22 Commits

Author SHA1 Message Date
45b299d80c Docs: Added README, contributing guide and code of conduct
All checks were successful
Build system / Check kernel codestyle (pull_request) Successful in 37s
Build system / Build (pull_request) Successful in 9m0s
Signed-off-by: Max Logaev <maxlogaev@proton.me>
2025-03-08 22:42:41 +01:00
Taldariner
9b08b20cc3 Charsets Checker 0.3.2
All checks were successful
Build system / Check kernel codestyle (push) Successful in 29s
Build system / Build (push) Successful in 8m26s
- Renamed to Charsets Viewer/Charsets
- Fixed rolled-up bug
- Tweaked UI a little bit
- Renamed files in autobuild
- Moved charsets to programs/develop
- Added credits in charsets.asm
- Moved charsets dev history to separate file
2025-03-07 23:25:15 +03:00
38fdd13e0c Added charset_checker app to IMG instead of asciivju and keyascii 2025-03-07 23:25:14 +03:00
d9679f5f81 Add new debug board - dbgboard based on console.obj (#119)
Main advantages:
- Bigger font
- Scrolling (like in other console apps)
- K : and L: messages highligting

Also, like the old board it writes log to /tmp0/1/boardlog.txt (or you can pass another path in args), can view it on F2

Co-authored-by: rgimad <33692565+rgimad@users.noreply.github.com>
Reviewed-on: #119
Reviewed-by: Max Logaev <maxlogaev@proton.me>
Co-authored-by: rgimad <rgimad@noreply.localhost>
Co-committed-by: rgimad <rgimad@noreply.localhost>
2025-03-07 23:24:48 +03:00
92ea2a97eb Data: Dino has been moved to the TCC category.
All checks were successful
Build system / Check kernel codestyle (push) Successful in 32s
Build system / Build (push) Successful in 9m9s
Signed-off-by: Maxim Logaev <maxlogaev@proton.me>
2025-03-07 10:48:09 +01:00
98cccc438c Apps/aclock: Rewrite from nasm to fasm
All checks were successful
Build system / Check kernel codestyle (push) Successful in 31s
Build system / Build (push) Successful in 9m41s
2025-03-07 01:10:44 +01:00
79d9f42085 Apps/genfiles: Rewrite from nasm to fasm 2025-03-07 01:10:44 +01:00
b39150ecea Apps/lod: Rewrite from nasm to fasm 2025-03-07 01:10:44 +01:00
1a40899780 Apps/FillScr: Rewrite from nasm to fasm 2025-03-07 01:10:44 +01:00
25b79ca6d1 Apps/Timer: Rewrite from nasm to fasm 2025-03-07 01:10:44 +01:00
2e3548d92a Apps/tinfo: Rewrite from nasm to fasm 2025-03-07 01:10:44 +01:00
ed8e4ecf33 Apps/mstate: Rewrite from nasm to fasm 2025-03-07 01:10:44 +01:00
6a9608c7a4 Apps/C4: Rewrite from nasm to fasm 2025-03-07 01:10:44 +01:00
d8c6274d19 Libs/iconv: Fixed convert BEL and UKR i/I to CP866
Some checks failed
Build system / Check kernel codestyle (push) Successful in 33s
Build system / Build (push) Has been cancelled
Signed-off-by: Maxim Logaev <maxlogaev@proton.me>
2025-03-07 01:05:42 +01:00
1df7b2fd4c Apps/webview: Version 3.8. Fixed <p>, new h3 style
Some checks failed
Build system / Check kernel codestyle (push) Successful in 29s
Build system / Build (push) Has been cancelled
- `cmm/lib/collection.h`: fixed memory leak, more safe, optimizations;
- webview: mostly fix <p>, new h3 style, some other updates.

Reviewed-on: #115
2025-03-07 03:00:49 +03:00
9001dbc1b4 CI/CD: Added CI, without MSVC (en_US and ru_RU)
All checks were successful
Build system / Check kernel codestyle (push) Successful in 1m51s
Build system / Build (push) Successful in 11m51s
- Added `install_kgcc` script;
- Added `checker.pl` script to check the kernel codestyle;
- Added build of en_US and ru_RU versions of images.
Known problem: projects that require the proprietary MSVC compiler are
not built.

Signed-off-by: Maxim Logaev <maxlogaev@proton.me>
2025-03-04 20:09:10 +01:00
c11c7922bd Libs/mbedtls: Use strip instead of kos32-strip
`kos32-strip`` contains a bug:
When trying to strip a large object file builded by `clink`,
a segfault occurs. This bug is not reproduced on the newer `strip`.

Signed-off-by: Maxim Logaev <maxlogaev@proton.me>
2025-03-04 20:09:10 +01:00
739facfeca CI/CD: Init building workflow 2025-03-04 20:09:10 +01:00
8c9a971e2c Libs/cmm: Fixed return type for GetProcessInfo() 2025-03-02 12:10:08 +01:00
5aa17d5823 Apps/webview: Fixed parse tag param and use Bing search
- Fixed parse case of tag param like "attr = value";
- Use the default Bing search as it only supports HTTP.
2025-03-02 12:10:08 +01:00
4d6ef342e1 Apps/webview: Fixed issue #100 2025-03-02 12:10:08 +01:00
8e5b315fd4 Apps: Fix webview and downloader issue #22
- Fix #22 in both webview and downloader;
- Get rid of app mode in webview;
- Fix update link for webview.
2025-03-02 12:10:08 +01:00
101 changed files with 3059 additions and 3724 deletions

174
.gitea/workflows/build.yaml Normal file
View File

@@ -0,0 +1,174 @@
# SPDX-License-Identifier: GPL-2.0-only
# SPDX-FileCopyrightText: 2025 KolibriOS team
name: 'Build system'
on:
push:
branches:
- 'main'
pull_request:
branches:
- '**'
jobs:
codestyle:
name: "Check kernel codestyle"
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup dependencies
run: |
sudo apt update && sudo apt install perl -y
- name: Check codestyle
run: |
find kernel/trunk -iname '*.asm' -or -iname '*.inc' -exec bash -c "echo {}; cat {} | perl .gitea/workflows/checker.pl" \;
build:
name: 'Build'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get describe
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Setup dependencies
run: |
cd /tmp
sudo apt update
sudo apt install p7zip-full fasm nasm make gcc gcc-multilib g++ g++-multilib mtools mkisofs parted gdisk -y
wget http://mirrors.kernel.org/ubuntu/pool/universe/t/tup/tup_0.8-1_amd64.deb
sudo apt install ./tup_0.8-1_amd64.deb -y
- name: Install GCC toolchain
run: |
chmod +x ${{ gitea.workspace }}/.gitea/workflows/install_kgcc
${{ gitea.workspace }}/.gitea/workflows/install_kgcc
- name: Install JWasm
run: |
cd /tmp
wget -O JWasm211bl.zip https://sourceforge.net/projects/jwasm/files/JWasm%20Linux%20binary/JWasm211bl.zip/download
unzip JWasm211bl.zip "jwasm" -d /home/autobuild/tools/win32/bin/
chmod +x /home/autobuild/tools/win32/bin/jwasm
- name: Build and install C--
run: |
cd ${{ gitea.workspace }}/programs/develop/cmm/
make -f Makefile.lin32
chmod +x c--
mv c-- /home/autobuild/tools/win32/bin/c--
cp ${{ gitea.workspace }}/programs/cmm/c--/c--.ini /home/autobuild/tools/win32/bin/c--.ini
make -f Makefile.lin32 clean
- name: Install TCC
run: |
cp ${{ gitea.workspace }}/programs/develop/ktcc/trunk/bin/kos32-tcc /home/autobuild/tools/win32/bin/kos32-tcc
chmod +x /home/autobuild/tools/win32/bin/kos32-tcc
- name: Compile objconv
run: |
cd ${{ gitea.workspace }}/programs/develop/objconv/
g++ -o /home/autobuild/tools/win32/bin/objconv -O2 *.cpp
chmod +x /home/autobuild/tools/win32/bin/objconv
- name: Compile kerpack
run: |
cd ${{ gitea.workspace }}/programs/other/kpack/kerpack_linux/
make
chmod +x kerpack
mv kerpack /home/autobuild/tools/win32/bin/.
- name: Compile kpack
run: |
cd ${{ gitea.workspace }}/programs/other/kpack/linux/
bash build.sh
chmod +x kpack
mv kpack /home/autobuild/tools/win32/bin/.
- name: Compile clink
run: |
cd ${{ github.workspace }}/programs/develop/clink
gcc main.c -o clink
chmod a+x clink
mv clink /home/autobuild/tools/win32/bin/clink
- name: Configure tup
run: |
cd ${{ gitea.workspace }}
export ROOT=${{ gitea.workspace }}
cd $ROOT
echo "CONFIG_KPACK_CMD=&& kpack --nologo %o" > tup.config
echo "CONFIG_KERPACK_CMD=&& kerpack %o" >> tup.config
echo "CONFIG_PESTRIP_CMD=&& EXENAME=%o fasm $ROOT/data/common/pestrip.asm %o" >> tup.config
echo "CONFIG_NO_MSVC=full" >> tup.config
echo "CONFIG_INSERT_REVISION_ID=1" >> tup.config
tup -v
tup init
- name: Build KolibriOS (en_US)
run: |
cp tup.config tup.config.en_US
echo "CONFIG_LANG=en_US" >> tup.config.en_US
echo "CONFIG_BUILD_TYPE=en_US" >> tup.config.en_US
export PATH=/home/autobuild/tools/win32/bin:$PATH
tup generate --config tup.config.en_US build-en_US.sh
./build-en_US.sh
- name: Upload floppy image (en_US)
uses: actions/upload-artifact@v3
with:
name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.img
path: data/kolibri.img
- name: Upload CD image (en_US)
uses: actions/upload-artifact@v3
with:
name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.iso
path: data/kolibri.iso
- name: Upload raw image (en_US)
uses: actions/upload-artifact@v3
with:
name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.raw
path: data/kolibri.raw
- name: Build KolibriOS (ru_RU)
run: |
git clean -d -x -f -e tup.config
cp tup.config tup.config.ru_RU
echo "CONFIG_LANG=ru_RU" >> tup.config.ru_RU
echo "CONFIG_BUILD_TYPE=ru_RU" >> tup.config.ru_RU
export PATH=/home/autobuild/tools/win32/bin:$PATH
tup generate --config tup.config.ru_RU build-ru_RU.sh
./build-ru_RU.sh
- name: Upload floppy image (ru_RU)
uses: actions/upload-artifact@v3
with:
name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.img
path: data/kolibri.img
- name: Upload CD image (ru_RU)
uses: actions/upload-artifact@v3
with:
name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.iso
path: data/kolibri.iso
- name: Upload raw image (ru_RU)
uses: actions/upload-artifact@v3
with:
name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.raw
path: data/kolibri.raw

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,82 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-only
# SPDX-FileCopyrightText: 2025 KolibriOS Team
# Written by mxlgv (Maxim Logaev)
# Installation steps described by maxcodehack (Maxim Kuzmitsky)
set -e
print_msg(){
echo -e "\e[34m$1\e[0m"
}
print_ok(){
echo -e "\e[32m$1\e[0m"
}
print_err(){
echo -e "\e[31m$1\e[0m"
exit
}
check_utils(){
printf "%s: " $1
if command -v $1 &> /dev/null
then
print_ok "ok\r"
else
print_err "no\r"
fi
}
print_msg "Checking utilities..."
check_utils wget
check_utils 7z
print_msg "Create the /home/autobuild folder..."
sudo rm -rf ~/autobuild /home/autobuild
mkdir -p ~/autobuild/tools
sudo ln -sf ~/autobuild /home/autobuild
print_ok "Successfully!"
print_msg "Download the kos32-gcc toolchain..."
wget http://ftp.kolibrios.org/users/Serge/new/Toolchain/x86_64-linux-kos32-5.4.0.7z -O ~/autobuild/tools/kos32-toolchain.7z
print_ok "Successfully!"
print_msg "Extracting files ..."
cd ~/autobuild/tools/
7z x -y kos32-toolchain.7z
rm -rf kos32-toolchain.7z
print_ok "Successfully!"
print_msg "Downloading libisl..."
cd /tmp
sudo wget http://board.kolibrios.org/download/file.php?id=8301libisl.so.10.2.2.7z -O /tmp/libisl.so.10.2.2.7z
sudo 7z x -y libisl.so.10.2.2.7z
if ! [ -d /usr/lib/x86_64-linux-gnu/ ]; then
sudo mkdir -p /usr/lib/x86_64-linux-gnu/
fi
print_msg "Fixing libisl..."
sudo mv /tmp/libisl.so.10.2.2 /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2
sudo ln -sf /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2 /usr/lib/x86_64-linux-gnu/libisl.so.10
sudo ln -sf /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2 /usr/lib/libisl.so.10
sudo chmod go-w /usr/lib/x86_64-linux-gnu/libisl.so.10
sudo chmod go-w /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2
print_ok "Successfully!"
print_msg "Fixing libmpfr..."
sudo ln -sf /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4
sudo ln -sf /usr/lib/libmpfr.so.6 /usr/lib/libmpfr.so.4
print_ok "Successfully!"
if ! grep -q 'export PATH=$PATH:/home/autobuild/tools/win32/bin' ~/.bashrc; then
export PATH=$PATH:/home/autobuild/tools/win32/bin
print_msg "Adding '/home/autobuild/tools/win32/bin' to '~/.bashrc'"
echo 'export PATH=$PATH:/home/autobuild/tools/win32/bin' >> ~/.bashrc
fi
print_ok "Installation was successful!"

41
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,41 @@
# Code of Conduct
__Code of Conduct__ of __KolibriOS__ project
## Purpose
The primary goal of our community is to be inclusive of a large number of contributors, with the most varied and diverse backgrounds possible. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, ability, ethnicity, socioeconomic status, and religion (or lack thereof)
This code of conduct outlines our expectations for all those who participate in our community, as well as the consequences for unacceptable behavior
We invite all those who participate in our community to help us create safe and positive experience for everyone
## Expected Behavior
The following behaviors are expected and requested of all community members:
- Exercise consideration and respect in your speech and actions
- Attempt collaboration before conflict
- Refrain from demeaning or discriminatory behavior and speech
- Be mindful of your surroundings and of your fellow participants
Also alert community leaders if you notice a dangerous situation, someone in distress, or violations of this *Code of Conduct*, even if they seem inconsequential
## Unacceptable Behavior
The following behaviors are considered harassment and are unacceptable within our community:
- Threats of violence or violent language directed against another person
- Posting or displaying sexually explicit material
- Personal insults
- Deliberate intimidation, stalking or following
- Advocating for, or encouraging, any of the above behaviors
- Sustained disruption of community events, including talks and presentations
## Reporting Guidelines
If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible
## Scope
We expect all community participants (contributors, sponsors and other guests) to abide by this *Code of Conduct* in all community venues as well as in all one-on-one communications pertaining to community business

View File

@@ -1,118 +1,99 @@
# Contributing guide # Contributing guide
The __KolibriOS__ project __Contributing__ guide
## Overview
The process of contributing to the project is described in detail in this document.
## Code of Conduct
The first thing to do is to read and follow our [Code of Conduct](./CODE_OF_CONDUCT.md).
## Type of contributing ## Type of contributing
There are two main types of contributions accepted in KolibriOS: There are two main types of contributions: submitting issues about problems and submitting pull requests. Each of these types of contributions is described in detail below.
- Submitting issues about problems in the project
- Submitting code to the project via pull requests
Each of these types is described in detail below.
## Issues ## Issues
You can help us by submitting issues about problems found in the system. You can help us by submitting issues to repository. At the moment there are 2 main ways of submitting an issue in the project: _bug reports_ and _feature requests_. All existing forms are provided with brief explanations
Currently, there are two main ways of submitting an issue in the project:
**Bug Reports** and **Feature Requests**:
- Bug Reports are suitable if you find a **bug** (crash, error, unexpected - Reports are suitable if you find a __bug__ in some part of the project and want to create a report;
behavior) in some part of the system (kernel, drivers, apps, etc.) and want to - Also there is a possibility submit a __feature request__ if it seems to you that the project lacks any feature.
report it
- Feature Request are used, when you want to propose some **improvement** to
the system (missing features, improved user experience, etc.)
## Pull requests ## Pull requests
You can also help us by submitting code via pull requests. The process of You can also help us by submitting pull requests. The process of submitting a pull request consists of several steps:
submitting a pull request consists of the following steps:
1. Find what you want to implement or improve - Find what you want to implement or improve;
2. Make a fork of kolibrios (or other needed) repository - Make a fork (not relevant for owners);
3. Create a branch with a name that matches [the style](#branch-style) - Create a branch with a name that matches your changes;
4. Implement and test the changes - Make and test the changes;
5. Create commits according to the [accepted style](#commit-style) - Create commits according to the [accepted style](##commit-style);
6. Create and submit a pull request into `main` branch - Create and submit a pull request;
7. Wait for CI/CD pipelines and code review to pass - Wait for CI/CD pipelines and code review to pass.
When a pull request is submitted, at least two project participants must conduct When a pull request is submitted, at least two project participants must conduct a code review, after which the changes are corrected (if it's necessary) and merged into the project.
a code review, after which the proposed changes can be corrected (if it's
necessary) and merged into the project.
## Branch style
1. Your branch name should be as short as possible, but describes your changes
2. Words should be divided by minus sign (`-`)
3. Optionally, might starts with general [type](#types) of your future PR
with slash (`/`): `refactor/nasm-to-fasm`, `update/demos`, `fix/cp866-charset`
## Commit style ## Commit style
### Pattern ### Naming
The commit message should look like this: - Pattern
Regular commit message should consist of several parts and be built according to the following template:
```test
Category: Commit message body
Long description if necessary
```
- Commit message body and description should briefly reflect the meaning of the commit changes;
- Commit message body should be written starting with a capital letter;
- Description should be separated from the body by one empty line.
- Length
The maximum number of characters in a commit header is __72__ (standard for __Git__). Additionally, __72__ is the maximum length of a line in a commit body.
- Categories
List of existing categories accepted in the project:
- `Krn` - kernel
- `Drv` - drivers
- `Libs` - libraries
- `Skins` - skins
- `Build` - build system
- `CI/CD` - CI/CD
- `Docs` - documentation
- `Data` - images, configs, resources, etc.
List of categories for exceptional situations:
- `All` - global changes
- `Other` - unclassifiable changes
If changes are made to a specific component, the name of the component separated by `/` character needs to be specified. For example:
```text
Apps/shell
Libs/libimg
```
### Merge commits
Merge commits are __prohibited__ in the project
### Unwanted commits
Commit messages like `Refactoring`/`Update files` are __unwanted__ in the project
### Signing
This is not a requirement, but it is strongly recommended to sign commits. This can be done by the following command:
```sh
git commit -s
``` ```
type(scope): commit message header
Commit message body, if needed
```
- Use the present tense ("Add feature" not "Added feature")
- Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
- Limit the first line to 72 characters or less
- Reference issues and pull requests liberally after the first line
- When only changing documentation, include [ci skip] in the commit title
- Commit message header and body should reflect changes made in commit
### Types
| Type | Description |
| :--------------: | :------------------------------------------------ |
| `feat / feature` | for new feature implementing commit |
| `update` | for update commit |
| `bug` | for bug fix commit |
| `security` | for security issue fix commit |
| `performance` | for performance issue fix commit |
| `improvement` | for backwards-compatible enhancement commit |
| `breaking` | for backwards-incompatible enhancement commit |
| `deprecated` | for deprecated feature commit |
| `i18n` | for i18n (internationalization) commit |
| `a11y` | for a11y (accessibility) commit |
| `refactor` | for refactoring commit |
| `docs` | for documentation commit |
| `example` | for example code commit |
| `test` | for testing commit |
| `deps` | for dependencies upgrading or downgrading commit |
| `config` | for configuration commit |
| `build` | for packaging or bundling commit |
| `release` | for publishing commit |
| `wip` | for work in progress commit |
| `chore` | for other operations commit |
### Scopes
> [!NOTE]
> Scopes are optional
| Scope | Description |
| :----: | :------------------------------- |
| `krn` | kernel |
| `drv` | drivers |
| `lib` | libraries |
| `app` | userspace applications |
| `skin` | skins |
| `data` | images, configs, resources, etc. |
> [!NOTE]
> If changes are made to a specific component, the name of the component
> separated by `/` character needs to be specified. For example:
> `app/shell`, `lib/libimg`
## Merge commits
> [!WARNING]
> Merge commits are **prohibited** in the project
## Conclusion
We hope this small instructions will help you to get familiar with KolibriOS
contribution rules and inspire you to participate in the work of this project.

View File

@@ -1,338 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
<https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Moe Ghoul>, 1 April 1989
Moe Ghoul, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@@ -3,26 +3,20 @@
[![License](https://img.shields.io/badge/License-GPL%202.0-green)](./COPYING.TXT) [![License](https://img.shields.io/badge/License-GPL%202.0-green)](./COPYING.TXT)
[![Build system](https://git.kolibrios.org/KolibriOS/kolibrios/actions/workflows/build.yaml/badge.svg)](https://git.kolibrios.org/KolibriOS/kolibrios/actions/workflows/build.yaml) [![Build system](https://git.kolibrios.org/KolibriOS/kolibrios/actions/workflows/build.yaml/badge.svg)](https://git.kolibrios.org/KolibriOS/kolibrios/actions/workflows/build.yaml)
KolibriOS is a hobby operating system for x86-compatible computers, which is currently being developed by a small teem of enthusiasts. KolibriOS is a hobby operating system for x86-compatible computers, its kernel is written entirely in [Fasm](https://flatassembler.net/) assembly language. Based on [MenuetOS](https://www.menuetos.net/), it uses its own standards and is not fully POSIX or UNIX compliant
It's kernel is written entirely in [FASM](https://flatassembler.net/) assembly language, making it very compact and lean on system resources.
Based on [MenuetOS](https://www.menuetos.net/), it uses its own standards and is NOT fully POSIX or UNIX compliant
## Contributing ## Contributing
We would appreciate any participation in the project and always welcome new users and contributors. Detailed instructions for the contribution process can be found in the [contributing guide](./CONTRIBUTING.md)
Detailed instructions for the contribution process can be found in the [contributing guide](./CONTRIBUTING.md). Also there is an accepted [code of conduct](./CODE_OF_CONDUCT.md) in the project
Common list of tasks, issues and enhancement proposals can be found on [this page](https://git.kolibrios.org/KolibriOS/kolibrios/issues). Common list of project tasks is located on [this page](https://git.kolibrios.org/KolibriOS/kolibrios/issues).
## Special thanks ## Special thanks
The KolibriOS team expresses special thanks to the author of the 32-bit **MenuetOS**, [Ville Turjanmaa](https://www.menuetos.net/contact.htm). We also want to note that all **MenuetOS** copyrights have been preserved. The KolibriOS team expresses special thanks to the author of the 32-bit __MenuetOS__, [Ville Turjanmaa](https://www.menuetos.net/contact.htm). We also want to note that all __MenuetOS__ copyrights have been preserved
## License ## License
Contents of this repository are licensed under the terms of **GNU GPL 2.0** unless otherwise specified. Contents of this repository are licensed under the terms of __GNU GPL 2.0__ unless otherwise specified. See [this](COPYING.TXT) file for details
See [this](./COPYING.TXT) file for details.

View File

@@ -407,6 +407,7 @@ tup.append_table(img_files, {
{"@SS", VAR_PROGS .. "/system/scrsaver/scrsaver"}, {"@SS", VAR_PROGS .. "/system/scrsaver/scrsaver"},
{"@VOLUME", VAR_PROGS .. "/media/volume/volume"}, {"@VOLUME", VAR_PROGS .. "/media/volume/volume"},
{"HACONFIG", VAR_PROGS .. "/other/ha/HACONFIG"}, {"HACONFIG", VAR_PROGS .. "/other/ha/HACONFIG"},
{"ACLOCK", VAR_PROGS .. "/demos/aclock/aclock"},
{"APM", VAR_PROGS .. "/system/apm/apm"}, {"APM", VAR_PROGS .. "/system/apm/apm"},
{"CALC", VAR_PROGS .. "/other/calc/trunk/calc"}, {"CALC", VAR_PROGS .. "/other/calc/trunk/calc"},
{"CALENDAR", VAR_PROGS .. "/system/calendar/trunk/calendar"}, {"CALENDAR", VAR_PROGS .. "/system/calendar/trunk/calendar"},
@@ -441,6 +442,8 @@ tup.append_table(img_files, {
{"TERMINAL", VAR_PROGS .. "/system/terminal/terminal"}, {"TERMINAL", VAR_PROGS .. "/system/terminal/terminal"},
{"TEST", VAR_PROGS .. "/testing/protection/trunk/test"}, {"TEST", VAR_PROGS .. "/testing/protection/trunk/test"},
{"TINYPAD", VAR_PROGS .. "/develop/tinypad/trunk/tinypad"}, {"TINYPAD", VAR_PROGS .. "/develop/tinypad/trunk/tinypad"},
{"TINFO", VAR_PROGS .. "/system/tinfo/tinfo"},
{"TIMER", VAR_PROGS .. "/other/Timer/Timer"},
{"UNZ", VAR_PROGS .. "/fs/unz/unz"}, {"UNZ", VAR_PROGS .. "/fs/unz/unz"},
{"ZKEY", VAR_PROGS .. "/system/zkey/trunk/ZKEY"}, {"ZKEY", VAR_PROGS .. "/system/zkey/trunk/ZKEY"},
{"3D/3DWAV", VAR_PROGS .. "/demos/3dwav/trunk/3dwav"}, {"3D/3DWAV", VAR_PROGS .. "/demos/3dwav/trunk/3dwav"},
@@ -463,16 +466,18 @@ tup.append_table(img_files, {
{"DEMOS/UNVWATER", VAR_PROGS .. "/demos/unvwater/trunk/unvwater"}, {"DEMOS/UNVWATER", VAR_PROGS .. "/demos/unvwater/trunk/unvwater"},
{"DEMOS/WEB", VAR_PROGS .. "/demos/web/trunk/web"}, {"DEMOS/WEB", VAR_PROGS .. "/demos/web/trunk/web"},
{"DEMOS/ZEROLINE", VAR_PROGS .. "/demos/zeroline/trunk/zeroline"}, {"DEMOS/ZEROLINE", VAR_PROGS .. "/demos/zeroline/trunk/zeroline"},
{"DEVELOP/ASCIIVJU", VAR_PROGS .. "/develop/asciivju/trunk/asciivju"},
{"DEVELOP/BOARD", VAR_PROGS .. "/system/board/trunk/board"}, {"DEVELOP/BOARD", VAR_PROGS .. "/system/board/trunk/board"},
{"DEVELOP/DBGBOARD", VAR_PROGS .. "/system/dbgboard/dbgboard"},
{"DEVELOP/CEDIT", SRC_PROGS .. "/develop/cedit/CEDIT"}, {"DEVELOP/CEDIT", SRC_PROGS .. "/develop/cedit/CEDIT"},
{"DEVELOP/CHARSETS", VAR_PROGS .. "/develop/charsets/charsets"},
{"DEVELOP/COBJ", VAR_PROGS .. "/develop/cObj/trunk/cObj"}, {"DEVELOP/COBJ", VAR_PROGS .. "/develop/cObj/trunk/cObj"},
{"DEVELOP/ENTROPYV", VAR_PROGS .. "/develop/entropyview/entropyview"}, {"DEVELOP/ENTROPYV", VAR_PROGS .. "/develop/entropyview/entropyview"},
{"DEVELOP/FASM", VAR_PROGS .. "/develop/fasm/1.73/fasm"}, {"DEVELOP/FASM", VAR_PROGS .. "/develop/fasm/1.73/fasm"},
{"DEVELOP/GENFILES", VAR_PROGS .. "/testing/genfiles/GenFiles"},
{"DEVELOP/H2D2B", VAR_PROGS .. "/develop/h2d2b/trunk/h2d2b"}, {"DEVELOP/H2D2B", VAR_PROGS .. "/develop/h2d2b/trunk/h2d2b"},
{"DEVELOP/HEED", VAR_PROGS .. "/develop/heed/trunk/heed"}, {"DEVELOP/HEED", VAR_PROGS .. "/develop/heed/trunk/heed"},
{"DEVELOP/KEYASCII", VAR_PROGS .. "/develop/keyascii/trunk/keyascii"},
{"DEVELOP/MTDBG", VAR_PROGS .. "/develop/mtdbg/mtdbg"}, {"DEVELOP/MTDBG", VAR_PROGS .. "/develop/mtdbg/mtdbg"},
{"DEVELOP/MSTATE", VAR_PROGS .. "/develop/mstate/mstate"},
{"DEVELOP/SCANCODE", VAR_PROGS .. "/develop/scancode/trunk/scancode"}, {"DEVELOP/SCANCODE", VAR_PROGS .. "/develop/scancode/trunk/scancode"},
{"DEVELOP/EXAMPLES/CIRCLE", VAR_PROGS .. "/develop/examples/circle/trunk/circle"}, {"DEVELOP/EXAMPLES/CIRCLE", VAR_PROGS .. "/develop/examples/circle/trunk/circle"},
{"DEVELOP/EXAMPLES/COLORREF", VAR_PROGS .. "/demos/colorref/trunk/colorref"}, {"DEVELOP/EXAMPLES/COLORREF", VAR_PROGS .. "/demos/colorref/trunk/colorref"},
@@ -482,8 +487,8 @@ tup.append_table(img_files, {
{"DEVELOP/EXAMPLES/USE_MB", VAR_PROGS .. "/demos/use_mb/use_mb"}, {"DEVELOP/EXAMPLES/USE_MB", VAR_PROGS .. "/demos/use_mb/use_mb"},
{"File Managers/KFAR", VAR_PROGS .. "/fs/kfar/trunk/kfar"}, {"File Managers/KFAR", VAR_PROGS .. "/fs/kfar/trunk/kfar"},
{"File Managers/OPENDIAL", VAR_PROGS .. "/fs/opendial/opendial"}, {"File Managers/OPENDIAL", VAR_PROGS .. "/fs/opendial/opendial"},
{"LOD", VAR_PROGS .. "/fs/lod/lod"},
{"GAMES/15", VAR_PROGS .. "/games/15/15"}, {"GAMES/15", VAR_PROGS .. "/games/15/15"},
{"GAMES/DINO", VAR_PROGS .. "/games/dino/dino"},
{"GAMES/FREECELL", VAR_PROGS .. "/games/freecell/freecell"}, {"GAMES/FREECELL", VAR_PROGS .. "/games/freecell/freecell"},
{"GAMES/GOMOKU", VAR_PROGS .. "/games/gomoku/gomoku"}, {"GAMES/GOMOKU", VAR_PROGS .. "/games/gomoku/gomoku"},
{"GAMES/LIGHTS", VAR_PROGS .. "/games/sq_game/SQ_GAME"}, {"GAMES/LIGHTS", VAR_PROGS .. "/games/sq_game/SQ_GAME"},
@@ -498,6 +503,7 @@ tup.append_table(img_files, {
{"GAMES/SW", VAR_PROGS .. "/games/sw/sw"}, {"GAMES/SW", VAR_PROGS .. "/games/sw/sw"},
{"GAMES/TANKS", VAR_PROGS .. "/games/tanks/tanks"}, {"GAMES/TANKS", VAR_PROGS .. "/games/tanks/tanks"},
{"GAMES/TETRIS", VAR_PROGS .. "/games/tetris/tetris"}, {"GAMES/TETRIS", VAR_PROGS .. "/games/tetris/tetris"},
{"GAMES/C4", VAR_PROGS .. "/games/c4/c4"},
{"LIB/ARCHIVER.OBJ", VAR_PROGS .. "/fs/kfar/trunk/kfar_arc/kfar_arc.obj"}, {"LIB/ARCHIVER.OBJ", VAR_PROGS .. "/fs/kfar/trunk/kfar_arc/kfar_arc.obj"},
{"LIB/BOX_LIB.OBJ", VAR_PROGS .. "/develop/libraries/box_lib/trunk/box_lib.obj"}, {"LIB/BOX_LIB.OBJ", VAR_PROGS .. "/develop/libraries/box_lib/trunk/box_lib.obj"},
{"LIB/BUF2D.OBJ", VAR_PROGS .. "/develop/libraries/buf2d/trunk/buf2d.obj"}, {"LIB/BUF2D.OBJ", VAR_PROGS .. "/develop/libraries/buf2d/trunk/buf2d.obj"},
@@ -517,6 +523,7 @@ tup.append_table(img_files, {
{"LIB/SORT.OBJ", VAR_PROGS .. "/develop/libraries/sorter/sort.obj"}, {"LIB/SORT.OBJ", VAR_PROGS .. "/develop/libraries/sorter/sort.obj"},
{"LIB/TINYGL.OBJ", VAR_PROGS .. "/develop/libraries/TinyGL/asm_fork/tinygl.obj"}, {"LIB/TINYGL.OBJ", VAR_PROGS .. "/develop/libraries/TinyGL/asm_fork/tinygl.obj"},
{"MEDIA/ANIMAGE", VAR_PROGS .. "/media/animage/trunk/animage"}, {"MEDIA/ANIMAGE", VAR_PROGS .. "/media/animage/trunk/animage"},
{"MEDIA/FILLSCR", VAR_PROGS .. "/media/FillScr/fillscr"},
{"MEDIA/KIV", VAR_PROGS .. "/media/kiv/trunk/kiv"}, {"MEDIA/KIV", VAR_PROGS .. "/media/kiv/trunk/kiv"},
{"MEDIA/LISTPLAY", VAR_PROGS .. "/media/listplay/trunk/listplay"}, {"MEDIA/LISTPLAY", VAR_PROGS .. "/media/listplay/trunk/listplay"},
{"MEDIA/MIDAMP", VAR_PROGS .. "/media/midamp/trunk/midamp"}, {"MEDIA/MIDAMP", VAR_PROGS .. "/media/midamp/trunk/midamp"},
@@ -599,7 +606,6 @@ tup.append_table(extra_files, {
{"kolibrios/demos/life3", VAR_PROGS .. "/games/life3/life3"}, {"kolibrios/demos/life3", VAR_PROGS .. "/games/life3/life3"},
{"kolibrios/demos/qjulia", VAR_PROGS .. "/demos/qjulia/trunk/qjulia"}, {"kolibrios/demos/qjulia", VAR_PROGS .. "/demos/qjulia/trunk/qjulia"},
{"kolibrios/develop/koldbg", VAR_PROGS .. "/develop/koldbg/koldbg"}, {"kolibrios/develop/koldbg", VAR_PROGS .. "/develop/koldbg/koldbg"},
{"kolibrios/develop/utils/charset_checker", VAR_PROGS .. "/other/charset_checker/charchck"},
{"kolibrios/games/Almaz", VAR_PROGS .. "/games/almaz/almaz"}, {"kolibrios/games/Almaz", VAR_PROGS .. "/games/almaz/almaz"},
{"kolibrios/games/arcanii", VAR_PROGS .. "/games/arcanii/arcanii"}, {"kolibrios/games/arcanii", VAR_PROGS .. "/games/arcanii/arcanii"},
{"kolibrios/games/bomber/bomber", VAR_PROGS .. "/games/bomber/bomber"}, {"kolibrios/games/bomber/bomber", VAR_PROGS .. "/games/bomber/bomber"},
@@ -639,22 +645,6 @@ if build_type == "ru_RU" then tup.append_table(extra_files, {
end -- tup.getconfig('NO_FASM') ~= 'full' end -- tup.getconfig('NO_FASM') ~= 'full'
-- Programs that require NASM to compile.
if tup.getconfig('NO_NASM') ~= 'full' then
tup.append_table(img_files, {
{"ACLOCK", VAR_PROGS .. "/demos/aclock/trunk/aclock"},
{"LOD", VAR_PROGS .. "/fs/lod/lod"},
{"TIMER", VAR_PROGS .. "/other/Timer/timer"},
{"TINFO", VAR_PROGS .. "/system/tinfo/tinfo"},
{"DEVELOP/MSTATE", VAR_PROGS .. "/develop/mstate/mstate"},
{"DEVELOP/GENFILES", VAR_PROGS .. "/testing/genfiles/GenFiles"},
{"GAMES/C4", VAR_PROGS .. "/games/c4/c4"},
{"MEDIA/FILLSCR", VAR_PROGS .. "/media/FillScr/fillscr"},
})
tup.append_table(extra_files, {
})
end -- tup.getconfig('NO_NASM') ~= 'full'
-- Programs that require JWASM to compile. -- Programs that require JWASM to compile.
if tup.getconfig('NO_JWASM') ~= 'full' then if tup.getconfig('NO_JWASM') ~= 'full' then
tup.append_table(img_files, { tup.append_table(img_files, {
@@ -730,6 +720,7 @@ if tup.getconfig('NO_TCC') ~= 'full' then
tup.append_table(img_files, { tup.append_table(img_files, {
{"NETWORK/WHOIS", VAR_PROGS .. "/network/whois/whois"}, {"NETWORK/WHOIS", VAR_PROGS .. "/network/whois/whois"},
{"SHELL", VAR_PROGS .. "/system/shell/shell"}, {"SHELL", VAR_PROGS .. "/system/shell/shell"},
{"GAMES/DINO", VAR_PROGS .. "/games/dino/dino"},
}) })
tup.append_table(extra_files, { tup.append_table(extra_files, {
{"kolibrios/utils/thashview", VAR_PROGS .. "/other/TinyHashView/thashview"}, {"kolibrios/utils/thashview", VAR_PROGS .. "/other/TinyHashView/thashview"},

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -57,8 +57,7 @@
20 Diff Tool |develop/diff 20 Diff Tool |develop/diff
52 Shared resources |/sys/@reshare 52 Shared resources |/sys/@reshare
34 Base Converter |develop/h2d2b 34 Base Converter |develop/h2d2b
59 Character table |develop/ASCIIVju 59 Charsets Viewer |develop/CHARSETS
59 Key ASCII-codes |develop/keyascii
59 Key SCAN-codes |develop/scancode 59 Key SCAN-codes |develop/scancode
#6 **** EMUL #6 **** EMUL
24 DOSBox * |/kolibrios/emul/DosBox/dosbox 24 DOSBox * |/kolibrios/emul/DosBox/dosbox

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -56,8 +56,7 @@
49 Debugger mtdbg |develop/mtdbg 49 Debugger mtdbg |develop/mtdbg
49 Debugger koldbg * |/kolibrios/develop/koldbg 49 Debugger koldbg * |/kolibrios/develop/koldbg
16 Hex2Dec2Bin |develop/h2d2b 16 Hex2Dec2Bin |develop/h2d2b
16 Tabla de caracteres |ASCIIVju 16 Tabla de caracteres |develop/CHARSETS
16 C<>digos ASCII |develop/keyascii
16 C<>digos SCAN |develop/scancode 16 C<>digos SCAN |develop/scancode
#6 **** EMULATORS #6 **** EMULATORS
24 DOSBox * |/kolibrios/emul/DosBox/dosbox 24 DOSBox * |/kolibrios/emul/DosBox/dosbox

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -58,8 +58,7 @@
20 Diff tool |develop/diff 20 Diff tool |develop/diff
52 Shared resources |/sys/@reshare 52 Shared resources |/sys/@reshare
34 Hex2Dec2Bin |develop/h2d2b 34 Hex2Dec2Bin |develop/h2d2b
59 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A8AC><EFBFBD><EFBFBD><EFBFBD> |develop/ASCIIVju 59 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A8AC><EFBFBD><EFBFBD><EFBFBD> |develop/CHARSETS
59 ASCII-<2D><><EFBFBD><EFBFBD> |develop/keyascii
59 SCAN-<2D><><EFBFBD><EFBFBD> |develop/scancode 59 SCAN-<2D><><EFBFBD><EFBFBD> |develop/scancode
#6 **** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #6 **** <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
24 DOSBox * |/kolibrios/emul/DosBox/dosbox 24 DOSBox * |/kolibrios/emul/DosBox/dosbox

View File

@@ -101,9 +101,12 @@ void TWebBrowser::SetPageDefaults()
img_url.drop(); img_url.drop();
text_colors.drop(); text_colors.drop();
text_colors.add(0); text_colors.add(0);
bg_colors.drop(); if (!secondrun) {
bg_colors.add(DEFAULT_BG_COL); bg_colors.drop();
canvas.Fill(0, DEFAULT_BG_COL); bg_colors.add(DEFAULT_BG_COL);
} else {
canvas.Fill(0, bg_colors.get(0));
}
header = NULL; header = NULL;
draw_y = BODY_MARGIN; draw_y = BODY_MARGIN;
draw_x = left_gap = BODY_MARGIN; draw_x = left_gap = BODY_MARGIN;

View File

@@ -45,9 +45,10 @@ void PAGE_LINKS::clear()
w.drop(); w.drop();
h.drop(); h.drop();
underline_h.drop(); underline_h.drop();
id.drop();
element_links.drop(); element_links.drop();
unic_links.drop(); unic_links.drop();
id.drop();
active = -1; active = -1;
active_url = 0; active_url = 0;

View File

@@ -112,6 +112,7 @@ dword _tag::get_next_param(dword ps, pe)
// "pe" - param end // "pe" - param end
// "q" - quote char // "q" - quote char
char q = NULL; char q = NULL;
dword initial_pe = pe;
dword fixeq; dword fixeq;
dword val; dword val;
dword attr; dword attr;
@@ -145,6 +146,14 @@ dword _tag::get_next_param(dword ps, pe)
//already have ATTR end //already have ATTR end
} }
if (pe > ps) pe--;
//Fix case: "src ="
while (pe>ps) && (__isWhite(ESBYTE[pe])) {
ESBYTE[pe] = '\0';
pe--;
}
//find ATTR start and copy //find ATTR start and copy
while (pe>ps) && (!__isWhite(ESBYTE[pe])) pe--; while (pe>ps) && (!__isWhite(ESBYTE[pe])) pe--;
attr = pe + 1; attr = pe + 1;
@@ -161,6 +170,8 @@ dword _tag::get_next_param(dword ps, pe)
} }
strlwr(attr); strlwr(attr);
strrtrim(val); strrtrim(val);
//Fix case: " img.png"
while(__isWhite(ESBYTE[val])) && (val<initial_pe) val++;
attributes.add(attr); attributes.add(attr);
values.add(val); values.add(val);

View File

@@ -10,10 +10,8 @@ void TWebBrowser::RenderLine(dword _line)
if (style.title) if (style.title)
{ {
strncpy(#header, _line, sizeof(TWebBrowser.header)-1); strncpy(#header, _line, sizeof(TWebBrowser.header)-1);
if (!application_mode) { strncat(#header, " - ", sizeof(TWebBrowser.header)-1);
strncat(#header, " - ", sizeof(TWebBrowser.header)-1); strncat(#header, #version, sizeof(TWebBrowser.header)-1);
strncat(#header, #version, sizeof(TWebBrowser.header)-1);
}
} }
else if (t_html) && (!t_body) { else if (t_html) && (!t_body) {
// //

View File

@@ -56,15 +56,12 @@ void TWebBrowser::SetStyle()
if (tag.is("tr")) { tag_table(); return; } if (tag.is("tr")) { tag_table(); return; }
if (tag.is("th")) { tag_table(); return; } if (tag.is("th")) { tag_table(); return; }
if (tag.is("td")) { tag_table(); return; } if (tag.is("td")) { tag_table(); return; }
if (application_mode) {
if (tag.is("exit")) { ExitProcess(); return; }
}
} }
void TWebBrowser::tag_p() void TWebBrowser::tag_p()
{ {
IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) || (streq(#tag.prior,"p")) return; IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) return;
if (!tag.opened) && (streq(#tag.prior,"p")) return;
NewLine(); NewLine();
} }
@@ -148,22 +145,6 @@ void TWebBrowser::tag_meta_xml()
if (streq(tag.get_value_of("http-equiv"), "refresh")) && (tag.get_value_of("content")) { if (streq(tag.get_value_of("http-equiv"), "refresh")) && (tag.get_value_of("content")) {
if (tag.value = strstri(tag.value, "url")) strcpy(#redirect, tag.value); if (tag.value = strstri(tag.value, "url")) strcpy(#redirect, tag.value);
} }
if (streq(tag.get_value_of("name"), "application")) {
if (application_mode) {
if (tag.get_number_of("left")) {
MoveSize(tag.number,-1,-1,-1);
}
if (tag.get_number_of("top")) {
MoveSize(-1,tag.number,-1,-1);
}
if (tag.get_number_of("width")) {
MoveSize(-1,-1,tag.number,-1);
}
if (tag.get_number_of("height")) {
MoveSize(-1,-1,-1,tag.number);
}
}
}
} }
signed int get_encoding_type_by_name(dword name) signed int get_encoding_type_by_name(dword name)
@@ -264,11 +245,19 @@ void TWebBrowser::tag_h1234_caption()
} else { } else {
style.h = tag.opened; style.h = tag.opened;
if (tag.opened) { if (tag.opened) {
if (!style.pre) NewLine(); if (!style.pre) {
draw_y += 10; NewLine();
list.SetFont(BASIC_CHAR_W*2, 14*2, 10011001b); NewLine();
list.item_h = BASIC_LINE_H * 2 - 2; }
if (tag.is("h1")) style.b = true; if (tag.is("h1")) {
list.SetFont(BASIC_CHAR_W*2, 14+12, 10011001b);
style.b = true;
} else if (tag.is("h2")) {
list.SetFont(BASIC_CHAR_W*2, 14+12, 10011001b);
} else {
list.SetFont(6*2, 9+7, 10001001b);
}
style.cur_line_h = list.item_h = list.font_h + 2;
} else { } else {
if (tag.is("h1")) style.b = false; if (tag.is("h1")) style.b = false;
NewLine(); NewLine();
@@ -456,7 +445,7 @@ void TWebBrowser::tag_table()
} }
} */ } */
tallest_cell_in_row = math.max(draw_y+style.cur_line_h-list.item_h, tallest_cell_in_row); tallest_cell_in_row = math.max(draw_y+style.cur_line_h-list.item_h+1, tallest_cell_in_row);
style.cur_line_h = list.item_h; style.cur_line_h = list.item_h;
if (tag.opened) { if (tag.opened) {

View File

@@ -65,6 +65,8 @@ char *unicode_symbols[]={
"times", "x", "times", "x",
"lowast","*", "lowast","*",
"#128154","<3",
0}; 0};

View File

@@ -45,7 +45,6 @@
bool debug_mode = false; bool debug_mode = false;
bool show_images = true; bool show_images = true;
bool source_mode = false; bool source_mode = false;
bool application_mode = false;
_history history; _history history;
@@ -110,9 +109,6 @@ void HandleParam()
history.add(#param + 8); history.add(#param + 8);
} else if (!strncmp(#param, "-new ", 5)) { } else if (!strncmp(#param, "-new ", 5)) {
history.add(#param + 5); history.add(#param + 5);
} else if (!strncmp(#param, "-app ", 5)) {
history.add(#param + 5);
application_mode = true;
} else { } else {
if (GetProcessesCount("WEBVIEW") == 1) { if (GetProcessesCount("WEBVIEW") == 1) {
history.add(#param); history.add(#param);
@@ -136,14 +132,6 @@ void main()
LoadLibraries(); LoadLibraries();
HandleParam(); HandleParam();
if (application_mode) {
TOOLBAR_H = 0;
PADDING = 0;
TSZE = 0;
STATUSBAR_H = 0;
TAB_H = 0;
}
omnibox_edit.left = PADDING+TSZE*2+PADDING+6; omnibox_edit.left = PADDING+TSZE*2+PADDING+6;
omnibox_edit.top = PADDING+3; omnibox_edit.top = PADDING+3;
@@ -221,15 +209,6 @@ void main()
if (http.transfer <= 0) break; if (http.transfer <= 0) break;
http.receive(); http.receive();
if (http_get_type==PAGE) {
CheckContentType();
prbar.max = http.content_length;
if (prbar.value != http.content_received) {
prbar.value = http.content_received;
DrawProgress();
}
}
if (http.receive_result != 0) break; if (http.receive_result != 0) break;
if (debug_mode) { if (debug_mode) {
EAX = http.transfer; EAX = http.transfer;
@@ -248,6 +227,15 @@ void main()
notify("'Too many redirects.' -E"); notify("'Too many redirects.' -E");
} }
} else { } else {
if (http_get_type==PAGE) {
CheckContentType();
prbar.max = http.content_length;
if (prbar.value != http.content_received) {
prbar.value = http.content_received;
DrawProgress();
}
}
// Loading the page is complete, free resources // Loading the page is complete, free resources
redirect_count = 0; redirect_count = 0;
if (http_get_type==PAGE) { if (http_get_type==PAGE) {
@@ -324,7 +312,7 @@ void ProcessKeyEvent()
if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT) if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT)
{ {
if (key_scancode == SCAN_CODE_TAB) {EventActivatePreviousTab();return;} if (key_scancode == SCAN_CODE_TAB) {EventActivatePreviousTab();return;}
if (key_scancode == SCAN_CODE_KEY_T) {EventOpenNewTab(URL_SERVICE_TEST);return;} if (key_scancode == SCAN_CODE_BS) {EventOpenNewTab(URL_SERVICE_TEST);return;}
} }
if (key_modifier&KEY_LCTRL) || (key_modifier&KEY_RCTRL) switch(key_scancode) if (key_modifier&KEY_LCTRL) || (key_modifier&KEY_RCTRL) switch(key_scancode)
@@ -349,6 +337,7 @@ void ProcessKeyEvent()
{ {
case SCAN_CODE_UP: EventScrollUpAndDown(SCAN_CODE_UP); return; case SCAN_CODE_UP: EventScrollUpAndDown(SCAN_CODE_UP); return;
case SCAN_CODE_DOWN: EventScrollUpAndDown(SCAN_CODE_DOWN); return; case SCAN_CODE_DOWN: EventScrollUpAndDown(SCAN_CODE_DOWN); return;
case SCAN_CODE_F2: EventEditSource(); return;
case SCAN_CODE_F6: {omnibox_edit.flags=ed_focus; DrawOmnibox();} return; case SCAN_CODE_F6: {omnibox_edit.flags=ed_focus; DrawOmnibox();} return;
case SCAN_CODE_F5: EventRefreshPage(); return; case SCAN_CODE_F5: EventRefreshPage(); return;
case SCAN_CODE_ENTER: if (omnibox_edit.flags & ed_focus) EventSubmitOmnibox(); return; case SCAN_CODE_ENTER: if (omnibox_edit.flags & ed_focus) EventSubmitOmnibox(); return;
@@ -382,23 +371,21 @@ void draw_window()
SetElementSizes(); SetElementSizes();
if (!application_mode) { DrawBar(0,0, Form.cwidth,PADDING, sc.work);
DrawBar(0,0, Form.cwidth,PADDING, sc.work); DrawBar(0,PADDING+TSZE+1, Form.cwidth,PADDING-1, sc.work);
DrawBar(0,PADDING+TSZE+1, Form.cwidth,PADDING-1, sc.work); DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, MixColors(sc.dark, sc.work, 180));
DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, MixColors(sc.dark, sc.work, 180)); DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, sc.line);
DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, sc.line); DrawBar(0, PADDING, omnibox_edit.left-2, TSZE+1, sc.work);
DrawBar(0, PADDING, omnibox_edit.left-2, TSZE+1, sc.work); DrawBar(omnibox_edit.left+omnibox_edit.width+18, PADDING, Form.cwidth-omnibox_edit.left-omnibox_edit.width-18, TSZE+1, sc.work);
DrawBar(omnibox_edit.left+omnibox_edit.width+18, PADDING, Form.cwidth-omnibox_edit.left-omnibox_edit.width-18, TSZE+1, sc.work);
DrawTopPanelButton(BACK_BUTTON, PADDING-1, PADDING, 30, false); DrawTopPanelButton(BACK_BUTTON, PADDING-1, PADDING, 30, false);
DrawTopPanelButton(FORWARD_BUTTON, PADDING+TSZE+PADDING-2, PADDING, 31, false); DrawTopPanelButton(FORWARD_BUTTON, PADDING+TSZE+PADDING-2, PADDING, 31, false);
DrawTopPanelButton(SANDWICH_BUTTON, Form.cwidth-PADDING-TSZE-3, PADDING, -1, burger_active); //burger menu DrawTopPanelButton(SANDWICH_BUTTON, Form.cwidth-PADDING-TSZE-3, PADDING, -1, burger_active); //burger menu
DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, sc.line); DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, sc.line);
DrawRectangle(WB1.list.x + WB1.list.w, WB1.list.y, scroll_wv.size_x, DrawRectangle(WB1.list.x + WB1.list.w, WB1.list.y, scroll_wv.size_x,
WB1.list.h-1, scroll_wv.bckg_col); WB1.list.h-1, scroll_wv.bckg_col);
}
if (!canvas.bufw) { if (!canvas.bufw) {
EventOpenFirstPage(); EventOpenFirstPage();
@@ -406,12 +393,9 @@ void draw_window()
WB1.DrawPage(); WB1.DrawPage();
DrawOmnibox(); DrawOmnibox();
} }
if (!application_mode) { DrawProgress();
DrawProgress(); DrawStatusBar(NULL);
DrawStatusBar(NULL); DrawTabsBar();
DrawTabsBar();
}
} }
void EventOpenFirstPage() void EventOpenFirstPage()
@@ -588,7 +572,6 @@ void OpenPage(dword _open_URL)
history.add(#new_url); history.add(#new_url);
WB1.custom_encoding = -1; WB1.custom_encoding = -1;
if (streq(#new_url, URL_SERVICE_HOMEPAGE)) LoadInternalPage(#buildin_page_home, sizeof(buildin_page_home)); if (streq(#new_url, URL_SERVICE_HOMEPAGE)) LoadInternalPage(#buildin_page_home, sizeof(buildin_page_home));
else if (streq(#new_url, URL_SERVICE_HELP)) LoadInternalPage(#buildin_page_help, sizeof(buildin_page_help));
else if (streq(#new_url, URL_SERVICE_TEST)) LoadInternalPage(#buildin_page_test, sizeof(buildin_page_test)); else if (streq(#new_url, URL_SERVICE_TEST)) LoadInternalPage(#buildin_page_test, sizeof(buildin_page_test));
else if (streq(#new_url, URL_SERVICE_HISTORY)) ShowHistory(); else if (streq(#new_url, URL_SERVICE_HISTORY)) ShowHistory();
else LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error)); else LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
@@ -757,7 +740,12 @@ void LoadInternalPage(dword _bufdata, _in_bufsize){
WB1.DrawPage(); WB1.DrawPage();
} }
http.hfree(); http.hfree();
if (WB1.img_url.count) { GetImg(true); DrawOmnibox(); } if (WB1.img_url.count) {
GetImg(true);
DrawOmnibox();
} else {
PageLoaded();
}
} }
} }
@@ -770,7 +758,6 @@ bool UrlExtIs(dword base, ext)
void DrawProgress() void DrawProgress()
{ {
dword pct; dword pct;
if (application_mode) return;
if (!http.transfer) return; if (!http.transfer) return;
if (http_get_type==PAGE) && (prbar.max) pct = prbar.value*30/prbar.max; else pct = 10; if (http_get_type==PAGE) && (prbar.max) pct = prbar.value*30/prbar.max; else pct = 10;
if (http_get_type==IMG) pct = prbar.value * 70 / prbar.max + 30; if (http_get_type==IMG) pct = prbar.value * 70 / prbar.max + 30;
@@ -779,21 +766,18 @@ void DrawProgress()
void EventShowPageMenu() void EventShowPageMenu()
{ {
if (application_mode) return;
open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #rmb_menu); open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #rmb_menu);
menu_id = VIEW_SOURCE; menu_id = BACK_BUTTON;
} }
void EventShowLinkMenu() void EventShowLinkMenu()
{ {
if (application_mode) return;
open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #link_menu); open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #link_menu);
menu_id = IN_NEW_TAB; menu_id = IN_NEW_TAB;
} }
void EventShowMainMenu() void EventShowMainMenu()
{ {
if (application_mode) return;
open_lmenu(Form.cwidth - PADDING -4, PADDING + TSZE + 3, open_lmenu(Form.cwidth - PADDING -4, PADDING + TSZE + 3,
MENU_TOP_RIGHT, NULL, #main_menu); MENU_TOP_RIGHT, NULL, #main_menu);
menu_id = OPEN_FILE; menu_id = OPEN_FILE;
@@ -801,7 +785,6 @@ void EventShowMainMenu()
void EventShowEncodingsList() void EventShowEncodingsList()
{ {
if (application_mode) return;
open_lmenu(Form.cwidth-4, Form.cheight - STATUSBAR_H + 12, open_lmenu(Form.cwidth-4, Form.cheight - STATUSBAR_H + 12,
MENU_BOT_RIGHT, WB1.cur_encoding + 1, MENU_BOT_RIGHT, WB1.cur_encoding + 1,
"UTF-8\nKOI8-RU\nCP1251\nCP1252\nISO8859-5\nCP866"); "UTF-8\nKOI8-RU\nCP1251\nCP1252\nISO8859-5\nCP866");
@@ -824,7 +807,8 @@ void EventSeachWeb()
{ {
char new_url[URL_SIZE+1]; char new_url[URL_SIZE+1];
replace_char(#editURL, ' ', '+', URL_SIZE); replace_char(#editURL, ' ', '+', URL_SIZE);
strcpy(#new_url, "https://www.google.com/search?q="); //strcpy(#new_url, "https://html.duckduckgo.com/html/?q=");
strcpy(#new_url, "http://bing.com/search?q=");
strncat(#new_url, #editURL, URL_SIZE); strncat(#new_url, #editURL, URL_SIZE);
OpenPage(#new_url); OpenPage(#new_url);
} }
@@ -886,7 +870,6 @@ void DrawStatusBar(dword _msg)
{ {
dword status_y = Form.cheight - STATUSBAR_H + 4; dword status_y = Form.cheight - STATUSBAR_H + 4;
dword status_w = Form.cwidth - 90; dword status_w = Form.cwidth - 90;
if (application_mode) return;
if (Form.status_window>2) return; if (Form.status_window>2) return;
DrawBar(0,Form.cheight - STATUSBAR_H+1, Form.cwidth,STATUSBAR_H-1, sc.work); DrawBar(0,Form.cheight - STATUSBAR_H+1, Form.cwidth,STATUSBAR_H-1, sc.work);
if (_msg) { if (_msg) {
@@ -900,7 +883,6 @@ void DrawStatusBar(dword _msg)
void DrawOmnibox() void DrawOmnibox()
{ {
int imgxoff; int imgxoff;
if (application_mode) return;
DrawOvalBorder(omnibox_edit.left-2, omnibox_edit.top-3, omnibox_edit.width+18, 24, sc.line, DrawOvalBorder(omnibox_edit.left-2, omnibox_edit.top-3, omnibox_edit.width+18, 24, sc.line,
sc.line, sc.line, sc.dark); sc.line, sc.line, sc.dark);
DrawBar(omnibox_edit.left-1, omnibox_edit.top-2, omnibox_edit.width+18, 1, 0xD8DCD8); DrawBar(omnibox_edit.left-1, omnibox_edit.top-2, omnibox_edit.width+18, 1, 0xD8DCD8);
@@ -919,7 +901,6 @@ void DrawOmnibox()
void SetOmniboxText(dword _text) void SetOmniboxText(dword _text)
{ {
if (application_mode) return;
edit_box_set_text stdcall (#omnibox_edit, _text); edit_box_set_text stdcall (#omnibox_edit, _text);
omnibox_edit.pos = omnibox_edit.flags = 0; omnibox_edit.pos = omnibox_edit.flags = 0;
DrawOmnibox(); DrawOmnibox();
@@ -1000,8 +981,13 @@ dword GetImg(bool _new)
DrawStatusBar(T_RENDERING); DrawStatusBar(T_RENDERING);
WB1.Reparse(); WB1.Reparse();
WB1.DrawPage(); WB1.DrawPage();
debugln(sprintf(#param, T_DONE_IN_SEC, GetStartTime()-render_start_time/100)); PageLoaded();
DrawStatusBar(NULL); }
void PageLoaded()
{
DrawStatusBar(sprintf(#param, T_DONE_IN_SEC, GetStartTime()-render_start_time/100,
GetStartTime()-render_start_time*10));
} }
stop: stop:

View File

@@ -16,7 +16,7 @@ struct _cache
void add(); void add();
bool has(); bool has();
void clear(); void clear();
} cache=0; } cache;
void _cache::add(dword _url, _data, _size, _type, _charset) void _cache::add(dword _url, _data, _size, _type, _charset)
{ {
@@ -37,6 +37,7 @@ void _cache::add(dword _url, _data, _size, _type, _charset)
bool _cache::has(dword _link) bool _cache::has(dword _link)
{ {
int pos; int pos;
if (!url.count) return false;
pos = url.get_pos_by_name(_link); pos = url.get_pos_by_name(_link);
if (pos != -1) { if (pos != -1) {
current_buf = data.get(pos); current_buf = data.get(pos);

View File

@@ -9,8 +9,11 @@ char buildin_page_home[] = FROM "res/homepage_ru.htm";
char buildin_page_help[] = FROM "res/help_ru.htm"; char buildin_page_help[] = FROM "res/help_ru.htm";
char accept_language[]= "Accept-Language: ru\n"; char accept_language[]= "Accept-Language: ru\n";
char rmb_menu[] = char rmb_menu[] =
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E5AEA4><EFBFBD>|Ctrl+U "Back|Ctrl+<
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; Forward|Ctrl+>
-
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|Ctrl+U
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|F2";
char main_menu[] = char main_menu[] =
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>...|Ctrl+O "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>...|Ctrl+O
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|Ctrl+N <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|Ctrl+N
@@ -27,14 +30,14 @@ char link_menu[] =
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>"; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>";
char loading_text[] = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..."; char loading_text[] = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...";
char update_param[] = "-e http://builds.kolibrios.org/rus/data/programs/cmm/browser/WebView.com"; char update_param[] = "-e http://builds.kolibrios.org/ru_RU/data/programs/cmm/browser/WebView.com";
char update_download_error[] = "'WebView\n<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!' -tE"; char update_download_error[] = "'WebView\n<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!' -tE";
char update_ok[] = "'WebView\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20>ᯥ譮 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!' -tO"; char update_ok[] = "'WebView\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20>ᯥ譮 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!' -tO";
char update_is_current[] = "'WebView\n<EFBFBD><EFBFBD><20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.' -tI"; char update_is_current[] = "'WebView\n<EFBFBD><EFBFBD><20><EFBFBD><E1AFAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.' -tI";
char update_can_not_copy[] = "'WebView\n<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> Downloads <20><> Ramdisk. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>.' -tE"; char update_can_not_copy[] = "'WebView\n<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> Downloads <20><> Ramdisk. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>.' -tE";
char clear_cache_ok[] = "'WebView\n<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>饭.' -tI"; char clear_cache_ok[] = "'WebView\n<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>饭.' -tI";
#define T_RENDERING "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD>..." #define T_RENDERING "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD>..."
#define T_DONE_IN_SEC "<22><><EFBFBD>: %i ᥪ" #define T_DONE_IN_SEC "<22><><EFBFBD>: %i ᥪ (%i <20><><EFBFBD><EFBFBD>ᥪ)"
#else #else
//===================================================// //===================================================//
// // // //
@@ -46,8 +49,11 @@ char buildin_page_home[] = FROM "res/homepage_en.htm";
char buildin_page_help[] = FROM "res/help_en.htm"; char buildin_page_help[] = FROM "res/help_en.htm";
char accept_language[]= "Accept-Language: en\n"; char accept_language[]= "Accept-Language: en\n";
char rmb_menu[] = char rmb_menu[] =
"View source|Ctrl+U "Back|Ctrl+<
Edit source"; Forward|Ctrl+>
-
View source|Ctrl+U
Edit source|F2";
char main_menu[] = char main_menu[] =
"Open local file...|Ctrl+O "Open local file...|Ctrl+O
New window|Ctrl+N New window|Ctrl+N
@@ -63,14 +69,14 @@ Open in new window
Copy link Copy link
Download link contents"; Download link contents";
char loading_text[] = "Loading..."; char loading_text[] = "Loading...";
char update_param[] = "-e http://builds.kolibrios.org/eng/data/programs/cmm/browser/WebView.com"; char update_param[] = "-e http://builds.kolibrios.org/en_US/data/programs/cmm/browser/WebView.com";
char update_download_error[] = "'WebView\nError receiving an up to date information!' -tE"; char update_download_error[] = "'WebView\nError receiving an up to date information!' -tE";
char update_ok[] = "'WebView\nThe browser has been updated!' -tO"; char update_ok[] = "'WebView\nThe browser has been updated!' -tO";
char update_is_current[] = "'WebView\nThe browser is up to date.' -tI"; char update_is_current[] = "'WebView\nThe browser is up to date.' -tI";
char update_can_not_copy[] = "'WebView\nError copying a new version from Downloads folder!\nProbably too litle space on Ramdisk.' -tE"; char update_can_not_copy[] = "'WebView\nError copying a new version from Downloads folder!\nProbably too litle space on Ramdisk.' -tE";
char clear_cache_ok[] = "'WebView\nThe cache has been cleared.' -tI"; char clear_cache_ok[] = "'WebView\nThe cache has been cleared.' -tI";
#define T_RENDERING "Rendering..." #define T_RENDERING "Rendering..."
#define T_DONE_IN_SEC "Done in %i sec" #define T_DONE_IN_SEC "Done in %i sec (%i milisec)"
#endif #endif
//===================================================// //===================================================//
@@ -83,7 +89,6 @@ char buildin_page_test[] = FROM "res/test.htm";
#define URL_SERVICE_HISTORY "WebView:history" #define URL_SERVICE_HISTORY "WebView:history"
#define URL_SERVICE_HOMEPAGE "WebView:home" #define URL_SERVICE_HOMEPAGE "WebView:home"
#define URL_SERVICE_HELP "WebView:help"
#define URL_SERVICE_TEST "WebView:test" #define URL_SERVICE_TEST "WebView:test"
char webview_shared[] = "WEBVIEW"; char webview_shared[] = "WEBVIEW";
@@ -91,12 +96,12 @@ char webview_shared[] = "WEBVIEW";
enum { enum {
NEW_TAB=600, NEW_TAB=600,
ENCODINGS=700, ENCODINGS=700,
BACK_BUTTON=800, BACK_BUTTON=800, FORWARD_BUTTON, VIEW_SOURCE, EDIT_SOURCE,
FORWARD_BUTTON, REFRESH_BUTTON, GOTOURL_BUTTON, CHANGE_ENCODING, REFRESH_BUTTON, GOTOURL_BUTTON, CHANGE_ENCODING,
SANDWICH_BUTTON, VIEW_SOURCE, EDIT_SOURCE, OPEN_FILE, SANDWICH_BUTTON,
NEW_WINDOW, VIEW_HISTORY, DOWNLOAD_MANAGER, CLEAR_CACHE, OPEN_FILE, NEW_WINDOW, VIEW_HISTORY, DOWNLOAD_MANAGER,
UPDATE_BROWSER, IN_NEW_TAB, IN_NEW_WINDOW, COPY_LINK_URL, CLEAR_CACHE, UPDATE_BROWSER, IN_NEW_TAB, IN_NEW_WINDOW,
DOWNLOAD_LINK_CT, TAB_ID, COPY_LINK_URL, DOWNLOAD_LINK_CT, TAB_ID,
TAB_CLOSE_ID = 900 TAB_CLOSE_ID = 900
}; };
@@ -107,4 +112,4 @@ char editbox_icons[] = FROM "res/editbox_icons.raw";
#define DEFAULT_URL URL_SERVICE_HOMEPAGE #define DEFAULT_URL URL_SERVICE_HOMEPAGE
char version[]="WebView 3.66-3"; char version[]="WebView 3.8";

View File

@@ -2,15 +2,16 @@
<head> <head>
<title>Homepage</title> <title>Homepage</title>
</head> </head>
<body><pre>Bookmarks: <body><pre>Welcome to WebView a Text-Based Browser.
Bookmarks:
1. <a href=//kolibrios.org>KolibriOS homepage</a> 1. <a href=//kolibrios.org>KolibriOS homepage</a>
2. <a href=//kolibri-n.org>KolibriN homepage</a> 2. <a href="//builds.kolibrios.org">Night-builds</a>
3. <a href="//builds.kolibrios.org">Night-builds</a> 3. <a href="//ftp.kolibrios.org">KolibriOS FTP</a>
4. <a href="//store.kolibri-n.org">Kolibri Stuff</a>
<font bg=#F8F15B>By the way,</font> <font bg=#F8F15B>By the way,</font>
<font color="#555555">&bull; You can check for browser updates from the main menu. <font color="#555555">&bull; You can check for browser updates from the main menu.
&bull; To run a web search, type a text in the adress box and press Ctrl+Enter. &bull; To run a web search, type a text in the adress box and press Ctrl+Enter.
&bull; You can also use other <a href=WebView:help><font color=555555>Hotkeys</font></a>. &bull; Pressing F6 moves a text cursor to the omnibox.
&bull; Click on a label in the bottom right corner to change the encoding of a page. &bull; Click on a label in the bottom right corner to change the encoding of a page.
</font> </font>

View File

@@ -4,14 +4,13 @@
<title><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD></title> <title><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD></title>
</head> </head>
<body><pre><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <body><pre><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
1. <a href=//kolibrios.org><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> KolibriOS</a> 1. <a href=//kolibrios.org><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> KolibriOS</a>
2. <a href=//kolibri-n.org>KolibriN10</a> 2. <a href="//builds.kolibrios.org"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᡮન</a>
3. <a href="//builds.kolibrios.org"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᡮન</a> 3. <a href="//ftp.kolibrios.org">KolibriOS FTP</a>
4. <a href="//store.kolibri-n.org">Kolibri Store</a>
<font bg=#F8F15B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,</font> <font bg=#F8F15B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,</font>
<font color="#555555">&bull; <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <font color="#555555">&bull; <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
&bull; <20><><EFBFBD> <20><><EFBFBD><20> Google <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ctrl+Enter &bull; <20><><EFBFBD> <20><><EFBFBD><20> Google <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ctrl+Enter
&bull; <20><><EFBFBD><EFBFBD><><E2A0AA> <20><><EFBFBD> <a href=WebView:help><font color=555555><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></font></a>. &bull; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> F6 <20><><EFBFBD><EFBFBD><><EFBFBD><E2AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
&bull; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><><EFBFBD><E0A0AD><EFBFBD>, <20><><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><> <20><><EFBFBD><EFBFBD>. &bull; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><><EFBFBD><E0A0AD><EFBFBD>, <20><><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><> <20><><EFBFBD><EFBFBD>.
</font> </font>

View File

@@ -2,23 +2,22 @@
<title>TEST</title> <title>TEST</title>
<style>a {display:block;font-size:130%;margin:5px 40px 5px 0;}</style> <style>a {display:block;font-size:130%;margin:5px 40px 5px 0;}</style>
<body> <body>
<pre> <pre><a href=//wiby.org>wiby.org</a>
<a href=//kolibrios.org>KolibriOS</a> <a href=//www.xlr8yourmac.com/OSX/os_x_network_cards.html>OSX network cards</a>
<a href=//kolibri-n.org>KolibriN10</a> <a href=//macintoshgarden.org/>Macintosh Garden</a>
<a href=//store.kolibri-n.org>Kolibri Store</a>
<table><tr><td>Simplest: <table><tr><td>Simplest:
<a href=//nostalgy.net.ru/>nostalgy.net.ru</a> <a href=//nostalgy.net.ru/>nostalgy.net.ru</a>
<a href=//pci-ids.ucw.cz>pci.ids</a> <a href=//pci-ids.ucw.cz>pci.ids</a>
<a href=//dgmag.in>dgmag.in</a> <a href=//dgmag.in>dgmag.in</a>
<a href=//bash.im>bash.im</a> <a href=//web.archive.org/web/https://bash.im>bash.im</a>
<a href=//opennet.ru>opennet</a> <a href=//web.archive.org/web/https://opennet.ru>opennet</a>
<a href=//linux.org.ru>LOR</a> <a href=//linux.org.ru>LOR</a>
<a href=//baravy.by/me/b.html>baravy.by/me/b.html</a> <a href=//web.archive.org/web/https://samlib.ru/b>samlib.ru/b</a>
<a href=//samlib.ru/b>samlib.ru/b</a> <a href=//web.archive.org/web/https://mirrors.pdp-11.ru>mirrors.pdp-11.ru</a>
<a href=//mirrors.pdp-11.ru>mirrors.pdp-11.ru</a> <a href=//web.archive.org/web/http://gona.mactar.hu/ATI_Mac/>ATI drivers for Mac</a>
<td>Simple: <td>Simple:
<a href=//lionovsky.us>lionovsky.us</a> <a href=//web.archive.org/web/http://lionovsky.us>lionovsky.us</a>
<a href=//os-menuet.narod.ru>os-menuet.narod.ru</a> <a href=//os-menuet.narod.ru>os-menuet.narod.ru</a>
<a href=//mestack.narod.ru/index.html>mestack.narod.ru</a> <a href=//mestack.narod.ru/index.html>mestack.narod.ru</a>
<a href=//coolthemes.narod.ru/indexold.html>coolthemes.narod.ru</a> <a href=//coolthemes.narod.ru/indexold.html>coolthemes.narod.ru</a>
@@ -34,8 +33,7 @@ Moderate:
<a href=//www.weitek.com/textual/support/driver.html>weitek</a> <a href=//www.weitek.com/textual/support/driver.html>weitek</a>
<a href=//www.abandonwarering.com/?Page=Listing>abandonware</a> <a href=//www.abandonwarering.com/?Page=Listing>abandonware</a>
<td>Complex: <td>Complex:
<a href=//artcon.ru>artcon.ru</a> <a href=//web.archive.org/web/https://artcon.ru>artcon.ru</a>
<a href=//nubo.ru>nubo.ru</a> <a href=//nubo.ru>nubo.ru</a>
<a href=//salinc.ru>salinc.ru</a>
<a href=//electromyne.de>electromyne.de</a> <a href=//electromyne.de>electromyne.de</a>
<a href=//www.thg.ru/graphic/25year_ati_history>tom's hardware</a> <a href=//web.archive.org/web/20190403215447//www.thg.ru/>thg</a>

View File

@@ -7,8 +7,8 @@
#define TABS_MAX 5 #define TABS_MAX 5
TWebBrowser tabdata[TABS_MAX+1]=0; TWebBrowser tabdata[TABS_MAX+1];
_history tabstory[TABS_MAX+1]=0; _history tabstory[TABS_MAX+1];
struct TAB struct TAB
{ {

View File

@@ -17,8 +17,10 @@
#define T_STATUS_DL_P2 " M<> <20><><EFBFBD><EFBFBD><EFBFBD> (" #define T_STATUS_DL_P2 " M<> <20><><EFBFBD><EFBFBD><EFBFBD> ("
#define T_STATUS_DL_P3 " K<>/<EFBFBD>) " #define T_STATUS_DL_P3 " K<>/<EFBFBD>) "
#define FILE_SAVED_AS "'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>\n<><6E><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> %s' -Dt" #define T_ERROR_TOO_MANY_REDIRECTS "'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>\n<><6E><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>४⮢ (HTTP 3XX)' -Et"
#define FILE_NOT_SAVED "'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>\n<><EFBFBD><E8A8A1>! <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD> <20><><EFBFBD>\n%s' -Et"
#define T_FILE_SAVED_AS "'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>\n<><6E><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD> <20><><EFBFBD> %s' -Dt"
#define T_FILE_NOT_SAVED "'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>\n<><EFBFBD><E8A8A1>! <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD> <20><><EFBFBD>\n%s' -Et"
#define T_ERROR_STARTING_DOWNLOAD "'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᪠稢<E1AAA0><E7A8A2><EFBFBD><EFBFBD>.\n<><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><E1AEA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>୥⮬.' -E" #define T_ERROR_STARTING_DOWNLOAD "'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᪠稢<E1AAA0><E7A8A2><EFBFBD><EFBFBD>.\n<><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><E1AEA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>୥⮬.' -E"
char accept_language[]= "Accept-Language: ru\n"; char accept_language[]= "Accept-Language: ru\n";
#else #else
@@ -38,8 +40,10 @@
#define T_STATUS_DL_P2 " MB received (" #define T_STATUS_DL_P2 " MB received ("
#define T_STATUS_DL_P3 " KB/s) " #define T_STATUS_DL_P3 " KB/s) "
#define FILE_SAVED_AS "'Download manager\nFile saved as %s' -Dt" #define T_ERROR_TOO_MANY_REDIRECTS "'Download manager\nToo many redirects' -Et"
#define FILE_NOT_SAVED "'Download manager\nError! Can\96t save file as %s' -Et"
#define T_FILE_SAVED_AS "'Download manager\nFile saved as %s' -Dt"
#define T_FILE_NOT_SAVED "'Download manager\nError! Can\96t save file as %s' -Et"
#define T_ERROR_STARTING_DOWNLOAD "'Error while starting download process.\nCheck entered path and Internet connection.' -E" #define T_ERROR_STARTING_DOWNLOAD "'Error while starting download process.\nCheck entered path and Internet connection.' -E"
char accept_language[]= "Accept-Language: en\n"; char accept_language[]= "Accept-Language: en\n";
#endif #endif

View File

@@ -11,6 +11,8 @@ bool open_file = false;
dword speed; dword speed;
int redirect_count;
_http http; _http http;
checkbox autoclose = { T_AUTOCLOSE, false }; checkbox autoclose = { T_AUTOCLOSE, false };
@@ -228,6 +230,7 @@ void InitDownload()
pb.progress_color = PB_COL_PROGRESS; pb.progress_color = PB_COL_PROGRESS;
filepath = '\0'; filepath = '\0';
active_status = T_STATUS_READY; active_status = T_STATUS_READY;
redirect_count = 0;
} }
void MonitorProgress() void MonitorProgress()
@@ -241,6 +244,13 @@ void MonitorProgress()
DrawDownloadingProgress(); DrawDownloadingProgress();
} else { } else {
if (http.status_code >= 300) && (http.status_code < 400) { if (http.status_code >= 300) && (http.status_code < 400) {
redirect_count++;
if (redirect_count >= 5) {
notify(T_ERROR_TOO_MANY_REDIRECTS);
ProcessButtonClick(BTN_STOP);
EditBox_UpdateText(#ed, ed_focus + ed_always_focus);
return;
}
http.header_field("location", #redirect_url, URL_SIZE); http.header_field("location", #redirect_url, URL_SIZE);
get_absolute_url(#redirect_url, #uEdit); get_absolute_url(#redirect_url, #uEdit);
edit_box_set_text stdcall (#ed, #redirect_url); edit_box_set_text stdcall (#ed, #redirect_url);
@@ -307,9 +317,9 @@ void SaveFile(int attempt)
} }
if (CreateFile(http.content_received, http.content_pointer, #filepath)==0) { if (CreateFile(http.content_received, http.content_pointer, #filepath)==0) {
miniprintf(#notify_message, FILE_SAVED_AS, #filepath); miniprintf(#notify_message, T_FILE_SAVED_AS, #filepath);
} else { } else {
miniprintf(#notify_message, FILE_NOT_SAVED, #filepath); miniprintf(#notify_message, T_FILE_NOT_SAVED, #filepath);
} }
if (!autoclose.checked) notify(#notify_message); if (!autoclose.checked) notify(#notify_message);

View File

@@ -13,7 +13,6 @@ struct collection_int
dword buf; dword buf;
dword buf_size; dword buf_size;
unsigned count; unsigned count;
void alloc();
void add(); void add();
dword get(); dword get();
dword set(); dword set();
@@ -22,34 +21,35 @@ struct collection_int
dword get_last(); dword get_last();
void pop(); void pop();
void drop(); void drop();
#define DWSIZE4 4
}; };
:void collection_int::alloc() {
if (!buf) {
buf_size = 4096;
buf = malloc(4096);
} else {
buf_size += 4096;
buf = realloc(buf, buf_size);
}
}
:void collection_int::add(dword _in) { :void collection_int::add(dword _in) {
if (!buf) || (count * sizeof(dword) >= buf_size) alloc(); unsigned i;
EAX = count * sizeof(dword) + buf; if (!buf) {
ESDWORD[EAX] = _in; //if (buf_size) notify("'buf_size on empty buf' -A");
buf_size = 4096 * 5;
buf = malloc(4096 * 5);
//if (!buf) notify("'malloc error' -E");
} else if (count + 1 * DWSIZE4 >= buf_size) {
buf_size += 4096 * 5;
buf = realloc(buf, buf_size);
//if (!buf) notify("'realloc error' -E");
}
i = count * DWSIZE4 + buf;
ESDWORD[i] = _in;
count++; count++;
} }
:dword collection_int::get(dword pos) { :dword collection_int::get(dword pos) {
if (pos<0) || (pos>=count) return 0; if (!buf) || (pos<0) || (pos>=count) return 0;
return ESDWORD[pos * sizeof(dword) + buf]; return ESDWORD[pos * DWSIZE4 + buf];
} }
:dword collection_int::set(dword pos, _in) { :dword collection_int::set(dword pos, _in) {
while (pos >= count) add(0); while (pos >= count) add(0);
EAX = pos * sizeof(dword) + buf; EAX = pos * DWSIZE4 + buf;
ESDWORD[EAX] = _in; ESDWORD[EAX] = _in;
return ESDWORD[EAX]; return ESDWORD[EAX];
} }
@@ -57,8 +57,8 @@ struct collection_int
:void collection_int::swap(dword pos1, pos2) { :void collection_int::swap(dword pos1, pos2) {
while (pos1 >= count) add(0); while (pos1 >= count) add(0);
while (pos2 >= count) add(0); while (pos2 >= count) add(0);
EAX = pos1 * sizeof(dword) + buf; EAX = pos1 * DWSIZE4 + buf;
EBX = pos2 * sizeof(dword) + buf; EBX = pos2 * DWSIZE4 + buf;
ESDWORD[EAX] >< ESDWORD[EBX]; ESDWORD[EAX] >< ESDWORD[EBX];
} }
@@ -77,6 +77,8 @@ struct collection_int
:void collection_int::drop() { :void collection_int::drop() {
count = 0; count = 0;
if (buf) buf = free(buf);
buf_size = 0;
} }
/*======================================================== /*========================================================
@@ -87,12 +89,11 @@ struct collection_int
struct collection struct collection
{ {
int realloc_size, count; unsigned int realloc_size, count;
dword data_start; dword data_start;
dword data_size; dword data_size;
collection_int offset; collection_int offset;
int add(); dword add();
int addn();
dword get(); //get_name_by_pos dword get(); //get_name_by_pos
dword get_pos_by_name(); dword get_pos_by_name();
void drop(); void drop();
@@ -105,28 +106,22 @@ struct collection
if (realloc_size<4096) realloc_size = 4096; if (realloc_size<4096) realloc_size = 4096;
if (!data_size) { if (!data_size) {
data_size = realloc_size; data_size = realloc_size;
data_start = malloc(realloc_size); data_start = malloc(data_size);
} } else {
else {
data_size = data_size + realloc_size; data_size = data_size + realloc_size;
data_start = realloc(data_start, data_size); data_start = realloc(data_start, data_size);
} }
} }
:int collection::add(dword in) { :dword collection::add(dword in) {
return addn(in, strlen(in)); dword len = strlen(in);
} while (offset.get(count) + len + 4 > data_size) {
:int collection::addn(dword in, len) {
if (offset.get(count)+len+2 > data_size) {
increase_data_size(); increase_data_size();
addn(in, len);
return 1;
} }
strncpy(data_start+offset.get(count), in, len); strncpy(data_start+offset.get(count), in, len);
count++; count++;
offset.set(count, offset.get(count-1) + len + 1); offset.set(count, offset.get(count-1) + len + 1);
return 1; return data_start+offset.get(count-1);
} }
:dword collection::get(dword pos) { :dword collection::get(dword pos) {
@@ -141,7 +136,9 @@ struct collection
:dword collection::get_pos_by_name(dword name) { :dword collection::get_pos_by_name(dword name) {
dword i; dword i;
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
if (strcmp(data_start + offset.get(i), name)==0) return i; if (streq(data_start + offset.get(i), name)) {
return i;
}
} }
return -1; return -1;
} }

View File

@@ -57,8 +57,8 @@ inline fastcall void utf8rutodos( ESI)
while (BL=ESBYTE[ESI]) while (BL=ESBYTE[ESI])
{ {
if (BL == 0xD0) || (BL == 0xD1) EDI--; if (BL == 0xD0) || (BL == 0xD1) EDI--;
else if (BL == 0x81) && (ESBYTE[ESI-1]==0xD0) ESBYTE[EDI] = 0xF0; //<EFBFBD> else if (BL == 0x81) && (ESBYTE[ESI-1]==0xD0) ESBYTE[EDI] = 0xF0; //I urk
else if (BL == 0x91) && (ESBYTE[ESI-1]==0xD1) ESBYTE[EDI] = 0xF1; //<EFBFBD> else if (BL == 0x91) && (ESBYTE[ESI-1]==0xD1) ESBYTE[EDI] = 0xF1; //i urk
//0xE2 0x80 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //0xE2 0x80 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if (BL == 0xE2) && (ESBYTE[ESI+1]==0x80) else if (BL == 0xE2) && (ESBYTE[ESI+1]==0x80)
switch (ESBYTE[ESI+2]) switch (ESBYTE[ESI+2])

View File

@@ -202,7 +202,7 @@ struct proc_info
byte reserved[1024-71]; byte reserved[1024-71];
}; };
:void GetProcessInfo(dword _process_struct_pointer, _process_id) :int GetProcessInfo(dword _process_struct_pointer, _process_id)
{ {
EAX = 9; EAX = 9;
EBX = _process_struct_pointer; EBX = _process_struct_pointer;

View File

@@ -70,17 +70,17 @@ char aURIunescape[] = "unescape";
#define FLAG_TRANSFER_FAILED 1 << 20 #define FLAG_TRANSFER_FAILED 1 << 20
struct http_msg{ struct http_msg{
dword socket; dword socket; //socket on which the actual transfer happens
dword flags; dword flags; //flags, reflects status of the transfer using bitflags
dword write_ptr; dword write_ptr; //internal use only (where to write new data in buffer)
dword buffer_length; dword buffer_length; //internal use only (number of available bytes in buffer)
dword chunk_ptr; dword chunk_ptr; //internal use only (where the next chunk begins)
dword timestamp; dword timestamp; //internal use only (when last data was received)
dword status; dword status; //HTTP status
dword header_length; dword header_length; //length of HTTP header
dword content_ptr; dword content_ptr; //ptr to content
dword content_length; dword content_length; //total length of HTTP content
dword content_received; dword content_received; //number of currently received content bytes
char http_header; char http_header;
}; };

View File

@@ -30,8 +30,7 @@ enum {
proc_info Process; proc_info Process;
for (i=0; i<MAX_PROCESS_COUNT; i++) for (i=0; i<MAX_PROCESS_COUNT; i++)
{ {
GetProcessInfo(#Process, i); if (i > GetProcessInfo(#Process, i)) break;
if (EAX+1 >= i) break;
if (Process.status_slot != TSTATE_FREE) if (Process.status_slot != TSTATE_FREE)
&& (strcmpi(#Process.name, proc_name)==0) && (strcmpi(#Process.name, proc_name)==0)
{ {
@@ -46,8 +45,7 @@ enum {
proc_info Process; proc_info Process;
for (i=0; i<MAX_PROCESS_COUNT; i++) for (i=0; i<MAX_PROCESS_COUNT; i++)
{ {
GetProcessInfo(#Process, i); if (i > GetProcessInfo(#Process, i)) break;
if (EAX+1 >= i) break;
if (Process.status_slot != TSTATE_FREE) if (Process.status_slot != TSTATE_FREE)
&& (strcmpi(#Process.name, proc_name)==0) && (strcmpi(#Process.name, proc_name)==0)
count++; count++;
@@ -66,8 +64,7 @@ enum {
GetProcessInfo(#Self, -1); GetProcessInfo(#Self, -1);
for (i=0; i<MAX_PROCESS_COUNT; i++) for (i=0; i<MAX_PROCESS_COUNT; i++)
{ {
GetProcessInfo(#Process, i); if (i > GetProcessInfo(#Process, i)) break;
if (EAX+1 >= i) break;
if (Process.name) if (Process.name)
&& (Process.ID != Self.ID) && (Process.ID != Self.ID)
KillProcess(Process.ID); KillProcess(Process.ID);

View File

@@ -0,0 +1,2 @@
if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("aclock.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "aclock")

View File

@@ -16,44 +16,42 @@
; along with this program; if not, write to the Free Software ; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
bits 32 use32
%include 'mos.inc' org 0
section .text db 'MENUET01'
dd 1,main,image_end,memory_end,stacktop,cmdLine,0
include '../../macros.inc'
include '../../proc32.inc'
include '../../KOSfuncs.inc'
;******************************************************************** ;********************************************************************
; configuration stuff ; configuration stuff
;******************************************************************** ;********************************************************************
; skinned window borders
%define APPNAME "Clock" MOS_WND_SKIN_BORDER_LEFT = 5
%define STACKSIZE 1024 MOS_WND_SKIN_BORDER_RIGHT = 5
MOS_WND_SKIN_BORDER_BOTTOM = 5
; default window position/dimensions (work area) ; default window position/dimensions (work area)
%define DEFAULT_XPOS -20 DEFAULT_XPOS =-20
%define DEFAULT_YPOS 20 DEFAULT_YPOS =20
%define DEFAULT_WIDTH 110 DEFAULT_WIDTH =110
%define DEFAULT_HEIGHT 110 DEFAULT_HEIGHT =110
; minimal size (horizontal and vertical) of work area ; minimal size (horizontal and vertical) of work area
%define MIN_WIDTH 100 MIN_WIDTH =100
%define MIN_HEIGHT 100 MIN_HEIGHT =100
;********************************************************************
; header
;********************************************************************
MOS_HEADER01 main,image_end,memory_end,stacktop-4,cmdLine,0
; these includes introduce code and thus mustn't stand ; these includes introduce code and thus mustn't stand
; before the menuet header =) ; before the menuet header =)
%include 'dbgboard.inc' include 'dbgboard.inc'
%include 'strlen.inc' include 'strfunct.inc'
%include 'str2dwrd.inc' include 'cmdline.inc'
%include 'strtok.inc' include 'adjstwnd.inc'
%include 'cmdline.inc' include 'draw.inc'
%include 'adjstwnd.inc'
%include 'draw.inc'
;******************************************************************** ;********************************************************************
; main program ; main program
@@ -89,20 +87,18 @@ main:
; call drawClock ; call drawClock
; wait up to a second for next event ; wait up to a second for next event
mov eax,MOS_SC_WAITEVENTTIMEOUT mcall SF_WAIT_EVENT_TIMEOUT,100
mov ebx,100
int 0x40
test eax,eax test eax,eax
jne .event_occured jne .event_occured
call drawClock call drawClock
.event_occured: .event_occured:
cmp eax,MOS_EVT_REDRAW cmp eax,EV_REDRAW
je .redraw je .redraw
cmp eax,MOS_EVT_KEY cmp eax,EV_KEY
je .key je .key
cmp eax,MOS_EVT_BUTTON cmp eax,EV_BUTTON
je .button je .button
jmp .msgpump jmp .msgpump
@@ -110,12 +106,10 @@ main:
call drawWindow call drawWindow
jmp .msgpump jmp .msgpump
.key: .key:
mov eax,MOS_SC_GETKEY mcall SF_GET_KEY
int 0x40
jmp .msgpump jmp .msgpump
.button: .button:
mov eax,MOS_SC_EXIT mcall SF_TERMINATE_PROCESS
int 0x40
jmp .msgpump jmp .msgpump
@@ -128,11 +122,7 @@ main:
getDefaultWindowColors: getDefaultWindowColors:
pushad pushad
pushfd pushfd
mov eax,MOS_SC_WINDOWPROPERTIES mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,wndColors,sizeof.system_colors
mov ebx,3
mov ecx,wndColors
mov edx,MOS_WNDCOLORS_size
int 0x40
popfd popfd
popad popad
ret ret
@@ -149,29 +139,24 @@ drawWindow:
pusha pusha
; start window redraw ; start window redraw
mov eax,MOS_SC_REDRAWSTATUS mcall SF_REDRAW,SSF_BEGIN_DRAW
mov ebx,1
int 0x40
; create window ; create window
mov eax,MOS_SC_DEFINEWINDOW
mov ebx,[wndXPos] mov ebx,[wndXPos]
shl ebx,16 shl ebx,16
or ebx,[wndWidth] or ebx,[wndWidth]
mov ecx,[wndYPos] mov ecx,[wndYPos]
shl ecx,16 shl ecx,16
or ecx,[wndHeight] or ecx,[wndHeight]
mov edx,[wndColors+MOS_WNDCOLORS.work] mov edx,[wndColors.work]
or edx,0x53000000 or edx,0x53000000
mov edi,label mov edi,w_label
int 0x40 mcall SF_CREATE_WINDOW
call drawClock call drawClock
; end window redraw ; end window redraw
mov eax,MOS_SC_REDRAWSTATUS mcall SF_REDRAW,SSF_END_DRAW
mov ebx,2
int 0x40
popa popa
ret ret
@@ -188,32 +173,29 @@ wndWidth dd DEFAULT_WIDTH
wndHeight dd DEFAULT_HEIGHT wndHeight dd DEFAULT_HEIGHT
; window label ; window label
label db APPNAME,0 w_label: db "Clock",0
LABEL_LEN equ ($-label-1) .end:
LABEL_LEN equ (w_label.end-w_label-1)
; token delimiter list for command line ; token delimiter list for command line
delimiters db 9,10,11,12,13,32,0 delimiters db 9,10,11,12,13,32,0
; don't insert anything after this label
image_end: image_end:
;******************************************************************** ;********************************************************************
; uninitialized data ; uninitialized data
;******************************************************************** ;********************************************************************
section .bss align=4 align 4
wndColors system_colors
wndColors resb MOS_WNDCOLORS_size procInfo process_information
procInfo resb MOS_PROCESSINFO_size
; space for command line. at the end we have an additional ; space for command line. at the end we have an additional
; byte for a terminating zero, just to be sure... ; byte for a terminating zero, just to be sure...
cmdLine resb 257 cmdLine rb 257
alignb 4 align 4
stack resb STACKSIZE rb 1024
stacktop: stacktop:
; don't insert anything after this label
memory_end: memory_end:

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -20,8 +20,6 @@
; along with this program; if not, write to the Free Software ; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
; ;
%ifndef _ADJSTWND_INC
%define _ADJSTWND_INC
;window types ;window types
@@ -72,8 +70,7 @@ adjustWindowDimensions:
; clamp window dimensions ; clamp window dimensions
.clamp: .clamp:
mov eax,MOS_SC_GETSCREENMAX ; get screen dimensions mcall SF_GET_SCREEN_SIZE ; get screen dimensions
int 0x40
mov edi,eax ; edi = screen width mov edi,eax ; edi = screen width
shr edi,16 shr edi,16
mov ebp,eax ; ebp = screen height mov ebp,eax ; ebp = screen height
@@ -136,12 +133,10 @@ adjustWindowDimensions:
add edx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT add edx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT
; adjust height (esi). we need the skin height to do this. ; adjust height (esi). we need the skin height to do this.
push ebx push ebx
mov eax,MOS_SC_WINDOWPROPERTIES mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
mov ebx,4
int 0x40
lea esi,[esi+eax+MOS_WND_SKIN_BORDER_BOTTOM] lea esi,[esi+eax+MOS_WND_SKIN_BORDER_BOTTOM]
pop ebx pop ebx
jmp .clamp jmp .clamp
%endif

View File

@@ -0,0 +1,3 @@
@fasm.exe -m 16384 aclock.asm aclock.kex
@kpack aclock.kex
pause

View File

@@ -17,8 +17,6 @@
; along with this program; if not, write to the Free Software ; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
; ;
%ifndef _CMDLINE_INC
%define _CMDLINE_INC
;******************************************************************** ;********************************************************************
@@ -105,8 +103,7 @@ parseCommandLine:
; output : eax contains position ; output : eax contains position
; destroys : nothing ; destroys : nothing
parsePositionParam: parsePositionParam:
push ebx push ebx esi
push esi
pushfd pushfd
; is the second char of the parameter a '-' ? ; is the second char of the parameter a '-' ?
@@ -129,8 +126,7 @@ parsePositionParam:
.rotationshyperboloid: .rotationshyperboloid:
popfd popfd
pop esi pop esi ebx
pop ebx
ret ret
; parse dimension parameter ; parse dimension parameter
@@ -147,5 +143,4 @@ parseSizeParam:
ret ret
%endif

View File

@@ -19,20 +19,34 @@
; along with this program; if not, write to the Free Software ; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
; ;
%ifndef _DBGBOARD_INC
%define _DBGBOARD_INC
%ifdef DEBUG if DEBUG eq
macro DBG_BOARD_PRINTNEWLINE {
}
macro DBG_BOARD_PRINTCHAR c1 {
}
macro DBG_BOARD_PRINTDWORD w1 {
}
macro DBG_BOARD_PRINTSTRINGLITERAL p1 {
}
macro DBG_BOARD_PRINTSTRING s1 {
}
else
;******************************************************************** ;********************************************************************
; print newline ; print newline
; no input ; no input
;******************************************************************** ;********************************************************************
%macro DBG_BOARD_PRINTNEWLINE 0 macro DBG_BOARD_PRINTNEWLINE {
call dbg_board_printnewline call dbg_board_printnewline
%endm }
;******************************************************************** ;********************************************************************
@@ -44,12 +58,12 @@
; DBG_BOARD_PRINTCHAR [esi] ; DBG_BOARD_PRINTCHAR [esi]
; DBG_BOARD_PRINTCHAR [somevariable] ; DBG_BOARD_PRINTCHAR [somevariable]
;******************************************************************** ;********************************************************************
%macro DBG_BOARD_PRINTCHAR 1 macro DBG_BOARD_PRINTCHAR c1 {
push ecx push ecx
mov cl,byte %1 mov cl,byte c1
call dbg_board_printchar call dbg_board_printchar
pop ecx pop ecx
%endm }
@@ -60,10 +74,10 @@
; DBG_BOARD_PRINTDWORD 0xdeadbeef ; DBG_BOARD_PRINTDWORD 0xdeadbeef
; DBG_BOARD_PRINTDWORD [somevariable] ; DBG_BOARD_PRINTDWORD [somevariable]
;******************************************************************** ;********************************************************************
%macro DBG_BOARD_PRINTDWORD 1 macro DBG_BOARD_PRINTDWORD w1 {
push dword %1 push dword w1
call dbg_board_printdword call dbg_board_printdword
%endm }
;******************************************************************** ;********************************************************************
@@ -73,13 +87,14 @@
; examples DBG_BOARD_PRINTSTRINGLITERAL "foo",0 ; examples DBG_BOARD_PRINTSTRINGLITERAL "foo",0
; DBG_BOARD_PRINTSTRINGLITERAL "bar",10,13,0 ; DBG_BOARD_PRINTSTRINGLITERAL "bar",10,13,0
;******************************************************************** ;********************************************************************
%macro DBG_BOARD_PRINTSTRINGLITERAL 1+ macro DBG_BOARD_PRINTSTRINGLITERAL p1 {
jmp %%bar local .foo
%%foo db %1, 0 ; terminate string, just to be sure jmp @f
%%bar: .foo db p1, 0 ; terminate string, just to be sure
push dword %%foo @@:
push dword .foo
call dbg_board_printstring call dbg_board_printstring
%endm }
;******************************************************************** ;********************************************************************
@@ -89,22 +104,18 @@
; DBG_BOARD_PRINTSTRING esi ; DBG_BOARD_PRINTSTRING esi
; DBG_BOARD_PRINTSTRING [ebx] ; DBG_BOARD_PRINTSTRING [ebx]
;******************************************************************** ;********************************************************************
%macro DBG_BOARD_PRINTSTRING 1 macro DBG_BOARD_PRINTSTRING s1 {
push dword %1 push dword s1
call dbg_board_printstring call dbg_board_printstring
%endm }
; no input ; no input
dbg_board_printnewline: dbg_board_printnewline:
pushad pushad
pushfd pushfd
mov eax,MOS_SC_DEBUGBOARD mcall SF_BOARD,SSF_DEBUG_WRITE,10
mov ebx,1 mcall ,,13
mov ecx,10
int 0x40
mov ecx,13
int 0x40
popfd popfd
popad popad
ret ret
@@ -114,10 +125,8 @@ dbg_board_printnewline:
dbg_board_printchar: dbg_board_printchar:
pushad pushad
pushfd pushfd
mov eax,MOS_SC_DEBUGBOARD
mov ebx,1
and ecx,0xff and ecx,0xff
int 0x40 mcall SF_BOARD,SSF_DEBUG_WRITE
popfd popfd
popad popad
ret ret
@@ -128,19 +137,16 @@ dbg_board_printdword:
enter 0,0 enter 0,0
pushad pushad
pushfd pushfd
mov eax,MOS_SC_DEBUGBOARD ; print 0x prefix
mov ebx,1 mcall SF_BOARD,SSF_DEBUG_WRITE,'0'
mov ecx,'0' ; print 0x prefix mcall ,,'x'
int 0x40
mov ecx,'x'
int 0x40
mov edx,[ebp + 8] ; get dword to print mov edx,[ebp + 8] ; get dword to print
mov esi,8 ; iterate through all nibbles mov esi,8 ; iterate through all nibbles
.loop: .loop:
mov ecx,edx ; display hex digit mov ecx,edx ; display hex digit
shr ecx,28 shr ecx,28
movzx ecx,byte [dbg_board_printdword_digits + ecx] movzx ecx,byte [dbg_board_printdword_digits + ecx]
int 0x40 mcall
shl edx,4 ; next nibble shl edx,4 ; next nibble
dec esi dec esi
jnz .loop jnz .loop
@@ -166,8 +172,7 @@ dbg_board_printstring:
or al,al ; zero ? or al,al ; zero ?
je .done ; yeah -> get outta here je .done ; yeah -> get outta here
movzx ecx,al ; nope -> display character movzx ecx,al ; nope -> display character
mov eax,MOS_SC_DEBUGBOARD mcall SF_BOARD
int 0x40
jmp .loop jmp .loop
.done: .done:
popfd popfd
@@ -175,26 +180,5 @@ dbg_board_printstring:
leave leave
ret 4 ret 4
%else end if
%macro DBG_BOARD_PRINTNEWLINE 0
%endm
%macro DBG_BOARD_PRINTCHAR 1
%endm
%macro DBG_BOARD_PRINTDWORD 1
%endm
%macro DBG_BOARD_PRINTSTRINGLITERAL 1+
%endm
%macro DBG_BOARD_PRINTSTRING 1
%endm
%endif
%endif

View File

@@ -17,8 +17,6 @@
; along with this program; if not, write to the Free Software ; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
; ;
%ifndef _DRAW_INC
%define _DRAW_INC
TMR1_FACTOR dd 0.45 TMR1_FACTOR dd 0.45
@@ -50,45 +48,36 @@ monthNames:
; output : nothing ; output : nothing
; destroys : nothing ; destroys : nothing
;******************************************************************** ;********************************************************************
drawClock: proc drawClock
%push drawClock_context locals
%stacksize flat i dd ?
%assign %$localsize 0 TMR1X dd ?
TMR1Y dd ?
%local i:dword, \ TMR2X dd ?
TMR1X:dword, \ TMR2Y dd ?
TMR1Y:dword, \ SECRX dd ?
TMR2X:dword, \ SECRY dd ?
TMR2Y:dword, \ MINRX dd ?
SECRX:dword, \ MINRY dd ?
SECRY:dword, \ HOURRX dd ?
MINRX:dword, \ HOURRY dd ?
MINRY:dword, \ workwidth dd ?
HOURRX:dword, \ workheight dd ?
HOURRY:dword, \ foo dd ?
workwidth:dword, \ endl
workheight:dword, \
foo:dword
enter %$localsize,0
pushad pushad
pushfd pushfd
; get window dimensions ; get window dimensions
mov eax,MOS_SC_GETPROCESSINFO mcall SF_THREAD_INFO,procInfo,-1
mov ebx,procInfo
mov ecx,-1
int 0x40
; calculate work area size (width/height = ecx/edx) ; calculate work area size (width/height = ecx/edx)
; if the work area is too small (maybe the window is shaded) ; if the work area is too small (maybe the window is shaded)
; we don't draw anything. ; we don't draw anything.
mov eax,MOS_SC_WINDOWPROPERTIES mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT ; get skin height (eax)
mov ebx,4 ; get skin height (eax) mov ecx,[procInfo.box.width]
int 0x40
mov ecx,[procInfo + MOS_PROCESSINFO.wndWidth]
sub ecx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT sub ecx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT
mov edx,[procInfo + MOS_PROCESSINFO.wndHeight] mov edx,[procInfo.box.height]
sub edx,eax sub edx,eax
sub edx,MOS_WND_SKIN_BORDER_BOTTOM sub edx,MOS_WND_SKIN_BORDER_BOTTOM
cmp ecx,0 ; width too small ? cmp ecx,0 ; width too small ?
@@ -102,9 +91,9 @@ drawClock:
mov [workheight],edx mov [workheight],edx
; calculate center of clock (x/y = esi/edi) ; calculate center of clock (x/y = esi/edi)
mov esi,[procInfo + MOS_PROCESSINFO.wndWidth] mov esi,[procInfo.box.width]
shr esi,1 shr esi,1
mov edi,[procInfo + MOS_PROCESSINFO.wndHeight] mov edi,[procInfo.box.height]
sub edi,MOS_WND_SKIN_BORDER_BOTTOM sub edi,MOS_WND_SKIN_BORDER_BOTTOM
sub edi,eax sub edi,eax
shr edi,1 shr edi,1
@@ -119,9 +108,8 @@ drawClock:
shl ecx,16 ; (=skin height) shl ecx,16 ; (=skin height)
or ecx,edx ; height or ecx,edx ; height
inc ecx inc ecx
mov edx,[wndColors + MOS_WNDCOLORS.work] mov edx,[wndColors.work]
mov eax,MOS_SC_DRAWBAR mcall SF_DRAW_RECT
int 0x40
popad popad
; calculate second hand radii ; calculate second hand radii
@@ -163,8 +151,7 @@ drawClock:
fstp dword [TMR2Y] fstp dword [TMR2Y]
; get system clock (edx) ; get system clock (edx)
mov eax,MOS_SC_GETSYSCLOCK mcall SF_GET_SYS_TIME
int 0x40
mov edx,eax mov edx,eax
; draw second hand ; draw second hand
@@ -173,21 +160,14 @@ drawClock:
shr eax,16 shr eax,16
call bcdbin call bcdbin
mov ecx,eax ; save seconds for later mov ecx,eax ; save seconds for later
push ecx ; 2*pi/60
push eax stdcall getHandCoords,edi,esi,[SECRY],[SECRX],0.104719755,eax,ecx
fpush32 0.104719755 ; 2*pi/60
push dword [SECRX]
push dword [SECRY]
push esi
push edi
call getHandCoords
mov eax,MOS_SC_DRAWLINE
shl ebx,16 shl ebx,16
or ebx,esi or ebx,esi
shl ecx,16 shl ecx,16
or ecx,edi or ecx,edi
mov edx,[wndColors + MOS_WNDCOLORS.workText] mov edx,[wndColors.work_text]
int 0x40 mcall SF_DRAW_LINE
pop ecx pop ecx
pop edx pop edx
@@ -200,21 +180,14 @@ drawClock:
mul edx mul edx
add eax,ecx add eax,ecx
mov ecx,eax ; save for later mov ecx,eax ; save for later
push ecx ; 2*pi/60/60
push eax stdcall getHandCoords,edi,esi,[MINRY],[MINRX],0.001745329,eax,ecx
fpush32 0.001745329 ; 2*pi/60/60
push dword [MINRX]
push dword [MINRY]
push esi
push edi
call getHandCoords
mov eax,MOS_SC_DRAWLINE
shl ebx,16 shl ebx,16
or ebx,esi or ebx,esi
shl ecx,16 shl ecx,16
or ecx,edi or ecx,edi
mov edx,[wndColors + MOS_WNDCOLORS.workText] mov edx,[wndColors.work_text]
int 0x40 mcall SF_DRAW_LINE
pop ecx pop ecx
pop edx pop edx
@@ -229,55 +202,39 @@ drawClock:
mov edx,60*60 mov edx,60*60
mul edx mul edx
add eax,ecx add eax,ecx
push eax ; 2*pi/60/60/12
fpush32 0.000145444 ; 2*pi/60/60/12 stdcall getHandCoords,edi,esi,[HOURRY],[HOURRX],0.000145444,eax
push dword [HOURRX]
push dword [HOURRY]
push esi
push edi
call getHandCoords
mov eax,MOS_SC_DRAWLINE
shl ebx,16 shl ebx,16
or ebx,esi or ebx,esi
shl ecx,16 shl ecx,16
or ecx,edi or ecx,edi
mov edx,[wndColors + MOS_WNDCOLORS.workText] mov edx,[wndColors.work_text]
int 0x40 mcall SF_DRAW_LINE
pop edx pop edx
; draw tick marks ; draw tick marks
mov dword [i],11 ; draw 12 marks mov dword [i],11 ; draw 12 marks
.drawtickmarks: .drawtickmarks:
push dword [i] ; calculate start point ; calculate start point
fpush32 0.523598776 ; 2*pi/12 ; 2*pi/12
push dword [TMR1X] stdcall getHandCoords,edi,esi,[TMR1Y],[TMR1X],0.523598776,[i]
push dword [TMR1Y]
push esi
push edi
call getHandCoords
mov eax,ebx ; save in eax and edx mov eax,ebx ; save in eax and edx
mov edx,ecx mov edx,ecx
push dword [i] ; 2*pi/12
fpush32 0.523598776 ; 2*pi/12 stdcall getHandCoords,edi,esi,[TMR2Y],[TMR2X],0.523598776,[i]
push dword [TMR2X]
push dword [TMR2Y]
push esi
push edi
call getHandCoords
shl eax,16 shl eax,16
shl edx,16 shl edx,16
or ebx,eax ; ebx = x start and end or ebx,eax ; ebx = x start and end
or ecx,edx ; ecx = y start and end or ecx,edx ; ecx = y start and end
mov edx,[wndColors + MOS_WNDCOLORS.workText] mov edx,[wndColors.work_text]
mov eax,MOS_SC_DRAWLINE mcall SF_DRAW_LINE
int 0x40
dec dword [i] dec dword [i]
jns .drawtickmarks jns .drawtickmarks
%define DATE_WIDTH 48 DATE_WIDTH =48
; calculate text start position ; calculate text start position
mov eax,[procInfo+MOS_PROCESSINFO.wndWidth] mov eax,[procInfo.box.width]
sub eax,DATE_WIDTH ; x = (wndwidth-textwidth)/2 sub eax,DATE_WIDTH ; x = (wndwidth-textwidth)/2
shr eax,1 ; eax = x shr eax,1 ; eax = x
fild dword [workheight] ; y = DATE_FACTOR*workheight... fild dword [workheight] ; y = DATE_FACTOR*workheight...
@@ -292,7 +249,7 @@ drawClock:
jb .goodbye jb .goodbye
mov ecx,ebx ; text too high ? mov ecx,ebx ; text too high ?
add ecx,10-1 add ecx,10-1
mov edx,[procInfo+MOS_PROCESSINFO.wndHeight] mov edx,[procInfo.box.height]
sub edx,MOS_WND_SKIN_BORDER_BOTTOM sub edx,MOS_WND_SKIN_BORDER_BOTTOM
cmp ecx,edx cmp ecx,edx
jnae .yousuck jnae .yousuck
@@ -306,8 +263,7 @@ drawClock:
or ebx,eax or ebx,eax
; get date (edi) ; get date (edi)
mov eax,MOS_SC_GETDATE mcall SF_GET_SYS_DATE
int 0x40
mov edi,eax mov edi,eax
; display month ; display month
@@ -315,44 +271,41 @@ drawClock:
shr eax,8 shr eax,8
call bcdbin call bcdbin
; ebx contains already position ; ebx contains already position
mov ecx,[wndColors+MOS_WNDCOLORS.workText] mov ecx,[wndColors.work_text]
lea edx,[monthNames-3+eax*2+eax]; -3 because eax = 1..12 =] lea edx,[monthNames-3+eax*2+eax]; -3 because eax = 1..12 =]
mov esi,3 ; text length mov esi,3 ; text length
mov eax,MOS_SC_WRITETEXT mcall SF_DRAW_TEXT
int 0x40
; display date ; display date
add ebx,MOS_DWORD(3*6+3,0) add ebx,(3*6+3) shl 16
mov eax,edi ; get date mov eax,edi ; get date
shr eax,16 shr eax,16
call bcdbin call bcdbin
mov edx,ebx ; position must be in edx mov edx,ebx ; position must be in edx
mov ebx,0x00020000 ; number, display two digits mov ebx,0x00020000 ; number, display two digits
mov ecx,eax ; number to display mov ecx,eax ; number to display
mov esi,[wndColors+MOS_WNDCOLORS.workText] mov esi,[wndColors.work_text]
mov eax,MOS_SC_WRITENUMBER mcall SF_DRAW_NUMBER
int 0x40
; display year. the way we avoid the y2k bug is even ; display year. the way we avoid the y2k bug is even
; simpler, yet much better than in the last version: ; simpler, yet much better than in the last version:
; now we simply display the last two digits and let the ; now we simply display the last two digits and let the
; user decide wether it's the year 1903 or 2003 =] ; user decide wether it's the year 1903 or 2003 =]
add edx,MOS_DWORD(2*6+3,0) add edx,(2*6+3) shl 16
mov eax,edi ; get year mov eax,edi ; get year
call bcdbin call bcdbin
mov ebx,0x00020000 ; number, display two digits mov ebx,0x00020000 ; number, display two digits
mov ecx,eax ; number to display mov ecx,eax ; number to display
; edx contains already position ; edx contains already position
mov esi,[wndColors+MOS_WNDCOLORS.workText] mov esi,[wndColors.work_text]
mov eax,MOS_SC_WRITENUMBER mcall SF_DRAW_NUMBER
int 0x40
.byebye: .byebye:
popfd popfd
popad popad
leave ;leave
ret ret
%pop endp
;********************************************************** ;**********************************************************
@@ -397,36 +350,26 @@ bcdbin:
; destroys: ; destroys:
; nothing ; nothing
;******************************************************************** ;********************************************************************
getHandCoords: proc getHandCoords CENTERY:dword, CENTERX:dword, RADIUSY:dword, RADIUSX:dword, DEG2RAD:dword, ANGLE:dword
ANGLE equ 28
DEG2RAD equ 24
RADIUSX equ 20
RADIUSY equ 16
CENTERX equ 12
CENTERY equ 8
enter 0,0
pushfd pushfd
fild dword [ebp+ANGLE] ; get angle fild dword [ANGLE] ; get angle
fmul dword [ebp+DEG2RAD] ; convert to radians fmul dword [DEG2RAD] ; convert to radians
fsincos fsincos
fmul dword [ebp+RADIUSY] ; -y * radius + clockcy fmul dword [RADIUSY] ; -y * radius + clockcy
fchs fchs
fiadd dword [ebp+CENTERY] fiadd dword [CENTERY]
fistp dword [ebp+CENTERY] fistp dword [CENTERY]
fmul dword [ebp+RADIUSX] ; x * radius + clockcx fmul dword [RADIUSX] ; x * radius + clockcx
fiadd dword [ebp+CENTERX] fiadd dword [CENTERX]
fistp dword [ebp+CENTERX] fistp dword [CENTERX]
mov ebx,[ebp+CENTERX] mov ebx,[CENTERX]
mov ecx,[ebp+CENTERY] mov ecx,[CENTERY]
popfd popfd
leave ;leave
ret 4*6 ret
endp
%endif

View File

@@ -1,5 +1,3 @@
; some strtok-like function
;
; Copyright (c) 2003 Thomas Mathys ; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch ; killer@vantage.ch
; ;
@@ -17,8 +15,94 @@
; along with this program; if not, write to the Free Software ; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
; ;
%ifndef _STRTOK_INC
%define _STRTOK_INC
;********************************************************************
; returns the length of an asciiz string
; input : esi = pointer to string
; output : eax = string length
; destroys : nothing
;********************************************************************
strlen:
push ecx edi
pushfd
cld ; !
mov ecx,-1
mov edi,esi ; find terminating zero
xor al,al
repne scasb
mov eax,edi ; calculate string length
sub eax,esi
dec eax
popfd
pop edi ecx
ret
;********************************************************************
; converts an asciiz string into an unsigned doubleword.
; (base 10 is assumed)
;
; - first, leading whitespaces are skipped
; - then the function converts the string, until it
; finds the terminating zero, another character it
; cannot convert or the number becomes too large.
;
; input : esi = pointer to string
; output : eax = unsigned doubleword
; the function tries to convert as
; many digits as possible, before it
; stops. if the value of the dword
; becomes too large, 0xffffffff is
; returned.
; destroys : nothing
;********************************************************************
string2dword:
push ebx ecx edx esi
pushfd
xor ebx,ebx ; ebx : dword
; skip leading whitespaces
.skipspaces:
lodsb
cmp al,32 ; space
je .skipspaces
cmp al,12 ; ff
je .skipspaces
cmp al,10 ; lf
je .skipspaces
cmp al,13 ; cr
je .skipspaces
cmp al,9 ; ht
je .skipspaces
cmp al,11 ; vt
je .skipspaces
; convert string
dec esi ; esi -> 1st non-whitespace
.convert:
xor eax,eax ; get character
lodsb
sub al,'0' ; convert to digit
cmp al,9 ; is digit in range [0,9] ?
ja .done ; nope -> stop conversion
mov ecx,eax ; save new digit
mov eax,10 ; dword = dword * 10
mul ebx
jc .overflow
add eax,ecx ; + new digit
jc .overflow
mov ebx,eax
jmp .convert
.overflow:
mov ebx,0xffffffff
.done:
mov eax,ebx
popfd
pop esi edx ecx ebx
ret
;******************************************************************** ;********************************************************************
@@ -121,5 +205,3 @@ strtok:
ret ret
.adx dd 0 .adx dd 0
%endif

View File

@@ -1,2 +0,0 @@
if tup.getconfig("NO_NASM") ~= "" then return end
tup.rule("aclock.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "aclock")

View File

@@ -1,3 +0,0 @@
@rem nasm -t -f bin -o aclock -l aclock.lst aclock.asm -DDEBUG
nasmw -t -f bin -o aclock aclock.asm
@pause

View File

@@ -1,334 +0,0 @@
; mos.inc 0.03
; Copyright (c) 2002 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _MOS_INC
%define _MOS_INC
;**********************************************************
; generates a menuetos 01 header
; takes 6 parameters:
;
; MOS_HEADER01 start, end, appmem, esp, i_param, i_icon
;**********************************************************
%macro MOS_HEADER01 6
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd %1 ; start of code
dd %2 ; image size
dd %3 ; application memory
dd %4 ; esp
dd %5 ; i_param
dd %6 ; i_icon
%endmacro
;**********************************************************
; MOS_DWORD
; packs 2 words into a double word
;**********************************************************
%define MOS_DWORD(hi,lo) ((((hi) & 0xffff) << 16) + ((lo) & 0xffff))
;**********************************************************
; MOS_RGB
; creates a menuet os compatible color (0x00RRGGBB)
;**********************************************************
%define MOS_RGB(r,g,b) ((((r) & 255) << 16) + (((g) & 255) << 8) + ((b) & 255))
;**********************************************************
; window stuff
;**********************************************************
; default window colors
struc MOS_WNDCOLORS
.frame: resd 1
.grab: resd 1
.grabButton: resd 1
.grabButtonText: resd 1
.grabText: resd 1
.work: resd 1
.workButton: resd 1
.workButtonText: resd 1
.workText: resd 1
.workGraphics: resd 1
endstruc
; skinned window borders
MOS_WND_SKIN_BORDER_LEFT equ 5
MOS_WND_SKIN_BORDER_RIGHT equ 5
MOS_WND_SKIN_BORDER_BOTTOM equ 5
;**********************************************************
; process info structure
;**********************************************************
struc MOS_PROCESSINFO
.CPUUsage: resd 1
.windowStackPos: resw 1
.windowStackVal: resw 1
.reserved1: resw 1
.processName: resb 12
.memStart: resd 1
.memUsed: resd 1
.pid: resd 1
.wndXPos resd 1
.wndYPos resd 1
.wndWidth resd 1
.wndHeight resd 1
.reserved2: resb (1024 - 50)
endstruc
;**********************************************************
; system call numbers
;**********************************************************
MOS_SC_EXIT equ -1
MOS_SC_DEFINEWINDOW equ 0
MOS_SC_PUTPIXEL equ 1
MOS_SC_GETKEY equ 2
MOS_SC_GETSYSCLOCK equ 3
MOS_SC_WRITETEXT equ 4
MOS_SC_DELAY equ 5
MOS_SC_OPENFILEFLOPPY equ 6 ; obsolete
MOS_SC_PUTIMAGE equ 7
MOS_SC_DEFINEBUTTON equ 8
MOS_SC_GETPROCESSINFO equ 9
MOS_SC_WAITEVENT equ 10
MOS_SC_CHECKEVENT equ 11
MOS_SC_REDRAWSTATUS equ 12
MOS_SC_DRAWBAR equ 13
MOS_SC_GETSCREENMAX equ 14
MOS_SC_SETBACKGROUND equ 15
MOS_SC_GETPRESSEDBUTTON equ 17
MOS_SC_SYSTEMSERVICE equ 18
MOS_SC_STARTPROGRAM equ 19 ; obsolete
MOS_SC_MIDIINTERFACE equ 20
MOS_SC_DEVICESETUP equ 21
MOS_SC_WAITEVENTTIMEOUT equ 23
MOS_SC_CDAUDIO equ 24
MOS_SC_SB16MIXER1 equ 25
MOS_SC_GETDEVICESETUP equ 26
MOS_SC_WSS equ 27
MOS_SC_SB16MIXER2 equ 28
MOS_SC_GETDATE equ 29
MOS_SC_READHD equ 30 ; obsolete
MOS_SC_STARTPROGRAMHD equ 31 ; obsolete
MOS_SC_DELETEFILEFLOPPY equ 32
MOS_SC_SAVEFILERAMDISK equ 33 ; obsolete
MOS_SC_READDIRRAMDISK equ 34 ; obsolete
MOS_SC_GETSCREENPIXEL equ 35
MOS_SC_GETMOUSEPOSITION equ 37
MOS_SC_DRAWLINE equ 38
MOS_SC_GETBACKGROUND equ 39
MOS_SC_SETEVENTMASK equ 40
MOS_SC_GETIRQOWNER equ 41
MOS_SC_GETDATAREADBYIRQ equ 42
MOS_SC_SENDDATATODEVICE equ 43
MOS_SC_PROGRAMIRQS equ 44
MOS_SC_RESERVEFREEIRQ equ 45
MOS_SC_RESERVEFREEPORTS equ 46
MOS_SC_WRITENUMBER equ 47
MOS_SC_WINDOWPROPERTIES equ 48
MOS_SC_SHAPEDWINDOWS equ 50
MOS_SC_CREATETHREAD equ 51
MOS_SC_STACKDRIVERSTATE equ 52
MOS_SC_SOCKETINTERFACE equ 53
MOS_SC_SOUNDINTERFACE equ 55
MOS_SC_WRITEFILEHD equ 56 ; obsolete
MOS_SC_DELETEFILEHD equ 57
MOS_SC_SYSTREEACCESS equ 58
MOS_SC_SYSCALLTRACE equ 59
MOS_SC_IPC equ 60
MOS_SC_DIRECTGRAPHICS equ 61
MOS_SC_PCI equ 62
MOS_SC_DEBUGBOARD equ 63
;**********************************************************
; event numbers
;**********************************************************
MOS_EVT_NONE equ 0
MOS_EVT_REDRAW equ 1
MOS_EVT_KEY equ 2
MOS_EVT_BUTTON equ 3
;**********************************************************
; event bits
;**********************************************************
MOS_EVTBIT_REDRAW equ (1 << 0)
MOS_EVTBIT_KEY equ (1 << 1)
MOS_EVTBIT_BUTTON equ (1 << 2)
MOS_EVTBIT_ENDREQUEST equ (1 << 3)
MOS_EVTBIT_BGDRAW equ (1 << 4)
MOS_EVTBIT_MOUSECHANGE equ (1 << 5)
MOS_EVTBIT_IPCEVENT equ (1 << 6)
MOS_EVTBIT_IRQ0 equ (1 << 16)
MOS_EVTBIT_IRQ1 equ (1 << 17)
MOS_EVTBIT_IRQ2 equ (1 << 18)
MOS_EVTBIT_IRQ3 equ (1 << 19)
MOS_EVTBIT_IRQ4 equ (1 << 20)
MOS_EVTBIT_IRQ5 equ (1 << 21)
MOS_EVTBIT_IRQ6 equ (1 << 22)
MOS_EVTBIT_IRQ7 equ (1 << 23)
MOS_EVTBIT_IRQ8 equ (1 << 24)
MOS_EVTBIT_IRQ9 equ (1 << 25)
MOS_EVTBIT_IRQ10 equ (1 << 26)
MOS_EVTBIT_IRQ11 equ (1 << 27)
MOS_EVTBIT_IRQ12 equ (1 << 28)
MOS_EVTBIT_IRQ13 equ (1 << 29)
MOS_EVTBIT_IRQ14 equ (1 << 30)
MOS_EVTBIT_IRQ15 equ (1 << 31)
;**********************************************************
; exit application (syscall -1)
;**********************************************************
; exit application
%macro MOS_EXIT 0
mov eax,MOS_SC_EXIT
int 0x40
%endmacro
; exit application, smaller version
%macro MOS_EXIT_S 0
xor eax,eax
dec eax
int 0x40
%endmacro
;**********************************************************
; wait event stuff
; (MOS_SC_WAITEVENT, syscall 10)
;**********************************************************
; wait for event
; destroys : nothing
; returns : eax = event type
%macro MOS_WAITEVENT 0
mov eax,MOS_SC_WAITEVENT
int 0x40
%endmacro
; wait for event, smaller version
; destroys : flags
; returns : eax = event type
%macro MOS_WAITEVENT_S 0
xor eax,eax
mov al,MOS_SC_WAITEVENT
int 0x40
%endmacro
;**********************************************************
; window redraw status stuff
; (MOS_SC_REDRAWSTATUS, syscall 12)
;**********************************************************
MOS_RS_STARTREDRAW equ 1
MOS_RS_ENDREDRAW equ 2
; start window redraw
; destroys: eax,ebx
%macro MOS_STARTREDRAW 0
mov ebx,MOS_RS_STARTREDRAW
mov eax,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
; start window redraw, smaller version
; destroys: eax,ebx,flags
%macro MOS_STARTREDRAW_S 0
xor ebx,ebx
inc ebx
xor eax,eax
mov al,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
; end window redraw
; destroys: eax,ebx
%macro MOS_ENDREDRAW 0
mov ebx,MOS_RS_ENDREDRAW
mov eax,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
; end window redraw, smaller version
; destroys: eax,ebx,flags
%macro MOS_ENDREDRAW_S 0
xor ebx,ebx
mov bl,MOS_RS_ENDREDRAW
xor eax,eax
mov al,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
;**********************************************************
; get screen max stuff (syscall 14)
;**********************************************************
; get screen dimensions in eax
; destroys: nothing
%macro MOS_GETSCREENMAX 0
mov eax,MOS_SC_GETSCREENMAX
int 0x40
%endmacro
; get screen dimensions in eax, smaller version
; destroys: flags
%macro MOS_GETSCREENMAX_S 0
xor eax,eax
mov al,MOS_SC_GETSCREENMAX
int 0x40
%endmacro
;********************************************************************
; opcode hacks
;********************************************************************
; nasm refuses to assemble stuff like
; push dword 4.44
; with the following macro this becomes possible:
; fpush32 9.81
; don't forget to use a decimal point. things like
; fpush32 1
; will probably not do what you expect. instead, write:
; fpush32 1.0
%macro fpush32 1
db 0x68 ; push imm32
dd %1
%endm
%endif

View File

@@ -1,92 +0,0 @@
; string2dword - a useless string to double word conversion routine
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
;********************************************************************
; converts an asciiz string into an unsigned doubleword.
; (base 10 is assumed)
;
; - first, leading whitespaces are skipped
; - then the function converts the string, until it
; finds the terminating zero, another character it
; cannot convert or the number becomes too large.
;
; input : esi = pointer to string
; output : eax = unsigned doubleword
; the function tries to convert as
; many digits as possible, before it
; stops. if the value of the dword
; becomes too large, 0xffffffff is
; returned.
; destroys : nothing
;********************************************************************
string2dword:
push ebx
push ecx
push edx
push esi
pushfd
xor ebx,ebx ; ebx : dword
; skip leading whitespaces
.skipspaces:
lodsb
cmp al,32 ; space
je .skipspaces
cmp al,12 ; ff
je .skipspaces
cmp al,10 ; lf
je .skipspaces
cmp al,13 ; cr
je .skipspaces
cmp al,9 ; ht
je .skipspaces
cmp al,11 ; vt
je .skipspaces
; convert string
dec esi ; esi -> 1st non-whitespace
.convert:
xor eax,eax ; get character
lodsb
sub al,'0' ; convert to digit
cmp al,9 ; is digit in range [0,9] ?
ja .done ; nope -> stop conversion
mov ecx,eax ; save new digit
mov eax,10 ; dword = dword * 10
mul ebx
jc .overflow
add eax,ecx ; + new digit
jc .overflow
mov ebx,eax
jmp .convert
.overflow:
mov ebx,0xffffffff
.done:
mov eax,ebx
popfd
pop esi
pop edx
pop ecx
pop ebx
ret

View File

@@ -1,49 +0,0 @@
; strlen function
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _STRLEN_INC
%define _STRLEN_INC
;********************************************************************
; returns the length of an asciiz string
; input : esi = pointer to string
; output : eax = string length
; destroys : nothing
;********************************************************************
strlen:
push ecx
push edi
pushfd
cld ; !
mov ecx,-1
mov edi,esi ; find terminating zero
xor al,al
repne scasb
mov eax,edi ; calculate string length
sub eax,esi
dec eax
popfd
pop edi
pop ecx
ret
%endif

View File

@@ -0,0 +1,2 @@
if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("charsets.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "charsets")

View File

@@ -0,0 +1,33 @@
Development history
22.10.2024 - 0.1.0
- First version, display of charpages in all KOS charsets
23.10.2024 - 0.2.0
- Fixed UTF-8 display by Doczom
- Interface adaptation for skins
- Reduced redraw
- Refactored code
27.10.2024 - 0.2.5
- Fixed version in app header
- Tweaked UI colors
- Something else???
17.01.2025 - 0.3.0
- Added button to reset charpage to 00
- Functionality to pick and preview single character
- Functionality to input characters from keyboard
- Display of ASCII and SCAN codes of characters in dec and hex format
- Tweaked UI colors
17.01.2025 - 0.3.1
- Small UI fixes
- Code refactoring
- Reformatted sources, fixed indentation
and removed non-Unicode characters
07.03.2025 - 0.3.2
- Renamed to Charsets Viewer/Charsets
- Symbol highlight UI tweaks
- Fixed rolled up bug

View File

@@ -1,3 +1,8 @@
; SPDX-License-Identifier: GPL-2.0-only
; SPDX-FileCopyrightText: 2024-2025 KolibriOS Team
; ================================================================
format binary as "" format binary as ""
use32 use32
org 0 org 0
@@ -170,7 +175,8 @@ draw_window:
mcall 48, 3, window_colors, 40 mcall 48, 3, window_colors, 40
mcall , 4 mcall , 4
push eax add eax, 3
mov [win_head], eax
mov eax, 0 mov eax, 0
mov ebx, 100 * 65536 + 685 mov ebx, 100 * 65536 + 685
@@ -180,15 +186,24 @@ draw_window:
mov edi, title mov edi, title
mcall mcall
pop esi ; Don't draw rolled up or rolled down window
add esi, 495 mcall 9, proc_info, -1
mcall 67, -1, -1, -1, mov eax, [proc_info + 70]
mov [win_stat], eax
test [win_stat], 100b
jnz .draw_end
; Draw all app content
add [win_head], 492
call draw_base call draw_base
call draw_update call draw_update
call draw_toggle call draw_toggle
mcall 12, 2 .draw_end:
mov esi, [win_head]
mcall 67, -1, -1, -1,
mcall 12, 2
ret ret
@@ -399,9 +414,21 @@ draw_update:
mov al, 0x01 mov al, 0x01
mov ecx, eax mov ecx, eax
push ecx push ecx
mcall 13, 65536 * 34 + 384, , [window_colors.work_button]
add ecx, 65536 * 23 mov eax, 13
mov ebx, 65536 * 34 + 384
mov edx, [window_colors.work_button]
;skip lines aligned to table borders
cmp ecx, 65536 * 34 + 65536
jle .hl_next_hr
mcall mcall
.hl_next_hr:
add ecx, 65536 * 23
cmp ecx, 65536 * 417
jge .hl_end_hr
mcall
.hl_end_hr:
mov al, [char] mov al, [char]
and al, 0x0F and al, 0x0F
@@ -411,15 +438,28 @@ draw_update:
shl eax, 16 shl eax, 16
mov al, 0x01 mov al, 0x01
mov ebx, eax mov ebx, eax
mcall 13, , 65536 * 34 + 384, [window_colors.work_button]
add ebx, 65536 * 23 mov eax, 13
mov ecx, 65536 * 34 + 384
mov edx, [window_colors.work_button]
;skip lines aligned to table borders
cmp ebx, 65536 * 34 + 65536
jle .hl_next_vr
mcall mcall
.hl_next_vr:
add ebx, 65536 * 23
cmp ebx, 65536 * 417
jge .hl_end_vr
mcall
.hl_end_vr:
pop ecx pop ecx
add ecx, 23 add ecx, 23
sub ebx, 65535 * 23 sub ebx, 65535 * 23
mcall mcall
; redraw active symbol
shr ecx, 16 shr ecx, 16
mov bx, cx mov bx, cx
add ebx, 65536 * 8 + 5 add ebx, 65536 * 8 + 5
@@ -574,7 +614,7 @@ logic_utf16to8:
; ================================================================ ; ================================================================
title db "Charset Checker 0.3.1", 0 title db "Charsets Viewer 0.3.2", 0
lb_cp6x9 db "CP866 6x9 ", 0 lb_cp6x9 db "CP866 6x9 ", 0
lb_cp8x16 db "CP866 8x16 ", 0 lb_cp8x16 db "CP866 8x16 ", 0
@@ -609,7 +649,11 @@ char_ascii dw 0x0000, 0
char_scan dw 0x0000, 0 char_scan dw 0x0000, 0
char_utf dd 0x00000000, 0 char_utf dd 0x00000000, 0
window_colors system_colors win_stat rd 1
win_head rd 1
window_colors system_colors
proc_info process_information
; ================================================================ ; ================================================================

View File

@@ -59,7 +59,7 @@ static const unsigned char cp866_page00[24] = {
0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */
}; };
static const unsigned char cp866_page04[96] = { static const unsigned char cp866_page04[96] = {
0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0xf4, /* 0x00-0x07 */ 0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, /*0x00*/ 0x49, 0xf4, /* 0x00-0x07 */ // Fix BE and UK 'I'
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */
@@ -69,7 +69,7 @@ static const unsigned char cp866_page04[96] = {
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */
0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xf5, /* 0x50-0x57 */ 0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, /*0x00*/ 0x69, 0xf5, /* 0x50-0x57 */ // Fix BE and UK 'i'
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */
}; };
static const unsigned char cp866_page22[8] = { static const unsigned char cp866_page22[8] = {

View File

@@ -100,5 +100,4 @@ compile_gcc(MBEDTLS_SRC);
table.insert(OBJS,"mbedtls_export.o"); table.insert(OBJS,"mbedtls_export.o");
table.insert(OBJS,"mbedtls_init.o"); table.insert(OBJS,"mbedtls_init.o");
tup.rule(OBJS, "clink -o %o %f" .. " && kos32-strip %o --strip-unneeded " .. tup.getconfig("KPACK_CMD"), "mbedtls.obj"); tup.rule(OBJS, "clink -o %o %f" .. " && strip %o --strip-unneeded " .. tup.getconfig("KPACK_CMD"), "mbedtls.obj");

View File

@@ -1,2 +1,4 @@
if tup.getconfig("NO_NASM") ~= "" then return end if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("mstate.asm", "nasm -t -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "mstate") HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR")
tup.include(HELPERDIR .. "/use_fasm.lua")
tup.rule("mstate.asm", FASM .. " -dlang=" .. tup.getconfig("LANG") .. " %f %o " .. tup.getconfig("KPACK_CMD"), "mstate")

View File

@@ -0,0 +1,3 @@
@fasm.exe -m 16384 mstate.asm mstate.kex
@kpack mstate.kex
pause

View File

@@ -1 +0,0 @@
nasm -f bin mstate.asm -o mstate

View File

@@ -1,246 +1,227 @@
; This program shows state of mouse buttons ; ; SPDX-License-Identifier: GPL-2.0-only
; to compile: nasm -f bin mstate.asm -o mstate ; ; SPDX-FileCopyrightText: 2024 KolibriOS-NG Team
ORG 0
BITS 32 format binary as ""
; ---------------------------------------------------------------------------- ; use32
PATH_SIZE equ 256 org 0
PARAMS_SIZE equ 256 db 'MENUET01' ; signature
STACK_SIZE equ 256 dd 1 ; header version
; ---------------------------------------------------------------------------- ; dd start ; entry point
TEXT_WIDTH equ 6 dd _image_end ; end of image
TEXT_HEIGHT equ 9 dd _memory ; required memory size
; ---------------------------------------------------------------------------- ; dd _stacktop ; address of stack top
MOUSE_LEFT_BUTTON_MASK equ 1b dd 0 ; buffer for command line arguments
MOUSE_RIGHT_BUTTON_MASK equ 10b dd 0 ; buffer for path
MOUSE_MIDDLE_BUTTON_MASK equ 100b
; ---------------------------------------------------------------------------- ; include '../../macros.inc'
EM_REDRAW equ 1b include '../../KOSfuncs.inc'
EM_KEY equ 10b
EM_BUTTON equ 100b TEXT_WIDTH = 8
EM_RESERVED0 equ 1000b TEXT_HEIGHT = 16
EM_REDRAW_BACKGROUND equ 10000b
EM_MOUSE equ 100000b MOUSE_LEFT_BUTTON_MASK = 1b
EM_IPC equ 1000000b MOUSE_RIGHT_BUTTON_MASK = 10b
EM_NETWORK equ 10000000b MOUSE_MIDDLE_BUTTON_MASK = 100b
EM_DEBUG equ 100000000b
; ---------------------------------------------------------------------------- ; WINDOW_STYLE_SKINNED_FIXED = 0x4000000
WINDOW_STYLE_SKINNED_FIXED equ 0x4000000 WINDOW_STYLE_COORD_CLIENT = 0x20000000
WINDOW_STYLE_COORD_CLIENT equ 0x20000000 WINDOW_STYLE_CAPTION = 0x10000000
WINDOW_STYLE_CAPTION equ 0x10000000
; ---------------------------------------------------------------------------- ; WINDOW_BORDER_SIZE = 5
WINDOW_BORDER_SIZE equ 5 WINDOW_STYLE = (WINDOW_STYLE_SKINNED_FIXED or WINDOW_STYLE_COORD_CLIENT or WINDOW_STYLE_CAPTION)
; ---------------------------------------------------------------------------- ;
WINDOW_STYLE equ WINDOW_STYLE_SKINNED_FIXED | WINDOW_STYLE_COORD_CLIENT | WINDOW_STYLE_CAPTION MOUSE_BODY_COLOR = 0x007C7C96
; ---------------------------------------------------------------------------- ; MOUSE_LEFT_BUTTON_COLOR = 0x008293A4
MOUSE_BODY_COLOR equ 0x007C7C96 MOUSE_RIGHT_BUTTON_COLOR = 0x008293A4
MOUSE_LEFT_BUTTON_COLOR equ 0x008293A4 MOUSE_MIDDLE_BUTTON_COLOR = 0x00A48293
MOUSE_RIGHT_BUTTON_COLOR equ 0x008293A4 MOUSE_LEFT_BUTTON_PRESSED_COLOR = 0x00568EC7
MOUSE_MIDDLE_BUTTON_COLOR equ 0x00A48293 MOUSE_RIGHT_BUTTON_PRESSED_COLOR = 0x00568EC7
MOUSE_LEFT_BUTTON_PRESSED_COLOR equ 0x00568EC7 MOUSE_MIDDLE_BUTTON_PRESSED_COLOR = 0x00C7568E
MOUSE_RIGHT_BUTTON_PRESSED_COLOR equ 0x00568EC7 WINDOW_BACK_COLOR = 0x00EFEFEF
MOUSE_MIDDLE_BUTTON_PRESSED_COLOR equ 0x00C7568E
WINDOW_BACK_COLOR equ 0x00EFEFEF MOUSE_WIDTH = 180
; ---------------------------------------------------------------------------- ; MOUSE_HEIGHT = 240
MOUSE_WIDTH equ 120 MOUSE_MARGIN = 4
MOUSE_HEIGHT equ 240 BUTTONS_MARGIN = 2
MOUSE_MARGIN equ 4
BUTTONS_MARGIN equ 2 MOUSE_LEFT = MOUSE_MARGIN
; ---------------------------------------------------------------------------- ; MOUSE_TOP = MOUSE_MARGIN
MOUSE_LEFT equ MOUSE_MARGIN WINDOW_WIDTH = MOUSE_WIDTH + WINDOW_BORDER_SIZE * 2 + MOUSE_MARGIN * 2
MOUSE_TOP equ MOUSE_MARGIN MOUSE_BODY_HEIGHT = (MOUSE_HEIGHT - BUTTONS_MARGIN) / 2
WINDOW_WIDTH equ MOUSE_WIDTH + WINDOW_BORDER_SIZE * 2 + MOUSE_MARGIN * 2 MOUSE_BODY_TOP = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT + MOUSE_TOP
MOUSE_BODY_HEIGHT equ (MOUSE_HEIGHT - BUTTONS_MARGIN) / 2 LEFT_BUTTON_HEIGHT = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN
MOUSE_BODY_TOP equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT + MOUSE_TOP RIGHT_BUTTON_HEIGHT = MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN
LEFT_BUTTON_HEIGHT equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN LEFT_BUTTON_WIDTH = (MOUSE_WIDTH - BUTTONS_MARGIN) / 2
RIGHT_BUTTON_HEIGHT equ MOUSE_HEIGHT - MOUSE_BODY_HEIGHT - BUTTONS_MARGIN RIGHT_BUTTON_WIDTH = MOUSE_WIDTH - LEFT_BUTTON_WIDTH - BUTTONS_MARGIN
LEFT_BUTTON_WIDTH equ (MOUSE_WIDTH - BUTTONS_MARGIN) / 2 LEFT_BUTTON_LEFT = MOUSE_LEFT
RIGHT_BUTTON_WIDTH equ MOUSE_WIDTH - LEFT_BUTTON_WIDTH - BUTTONS_MARGIN RIGHT_BUTTON_LEFT = LEFT_BUTTON_LEFT + LEFT_BUTTON_WIDTH + BUTTONS_MARGIN
LEFT_BUTTON_LEFT equ MOUSE_LEFT MIDDLE_BUTTON_WIDTH = MOUSE_WIDTH / 10
RIGHT_BUTTON_LEFT equ LEFT_BUTTON_LEFT + LEFT_BUTTON_WIDTH + BUTTONS_MARGIN MIDDLE_BUTTON_HEIGHT = MOUSE_HEIGHT / 6
MIDDLE_BUTTON_WIDTH equ MOUSE_WIDTH / 10 MIDDLE_BUTTON_LEFT = (MOUSE_WIDTH - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_LEFT
MIDDLE_BUTTON_HEIGHT equ MOUSE_HEIGHT / 6 MIDDLE_BUTTON_TOP = (MOUSE_WIDTH / 2 - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_TOP
MIDDLE_BUTTON_LEFT equ (MOUSE_WIDTH - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_LEFT
MIDDLE_BUTTON_TOP equ (MOUSE_WIDTH / 2 - MIDDLE_BUTTON_WIDTH) / 2 + MOUSE_TOP ; data:
; ---------------------------------------------------------------------------- ;
%define SZ_BUTTONS_STATE "Buttons state:"
%define SZ_BIN "bin:"
%define SZ_HEX "hex:0x"
%strlen LEN_SZ_BUTTONS_STATE SZ_BUTTONS_STATE
%strlen LEN_SZ_BIN SZ_BIN
%strlen LEN_SZ_HEX SZ_HEX
; ---------------------------------------------------------------------------- ;
STATE_VALUES_HEIGHT equ 3 * TEXT_HEIGHT ; we have three lines of text
STATE_VALUES_WIDTH equ LEN_SZ_BUTTONS_STATE * TEXT_WIDTH
STATE_VALUES_TOP equ (MOUSE_BODY_HEIGHT - STATE_VALUES_HEIGHT) / 2 + MOUSE_BODY_TOP
STATE_VALUES_LEFT equ (MOUSE_WIDTH - STATE_VALUES_WIDTH) / 2 + MOUSE_LEFT
; ---------------------------------------------------------------------------- ;
MENUET01 db 'MENUET01'
version dd 1
program.start dd START
program.end dd _END
program.memory dd _END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
program.stack dd _END + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
program.params dd _END + PATH_SIZE
program.path dd _END
; ---------------------------------------------------------------------------- ;
mouse_body_color dd MOUSE_BODY_COLOR
mouse_left_button_color dd MOUSE_LEFT_BUTTON_COLOR mouse_left_button_color dd MOUSE_LEFT_BUTTON_COLOR
mouse_right_button_color dd MOUSE_RIGHT_BUTTON_COLOR mouse_right_button_color dd MOUSE_RIGHT_BUTTON_COLOR
mouse_middle_button_color dd MOUSE_MIDDLE_BUTTON_COLOR mouse_middle_button_color dd MOUSE_MIDDLE_BUTTON_COLOR
; ---------------------------------------------------------------------------- ;
mouse.button dd 0 mouse_button dd 0
; ---------------------------------------------------------------------------- ; sz_caption db "MouseState", 0
sz_caption db "MouseState",0
; ---------------------------------------------------------------------------- ; sz_button_state db "Buttons state:", 0
sz_button_state db SZ_BUTTONS_STATE,0 STATE_VALUES_WIDTH = ($ - sz_button_state - 1)*TEXT_WIDTH
sz_bin db SZ_BIN,0 sz_bin db "bin: ", 0
sz_hex db SZ_HEX,0 LEN_SZ_BIN = $ - sz_bin - 1
; ---------------------------------------------------------------------------- ; sz_hex db "hex: 0x", 0
%macro DrawMouseBody 0 LEN_SZ_HEX = $ - sz_hex - 1
; draw.rectangle
mov eax, 13 STATE_VALUES_HEIGHT = 3*TEXT_HEIGHT ; we have three lines of text
mov ebx, MOUSE_LEFT << 16 | MOUSE_WIDTH STATE_VALUES_TOP = ((MOUSE_BODY_HEIGHT - STATE_VALUES_HEIGHT) / 2 + MOUSE_BODY_TOP)
mov ecx, MOUSE_BODY_TOP << 16 | MOUSE_BODY_HEIGHT STATE_VALUES_LEFT = ((MOUSE_WIDTH - STATE_VALUES_WIDTH) / 2 + MOUSE_LEFT)
mov edx, [mouse_body_color]
int 64
; texts
mov eax, 4
mov ecx, 1100b << 28 | WINDOW_BACK_COLOR
mov edi, [mouse_body_color]
; draw.text
mov ebx, (STATE_VALUES_LEFT << 16) | STATE_VALUES_TOP
mov edx, sz_button_state
int 64
; draw.text
add ebx, TEXT_HEIGHT
mov edx, sz_bin
int 64
; draw.text
add ebx, TEXT_HEIGHT
mov edx, sz_hex
int 64
%endmacro
; ---------------------------------------------------------------------------- ;
align 4 align 4
DrawMouseButtons: draw_mouse_buttons:
mov eax, 13 mov eax, SF_DRAW_RECT
; draw.rectangle
mov ebx, LEFT_BUTTON_LEFT << 16 | LEFT_BUTTON_WIDTH mov ebx, (LEFT_BUTTON_LEFT shl 16) or LEFT_BUTTON_WIDTH
mov ecx, MOUSE_TOP << 16 | LEFT_BUTTON_HEIGHT mov ecx, (MOUSE_TOP shl 16) or LEFT_BUTTON_HEIGHT
mov edx, [mouse_left_button_color] mov edx, [mouse_left_button_color]
int 64 mcall
; draw.rectangle
mov ebx, RIGHT_BUTTON_LEFT << 16 | RIGHT_BUTTON_WIDTH mov ebx, (RIGHT_BUTTON_LEFT shl 16) or RIGHT_BUTTON_WIDTH
mov ecx, MOUSE_TOP << 16 | RIGHT_BUTTON_HEIGHT mov ecx, (MOUSE_TOP shl 16) or RIGHT_BUTTON_HEIGHT
mov edx, [mouse_right_button_color] mov edx, [mouse_right_button_color]
int 64 mcall
; draw.rectangle
mov ebx, MIDDLE_BUTTON_LEFT << 16 | MIDDLE_BUTTON_WIDTH mov ebx, (MIDDLE_BUTTON_LEFT shl 16) or MIDDLE_BUTTON_WIDTH
mov ecx, MIDDLE_BUTTON_TOP << 16 | MIDDLE_BUTTON_HEIGHT mov ecx, (MIDDLE_BUTTON_TOP shl 16) or MIDDLE_BUTTON_HEIGHT
mov edx, [mouse_middle_button_color] mov edx, [mouse_middle_button_color]
int 64 mcall
; Draw State Values ; draw state values
mov eax, 47 mov eax, SF_DRAW_NUMBER
mov esi, 0100b << 28 | WINDOW_BACK_COLOR mov esi, (0101b shl 28) or WINDOW_BACK_COLOR
mov ecx, [mouse.button] mov ecx, [mouse_button]
mov edi, [mouse_body_color] mov edi, MOUSE_BODY_COLOR
; draw.number
mov ebx, (10 << 16) | (2 << 8) ; 10 digits, base2 mov ebx, (10 shl 16) or (2 shl 8) ; 10 digits, base2
mov edx, (LEN_SZ_BIN * TEXT_WIDTH + STATE_VALUES_LEFT) << 16 | (STATE_VALUES_TOP + TEXT_HEIGHT) mov edx, ((LEN_SZ_BIN * TEXT_WIDTH + STATE_VALUES_LEFT) shl 16) or (STATE_VALUES_TOP + TEXT_HEIGHT)
int 64 mcall
; draw.number
mov ebx, (8 << 16) | (1 << 8) ; 8 digits, base16 mov ebx, (8 shl 16) or (1 shl 8) ; 8 digits, base16
mov edx, (LEN_SZ_HEX * TEXT_WIDTH + STATE_VALUES_LEFT) << 16 | (STATE_VALUES_TOP + TEXT_HEIGHT * 2) mov edx, ((LEN_SZ_HEX * TEXT_WIDTH + STATE_VALUES_LEFT) shl 16) or (STATE_VALUES_TOP + TEXT_HEIGHT * 2)
int 64 mcall
ret ret
; ---------------------------------------------------------------------------- ;
align 4 align 4
START: start:
; get.screen.size mcall SF_GET_GRAPHICAL_PARAMS, SSF_SCREEN_SIZE
mov eax, 61 mov edx, eax
mov ebx, 1 movzx ecx, ax
int 64 shr edx, 16
mov edx, eax
movzx ecx, ax mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
shr edx, 16 add eax, MOUSE_HEIGHT + WINDOW_BORDER_SIZE + MOUSE_MARGIN * 2 - 1
; skin.height mov esi, eax
mov eax, 48 sub edx, (WINDOW_WIDTH - 1)
mov ebx, 4 sub ecx, eax
int 64 shr edx, 1
add eax, MOUSE_HEIGHT + WINDOW_BORDER_SIZE + MOUSE_MARGIN * 2 - 1 shr ecx, 1
mov esi, eax
sub edx, (WINDOW_WIDTH - 1) mov eax, SF_SET_EVENTS_MASK
sub ecx, eax mov ebx, EVM_REDRAW or EVM_BUTTON or EVM_MOUSE
shr edx, 1 mcall
shr ecx, 1
; set.event
mov eax, 40
mov ebx, EM_REDRAW | EM_BUTTON | EM_MOUSE
int 64
; ---------------------------------------------------------------------------- ;
align 4 align 4
on_redraw: on_redraw:
; redraw.start mcall SF_REDRAW, SSF_BEGIN_DRAW
mov eax, 12 xor eax, eax ; SF_CREATE_WINDOW
mov ebx, 1 mov ebx, edx ; window.left
int 64
; draw.window
xor eax, eax
mov ebx, edx ; window.left
; ecx = window.top ; ecx = window.top
shl ebx, 16 shl ebx, 16
shl ecx, 16 shl ecx, 16
or ebx, (WINDOW_WIDTH - 1) or ebx, (WINDOW_WIDTH - 1)
or ecx, esi ; window.height or ecx, esi ; window.height
mov edx, WINDOW_STYLE | WINDOW_BACK_COLOR mov edx, WINDOW_STYLE or WINDOW_BACK_COLOR
mov edi, sz_caption mov edi, sz_caption
xor esi, esi xor esi, esi
int 64 mcall
; redraw.finish
mov eax, 12 mcall SF_REDRAW, SSF_END_DRAW
mov ebx, 2 ; draw mouse body:
int 64 mov eax, SF_DRAW_RECT
DrawMouseBody mov ebx, (MOUSE_LEFT shl 16) or MOUSE_WIDTH
call DrawMouseButtons mov ecx, (MOUSE_BODY_TOP shl 16) or MOUSE_BODY_HEIGHT
mov edx, MOUSE_BODY_COLOR
mcall
mov eax, SF_DRAW_TEXT
mov ecx, (1101b shl 28) or WINDOW_BACK_COLOR
mov edi, MOUSE_BODY_COLOR
mov ebx, (STATE_VALUES_LEFT shl 16) or STATE_VALUES_TOP
mov edx, sz_button_state
mcall
add ebx, TEXT_HEIGHT
mov edx, sz_bin
mcall
add ebx, TEXT_HEIGHT
mov edx, sz_hex
mcall
call draw_mouse_buttons
align 4 align 4
wait.event: wait_event:
mov eax, 10 ; redraw = 001b; 001b & 110b = 000b mcall SF_WAIT_EVENT
int 64 ; button = 011b; 011b & 110b = 010b cmp eax, EV_REDRAW
test eax, 110b ; mouse = 110b; 110b & 110b = 110b je on_redraw
jz on_redraw cmp eax, EV_BUTTON
jnp on_button je on_button
; get.mouse.button ; otherwise mouse:
mov eax, 37
mov ebx, 2 mcall SF_MOUSE_GET, SSF_BUTTON
int 64 cmp [mouse_button], eax ; if equal, then no need update
cmp [mouse.button], eax ; if equal je wait_event
je wait.event ; then no need update mov ebx, dword MOUSE_LEFT_BUTTON_COLOR
mov ebx, dword MOUSE_LEFT_BUTTON_COLOR mov ecx, dword MOUSE_RIGHT_BUTTON_COLOR
mov ecx, dword MOUSE_RIGHT_BUTTON_COLOR mov edx, dword MOUSE_MIDDLE_BUTTON_COLOR
mov edx, dword MOUSE_MIDDLE_BUTTON_COLOR
.left: .left:
test eax, MOUSE_LEFT_BUTTON_MASK test eax, MOUSE_LEFT_BUTTON_MASK
jz .right jz .right
mov ebx, dword MOUSE_LEFT_BUTTON_PRESSED_COLOR mov ebx, dword MOUSE_LEFT_BUTTON_PRESSED_COLOR
.right: .right:
test eax, MOUSE_RIGHT_BUTTON_MASK test eax, MOUSE_RIGHT_BUTTON_MASK
jz .middle jz .middle
mov ecx, dword MOUSE_RIGHT_BUTTON_PRESSED_COLOR mov ecx, dword MOUSE_RIGHT_BUTTON_PRESSED_COLOR
.middle: .middle:
test eax, MOUSE_MIDDLE_BUTTON_MASK test eax, MOUSE_MIDDLE_BUTTON_MASK
jz .other jz .other
mov edx, dword MOUSE_MIDDLE_BUTTON_PRESSED_COLOR mov edx, dword MOUSE_MIDDLE_BUTTON_PRESSED_COLOR
.other: .other:
mov [mouse_left_button_color], ebx mov [mouse_left_button_color], ebx
mov [mouse_right_button_color], ecx mov [mouse_right_button_color], ecx
mov [mouse_middle_button_color], edx mov [mouse_middle_button_color], edx
mov [mouse.button], eax mov [mouse_button], eax
call DrawMouseButtons call draw_mouse_buttons
jmp wait.event jmp wait_event
align 4 align 4
on_button: ; terminate because we have only one button(close button) on_button:
or eax, -1 ; terminate because we have only one button (close)
int 64 mcall SF_TERMINATE_PROCESS
; ---------------------------------------------------------------------------- ;
align 4 align 16
_END: _image_end:
; reserve for stack:
rb 256
align 16
_stacktop:
_memory:

View File

@@ -1,2 +1,2 @@
if tup.getconfig("NO_NASM") ~= "" then return end if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("lod.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "lod") tup.rule("lod.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "lod")

View File

@@ -0,0 +1,3 @@
@fasm.exe -m 16384 lod.asm lod.kex
@kpack lod.kex
pause

View File

@@ -8,11 +8,20 @@
; Author 0CodErr ; Author 0CodErr
; http://board.kolibrios.org/viewtopic.php?f=9&t=2486 ; http://board.kolibrios.org/viewtopic.php?f=9&t=2486
ORG 0 use32
BITS 32 org 0
; ---------------------------------------------------------------------------- ; db 'MENUET01'
PARAMS_SIZE equ 256 version dd 1
STACK_SIZE equ 256 dd program.start
dd program.end
dd program.memory
dd program.stack
dd program.params
dd 0
; ---------------------------- ;
include '../../macros.inc'
include '../../KOSfuncs.inc'
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
PROCINFO_SIZE equ 1024 PROCINFO_SIZE equ 1024
FILENAME_AREA_SIZE equ 256 FILENAME_AREA_SIZE equ 256
@@ -21,18 +30,10 @@ OPENFILE_PATH_SIZE equ 4096
FILTER_AREA_SIZE equ 256 FILTER_AREA_SIZE equ 256
FILTER_BRACKET equ "*" ; and for example: LOD *bmp,png,jpeg*/sys/media/kiv FILTER_BRACKET equ "*" ; and for example: LOD *bmp,png,jpeg*/sys/media/kiv
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
MENUET01 db 'MENUET01' align 4
version dd 1 program.start:
program.start dd START mov edi, program.params
program.end dd END cmp [edi], dword 0
program.memory dd END + PARAMS_SIZE + STACK_SIZE
program.stack dd END + PARAMS_SIZE + STACK_SIZE
program.params dd END
program.path dd 0
; ---------------------------------------------------------------------------- ;
START:
mov edi,[program.params]
cmp [edi],dword 0
je terminate je terminate
call FakeDrawWindow call FakeDrawWindow
@@ -43,19 +44,13 @@ START:
je terminate je terminate
mov [file_info.params], eax mov [file_info.params], eax
launch_program: launch_program:
mov eax, 70 mcall SF_FILE, file_info
mov ebx, file_info
int 64
terminate: terminate:
or eax, -1 mcall SF_TERMINATE_PROCESS
int 64
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
OpenDialogInit: OpenDialogInit:
; load.library ; load.library
mov eax, 68 mcall SF_SYS_MISC,SSF_LOAD_DLL, sz_proc_lib
mov ebx, 19
mov ecx, sz_proc_lib
int 64
mov [proclib], eax mov [proclib], eax
push dword[proclib] push dword[proclib]
@@ -68,10 +63,7 @@ OpenDialogInit:
call GetProcAddress call GetProcAddress
mov [opendialog_start], eax mov [opendialog_start], eax
; memory.allocate ; memory.allocate
mov eax, 68 mcall SF_SYS_MISC,SSF_MEM_ALLOC, PROCINFO_SIZE + FILENAME_AREA_SIZE + OPENDIR_PATH_SIZE + OPENFILE_PATH_SIZE
mov ebx, 12
mov ecx, PROCINFO_SIZE + FILENAME_AREA_SIZE + OPENDIR_PATH_SIZE + OPENFILE_PATH_SIZE
int 64
mov [od.procinfo], eax mov [od.procinfo], eax
add eax, PROCINFO_SIZE add eax, PROCINFO_SIZE
@@ -121,13 +113,9 @@ GetProcAddress:
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
FakeDrawWindow: FakeDrawWindow:
; redraw.start ; redraw.start
mov eax, 12 mcall SF_REDRAW,SSF_BEGIN_DRAW
mov ebx, 1
int 64
; get.screen.size ; get.screen.size
mov eax, 61 mcall SF_GET_GRAPHICAL_PARAMS,SSF_SCREEN_SIZE
mov ebx, 1
int 64
shr eax, 1 shr eax, 1
and eax, 0x7FFF7FFF and eax, 0x7FFF7FFF
; draw.window ; draw.window
@@ -136,17 +124,13 @@ FakeDrawWindow:
shr eax, 16 shr eax, 16
movzx ebx, ax movzx ebx, ax
shl ebx, 16 shl ebx, 16
mov edx, 0x01000000 mcall SF_CREATE_WINDOW,,, 0x01000000
xor eax, eax
int 64
; redraw.finish ; redraw.finish
mov eax, 12 mcall SF_REDRAW,SSF_END_DRAW
mov ebx, 2
int 64
ret ret
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
OpenDialogSetFilter: OpenDialogSetFilter:
mov edi, [program.params] mov edi, program.params
mov esi, filefilter + 4 mov esi, filefilter + 4
; skip spaces ; skip spaces
or ecx, -1 or ecx, -1
@@ -195,22 +179,17 @@ OpenDialogSetFilter:
LaunchProgram: LaunchProgram:
mov eax, [od.openfile_path] mov eax, [od.openfile_path]
mov [file_info.params], eax mov [file_info.params], eax
mov eax, 70 mcall SF_FILE, file_info
mov ebx, file_info
int 64
ret ret
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
file_info: file_info:
dd 7 dd SSF_START_APP,0
dd 0 .params dd 0,0,0
.params dd 0
dd 0
dd 0
db 0 db 0
.file_path dd 0 .file_path dd 0
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
filefilter dd 0 filefilter dd 0
resb FILTER_AREA_SIZE rb FILTER_AREA_SIZE
.end db 0 .end db 0
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
od: od:
@@ -242,4 +221,10 @@ proclib dd 0
opendialog_init dd 0 opendialog_init dd 0
opendialog_start dd 0 opendialog_start dd 0
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
END: align 4
program.end:
program.params rb 256
rb 256
align 16
program.stack:
program.memory:

View File

@@ -1,2 +0,0 @@
nasm -f bin LOD.asm -o LOD
pause

View File

@@ -1,7 +1,7 @@
if tup.getconfig("NO_NASM") ~= "" then return end if tup.getconfig("NO_FASM") ~= "" then return end
-- tup.rule is too unmannerly to %define HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR")
tup.definerule{ tup.include(HELPERDIR .. "/use_fasm.lua")
command = "echo %%define lang '" .. ((tup.getconfig("LANG") == "") and "en_US" or tup.getconfig("LANG")) .. "'> %o", add_include(tup.getvariantdir())
outputs = {"lang_nasm.inc"}
} tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "en_US" or tup.getconfig("LANG")) .. " > %o", {"lang.inc"})
tup.rule({"c4.asm", extra_inputs = {"lang_nasm.inc"}}, "nasm -I" .. tup.getvariantdir() .. "/ -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "c4") tup.rule({"c4.asm", extra_inputs = {"lang.inc"}}, FASM .. " %f %o " .. tup.getconfig("KPACK_CMD"), "c4")

View File

@@ -18,16 +18,11 @@
; along with C4; if not, write to the Free Software ; along with C4; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%ifndef _AI_INC
%define _AI_INC
INFTY equ 1000000000 INFTY equ 1000000000
section .data
; table used to perform some primitive move "ordering": ; table used to perform some primitive move "ordering":
; middle columns which are usually more important are ; middle columns which are usually more important are
; searched first. ; searched first.
@@ -46,18 +41,10 @@ evaltable: dd 0, 0, 0, 0, 0, 0, 0, 0, 0
dd 0, 0, 0, 0, 0, 0, 0, 0, 0 dd 0, 0, 0, 0, 0, 0, 0, 0, 0
cpulevel rd 1 ; level of current cpu player
section .bss bestval rd 1 ; value of best move found so far
nbestmoves rd 1 ; # of best moves found so far
cpulevel resd 1 ; level of current cpu player bestmoves rd 7 ; array to hold all best moves
bestval resd 1 ; value of best move found so far
nbestmoves resd 1 ; # of best moves found so far
bestmoves resd 7 ; array to hold all best moves
section .text
;********************************************************** ;**********************************************************
@@ -148,15 +135,16 @@ aiGetMove:
; output : eax = move value ; output : eax = move value
; destroys : everything ; destroys : everything
;********************************************************** ;**********************************************************
align 4
alphabeta: alphabeta:
%define ply (ebp+20) ply equ (ebp+20)
%define player (ebp+16) player equ (ebp+16)
%define alpha (ebp+12) alpha equ (ebp+12)
%define beta (ebp+ 8) beta equ (ebp+ 8)
enter 0,0
push ebp
mov ebp,esp
; win for other player -> end search ; win for other player -> end search
mov eax,[player] mov eax,[player]
BOARDGETOTHERPLAYER eax BOARDGETOTHERPLAYER eax
@@ -262,9 +250,8 @@ alphabeta:
leave ; eax contains static value leave ; eax contains static value
ret 4*4 ret 4*4
%undef ply purge ply
%undef player purge player
%undef alpha purge alpha
%undef beta purge beta
%endif

View File

@@ -18,9 +18,6 @@
; along with C4; if not, write to the Free Software ; along with C4; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%ifndef _BOARD_INC
%define _BOARD_INC
;********************************************************** ;**********************************************************
; magic numbers ; magic numbers
@@ -36,27 +33,15 @@ BHEIGHT equ 8
;********************************************************** board rd BHEIGHT*BWIDTH ; the board
; uninitialized data free rd BWIDTH ; # of free fields for each column
;********************************************************** totalfree rd 1 ; total # of free fields
currentplayer rd 1 ; player to make next move
section .bss lastmove rd 1 ; last move done on the board
board resd BHEIGHT*BWIDTH ; the board
free resd BWIDTH ; # of free fields for each column
totalfree resd 1 ; total # of free fields
currentplayer resd 1 ; player to make next move
lastmove resd 1 ; last move done on the board
; (0 if no last move available) ; (0 if no last move available)
;**********************************************************
; code
;**********************************************************
section .text
;********************************************************** ;**********************************************************
; boardReset ; boardReset
@@ -102,9 +87,9 @@ boardReset:
; zero flag clear -> move is valid ; zero flag clear -> move is valid
; destroys : nothing ; destroys : nothing
;********************************************************** ;**********************************************************
%macro BOARDISVALIDMOVE 1 macro BOARDISVALIDMOVE p1 {
cmp dword [free+%1*4],0 cmp dword [free+p1*4],0
%endmacro }
@@ -160,9 +145,9 @@ boardUndoMove:
; output : current player is switched ; output : current player is switched
; destroys : flags ; destroys : flags
;********************************************************** ;**********************************************************
%macro BOARDSWITCHPLAYERS 0 macro BOARDSWITCHPLAYERS {
xor dword [currentplayer],(PLAYER1 ^ PLAYER2) xor dword [currentplayer],(PLAYER1 xor PLAYER2)
%endmacro }
@@ -174,9 +159,9 @@ boardUndoMove:
; output : player changed ; output : player changed
; destroys : flags ; destroys : flags
;********************************************************** ;**********************************************************
%macro BOARDGETOTHERPLAYER 1 macro BOARDGETOTHERPLAYER r1 {
xor %1,(PLAYER1 ^ PLAYER2) xor r1,(PLAYER1 xor PLAYER2)
%endmacro }
@@ -188,9 +173,9 @@ boardUndoMove:
; output : zero flag set -> board is full ; output : zero flag set -> board is full
; zero flag clear -> board isn't full ; zero flag clear -> board isn't full
;********************************************************** ;**********************************************************
%macro BOARDISFULL 0 macro BOARDISFULL {
cmp dword [totalfree],0 cmp dword [totalfree],0
%endmacro }
@@ -313,6 +298,3 @@ boardIsWin:
; no win for this player ; no win for this player
xor eax,eax xor eax,eax
ret ret
%endif

View File

@@ -1,2 +0,0 @@
@nasmw -f bin -o c4 c4.asm
@pause

View File

@@ -0,0 +1,4 @@
@echo lang fix en_EN >lang.inc
@fasm.exe -m 16384 c4.asm c4.kex
@kpack c4.kex
pause

View File

@@ -0,0 +1,4 @@
@echo lang fix ru_RU >lang.inc
@fasm.exe -m 16384 c4.asm c4.kex
@kpack c4.kex
pause

View File

@@ -18,14 +18,15 @@
; along with C4; if not, write to the Free Software ; along with C4; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
bits 32 use32
%include 'mos.inc' org 0
section .text db 'MENUET01'
%include 'lang_nasm.inc' ;fedesco dd 1,start,i_end,mem,stacktop,0,0
MOS_HEADER01 start,end
include '../../macros.inc'
include '../../proc32.inc'
include '../../KOSfuncs.inc'
include 'lang.inc' ;fedesco
;********************************************************** ;**********************************************************
@@ -46,11 +47,20 @@ BUTTON_HEIGHT equ 12
BUTTON_NEW_X equ 14 BUTTON_NEW_X equ 14
BUTTON_NEW_Y equ 30 BUTTON_NEW_Y equ 30
%ifidn lang, 'it_IT' BUTTON_NEW_HEIGHT equ 32
BUTTON_NEW_WIDTH equ 56 + 28 if lang eq it_IT
%else BUTTON_NEW_WIDTH = 56 + 28
BUTTON_NEW_WIDTH equ 56 LABEL_PL1_X = 90 + 10
%endif LABEL_PL1TYPE_X = (LABEL_PL1_X + 10*6 - 4)
else if lang eq ru_RU
BUTTON_NEW_WIDTH = 56 + 12
LABEL_PL1_X = 90
LABEL_PL1TYPE_X = (LABEL_PL1_X + 10*6)
else
BUTTON_NEW_WIDTH = 56
LABEL_PL1_X = 90
LABEL_PL1TYPE_X = (LABEL_PL1_X + 10*6)
end if
BUTTON_SPIN_WIDTH equ 8 BUTTON_SPIN_WIDTH equ 8
BUTTON_PL1DN_X equ 228 BUTTON_PL1DN_X equ 228
@@ -64,19 +74,9 @@ BUTTON_PL2UP_X equ (BUTTON_PL2DN_X + BUTTON_SPIN_WIDTH + 1)
BUTTON_PL2UP_Y equ BUTTON_PL2DN_Y BUTTON_PL2UP_Y equ BUTTON_PL2DN_Y
; label dimensions ; label dimensions
%ifidn lang, 'it_IT'
LABEL_PL1_X equ 90 + 10
%else
LABEL_PL1_X equ 90
%endif
LABEL_PL1_Y equ (1 + BUTTON_PL1DN_Y + (BUTTON_HEIGHT-8)/2) LABEL_PL1_Y equ (1 + BUTTON_PL1DN_Y + (BUTTON_HEIGHT-8)/2)
LABEL_PL2_X equ LABEL_PL1_X LABEL_PL2_X equ LABEL_PL1_X
LABEL_PL2_Y equ (1 + BUTTON_PL2DN_Y + (BUTTON_HEIGHT-8)/2) LABEL_PL2_Y equ (1 + BUTTON_PL2DN_Y + (BUTTON_HEIGHT-8)/2)
%ifidn lang, 'it_IT'
LABEL_PL1TYPE_X equ (LABEL_PL1_X + 10*6 - 4)
%else
LABEL_PL1TYPE_X equ (LABEL_PL1_X + 10*6)
%endif
LABEL_PL1TYPE_Y equ LABEL_PL1_Y LABEL_PL1TYPE_Y equ LABEL_PL1_Y
LABEL_PL2TYPE_X equ LABEL_PL1TYPE_X LABEL_PL2TYPE_X equ LABEL_PL1TYPE_X
LABEL_PL2TYPE_Y equ LABEL_PL2_Y LABEL_PL2TYPE_Y equ LABEL_PL2_Y
@@ -94,9 +94,7 @@ GRIDY equ 70
GRIDSPACING equ (STONESIZE + 1) ; space between lines GRIDSPACING equ (STONESIZE + 1) ; space between lines
GRIDHEIGHT equ (6*GRIDSPACING+1) ; total grid width and height GRIDHEIGHT equ (6*GRIDSPACING+1) ; total grid width and height
GRIDWIDTH equ (7*GRIDSPACING+1) GRIDWIDTH equ (7*GRIDSPACING+1)
GRIDCOLOR equ MOS_RGB(128,128,128) GRIDCOLOR equ 0x808080
; button id's ; button id's
BT_QUIT equ 1 BT_QUIT equ 1
@@ -106,55 +104,170 @@ BT_PLAYER1UP equ 4
BT_PLAYER2DN equ 5 BT_PLAYER2DN equ 5
BT_PLAYER2UP equ 6 BT_PLAYER2UP equ 6
include "pcx.inc"
include "windows.inc"
include "board.inc"
include "rng.inc"
;include "randomai.inc"
include "ai.inc"
;
; label table
;
if lang eq it_IT
newgame db "Nuova partita",0
down db "<",0
up db ">",0
pl1 db "Giocatore 1:",0
pl2 db "Giocatore 2:",0
playertypes:
db "Umano ",0
.e1:
db "CPU 1 ",0
db "CPU 2 ",0
db "CPU 3 ",0
db "CPU 4 ",0
db "CPU 5 ",0
db "CPU 6 ",0
db "CPU 7 ",0
db "CPU 8 ",0
else if lang eq ru_RU
newgame db "<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",0
down db "<",0
up db ">",0
pl1 db "<22><>ப 1:",0
pl2 db "<22><>ப 2:",0
playertypes:
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ",0
.e1:
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 ",0
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 ",0
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 ",0
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4 ",0
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5 ",0
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 6 ",0
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 7 ",0
db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 ",0
else
newgame db "New game",0
down db "<",0
up db ">",0
pl1 db "Player 1:",0
pl2 db "Player 2:",0
playertypes:
db "Human ",0
.e1:
db "CPU level 1 ",0
db "CPU level 2 ",0
db "CPU level 3 ",0
db "CPU level 4 ",0
db "CPU level 5 ",0
db "CPU level 6 ",0
db "CPU level 7 ",0
db "CPU level 8 ",0
end if
playertypes_end:
PLAYERTYPELEN equ (playertypes.e1 - playertypes)
NPLAYERTYPES equ ((playertypes_end-playertypes)/PLAYERTYPELEN)
;
; button table
;
align 4
buttons:
; new
BUTTON (BUTTON_NEW_X shl 16) + BUTTON_NEW_WIDTH, (BUTTON_NEW_Y shl 16) + BUTTON_NEW_HEIGHT, BT_NEW, BUTTON_COLOR_WORK
; player 1 down
BUTTON (BUTTON_PL1DN_X shl 16) + BUTTON_SPIN_WIDTH, (BUTTON_PL1DN_Y shl 16) + BUTTON_HEIGHT, BT_PLAYER1DN, BUTTON_COLOR_WORK
; player 1 up
BUTTON (BUTTON_PL1UP_X shl 16) + BUTTON_SPIN_WIDTH, (BUTTON_PL1UP_Y shl 16) + BUTTON_HEIGHT, BT_PLAYER1UP, BUTTON_COLOR_WORK
; player 2 down
BUTTON (BUTTON_PL2DN_X shl 16) + BUTTON_SPIN_WIDTH, (BUTTON_PL2DN_Y shl 16) + BUTTON_HEIGHT, BT_PLAYER2DN, BUTTON_COLOR_WORK
; player 2 up
BUTTON (BUTTON_PL2UP_X shl 16) + BUTTON_SPIN_WIDTH, (BUTTON_PL2UP_Y shl 16) + BUTTON_HEIGHT, BT_PLAYER2UP, BUTTON_COLOR_WORK
buttons_end:
NBUTTONS equ ((buttons_end-buttons)/sizeof.BUTTON)
align 4
labels:
; new
LABEL ((BUTTON_NEW_X+4) shl 16) + (1+BUTTON_NEW_Y+(BUTTON_NEW_HEIGHT-8)/2), newgame,LABEL_COLOR_WORKBUTTON,LABEL_BGCOLOR_TRANSPARENT
; player 1 down
LABEL ((BUTTON_PL1DN_X+(BUTTON_SPIN_WIDTH-4)/2) shl 16) + (1+BUTTON_PL1DN_Y+(BUTTON_HEIGHT-8)/2), down,LABEL_COLOR_WORKBUTTON,LABEL_BGCOLOR_TRANSPARENT
; player 1 up
LABEL ((1+BUTTON_PL1UP_X+(BUTTON_SPIN_WIDTH-4)/2) shl 16) + (1+BUTTON_PL1UP_Y+(BUTTON_HEIGHT-8)/2), up,LABEL_COLOR_WORKBUTTON,LABEL_BGCOLOR_TRANSPARENT
; player 2 down
LABEL ((BUTTON_PL2DN_X+(BUTTON_SPIN_WIDTH-4)/2) shl 16) + (1+BUTTON_PL2DN_Y+(BUTTON_HEIGHT-8)/2), down,LABEL_COLOR_WORKBUTTON,LABEL_BGCOLOR_TRANSPARENT
; player 2 up
LABEL ((1+BUTTON_PL2UP_X+(BUTTON_SPIN_WIDTH-4)/2) shl 16) + (1+BUTTON_PL2UP_Y+(BUTTON_HEIGHT-8)/2), up,LABEL_COLOR_WORKBUTTON,LABEL_BGCOLOR_TRANSPARENT
; player 1
LABEL (LABEL_PL1_X shl 16) + LABEL_PL1_Y, pl1,0xffffff,LABEL_BGCOLOR_TRANSPARENT
; player 2
LABEL (LABEL_PL2_X shl 16) + LABEL_PL2_Y, pl2,0xffffff,LABEL_BGCOLOR_TRANSPARENT
; status bar
statusbar LABEL (LABEL_STATUS_X shl 16) + LABEL_STATUS_Y, 0,0xffffff,LABEL_BGCOLOR_TRANSPARENT
if lang eq it_IT
label_pl1type LABEL ((LABEL_PL1TYPE_X + 18) shl 16) + LABEL_PL1TYPE_Y, playertypes+PL1TYPE_INIT*PLAYERTYPELEN,0xffffff,0
label_pl2type LABEL ((LABEL_PL2TYPE_X + 18) shl 16) + LABEL_PL2TYPE_Y, playertypes+PL2TYPE_INIT*PLAYERTYPELEN,0xffffff,0
else
label_pl1type LABEL (LABEL_PL1TYPE_X shl 16) + LABEL_PL1TYPE_Y, playertypes+PL1TYPE_INIT*PLAYERTYPELEN,0xffffff,0
label_pl2type LABEL (LABEL_PL2TYPE_X shl 16) + LABEL_PL2TYPE_Y, playertypes+PL2TYPE_INIT*PLAYERTYPELEN,0xffffff,0
end if
labels_end:
NLABELS equ ((labels_end-labels)/sizeof.LABEL)
; button images
redpcx:
file "red.pcx"
REDPCXSIZE equ (bluepcx - redpcx)
bluepcx:
file "blue.pcx"
pcx_end:
BLUEPCXSIZE equ (pcx_end - bluepcx)
align 4
start: start:
jmp main
%include "pcx.inc"
%include "windows.inc"
%include "board.inc"
%include "rng.inc"
; %include "randomai.inc"
%include "ai.inc"
;**********************************************************
; main program
;**********************************************************
main:
call randomize call randomize
call defineWindow call defineWindow
call decrunchImages call decrunchImages
call newGame call newGame
align 16
.msgpump: .msgpump:
; wait for event ; wait for event
mov ebx,1 mcall SF_WAIT_EVENT_TIMEOUT,1
mov eax,MOS_SC_WAITEVENTTIMEOUT
int 0x40
; process events ; process events
cmp eax,MOS_EVT_REDRAW cmp eax,EV_REDRAW
je short .redraw je .redraw
cmp eax,MOS_EVT_KEY cmp eax,EV_KEY
je short .key je .key
cmp eax,MOS_EVT_BUTTON cmp eax,EV_BUTTON
je short .button je .button
call pollMouse call pollMouse
call gameLoop call gameLoop
jmp short .msgpump jmp .msgpump
.redraw: .redraw:
call defineWindow call defineWindow
jmp short .msgpump jmp .msgpump
.key: .key:
call keyboardInput call keyboardInput
jmp short .msgpump jmp .msgpump
.button: .button:
call handleButton call handleButton
jmp short .msgpump jmp .msgpump
@@ -162,28 +275,27 @@ main:
; button handling function ; button handling function
;********************************************************** ;**********************************************************
handleButton: handleButton:
mov eax,MOS_SC_GETPRESSEDBUTTON ; get button id mcall SF_GET_BUTTON ; get button id
int 0x40
cmp al,1 ; button pressed ? cmp al,1 ; button pressed ?
je short .bye ; nope -> nothing to do je .bye ; nope -> nothing to do
cmp ah,BT_QUIT ; which button has been pressed ? cmp ah,BT_QUIT ; which button has been pressed ?
je short .quit je .quit
cmp ah,BT_NEW cmp ah,BT_NEW
je short .new je .new
cmp ah,BT_PLAYER1DN cmp ah,BT_PLAYER1DN
je short .player1dn je .player1dn
cmp ah,BT_PLAYER1UP cmp ah,BT_PLAYER1UP
je short .player1up je .player1up
cmp ah,BT_PLAYER2DN cmp ah,BT_PLAYER2DN
je short .player2dn je .player2dn
cmp ah,BT_PLAYER2UP cmp ah,BT_PLAYER2UP
je short .player2up je .player2up
.bye: .bye:
ret ret
.quit: .quit:
MOS_EXIT mcall SF_TERMINATE_PROCESS
.new: .new:
call newGame call newGame
ret ret
@@ -234,7 +346,7 @@ handleButton:
; window definition function ; window definition function
;********************************************************** ;**********************************************************
defineWindow: defineWindow:
MOS_STARTREDRAW mcall SF_REDRAW,SSF_BEGIN_DRAW
mov edi,window mov edi,window
call drawWindow call drawWindow
@@ -250,7 +362,7 @@ defineWindow:
xor eax,eax xor eax,eax
call drawBoard call drawBoard
MOS_ENDREDRAW mcall SF_REDRAW,SSF_END_DRAW
ret ret
@@ -270,11 +382,10 @@ updateStatusText:
mov dword [statusbar + LABEL.caption],esi ; yeah -> save & redraw mov dword [statusbar + LABEL.caption],esi ; yeah -> save & redraw
; clear background ; clear background
mov ebx,MOS_DWORD(LABEL_STATUS_X,LABEL_STATUS_WIDTH) mov ebx, LABEL_STATUS_X shl 16 + LABEL_STATUS_WIDTH
mov ecx,MOS_DWORD(LABEL_STATUS_Y,LABEL_STATUS_HEIGHT) mov ecx, LABEL_STATUS_Y shl 16 + LABEL_STATUS_HEIGHT
xor edx,edx xor edx,edx
mov eax,MOS_SC_DRAWBAR mcall SF_DRAW_RECT
int 0x40
; redraw label ; redraw label
mov edi,statusbar mov edi,statusbar
@@ -310,50 +421,50 @@ updatePlayerType:
; draw whole board ; draw whole board
; ;
; input : eax nonzero = clear board background ; input : eax nonzero = clear board background
align 4
drawBoard: drawBoard:
; clear background ? ; clear background ?
or eax,eax or eax,eax
jz .noclear jz .noclear
mov ebx,MOS_DWORD(GRIDX,GRIDWIDTH) mov ebx, GRIDX shl 16 + GRIDWIDTH
mov ecx,MOS_DWORD(GRIDY,GRIDHEIGHT) mov ecx, GRIDY shl 16 + GRIDHEIGHT
mov edx,WND_WORKCOLOR mov edx,WND_WORKCOLOR
mov eax,MOS_SC_DRAWBAR mcall SF_DRAW_RECT
int 0x40
.noclear: .noclear:
call drawGrid call drawGrid
call drawStones call drawStones
ret ret
align 4
drawGrid: drawGrid:
; vertical lines ; vertical lines
mov ebx,MOS_DWORD(GRIDX,GRIDX) mov ebx, GRIDX shl 16 + GRIDX
mov ecx,MOS_DWORD(GRIDY,GRIDY+GRIDHEIGHT-1) mov ecx, GRIDY shl 16 + GRIDY+GRIDHEIGHT-1
mov edx,GRIDCOLOR mov edx,GRIDCOLOR
mov eax,MOS_SC_DRAWLINE mcall SF_DRAW_LINE
mov esi,8 mov esi,8
.vlines: .vlines:
int 0x40 int 0x40
add ebx,MOS_DWORD(GRIDSPACING,GRIDSPACING) add ebx, GRIDSPACING shl 16 + GRIDSPACING
dec esi dec esi
jnz .vlines jnz .vlines
; horizontal lines ; horizontal lines
mov ebx,MOS_DWORD(GRIDX,GRIDX+GRIDWIDTH-1) mov ebx, GRIDX shl 16 + GRIDX+GRIDWIDTH-1
mov ecx,MOS_DWORD(GRIDY,GRIDY) mov ecx, GRIDY shl 16 + GRIDY
mov esi,7 mov esi,7
.hlines: .hlines:
int 0x40 int 0x40
add ecx,MOS_DWORD(GRIDSPACING,GRIDSPACING) add ecx, GRIDSPACING shl 16 + GRIDSPACING
dec esi dec esi
jnz .hlines jnz .hlines
ret ret
align 4
drawStones: drawStones:
mov ebx,6 mov ebx,6
.col: .col:
@@ -369,6 +480,7 @@ drawStones:
; ecx = column (1..7) ; ecx = column (1..7)
; ebx = row (1..6) ; ebx = row (1..6)
align 4
drawStone: drawStone:
pushad pushad
@@ -402,9 +514,8 @@ drawStone:
; put image (position is already in edx) ; put image (position is already in edx)
mov ebx,ebp ; image address mov ebx,ebp ; image address
mov ecx,MOS_DWORD(STONESIZE,STONESIZE) ; image dimensions mov ecx, (STONESIZE shl 16) + STONESIZE ; image dimensions
mov eax,MOS_SC_PUTIMAGE mcall SF_PUT_IMAGE
int 0x40
.bye: .bye:
popad popad
@@ -461,9 +572,8 @@ newGame:
; destroys : everything ; destroys : everything
;********************************************************** ;**********************************************************
pollMouse: pollMouse:
mov ebx,2 mcall SF_MOUSE_GET,SSF_BUTTON
mov eax,MOS_SC_GETMOUSEPOSITION
int 0x40
and eax,1 and eax,1
jz .mousenotpressed jz .mousenotpressed
.mousepressed: .mousepressed:
@@ -503,9 +613,7 @@ pollMouse:
;********************************************************** ;**********************************************************
getMouseCol: getMouseCol:
mov ebx,1 ; get mouse position, window relative mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ; get mouse position, window relative
mov eax,MOS_SC_GETMOUSEPOSITION
int 0x40
movzx ebx,ax ; y clipping movzx ebx,ax ; y clipping
cmp ebx,GRIDY cmp ebx,GRIDY
@@ -539,24 +647,15 @@ getMouseCol:
; destroys : everything ; destroys : everything
;********************************************************** ;**********************************************************
isActiveApp: isActiveApp:
%define PROCINFO (ebp-MOS_PROCESSINFO_size)
enter MOS_PROCESSINFO_size,0
; get process information ; get process information
mov eax,MOS_SC_GETPROCESSINFO mcall SF_THREAD_INFO,procinfo,-1
lea ebx,[ebp-MOS_PROCESSINFO_size]
mov ecx,-1
int 0x40
; set al to 1 if we are the active application ; set al to 1 if we are the active application
cmp ax,[PROCINFO+MOS_PROCESSINFO.windowStackPos] cmp ax,[procinfo+process_information.window_stack_position]
sete al sete al
leave ;;;leave
ret ret
%undef PROCINFO
@@ -569,8 +668,7 @@ isActiveApp:
; destroys : everything ; destroys : everything
;********************************************************** ;**********************************************************
keyboardInput: keyboardInput:
mov eax,MOS_SC_GETKEY ; get key mcall SF_GET_KEY ; get key
int 0x40
or al,al ; key available ? or al,al ; key available ?
jnz .bye ; no -> bye jnz .bye ; no -> bye
cmp dword [playerinput],0 ; unprocessed input available ? cmp dword [playerinput],0 ; unprocessed input available ?
@@ -698,7 +796,7 @@ updatePlayerStatusText:
cmp dword [player1_type],0 cmp dword [player1_type],0
je .statustextok je .statustextok
mov esi,player1cpuprmpt mov esi,player1cpuprmpt
jmp short .statustextok jmp .statustextok
.player2: .player2:
mov esi,player2hmnprmpt mov esi,player2hmnprmpt
cmp dword [player2_type],0 cmp dword [player2_type],0
@@ -714,196 +812,11 @@ updatePlayerStatusText:
; initialized data ; initialized data
;********************************************************** ;**********************************************************
section .data
; ;
; window definition ; window definition
; ;
windowtitle db "C4",0 windowtitle db "C4",0
window: window WND WND_WIDTH, WND_HEIGHT, 0x14000000 or WND_WORKCOLOR, 0,0,windowtitle,0, WND_CENTER or WND_DEFAULT_GRABCOLOR or WND_DEFAULT_FRAMECOLOR or WND_DEFAULT_CAPTIONCOLOR
istruc WND
at WND.xposandsize, dd MOS_DWORD(0,WND_WIDTH)
at WND.yposandsize, dd MOS_DWORD(0,WND_HEIGHT)
at WND.workcolor, dd 0x14000000 | WND_WORKCOLOR
at WND.grabcolor, dd 0
at WND.framecolor, dd 0
at WND.caption, dd windowtitle
at WND.captioncolor, dd 0
at WND.flags, dd WND_CENTER | WND_DEFAULT_GRABCOLOR | WND_DEFAULT_FRAMECOLOR | WND_DEFAULT_CAPTIONCOLOR
iend
;
; button table
;
buttons:
istruc BUTTON ; new
at BUTTON.xposandsize
dd MOS_DWORD(BUTTON_NEW_X,BUTTON_NEW_WIDTH)
dd MOS_DWORD(BUTTON_NEW_Y,BUTTON_HEIGHT)
dd BT_NEW
dd BUTTON_COLOR_WORK
iend
istruc BUTTON ; player 1 down
at BUTTON.xposandsize
dd MOS_DWORD(BUTTON_PL1DN_X,BUTTON_SPIN_WIDTH)
dd MOS_DWORD(BUTTON_PL1DN_Y,BUTTON_HEIGHT)
dd BT_PLAYER1DN
dd BUTTON_COLOR_WORK
iend
istruc BUTTON ; player 1 up
at BUTTON.xposandsize
dd MOS_DWORD(BUTTON_PL1UP_X,BUTTON_SPIN_WIDTH)
dd MOS_DWORD(BUTTON_PL1UP_Y,BUTTON_HEIGHT)
dd BT_PLAYER1UP
dd BUTTON_COLOR_WORK
iend
istruc BUTTON ; player 2 down
at BUTTON.xposandsize
dd MOS_DWORD(BUTTON_PL2DN_X,BUTTON_SPIN_WIDTH)
dd MOS_DWORD(BUTTON_PL2DN_Y,BUTTON_HEIGHT)
dd BT_PLAYER2DN
dd BUTTON_COLOR_WORK
iend
istruc BUTTON ; player 2 up
at BUTTON.xposandsize
dd MOS_DWORD(BUTTON_PL2UP_X,BUTTON_SPIN_WIDTH)
dd MOS_DWORD(BUTTON_PL2UP_Y,BUTTON_HEIGHT)
dd BT_PLAYER2UP
dd BUTTON_COLOR_WORK
iend
NBUTTONS equ (($-buttons)/BUTTON_size)
;
; label table
;
%ifidn lang, 'it_IT'
newgame db "Nuova partita",0
%else
newgame db "New game",0
%endif
down db "<",0
up db ">",0
%ifidn lang, 'it_IT'
pl1 db "Giocatore 1:",0
pl2 db "Giocatore 2:",0
%else
pl1 db "Player 1:",0
pl2 db "Player 2:",0
%endif
%ifidn lang, 'it_IT'
playertypes:
db "Umano",0
PLAYERTYPELEN equ ($ - playertypes)
db "CPU 1 ",0
db "CPU 2 ",0
db "CPU 3 ",0
db "CPU 4 ",0
db "CPU 5 ",0
db "CPU 6 ",0
db "CPU 7 ",0
db "CPU 8 ",0
%else
playertypes:
db "Human ",0
PLAYERTYPELEN equ ($ - playertypes)
db "CPU level 1 ",0
db "CPU level 2 ",0
db "CPU level 3 ",0
db "CPU level 4 ",0
db "CPU level 5 ",0
db "CPU level 6 ",0
db "CPU level 7 ",0
db "CPU level 8 ",0
%endif
NPLAYERTYPES equ (($-playertypes)/PLAYERTYPELEN)
labels:
istruc LABEL ; new
at LABEL.position
dd MOS_DWORD(BUTTON_NEW_X+4,1+BUTTON_NEW_Y+(BUTTON_HEIGHT-8)/2)
dd newgame
dd LABEL_COLOR_WORKBUTTON
dd LABEL_BGCOLOR_TRANSPARENT
iend
istruc LABEL ; player 1 down
at LABEL.position
dd MOS_DWORD(BUTTON_PL1DN_X+(BUTTON_SPIN_WIDTH-4)/2,1+BUTTON_PL1DN_Y+(BUTTON_HEIGHT-8)/2)
dd down
dd LABEL_COLOR_WORKBUTTON
dd LABEL_BGCOLOR_TRANSPARENT
iend
istruc LABEL ; player 1 up
at LABEL.position
dd MOS_DWORD(1+BUTTON_PL1UP_X+(BUTTON_SPIN_WIDTH-4)/2,1+BUTTON_PL1UP_Y+(BUTTON_HEIGHT-8)/2)
dd up
dd LABEL_COLOR_WORKBUTTON
dd LABEL_BGCOLOR_TRANSPARENT
iend
istruc LABEL ; player 2 down
at LABEL.position
dd MOS_DWORD(BUTTON_PL2DN_X+(BUTTON_SPIN_WIDTH-4)/2,1+BUTTON_PL2DN_Y+(BUTTON_HEIGHT-8)/2)
dd down
dd LABEL_COLOR_WORKBUTTON
dd LABEL_BGCOLOR_TRANSPARENT
iend
istruc LABEL ; player 2 up
at LABEL.position
dd MOS_DWORD(1+BUTTON_PL2UP_X+(BUTTON_SPIN_WIDTH-4)/2,1+BUTTON_PL2UP_Y+(BUTTON_HEIGHT-8)/2)
dd up
dd LABEL_COLOR_WORKBUTTON
dd LABEL_BGCOLOR_TRANSPARENT
iend
istruc LABEL ; player 1
at LABEL.position
dd MOS_DWORD(LABEL_PL1_X,LABEL_PL1_Y)
dd pl1
dd MOS_RGB(255,255,255)
dd LABEL_BGCOLOR_TRANSPARENT
iend
istruc LABEL ; player 2
at LABEL.position
dd MOS_DWORD(LABEL_PL2_X,LABEL_PL2_Y)
dd pl2
dd MOS_RGB(255,255,255)
dd LABEL_BGCOLOR_TRANSPARENT
iend
statusbar: ; status bar
istruc LABEL
at LABEL.position
dd MOS_DWORD(LABEL_STATUS_X,LABEL_STATUS_Y)
dd 0
dd MOS_RGB(255,255,255)
dd LABEL_BGCOLOR_TRANSPARENT
iend
label_pl1type:
istruc LABEL
at LABEL.position
%ifidn lang, 'it_IT'
dd MOS_DWORD(LABEL_PL1TYPE_X + 18,LABEL_PL1TYPE_Y)
%else
dd MOS_DWORD(LABEL_PL1TYPE_X,LABEL_PL1TYPE_Y)
%endif
dd playertypes+PL1TYPE_INIT*PLAYERTYPELEN
dd MOS_RGB(255,255,255)
dd MOS_RGB(0,0,0)
iend
label_pl2type:
istruc LABEL
at LABEL.position
%ifidn lang, 'it_IT'
dd MOS_DWORD(LABEL_PL2TYPE_X + 18,LABEL_PL2TYPE_Y)
%else
dd MOS_DWORD(LABEL_PL2TYPE_X,LABEL_PL2TYPE_Y)
%endif
dd playertypes+PL2TYPE_INIT*PLAYERTYPELEN
dd MOS_RGB(255,255,255)
dd MOS_RGB(0,0,0)
iend
NLABELS equ (($-labels)/LABEL_size)
; player types ; player types
@@ -912,23 +825,31 @@ player2_type dd PL2TYPE_INIT
; status messages ; status messages
%ifidn lang, 'it_IT' if lang eq it_IT
player1hmnprmpt db "Turno del giocatore 1",0 player1hmnprmpt db "Turno del giocatore 1",0
player2hmnprmpt db "Turno del giocatore 2",0 player2hmnprmpt db "Turno del giocatore 2",0
player1cpuprmpt db "Attendi, giocatore 1 sta pensando...",0 player1cpuprmpt db "Attendi, giocatore 1 sta pensando...",0
player2cpuprmpt db "Attendi, giocatore 2 sta pensando...",0 player2cpuprmpt db "Attendi, giocatore 2 sta pensando...",0
itisadraw db "Pareggio",0 itisadraw db "Pareggio",0
player1wins db "Vince giocatore 1",0 player1wins db "Vince giocatore 1",0
player2wins db "Vince Giocatore 2",0 player2wins db "Vince giocatore 2",0
%else else if lang eq ru_RU
player1hmnprmpt db "Make your move, player 1.",0 player1hmnprmpt db "<EFBFBD><EFBFBD>ப 1 ᤥ<><E1A4A5><EFBFBD><EFBFBD><EFBFBD>",0
player2hmnprmpt db "Make your move, player 2.",0 player2hmnprmpt db "<EFBFBD><EFBFBD>ப 2 ᤥ<><E1A4A5><EFBFBD><EFBFBD><EFBFBD>",0
player1cpuprmpt db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ப 1 <20><EFBFBD><E3ACA0>......",0
player2cpuprmpt db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ப 2 <20><EFBFBD><E3ACA0>......",0
itisadraw db "<22><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>",0
player1wins db "<22><>ப 1 <20>먣ࠫ",0
player2wins db "<22><>ப 2 <20>먣ࠫ",0
else
player1hmnprmpt db "Make your move, player 1",0
player2hmnprmpt db "Make your move, player 2",0
player1cpuprmpt db "Player 1 is thinking, please wait...",0 player1cpuprmpt db "Player 1 is thinking, please wait...",0
player2cpuprmpt db "Player 2 is thinking, please wait...",0 player2cpuprmpt db "Player 2 is thinking, please wait...",0
itisadraw db "It's a draw.",0 itisadraw db "It's a draw",0
player1wins db "Player 1 wins.",0 player1wins db "Player 1 wins",0
player2wins db "Player 2 wins.",0 player2wins db "Player 2 wins",0
%endif end if
; pointer to ai player. future releases C4 might ; pointer to ai player. future releases C4 might
@@ -936,29 +857,22 @@ player2_type dd PL2TYPE_INIT
aicode dd aiGetMove aicode dd aiGetMove
; button images align 16
redpcx: incbin "red.pcx" i_end:
REDPCXSIZE equ ($ - redpcx) sc system_colors
bluepcx: incbin "blue.pcx" procinfo process_information
BLUEPCXSIZE equ ($ - bluepcx) rb 1024
align 16
stacktop:
; player input
; 0 : no input available
; 1..7 : column to drop stone into
playerinput rd 1
mouseinput rd 1
gameover rd 1
redstone rb STONESIZE*STONESIZE*3
bluestone rb STONESIZE*STONESIZE*3
mem:
;**********************************************************
; uninitialized data
;**********************************************************
section .bss
; player input
; 0 : no input available
; 1..7 : column to drop stone into
playerinput resd 1
mouseinput resd 1
gameover resd 1
redstone resb STONESIZE*STONESIZE*3
bluestone resb STONESIZE*STONESIZE*3
end:

View File

@@ -1,305 +0,0 @@
; mos.inc 0.0.2
; Copyright (c) 2002 Thomas Mathys
; killer@vantage.ch
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
;
;
; revision history
; ----------------
;
; 10-04-2002 version 0.0.2
; - removed MOS_WNDCOLORS_SIZE and similar constants.
; while reading the docs i realized that NASM creates
; such symbols already itself...
; + macros: MOS_WAITEVENT, MOS_WAITEVENT_S, MOS_STARTREDRAW,
; MOS_STARTREDRAW_S, MOS_ENDREDRAW, MOS_ENDREDRAW_S,
; MOS_GETSCREENMAX, MOS_GETSCREENMAX_S, MOS_EXIT, MOS_EXIT_S
; + event bit masks
; + some syscall numbers
; + process info structure
;
; 08-??-2002 version 0.0.1
; first release
;
%ifndef _MOS_INC
%define _MOS_INC
;**********************************************************
; generates a menuetos 01 header
; takes 2-6 parameters:
;
; MOS_HEADER01 start,end[,appmem,esp,i_param,i_icon]
;**********************************************************
%macro MOS_HEADER01 2-6 0x100000,0x7fff0,0,0
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd %1 ; start of code
dd %2 ; image size
dd %3 ; application memory
dd %4 ; esp
dd %5 ; i_param
dd %6 ; i_icon
%endmacro
;**********************************************************
; MOS_DWORD
; packs 2 words into a double word
;**********************************************************
%define MOS_DWORD(hi,lo) ((((hi) & 0xffff) << 16) + ((lo) & 0xffff))
;**********************************************************
; MOS_RGB
; creates a menuet os compatible color (0x00RRGGBB)
;**********************************************************
%define MOS_RGB(r,g,b) ((((r) & 255) << 16) + (((g) & 255) << 8) + ((b) & 255))
;**********************************************************
; window color structure
;**********************************************************
struc MOS_WNDCOLORS
.frame: resd 1
.grab: resd 1
.grabButton: resd 1
.grabButtonText: resd 1
.grabText: resd 1
.work: resd 1
.workButton: resd 1
.workButtonText: resd 1
.workText: resd 1
.workGraphics: resd 1
endstruc
;**********************************************************
; process info structure
;**********************************************************
struc MOS_PROCESSINFO
.CPUUsage: resd 1 ; cpu usage
.windowStackPos: resw 1 ; process' position in windowing stack
.windowStackVal: resw 1 ; window stack value at ecx
.reserved1: resw 1
.processName: resb 12 ; process name
.memStart: resd 1 ; start of process memory
.memUsed: resd 1 ; memory used by the process
.pid: resd 1 ; process id
.reserved2: resb (1024-34)
endstruc
;**********************************************************
; system call numbers
;**********************************************************
MOS_SC_EXIT equ -1
MOS_SC_DEFINEWINDOW equ 0
MOS_SC_PUTPIXEL equ 1
MOS_SC_GETKEY equ 2
MOS_SC_GETSYSCLOCK equ 3
MOS_SC_WRITETEXT equ 4
MOS_SC_DELAY equ 5
MOS_SC_OPENFILEFLOPPY equ 6
MOS_SC_PUTIMAGE equ 7
MOS_SC_DEFINEBUTTON equ 8
MOS_SC_GETPROCESSINFO equ 9
MOS_SC_WAITEVENT equ 10
MOS_SC_CHECKEVENT equ 11
MOS_SC_REDRAWSTATUS equ 12
MOS_SC_DRAWBAR equ 13
MOS_SC_GETSCREENMAX equ 14
MOS_SC_SETBACKGROUND equ 15
MOS_SC_GETPRESSEDBUTTON equ 17
MOS_SC_SYSTEMSERVICE equ 18
MOS_SC_STARTPROGRAM equ 19
MOS_SC_MIDIINTERFACE equ 20
MOS_SC_DEVICESETUP equ 21
MOS_SC_WAITEVENTTIMEOUT equ 23
MOS_SC_CDAUDIO equ 24
MOS_SC_SB16MIXER1 equ 25
MOS_SC_GETDEVICESETUP equ 26
MOS_SC_WSS equ 27
MOS_SC_SB16MIXER2 equ 28
MOS_SC_GETDATE equ 29
MOS_SC_READHD equ 30
MOS_SC_STARTPROGRAMHD equ 31
MOS_SC_GETSCREENPIXEL equ 35
MOS_SC_GETMOUSEPOSITION equ 37
MOS_SC_DRAWLINE equ 38
MOS_SC_GETBACKGROUND equ 39
MOS_SC_SETEVENTMASK equ 40
MOS_SC_WRITENUMBER equ 47
MOS_SC_WINDOWPROPERTIES equ 48
;**********************************************************
; event numbers
;**********************************************************
MOS_EVT_NONE equ 0
MOS_EVT_REDRAW equ 1
MOS_EVT_KEY equ 2
MOS_EVT_BUTTON equ 3
;**********************************************************
; event bits
;**********************************************************
MOS_EVTBIT_REDRAW equ (1 << 0)
MOS_EVTBIT_KEY equ (1 << 1)
MOS_EVTBIT_BUTTON equ (1 << 2)
MOS_EVTBIT_ENDREQUEST equ (1 << 3)
MOS_EVTBIT_BGDRAW equ (1 << 4)
MOS_EVTBIT_MOUSECHANGE equ (1 << 5)
MOS_EVTBIT_IPCEVENT equ (1 << 6)
MOS_EVTBIT_IRQ0 equ (1 << 16)
MOS_EVTBIT_IRQ1 equ (1 << 17)
MOS_EVTBIT_IRQ2 equ (1 << 18)
MOS_EVTBIT_IRQ3 equ (1 << 19)
MOS_EVTBIT_IRQ4 equ (1 << 20)
MOS_EVTBIT_IRQ5 equ (1 << 21)
MOS_EVTBIT_IRQ6 equ (1 << 22)
MOS_EVTBIT_IRQ7 equ (1 << 23)
MOS_EVTBIT_IRQ8 equ (1 << 24)
MOS_EVTBIT_IRQ9 equ (1 << 25)
MOS_EVTBIT_IRQ10 equ (1 << 26)
MOS_EVTBIT_IRQ11 equ (1 << 27)
MOS_EVTBIT_IRQ12 equ (1 << 28)
MOS_EVTBIT_IRQ13 equ (1 << 29)
MOS_EVTBIT_IRQ14 equ (1 << 30)
MOS_EVTBIT_IRQ15 equ (1 << 31)
;**********************************************************
; exit application (syscall -1)
;**********************************************************
; exit application
%macro MOS_EXIT 0
mov eax,MOS_SC_EXIT
int 0x40
%endmacro
; exit application, smaller version
%macro MOS_EXIT_S 0
xor eax,eax
dec eax
int 0x40
%endmacro
;**********************************************************
; wait event stuff
; (MOS_SC_WAITEVENT, syscall 10)
;**********************************************************
; wait for event
; destroys : nothing
; returns : eax = event type
%macro MOS_WAITEVENT 0
mov eax,MOS_SC_WAITEVENT
int 0x40
%endmacro
; wait for event, smaller version
; destroys : flags
; returns : eax = event type
%macro MOS_WAITEVENT_S 0
xor eax,eax
mov al,MOS_SC_WAITEVENT
int 0x40
%endmacro
;**********************************************************
; window redraw status stuff
; (MOS_SC_REDRAWSTATUS, syscall 12)
;**********************************************************
MOS_RS_STARTREDRAW equ 1
MOS_RS_ENDREDRAW equ 2
; start window redraw
; destroys: eax,ebx
%macro MOS_STARTREDRAW 0
mov ebx,MOS_RS_STARTREDRAW
mov eax,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
; start window redraw, smaller version
; destroys: eax,ebx,flags
%macro MOS_STARTREDRAW_S 0
xor ebx,ebx
inc ebx
xor eax,eax
mov al,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
; end window redraw
; destroys: eax,ebx
%macro MOS_ENDREDRAW 0
mov ebx,MOS_RS_ENDREDRAW
mov eax,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
; end window redraw, smaller version
; destroys: eax,ebx,flags
%macro MOS_ENDREDRAW_S 0
xor ebx,ebx
mov bl,MOS_RS_ENDREDRAW
xor eax,eax
mov al,MOS_SC_REDRAWSTATUS
int 0x40
%endmacro
;**********************************************************
; get screen max stuff (syscall 14)
;**********************************************************
; get screen dimensions in eax
; destroys: nothing
%macro MOS_GETSCREENMAX 0
mov eax,MOS_SC_GETSCREENMAX
int 0x40
%endmacro
; get screen dimensions in eax, smaller version
; destroys: flags
%macro MOS_GETSCREENMAX_S 0
xor eax,eax
mov al,MOS_SC_GETSCREENMAX
int 0x40
%endmacro
%endif

View File

@@ -16,38 +16,32 @@
; along with this program; if not, write to the Free Software ; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%ifndef _PCX_INC
%define _PCX_INC
;********************************************************** ;**********************************************************
; pcx header ; pcx header
;********************************************************** ;**********************************************************
PCXHEADER_SIZE equ 128 PCXHEADER_SIZE equ 128
struc PCXHEADER struct PCXHEADER
.id: resb 1 ; id, should be 10 id rb 1 ; id, should be 10
.version: resb 1 ; pcx version version rb 1 ; pcx version
.encoding: resb 1 ; 1 = rle encoding rb 1 ; 1 = rle
.bpp: resb 1 ; bits per pixel bpp rb 1 ; bits per pixel
.xmin: resw 1 ; image dimensions xmin rw 1 ; image dimensions
.ymin: resw 1 ymin rw 1
.xmax: resw 1 xmax rw 1
.ymax: resw 1 ymax rw 1
.hdpi: resw 1 ; horizontal resolution in dpi hdpi rw 1 ; horizontal resolution in dpi
.vdpi: resw 1 ; verttical resolution in dpi vdpi rw 1 ; verttical resolution in dpi
.colormap: resb 48 ; 16 color palette colormap rb 48 ; 16 color palette
.reserved1: resb 1 reserved1 rb 1
.nplanes: resb 1 ; # of color planes nplanes rb 1 ; # of color planes
.bytesperline: resw 1 ; # of bytes per scanline. always even bytesperline rw 1 ; # of bytes per scanline. always even
.palinfo: resw 1 ; 1 = color/bw, 2 = grayscale palinfo rw 1 ; 1 = color/bw, 2 = grayscale
.hscreensize: resw 1 ; horizontal screen size hscreensize rw 1 ; horizontal screen size
.vscreensize: resw 1 ; vertical screen size vscreensize rw 1 ; vertical screen size
.reserved2: resb 54 reserved2 rb 54
endstruc ends
section .text
@@ -98,7 +92,7 @@ loadPCX:
.decode: .decode:
lodsb ; read byte from input stream lodsb ; read byte from input stream
cmp al,192 ; encoded/unencoded byte ? cmp al,192 ; encoded/unencoded byte ?
jae short .encoded jae .encoded
lea edx,[eax*2+eax] ; read color values from lea edx,[eax*2+eax] ; read color values from
mov al,[ebx+edx+2] ; palette and store them mov al,[ebx+edx+2] ; palette and store them
stosb ; in the destination image stosb ; in the destination image
@@ -107,7 +101,7 @@ loadPCX:
mov al,[ebx+edx+0] mov al,[ebx+edx+0]
stosb stosb
dec ebp ; one less to go... dec ebp ; one less to go...
jmp short .continue jmp .continue
.encoded: .encoded:
and al,00111111b ; calc # of times to repeat and al,00111111b ; calc # of times to repeat
mov cl,al mov cl,al
@@ -127,11 +121,8 @@ loadPCX:
xor ah,ah ; reset ah to 0 ! xor ah,ah ; reset ah to 0 !
.continue: .continue:
or ebp,ebp ; all pixels decoded ? or ebp,ebp ; all pixels decoded ?
jnz short .decode jnz .decode
popfd popfd
popad popad
ret ret
%endif

View File

@@ -18,12 +18,6 @@
; along with C4; if not, write to the Free Software ; along with C4; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%infdef _RANDOMAI_INC
%define _RANDOMAI_INC
section .text
;********************************************************** ;**********************************************************
; randomaiGetMove ; randomaiGetMove
@@ -47,4 +41,3 @@ randomaiGetMove
mov eax,edx ; return move mov eax,edx ; return move
ret ret
%endif

View File

@@ -18,10 +18,6 @@
; along with C4; if not, write to the Free Software ; along with C4; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%ifndef _RNG_INC
%define _RNG_INC
section .data
; random seed ; random seed
@@ -29,9 +25,6 @@ seed dd 0
section .text
;********************************************************** ;**********************************************************
; randomize ; randomize
; initialize random number generator. ; initialize random number generator.
@@ -43,8 +36,7 @@ seed dd 0
;********************************************************** ;**********************************************************
randomize: randomize:
push eax push eax
mov eax,MOS_SC_GETSYSCLOCK mcall SF_GET_SYS_TIME
int 0x40
mov [seed],eax mov [seed],eax
pop eax pop eax
ret ret
@@ -72,5 +64,3 @@ rand:
pop edx pop edx
popfd popfd
ret ret
%endif

View File

@@ -16,63 +16,52 @@
; along with this program; if not, write to the Free Software ; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%ifndef _WINDOWS_INC
%define _WINDOWS_INC
WND_CENTER equ (1 shl 0)
WND_CENTER equ (1 << 0) WND_DEFAULT_WORKCOLOR equ (1 shl 1)
WND_DEFAULT_WORKCOLOR equ (1 << 1) WND_DEFAULT_GRABCOLOR equ (1 shl 2)
WND_DEFAULT_GRABCOLOR equ (1 << 2) WND_DEFAULT_FRAMECOLOR equ (1 shl 3)
WND_DEFAULT_FRAMECOLOR equ (1 << 3) WND_DEFAULT_CAPTIONCOLOR equ (1 shl 4)
WND_DEFAULT_CAPTIONCOLOR equ (1 << 4)
WND_DEFAULT_COLORS equ (WND_DEFAULT_WORKCOLOR | WND_DEFAULT_GRABCOLOR | WND_DEFAULT_FRAMECOLOR | WND_DEFAULT_CAPTIONCOLOR) WND_DEFAULT_COLORS equ (WND_DEFAULT_WORKCOLOR | WND_DEFAULT_GRABCOLOR | WND_DEFAULT_FRAMECOLOR | WND_DEFAULT_CAPTIONCOLOR)
struc WND struct WND
.xposandsize resd 1 ; x position and size (like syscall) xposandsize rd 1 ; x position and size (like syscall)
.yposandsize resd 1 ; y position and size (like syscall) yposandsize rd 1 ; y position and size (like syscall)
.workcolor resd 1 ; work area color (like syscall) workcolor rd 1 ; work area color (like syscall)
.grabcolor resd 1 ; grab bar color (like syscall) grabcolor rd 1 ; grab bar color (like syscall)
.framecolor resd 1 ; frame color (like syscall) framecolor rd 1 ; frame color (like syscall)
.caption resd 1 ; pointer to caption (zero terminated) caption rd 1 ; pointer to caption (zero terminated)
; can be zero, if no caption is desired. ; can be zero, if no caption is desired.
.captioncolor resd 1 ; caption color captioncolor rd 1 ; caption color
.flags resd 1 ; combination of WND_xxx flags, or zero. flags rd 1 ; combination of WND_xxx flags, or zero.
endstruc ends
USE_SYSTEM_COLORS equ 0 ;0 or 1
BUTTON_COLOR_WORK equ 0x505050
BUTTON_COLOR_GRAB equ 0x01000000 struct BUTTON
BUTTON_COLOR_WORK equ 0x02000000 xposandsize rd 1 ; x position and size (like syscall)
yposandsize rd 1 ; y position and size (like syscall)
id rd 1 ; button id
struc BUTTON color rd 1 ; button color. can be a real color
.xposandsize resd 1 ; x position and size (like syscall)
.yposandsize resd 1 ; y position and size (like syscall)
.id resd 1 ; button id
.color resd 1 ; button color. can be a real color
; or one of the BUTTON_COLOR_xxx constants ; or one of the BUTTON_COLOR_xxx constants
endstruc ends
LABEL_COLOR_GRABBUTTON equ 0x01000000 ; use grab button text default color LABEL_COLOR_WORKBUTTON equ 0xffffff ; use work button text default color
LABEL_COLOR_GRAB equ 0x02000000 ; use grab text default color
LABEL_COLOR_WORKBUTTON equ 0x03000000 ; use work button text default color
LABEL_COLOR_WORK equ 0x04000000 ; use work text default color
LABEL_BGCOLOR_TRANSPARENT equ 0x01000000 ; transparent LABEL_BGCOLOR_TRANSPARENT equ 0x01000000 ; transparent
LABEL_BGCOLOR_WORK equ 0x02000000 ; use work area color
struc LABEL struct LABEL
.position resd 1 ; position, x in upper word, y in lower word position rd 1 ; position, x in upper word, y in lower word
.caption resd 1 ; pointer to caption (zero terminated) caption rd 1 ; pointer to caption (zero terminated)
; if this is field is zero, the label will ; if this is field is zero, the label will
; not be drawn. ; not be drawn.
.color resd 1 ; text color, or a LABEL_COLOR_xxx constant color rd 1 ; text color, or a LABEL_COLOR_xxx constant
.bgcolor resd 1 ; background color, or a LABEL_BGCOLOR_xxx constant bgcolor rd 1 ; background color, or a LABEL_BGCOLOR_xxx constant
endstruc ends
section .text
;*********************************************************** ;***********************************************************
@@ -87,61 +76,47 @@ endstruc
;*********************************************************** ;***********************************************************
drawWindow: drawWindow:
%define WNDCOLORS ebp-MOS_WNDCOLORS_size
enter MOS_WNDCOLORS_size,0
pushfd pushfd
pushad pushad
; get default window colors ; get default window colors
mov ebx,3 mcall SF_STYLE_SETTINGS,3,sc,sizeof.system_colors
lea ecx,[WNDCOLORS]
mov edx,MOS_WNDCOLORS_size
mov eax,MOS_SC_WINDOWPROPERTIES
int 0x40
; ;
; window position ; window position
; ;
test dword [edi + WND.flags],WND_CENTER ; center window ? test dword [edi + WND.flags],WND_CENTER ; center window ?
jnz short .center jnz .center
mov ebx,[edi + WND.xposandsize] ; nope -> just load dimensions mov ebx,[edi + WND.xposandsize] ; nope -> just load dimensions
mov ecx,[edi + WND.yposandsize] mov ecx,[edi + WND.yposandsize]
jmp short .positionok jmp .positionok
.center: ; so let's center this window... .center: ; so let's center this window...
MOS_GETSCREENMAX ; get screen dimensions mcall SF_GET_SCREEN_SIZE ; get screen dimensions
mov ebx,eax ; xpos = (screenx-width)/2 mov ebx,eax ; xpos = (screenx-width)/2
shr ebx,16 shr ebx,16
sub bx,[edi + WND.xposandsize] sub bx,word[edi + WND.xposandsize]
jns short .xok jns .xok
xor ebx,ebx xor ebx,ebx
.xok: .xok:
shl ebx,15 ; / 2, move result to hi-word shl ebx,15 ; / 2, move result to hi-word
mov bx,[edi + WND.xposandsize] mov bx,word[edi + WND.xposandsize]
movzx ecx,ax ; same for ypos movzx ecx,ax ; same for ypos
sub cx,[edi + WND.yposandsize] sub cx,word[edi + WND.yposandsize]
jns short .yok jns .yok
xor ecx,ecx xor ecx,ecx
.yok: .yok:
shl ecx,15 shl ecx,15
mov cx,[edi + WND.yposandsize] mov cx,word[edi + WND.yposandsize]
.positionok: ; ebx/ecx contain dimensions .positionok: ; ebx/ecx contain dimensions
push edi
; define window ; define window
mov eax,MOS_SC_DEFINEWINDOW
mov edx,[edi + WND.workcolor] mov edx,[edi + WND.workcolor]
mov edi,windowtitle mov edi,windowtitle
int 0x40 mcall SF_CREATE_WINDOW
pop edi
popad popad
popfd popfd
leave
ret ret
%undef WNDCOLORS
;*********************************************************** ;***********************************************************
@@ -153,53 +128,40 @@ drawWindow:
; destroys: nothing ; destroys: nothing
; notes: you must call begin redraw/end redraw yourself ; notes: you must call begin redraw/end redraw yourself
;*********************************************************** ;***********************************************************
align 4
drawButtons: drawButtons:
%define WNDCOLORS ebp-MOS_WNDCOLORS_size
or ecx,ecx or ecx,ecx
jnz short .ok jnz .ok
ret ret
.ok: .ok:
enter MOS_WNDCOLORS_size,0
pushfd pushfd
pushad pushad
; get default window colors ; get default window colors
if USE_SYSTEM_COLORS eq 1
push ecx push ecx
mov ebx,3 mcall SF_STYLE_SETTINGS,3,sc,sizeof.system_colors
lea ecx,[WNDCOLORS]
mov edx,MOS_WNDCOLORS_size
mov eax,MOS_SC_WINDOWPROPERTIES
int 0x40
pop ecx pop ecx
end if
align 4
.drawall: .drawall:
push ecx push ecx
mov ebx,[edi + BUTTON.xposandsize] mov ebx,[edi + BUTTON.xposandsize]
mov ecx,[edi + BUTTON.yposandsize] mov ecx,[edi + BUTTON.yposandsize]
mov edx,[edi + BUTTON.id] mov edx,[edi + BUTTON.id]
mov esi,[edi + BUTTON.color] if USE_SYSTEM_COLORS eq 1
cmp esi,BUTTON_COLOR_GRAB ; use a default color ? mov esi,[sc.work_button] ; use a system color
jne .ok1 else
mov esi,[WNDCOLORS + MOS_WNDCOLORS.grabButton] mov esi,[edi + BUTTON.color] ; use a default color
.ok1: end if
cmp esi,BUTTON_COLOR_WORK mcall SF_DEFINE_BUTTON
jne .ok2 add edi,sizeof.BUTTON
mov esi,[WNDCOLORS + MOS_WNDCOLORS.workButton]
.ok2:
mov eax,MOS_SC_DEFINEBUTTON
int 0x40
add edi,BUTTON_size
pop ecx pop ecx
loop .drawall loop .drawall
popad popad
popfd popfd
leave
ret ret
%undef WNDCOLORS
;*********************************************************** ;***********************************************************
@@ -210,33 +172,27 @@ drawButtons:
; output: nothing ; output: nothing
; destroys: nothing ; destroys: nothing
;*********************************************************** ;***********************************************************
align 4
drawLabels: drawLabels:
%define WNDCOLORS ebp-MOS_WNDCOLORS_size
or ecx,ecx or ecx,ecx
jnz short .ok jnz .ok
ret ret
.ok: .ok:
enter MOS_WNDCOLORS_size,0
pushfd pushfd
pushad pushad
; get default window colors ; get default window colors
if USE_SYSTEM_COLORS eq 1
push ecx push ecx
mov ebx,3 mcall SF_STYLE_SETTINGS,3,sc,sizeof.system_colors
lea ecx,[WNDCOLORS]
mov edx,MOS_WNDCOLORS_size
mov eax,MOS_SC_WINDOWPROPERTIES
int 0x40
pop ecx pop ecx
end if
.drawall: .drawall:
push ecx push ecx
cmp dword [edi + LABEL.caption],0 cmp dword [edi + LABEL.caption],0
jne short .notnull jne .notnull
jmp .next jmp .next
.notnull: .notnull:
@@ -262,40 +218,27 @@ drawLabels:
mov ecx,[edi + LABEL.position] ; ecx = ystart/height mov ecx,[edi + LABEL.position] ; ecx = ystart/height
shl ecx,16 shl ecx,16
mov cx,8 mov cx,8
if USE_SYSTEM_COLORS eq 1
mov edx,[sc.work]
else
mov edx,[edi + LABEL.bgcolor] mov edx,[edi + LABEL.bgcolor]
cmp edx,LABEL_BGCOLOR_WORK end if
jne short .bgcolorok mcall SF_DRAW_RECT
mov edx,[WNDCOLORS + MOS_WNDCOLORS.work]
.bgcolorok:
mov eax,MOS_SC_DRAWBAR
int 0x40
.clearok: .clearok:
; draw label ; draw label
mov ebx,[edi + LABEL.position] ; ebx = label position mov ebx,[edi + LABEL.position] ; ebx = label position
mov edx,[edi + LABEL.caption] ; edx -> caption mov edx,[edi + LABEL.caption] ; edx -> caption
if USE_SYSTEM_COLORS eq 1
mov ecx,[sc.work_button_text]
else
mov ecx,[edi + LABEL.color] ; ecx = color mov ecx,[edi + LABEL.color] ; ecx = color
cmp ecx,LABEL_COLOR_GRABBUTTON end if
jne short .ok1 mcall SF_DRAW_TEXT
mov ecx,[WNDCOLORS + MOS_WNDCOLORS.grabButtonText]
.ok1:
cmp ecx,LABEL_COLOR_GRAB
jne short .ok2
mov ecx,[WNDCOLORS + MOS_WNDCOLORS.grabText]
.ok2:
cmp ecx,LABEL_COLOR_WORKBUTTON
jne short .ok3
mov ecx,[WNDCOLORS + MOS_WNDCOLORS.workButtonText]
.ok3:
cmp ecx,LABEL_COLOR_WORK
jne short .ok4
mov ecx,[WNDCOLORS + MOS_WNDCOLORS.workText]
.ok4:
mov eax,MOS_SC_WRITETEXT
int 0x40
.next: .next:
add edi,LABEL_size ; next label add edi,sizeof.LABEL ; next label
pop ecx pop ecx
dec ecx dec ecx
jz .done jz .done
@@ -304,9 +247,5 @@ drawLabels:
popad popad
popfd popfd
leave
ret ret
%undef WNDCOLORS
%endif

510
programs/if.inc Normal file
View File

@@ -0,0 +1,510 @@
; flat assembler version 1.73
; Copyright (c) 1999-2024, Tomasz Grysztar.
; All rights reserved.
; Macroinstructions for HLL-style conditional operations
macro .if [arg]
{
common
__IF equ
local ..endif
__ENDIF equ ..endif
local ..else
__ELSE equ ..else
JNCOND __ELSE,arg
}
macro .else
{
jmp __ENDIF
__ELSE:
restore __IF
__IF equ ,
}
macro .elseif [arg]
{
common
jmp __ENDIF
__ELSE:
restore __ELSE
local ..else
__ELSE equ ..else
JNCOND __ELSE,arg
}
macro .endif
{
if __IF eq
__ELSE:
end if
__ENDIF:
restore __ELSE
restore __ENDIF
restore __IF
}
macro .while [arg]
{
common
local ..while
__WHILE equ ..while
local ..endw
__ENDW equ ..endw
__WHILE:
JNCOND __ENDW,arg
}
macro .endw
{
jmp __WHILE
__ENDW:
restore __ENDW
restore __WHILE
}
macro .repeat
{
local ..repeat
__REPEAT equ ..repeat
__REPEAT:
}
macro .until [arg]
{
common
JNCOND __REPEAT,arg
restore __REPEAT
}
jnne equ je
jnna equ ja
jnnb equ jb
jnng equ jg
jnnl equ jl
jnnae equ jae
jnnbe equ jbe
jnnge equ jge
jnnle equ jle
macro JNCOND label,v1,c,v2
{
match any,c
\{
cmp v1,v2
jn\#c label
\}
match ,c
\{
PARSECOND parsed@cond,v1
match cond,parsed@cond \\{ JNCONDEXPR label,cond \\}
\}
}
gt equ >
lt equ <
macro PARSECOND parsed,cond
{
define parsed
define neg@cond
define status@cond
define nest@cond
irps symb,cond
\{
define symb@cond symb
match >,symb
\\{
define symb@cond gt
\\}
match <,symb
\\{
define symb@cond lt
\\}
current@cond equ status@cond
match ,current@cond
\\{
match ~,symb
\\\{
neg@cond equ neg@cond ~
match ~~,neg@cond
\\\\{
define neg@cond
\\\\}
define symb@cond
\\\}
match (,symb
\\\{
parsed equ parsed neg@cond,<
define nest@cond +
define symb@cond
define neg@cond
\\\}
match any,symb@cond
\\\{
parsed equ parsed neg@cond,symb@cond
define status@cond +
\\\}
\\}
match status,current@cond
\\{
match &,symb
\\\{
parsed equ parsed,&,
define status@cond
define symb@cond
define neg@cond
\\\}
match |,symb
\\\{
parsed equ parsed,|,
define status@cond
define symb@cond
define neg@cond
\\\}
match (,symb
\\\{
define nest@cond (
\\\}
match ),symb
\\\{
match +,nest@cond
\\\\{
parsed equ parsed>
define symb@cond
\\\\}
restore nest@cond
\\\}
match any,symb@cond
\\\{
parsed equ parsed symb@cond
\\\}
\\}
\}
}
macro define_JNCONDEXPR
{
macro JNCONDEXPR elabel,[mod,cond,op]
\{
\common
\local ..t,..f
define t@cond ..t
define f@cond ..f
\forward
match ,op
\\{
match ,mod \\\{ JNCONDEL elabel,<cond> \\\}
match ~,mod \\\{ JCONDEL elabel,<cond> \\\}
\\}
match &:flabel:tlabel, op:f@cond:t@cond
\\{
match ,mod \\\{ JNCONDEL flabel,<cond> \\\}
match ~,mod \\\{ JCONDEL flabel,<cond> \\\}
tlabel:
\\local ..tnew
restore t@cond
define t@cond ..tnew
\\}
match |:flabel:tlabel, op:f@cond:t@cond
\\{
match ,mod \\\{ JCONDEL tlabel,<cond> \\\}
match ~,mod \\\{ JNCONDEL tlabel,<cond> \\\}
flabel:
\\local ..fnew
restore f@cond
define f@cond ..fnew
\\}
\common
label f@cond at elabel
t@cond:
restore t@cond
restore f@cond
\}
}
macro define_JCONDEXPR
{
macro JCONDEXPR elabel,[mod,cond,op]
\{
\common
\local ..t,..f
define t@cond ..t
define f@cond ..f
\forward
match ,op
\\{
match ,mod \\\{ JCONDEL elabel,<cond> \\\}
match ~,mod \\\{ JNCONDEL elabel,<cond> \\\}
\\}
match |:flabel:tlabel, op:f@cond:t@cond
\\{
match ,mod \\\{ JCONDEL flabel,<cond> \\\}
match ~,mod \\\{ JNCONDEL flabel,<cond> \\\}
tlabel:
\\local ..tnew
restore t@cond
define t@cond ..tnew
\\}
match &:flabel:tlabel, op:f@cond:t@cond
\\{
match ,mod \\\{ JNCONDEL tlabel,<cond> \\\}
match ~,mod \\\{ JCONDEL tlabel,<cond> \\\}
flabel:
\\local ..fnew
restore f@cond
define f@cond ..fnew
\\}
\common
label f@cond at elabel
t@cond:
restore t@cond
restore f@cond
\}
}
macro define_JNCONDEL
{
macro JNCONDEL label,cond
\{
\local COND
match car=,cdr,:cond
\\{
define_JNCONDEXPR
define_JCONDEXPR
define_JCONDEL
define_JNCONDEL
JNCONDEXPR label,cond
purge JNCONDEXPR,JCONDEXPR,JCONDEL,JNCONDEL
define COND
\\}
match c,cond ; replace gt and lt
\\{
match =COND =signed v1>==v2, COND c
\\\{
cmp v1,v2
jl label
define COND
\\\}
match =COND =signed v1<==v2, COND c
\\\{
cmp v1,v2
jg label
define COND
\\\}
match =COND v1>==v2, COND c
\\\{
cmp v1,v2
jb label
define COND
\\\}
match =COND v1<==v2, COND c
\\\{
cmp v1,v2
ja label
define COND
\\\}
match =COND v1==v2, COND c
\\\{
cmp v1,v2
jne label
define COND
\\\}
match =COND v1<>v2, COND c
\\\{
cmp v1,v2
je label
define COND
\\\}
match =COND =signed v1>v2, COND c
\\\{
cmp v1,v2
jle label
define COND
\\\}
match =COND =signed v1<v2, COND c
\\\{
cmp v1,v2
jge label
define COND
\\\}
match =COND v1>v2, COND c
\\\{
cmp v1,v2
jbe label
define COND
\\\}
match =COND v1<v2, COND c
\\\{
cmp v1,v2
jae label
define COND
\\\}
match =COND =ZERO?, COND c
\\\{
jnz label
define COND
\\\}
match =COND =CARRY?, COND c
\\\{
jnc label
define COND
\\\}
match =COND =OVERFLOW?, COND c
\\\{
jno label
define COND
\\\}
match =COND =SIGN?, COND c
\\\{
jns label
define COND
\\\}
match =COND =PARITY?, COND c
\\\{
jnp label
define COND
\\\}
match =COND v, COND c
\\\{
if v eqtype 0
if ~ v
jmp label
end if
else if v eqtype eax
test v,v
jz label
else
cmp v,0
je label
end if
\\\}
\\}
\}
}
macro define_JCONDEL
{
macro JCONDEL label,cond
\{
\local COND
match car=,cdr,:cond
\\{
define_JNCONDEXPR
define_JCONDEXPR
define_JCONDEL
define_JNCONDEL
JCONDEXPR label,cond
purge JNCONDEXPR,JCONDEXPR,JCONDEL,JNCONDEL
define COND
\\}
match c,cond ; replace gt and lt
\\{
match =COND =signed v1>==v2, COND c
\\\{
cmp v1,v2
jge label
define COND
\\\}
match =COND =signed v1<==v2, COND c
\\\{
cmp v1,v2
jle label
define COND
\\\}
match =COND v1>==v2, COND c
\\\{
cmp v1,v2
jae label
define COND
\\\}
match =COND v1<==v2, COND c
\\\{
cmp v1,v2
jbe label
define COND
\\\}
match =COND v1==v2, COND c
\\\{
cmp v1,v2
je label
define COND
\\\}
match =COND v1<>v2, COND c
\\\{
cmp v1,v2
jne label
define COND
\\\}
match =COND =signed v1>v2, COND c
\\\{
cmp v1,v2
jg label
define COND
\\\}
match =COND =signed v1<v2, COND c
\\\{
cmp v1,v2
jl label
define COND
\\\}
match =COND v1>v2, COND c
\\\{
cmp v1,v2
ja label
define COND
\\\}
match =COND v1<v2, COND c
\\\{
cmp v1,v2
jb label
define COND
\\\}
match =COND =ZERO?, COND c
\\\{
jz label
define COND
\\\}
match =COND =CARRY?, COND c
\\\{
jc label
define COND
\\\}
match =COND =OVERFLOW?, COND c
\\\{
jo label
define COND
\\\}
match =COND =SIGN?, COND c
\\\{
js label
define COND
\\\}
match =COND =PARITY?, COND c
\\\{
jp label
define COND
\\\}
match =COND v, COND c
\\\{
if v eqtype 0
if v
jmp label
end if
else if v eqtype eax
test v,v
jnz label
else
cmp v,0
jne label
end if
\\\}
\\}
\}
}
define_JNCONDEXPR
define_JCONDEXPR
define_JNCONDEL
define_JCONDEL

View File

@@ -1,2 +1,2 @@
if tup.getconfig("NO_NASM") ~= "" then return end if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("fillscr.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "fillscr") tup.rule("fillscr.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "fillscr")

View File

@@ -0,0 +1,3 @@
@fasm.exe -m 16384 fillscr.asm fillscr.kex
@kpack fillscr.kex
pause

View File

@@ -1,28 +1,29 @@
; to compile: nasm -f bin fillscr.asm -o fillscr ;
; to generate random colors use "fillscr rnd" ; ; to generate random colors use "fillscr rnd" ;
; otherwise use "filscr r,g,b, r,g,b, r,g,b,..." ; ; otherwise use "filscr r,g,b, r,g,b, r,g,b,..." ;
ORG 0 use32
BITS 32 org 0
db 'MENUET01'
version dd 1
dd program.start
dd program.end
dd program.memory
dd program.stack
dd program.params
dd 0
; ---------------------------- ; ; ---------------------------- ;
points equ END
POINTS_SIZE equ 108 include '../../macros.inc'
PARAMS_SIZE equ 256 include '../../KOSfuncs.inc'
; ---------------------------- ;
MENUET01 db 'MENUET01'
version dd 1
program.start dd START
program.end dd END
program.memory dd END + POINTS_SIZE + PARAMS_SIZE
program.stack dd 0
program.params dd END + POINTS_SIZE
program.path dd 0
; ---------------------------- ; ; ---------------------------- ;
POINTS_SIZE = 108
points_count dd 0 points_count dd 0
rnd dd 0 rnd dd 0
; ---------------------------- ; ; ---------------------------- ;
START: align 4
program.start:
mov edi, points mov edi, points
mov esi, [program.params] mov esi, program.params
cmp [esi], dword "rnd" cmp [esi], dword "rnd"
jne .not_rnd jne .not_rnd
mov [points_count], dword POINTS_SIZE / 3 mov [points_count], dword POINTS_SIZE / 3
@@ -125,32 +126,29 @@ START:
@@: @@:
add edx, 2 add edx, 2
sub eax, edx sub eax, edx
jnle @@ jnle @b
sbb edx, -1 sbb edx, -1
shr edx, 1 shr edx, 1
; set width, height ; set width, height
mov eax, 15
mov ebx, 1
mov ecx, edx mov ecx, edx
int 64 mcall SF_BACKGROUND_SET,SSF_SIZE_BG
; set "stretch" ; set "stretch"
; mov eax, 15 mcall ,SSF_MODE_BG
mov ebx, 4
mov ecx, 2
int 64
; put pixels ; put pixels
; mov eax, 15
mov ebx, 5
mov ecx, points ; BBGGRRBBGGRR...
xor edx, edx xor edx, edx
mov esi, [points_count] ; size of data = count * 3 mov esi, [points_count] ; size of data = count * 3
lea esi, [esi * 2 + esi] lea esi, [esi * 2 + esi]
int 64 mcall ,SSF_IMAGE_BG, points ; BBGGRRBBGGRR...
; refresh screen ; refresh screen
; mov eax, 15 mcall ,SSF_REDRAW_BG
mov ebx, 3
int 64
; thread terminate ; thread terminate
mov eax, -1 mcall SF_TERMINATE_PROCESS
int 64
END: align 4
program.end:
points rb POINTS_SIZE
program.params rb 256
rb 256
align 16
program.stack:
program.memory:

View File

@@ -1,2 +0,0 @@
nasm -f bin fillscr.asm -o fillscr
pause

View File

@@ -1,11 +1,21 @@
; Timer with three buttons ; ; Timer with three buttons ;
; %define lang "ru_RU" ; %define lang "ru_RU"
; %define lang "it_IT" ; %define lang "it_IT"
ORG 0 use32
BITS 32 org 0
; ---------------------------------------------------------------------------- ; db 'MENUET01'
STACK_SIZE equ 256 version dd 1
dd program.start
dd program.end
dd program.memory
dd program.stack
dd 0,0
include '../../macros.inc'
include '../../proc32.inc'
include '../../KOSfuncs.inc'
include 'lang.inc'
; ---------------------------------------------------------------------------- ;
BUTTON_START equ 2 BUTTON_START equ 2
BUTTON_PAUSE equ 3 BUTTON_PAUSE equ 3
BUTTON_RESET equ 4 BUTTON_RESET equ 4
@@ -19,33 +29,24 @@ CHAR_WIDTH equ 6
CHAR2_WIDTH equ 8 CHAR2_WIDTH equ 8
CHAR_HEIGHT equ 9 CHAR_HEIGHT equ 9
BUTTON_START_WIDTH equ (BUTTON_PADDING * 2) + (sz_start.end - sz_start) * CHAR_WIDTH BUTTON_START_WIDTH = (BUTTON_PADDING * 2) + (sz_start.end - sz_start) * CHAR_WIDTH
BUTTON_PAUSE_WIDTH equ (BUTTON_PADDING * 2) + (sz_pause.end - sz_pause) * CHAR_WIDTH BUTTON_PAUSE_WIDTH = (BUTTON_PADDING * 2) + (sz_pause.end - sz_pause) * CHAR_WIDTH
BUTTON_RESET_WIDTH equ (BUTTON_PADDING * 2) + (sz_reset.end - sz_reset) * CHAR_WIDTH BUTTON_RESET_WIDTH = (BUTTON_PADDING * 2) + (sz_reset.end - sz_reset) * CHAR_WIDTH
BUTTON_HEIGHT equ (BUTTON_PADDING * 2) + CHAR_HEIGHT + 1 BUTTON_HEIGHT = (BUTTON_PADDING * 2) + CHAR_HEIGHT + 1
WINDOW_WIDTH equ (BORDER_SIZE * 2) + (MARGIN * 2) + (BUTTON_MARGIN * 2) + (BUTTON_START_WIDTH + BUTTON_PAUSE_WIDTH + BUTTON_RESET_WIDTH) WINDOW_WIDTH = (BORDER_SIZE * 2) + (MARGIN * 2) + (BUTTON_MARGIN * 2) + (BUTTON_START_WIDTH + BUTTON_PAUSE_WIDTH + BUTTON_RESET_WIDTH)
TIME_AREA_WIDTH equ (CHAR2_WIDTH * 8) ; HH MM SS TIME_AREA_WIDTH = (CHAR2_WIDTH * 8) ; HH MM SS
TIME_AREA_LEFT equ (WINDOW_WIDTH - BORDER_SIZE * 2 - TIME_AREA_WIDTH) / 2 TIME_AREA_LEFT = (WINDOW_WIDTH - BORDER_SIZE * 2 - TIME_AREA_WIDTH) / 2
TIME_AREA_TOP equ MARGIN + 1 TIME_AREA_TOP = MARGIN + 1
TEXT_ON_BUTTONS_TOP equ (MARGIN + CHAR_HEIGHT + MARGIN + BUTTON_PADDING) + 1 TEXT_ON_BUTTONS_TOP = (MARGIN + CHAR_HEIGHT + MARGIN + BUTTON_PADDING) + 1
BUTTON_START_BACK_COLOR equ 0x880000 BUTTON_START_BACK_COLOR equ 0x880000
BUTTON_PAUSE_BACK_COLOR equ 0x008800 BUTTON_PAUSE_BACK_COLOR equ 0x008800
BUTTON_RESET_BACK_COLOR equ 0x000088 BUTTON_RESET_BACK_COLOR equ 0x000088
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
MENUET01 db 'MENUET01'
version dd 1
program.start dd START
program.end dd END
program.memory dd END + STACK_SIZE
program.stack dd END + STACK_SIZE
program.params dd 0
program.path dd 0
; ---------------------------------------------------------------------------- ;
screen: screen:
.height dw 0 .height dw 0
.width dw 0 .width dw 0
@@ -56,17 +57,7 @@ window:
.width dd WINDOW_WIDTH .width dd WINDOW_WIDTH
.height dd 0 .height dd 0
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
sc: sc system_colors
.frames dd 0
.grab dd 0
.work_dark dd 0
.work_light dd 0
.grab_text dd 0
.work dd 0
.work_button dd 0
.work_button_text dd 0
.work_text dd 0
.work_graph dd 0
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
timer_ticks dd 0 timer_ticks dd 0
last_timer_ticks dd 0 last_timer_ticks dd 0
@@ -88,16 +79,16 @@ ButtonEvents:
.pause dd EmptyProc ; at start Pause must not work .pause dd EmptyProc ; at start Pause must not work
.reset dd On_ButtonReset .reset dd On_ButtonReset
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
%ifidn lang, "ru_RU" if lang eq ru_RU
sz_timer db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",0 sz_timer db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",0
sz_start: db "<22><><EFBFBD><EFBFBD><EFBFBD>" sz_start: db "<22><><EFBFBD><EFBFBD><EFBFBD>"
.end: db 0 .end: db 0
sz_pause: db "<22><><EFBFBD><EFBFBD><EFBFBD>" sz_pause: db "<22><>"
.end: db 0 .end: db 0
sz_reset: db "<22><><EFBFBD><EFBFBD><EFBFBD>" sz_reset: db "<22><><EFBFBD><EFBFBD><EFBFBD>"
.end: db 0 .end: db 0
%elifidn lang, "it_IT" else if lang eq it_IT
sz_timer db "Timer",0 sz_timer db "Timer",0
sz_start: db "lancio" sz_start: db "lancio"
@@ -106,7 +97,7 @@ ButtonEvents:
.end: db 0 .end: db 0
sz_reset: db "reset" sz_reset: db "reset"
.end: db 0 .end: db 0
%else else
sz_timer db "Timer",0 sz_timer db "Timer",0
sz_start: db "start" sz_start: db "start"
@@ -115,13 +106,12 @@ ButtonEvents:
.end: db 0 .end: db 0
sz_reset: db "reset" sz_reset: db "reset"
.end: db 0 .end: db 0
%endif end if
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
START: align 4
program.start:
; get.screen.size ; get.screen.size
mov eax, 61 mcall SF_GET_GRAPHICAL_PARAMS,SSF_SCREEN_SIZE
mov ebx, 1
int 64
mov [screen], eax mov [screen], eax
movzx eax, word[screen.width] movzx eax, word[screen.width]
@@ -130,9 +120,7 @@ START:
mov [window.left], eax mov [window.left], eax
; skin.height ; skin.height
mov eax, 48 mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
mov ebx, 4
int 64
add eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT add eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
mov [window.height], eax mov [window.height], eax
@@ -144,33 +132,26 @@ START:
call On_Redraw call On_Redraw
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
wait.event: wait.event:
mov eax, 23 mcall SF_WAIT_EVENT_TIMEOUT, 50
mov ebx, 50 call dword[eax * 4 + Events]
int 64
call [eax * 4 + Events]
jmp wait.event jmp wait.event
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
On_KeyPress: On_KeyPress:
mov eax, 2 mcall SF_GET_KEY
int 64
ret ret
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
On_ButtonPress: On_ButtonPress:
mov eax, 17 mcall SF_GET_BUTTON
int 64
movzx eax, ah movzx eax, ah
call [eax * 4 + ButtonEvents] call dword[eax * 4 + ButtonEvents]
ret ret
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
On_ButtonClose: On_ButtonClose:
or eax, -1 mcall SF_TERMINATE_PROCESS
int 64
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
On_ButtonStart: On_ButtonStart:
; get system counter ; get system counter
mov eax, 26 mcall SF_SYSTEM_GET,SSF_TIME_COUNT
mov ebx, 9
int 64
sub eax, [last_timer_ticks] sub eax, [last_timer_ticks]
and [last_timer_ticks], dword 0 and [last_timer_ticks], dword 0
mov [timer_ticks], eax mov [timer_ticks], eax
@@ -181,9 +162,7 @@ On_ButtonStart:
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
On_ButtonPause: On_ButtonPause:
; get system counter ; get system counter
mov eax, 26 mcall SF_SYSTEM_GET,SSF_TIME_COUNT
mov ebx, 9
int 64
sub eax, [timer_ticks] sub eax, [timer_ticks]
mov [last_timer_ticks], eax mov [last_timer_ticks], eax
mov [timer_proc], dword EmptyProc mov [timer_proc], dword EmptyProc
@@ -204,23 +183,14 @@ On_ButtonReset:
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
On_Redraw: On_Redraw:
; redraw.start ; redraw.start
mov eax, 12 mcall SF_REDRAW,SSF_BEGIN_DRAW
mov ebx, 1
int 64
; get.standart.colors ; get.standart.colors
mov eax, 48 mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
mov ebx, 3
mov ecx, sc
mov edx, 40
int 64
; skin.height ; skin.height
mov eax, 48 mcall ,SSF_GET_SKIN_HEIGHT
mov ebx, 4
int 64
add eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT add eax, (MARGIN * 3) + BORDER_SIZE + BUTTON_HEIGHT + CHAR_HEIGHT
mov [window.height], eax mov [window.height], eax
; draw.window ; draw.window
xor eax, eax
mov ebx, [window.left] mov ebx, [window.left]
shl ebx, 16 shl ebx, 16
add ebx, [window.width] add ebx, [window.width]
@@ -230,51 +200,28 @@ On_Redraw:
mov edx, [sc.work] mov edx, [sc.work]
or edx, 0x34000000 or edx, 0x34000000
mov edi, sz_timer mov edi, sz_timer
int 64 mcall SF_CREATE_WINDOW
; draw.buttons: ; draw.buttons:
mov eax, 8 mcall SF_DEFINE_BUTTON, (MARGIN shl 16) or BUTTON_START_WIDTH, ((MARGIN + CHAR_HEIGHT + MARGIN) shl 16) or BUTTON_HEIGHT, BUTTON_START, BUTTON_START_BACK_COLOR
mov ecx, ((MARGIN + CHAR_HEIGHT + MARGIN) << 16) | BUTTON_HEIGHT
mov ebx, (MARGIN << 16) | BUTTON_START_WIDTH mcall , ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN) shl 16) or BUTTON_PAUSE_WIDTH,, BUTTON_PAUSE, BUTTON_PAUSE_BACK_COLOR
mov edx, BUTTON_START
mov esi, BUTTON_START_BACK_COLOR
int 64
mov ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_PAUSE_WIDTH mcall , ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN) shl 16) or BUTTON_RESET_WIDTH,, BUTTON_RESET, BUTTON_RESET_BACK_COLOR
mov edx, BUTTON_PAUSE
mov esi, BUTTON_PAUSE_BACK_COLOR
int 64
mov ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN) << 16) | BUTTON_RESET_WIDTH
mov edx, BUTTON_RESET
mov esi, BUTTON_RESET_BACK_COLOR
int 64
;---------------------- ;----------------------
; draw.texts: ; draw.texts:
mov eax, 4 mcall SF_DRAW_TEXT, ((MARGIN + BUTTON_PADDING + 1) shl 16) or TEXT_ON_BUTTONS_TOP, 0x80FFFFFF, sz_start
mov ecx, 0x80FFFFFF
mov ebx, ((MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP mcall , ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) shl 16) or TEXT_ON_BUTTONS_TOP,, sz_pause
mov edx, sz_start
int 64
mov ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP mcall , ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) shl 16) or TEXT_ON_BUTTONS_TOP,, sz_reset
mov edx, sz_pause
int 64
mov ebx, ((MARGIN + BUTTON_START_WIDTH + BUTTON_MARGIN + BUTTON_PAUSE_WIDTH + BUTTON_MARGIN + BUTTON_PADDING + 1) << 16) | TEXT_ON_BUTTONS_TOP
mov edx, sz_reset
int 64
;---------------------- ;----------------------
call On_Idle call On_Idle
; redraw.finish ; redraw.finish
mov eax, 12 mcall SF_REDRAW,SSF_END_DRAW
mov ebx, 2
int 64
ret ret
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
DrawTime: DrawTime:
mov ebx, (1 << 16) mov ebx, (1 shl 16)
mov esi, [sc.work_text] mov esi, [sc.work_text]
mov edi, [sc.work] mov edi, [sc.work]
; HH ; HH
@@ -287,24 +234,16 @@ DrawTime:
mov ecx, eax ; [hours] first digit mov ecx, eax ; [hours] first digit
or esi, 0x70000000 or esi, 0x70000000
mov eax, 47 mcall SF_DRAW_NUMBER,,, (TIME_AREA_LEFT shl 16) or TIME_AREA_TOP
mov edx, (TIME_AREA_LEFT << 16) | TIME_AREA_TOP
int 64
and esi, 0x30FFFFFF and esi, 0x30FFFFFF
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + 1) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + 1) << 16) | TIME_AREA_TOP
int 64
mov ecx, ebp ; [hours] second digit mov ecx, ebp ; [hours] second digit
or esi, 0x70000000 or esi, 0x70000000
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
int 64
and esi, 0x30FFFFFF and esi, 0x30FFFFFF
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH + 1) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
int 64
; MM ; MM
mov eax, [minutes] mov eax, [minutes]
xor edx, edx xor edx, edx
@@ -315,24 +254,16 @@ DrawTime:
mov ecx, eax ; [minutes] first digit mov ecx, eax ; [minutes] first digit
or esi, 0x70000000 or esi, 0x70000000
mov eax, 47 mcall SF_DRAW_NUMBER,,, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3) << 16) | TIME_AREA_TOP
int 64
and esi, 0x30FFFFFF and esi, 0x30FFFFFF
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3 + 1) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 3 + 1) << 16) | TIME_AREA_TOP
int 64
mov ecx, ebp ; [minutes] second digit mov ecx, ebp ; [minutes] second digit
or esi, 0x70000000 or esi, 0x70000000
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
int 64
and esi, 0x30FFFFFF and esi, 0x30FFFFFF
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH + 1) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 3 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
int 64
; SS ; SS
mov eax, [seconds] mov eax, [seconds]
xor edx, edx xor edx, edx
@@ -343,24 +274,16 @@ DrawTime:
mov ecx, eax ; [seconds] first digit mov ecx, eax ; [seconds] first digit
or esi, 0x70000000 or esi, 0x70000000
mov eax, 47 mcall SF_DRAW_NUMBER,,, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6) << 16) | TIME_AREA_TOP
int 64
and esi, 0x30FFFFFF and esi, 0x30FFFFFF
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6 + 1) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + CHAR2_WIDTH * 6 + 1) << 16) | TIME_AREA_TOP
int 64
mov ecx, ebp ; [seconds] second digit mov ecx, ebp ; [seconds] second digit
or esi, 0x70000000 or esi, 0x70000000
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH) << 16) | TIME_AREA_TOP
int 64
and esi, 0x30FFFFFF and esi, 0x30FFFFFF
mov eax, 47 mcall ,,, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH + 1) shl 16) or TIME_AREA_TOP
mov edx, ((TIME_AREA_LEFT + 1 + CHAR2_WIDTH * 6 + CHAR2_WIDTH + 1) << 16) | TIME_AREA_TOP
int 64
ret ret
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
On_Idle: On_Idle:
@@ -370,9 +293,7 @@ On_Idle:
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
TimerStarted: TimerStarted:
; get system counter ; get system counter
mov eax, 26 mcall SF_SYSTEM_GET,SSF_TIME_COUNT
mov ebx, 9
int 64
sub eax, [timer_ticks] sub eax, [timer_ticks]
xor edx, edx xor edx, edx
mov ecx, 100 mov ecx, 100
@@ -390,4 +311,9 @@ TimerStarted:
EmptyProc: EmptyProc:
ret ret
; ---------------------------------------------------------------------------- ; ; ---------------------------------------------------------------------------- ;
END: align 4
program.end:
rb 512
align 16
program.stack:
program.memory:

View File

@@ -1,2 +1,7 @@
if tup.getconfig("NO_NASM") ~= "" then return end if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("Timer.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "timer") HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR")
tup.include(HELPERDIR .. "/use_fasm.lua")
add_include(tup.getvariantdir())
tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "en_US" or tup.getconfig("LANG")) .. " > %o", {"lang.inc"})
tup.rule({"Timer.asm", extra_inputs = {"lang.inc"}}, FASM .. " %f %o " .. tup.getconfig("KPACK_CMD"), "Timer")

View File

@@ -0,0 +1,4 @@
@echo lang fix en_EN >lang.inc
@fasm.exe -m 16384 timer.asm timer.kex
@kpack timer.kex
pause

View File

@@ -0,0 +1,4 @@
@echo lang fix ru_RU >lang.inc
@fasm.exe -m 16384 timer.asm timer.kex
@kpack timer.kex
pause

View File

@@ -1 +0,0 @@
nasm -f bin Timer.asm -o Timer

View File

@@ -1,2 +0,0 @@
if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("charset_checker.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "charchck")

View File

@@ -0,0 +1,7 @@
## DBGBOARD - a console-based debug board
Main advantages over the old board:
* Bigger font
* Scrolling (like in other console apps)
* K : and L: messages highligting
Also, like the old board it writes log to /tmp0/1/boardlog.txt (or you can pass another path in args like `/sys/develop/dbgboard /tmp0/1/hgfdhgfh.txt`), you can view log file in cedit by hitting `F2` key

View File

@@ -0,0 +1,2 @@
if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("dbgboard.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "dbgboard")

View File

@@ -0,0 +1,244 @@
; SPDX-License-Identifier: GPL-2.0
; DBGBOARD - a console-based debug board
; Copyright (C) 2025 KolibriOS team
format binary as ""
use32
org 0
db 'MENUET01' ; signature
dd 1 ; header version
dd start ; entry point
dd _image_end ; end of image
dd _memory ; required memory size
dd _stacktop ; address of stack top
dd _cmdline ; buffer for command line arguments
dd 0 ; buffer for path
; __DEBUG__ = 1
; __DEBUG_LEVEL__ = DBG_ALL
; DBG_ALL = 0 ; all messages
; DBG_INFO = 1 ; info and errors
; DBG_ERR = 2 ; only errors
include '../../macros.inc'
purge mov,add,sub
include '../../KOSfuncs.inc'
; include '../../debug-fdo.inc'
include '../../proc32.inc'
include '../../dll.inc'
include '../../if.inc'
include '../../string.inc'
CON_WINDOW_CLOSED = 0x200
TEXT_COLOR_YELLOW = 14
TEXT_COLOR_WHITE = 15
TEXT_COLOR_LIGHTGRAY = 7
; TEXT_COLOR_LIGHTGREEN = 10
proc set_text_color stdcall uses eax, _color
and [_color], 0x0F
invoke con_get_flags
and eax, 0x3F0
or eax, [_color]
invoke con_set_flags, eax
ret
endp
; returns eax = 0 or fs error code
proc get_file_attrib stdcall uses ebx, _path, _buf
push [_path]
dec esp
mov byte[esp], 0
push [_buf] ; 40 bytes buf
push 0
push 0
push 0
push SSF_GET_INFO
mov ebx, esp
mcall SF_FILE
add esp, 25
ret
endp
; returns eax = 0 or fs error code
proc create_file stdcall uses ebx, _path
push [_path]
dec esp
mov byte[esp], 0
push 0
push 0
push 0
push 0
push SSF_CREATE_FILE
mov ebx, esp
mcall SF_FILE
add esp, 25
ret
endp
; returns eax = 0 or fs error code
proc write_file stdcall uses ebx, _path, _buf, _count, _pos_lo, _pos_hi, _out_bytes_written
push [_path]
dec esp
mov byte[esp], 0
push [_buf]
push [_count]
push [_pos_hi]
push [_pos_lo]
push SSF_WRITE_FILE
mov ebx, esp
mcall SF_FILE
add esp, 25
mov ecx, [_out_bytes_written]
mov [ecx], ebx
ret
endp
start:
;; if there is a second instance of conboard is running then exit
mcall SF_THREAD_INFO, thread_info, -1
stdcall string.copy, thread_info + process_information.process_name, thread_name
stdcall string.to_lower_case, thread_name
xor edx, edx ; conboard instance count
xor esi, esi
.while esi < 256 ; NOTE: add to macros.inc MAX_THREAD_COUNT = 256
mcall SF_THREAD_INFO, thread_info, esi
.if [thread_info + process_information.slot_state] <> TSTATE_FREE
stdcall string.to_lower_case, thread_info + process_information.process_name
stdcall string.cmp, thread_info + process_information.process_name, thread_name, -1
.if eax = 0
inc edx
.if edx >= 2
jmp .raw_exit
.endif
.endif
.endif
inc esi
.endw
stdcall dll.Load, @IMPORT
test eax, eax
jnz .exit
invoke con_start, 1
invoke con_init, 80, 32, -1, -1, title
.if byte [_cmdline] <> 0
mov [log_file_path], _cmdline
.endif
.main_loop:
invoke con_kbhit
.if eax = 1
invoke con_getch2
.if ah = 60 ; F2
mov eax, [log_file_path]
mov [struct_open_in_notepad.filename], eax
mcall SF_FILE, struct_open_in_notepad
.endif
.endif
mcall SF_BOARD, SSF_DEBUG_READ
.if ebx = 0
mcall SF_SLEEP, 50
jz .main_loop_cond
.endif
mov [chr], al
.if [is_start_line] = 1
mov eax, prefix
add eax, [prefix_index]
mov bl, byte [chr]
mov [eax], bl
.if [prefix_index] = 2
.if dword [prefix] = 'K :'
stdcall set_text_color, TEXT_COLOR_YELLOW
.elseif dword [prefix] = 'L: '
stdcall set_text_color, TEXT_COLOR_WHITE
.else
stdcall set_text_color, TEXT_COLOR_LIGHTGRAY
.endif
mov [is_start_line], 0
mov [prefix_index], 0
invoke con_write_asciiz, prefix
mov dword [prefix], 0
.else
inc [prefix_index]
.endif
.else
invoke con_write_asciiz, chr
.if byte [chr] = 10
mov [is_start_line], 1
stdcall set_text_color, TEXT_COLOR_LIGHTGRAY
.endif
.endif
stdcall get_file_attrib, [log_file_path], file_info_buf
.if eax = 5 ; file not found
stdcall create_file, [log_file_path]
.endif
stdcall write_file, [log_file_path], chr, 1, dword [file_info_buf + 32], dword [file_info_buf + 32 + 4], bytes_written
.main_loop_cond:
invoke con_get_flags
and eax, CON_WINDOW_CLOSED
test eax, eax
jz .main_loop
.exit:
invoke con_exit, 0
.raw_exit:
mcall SF_TERMINATE_PROCESS
; data:
title db 'Debug & message board',0
log_file_path dd default_log_file_path
default_log_file_path db '/tmp0/1/BOARDLOG.TXT',0
prefix db 0,0,0,0
prefix_index dd 0
is_start_line dd 1
bytes_written dd 0
chr db 0, 0
struct_open_in_notepad:
dd SSF_START_APP
dd 0
.filename dd ?
dd 0
dd 0
db '/sys/develop/cedit', 0
; include_debug_strings
align 4
@IMPORT:
library console, 'console.obj'
import console, \
con_start, 'START', \
con_init, 'con_init', \
con_write_asciiz, 'con_write_asciiz', \
con_exit, 'con_exit', \
con_kbhit, 'con_kbhit', \
con_getch2, 'con_getch2', \
con_set_flags, 'con_set_flags', \
con_get_flags, 'con_get_flags'
align 16
_image_end:
file_info_buf rb 40
align 4
_cmdline rb 256
thread_info process_information
thread_name rb 16
; reserve for stack:
rb 4096
align 16
_stacktop:
_memory:

View File

@@ -118,8 +118,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -1,2 +1,7 @@
if tup.getconfig("NO_NASM") ~= "" then return end if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("tinfo.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "tinfo") HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR")
tup.include(HELPERDIR .. "/use_fasm.lua")
add_include(tup.getvariantdir())
tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "en_US" or tup.getconfig("LANG")) .. " > %o", {"lang.inc"})
tup.rule({"tinfo.asm", extra_inputs = {"lang.inc"}}, FASM .. " %f %o " .. tup.getconfig("KPACK_CMD"), "tinfo")

View File

@@ -0,0 +1,4 @@
@echo lang fix en_EN >lang.inc
@fasm.exe -m 16384 tinfo.asm tinfo.kex
@kpack tinfo.kex
pause

View File

@@ -0,0 +1,4 @@
@echo lang fix ru_RU >lang.inc
@fasm.exe -m 16384 tinfo.asm tinfo.kex
@kpack tinfo.kex
pause

View File

@@ -1 +0,0 @@
nasm -f bin tinfo.asm -o tinfo

File diff suppressed because it is too large Load Diff

View File

@@ -2,36 +2,28 @@
; path to folder in edit1 ; ; path to folder in edit1 ;
; count of files in edit2 ; ; count of files in edit2 ;
; to compile: nasm -f bin GenFiles.asm -o GenFiles ; ; to compile: nasm -f bin GenFiles.asm -o GenFiles ;
ORG 0 use32
BITS 32 org 0
db 'MENUET01'
version dd 1
dd program.start
dd program.end
dd program.memory
dd program.stack
dd 0,0
include '../../macros.inc'
include '../../proc32.inc'
include '../../KOSfuncs.inc'
; ------------------------------------- ; ; ------------------------------------- ;
STACK_SIZE equ 256 BUTTON_START = 2
; ------------------------------------- ; ; ------------------------------------- ;
EM_REDRAW equ 0b1 ED_DISABLED = 100000000000b
EM_KEY equ 0b10
EM_BUTTON equ 0b100
EM_MOUSE equ 0b100000
; ------------------------------------- ; ; ------------------------------------- ;
BUTTON_START equ 2 EDIT1_MAX_LENGTH = 1024
; ------------------------------------- ; EDIT2_MAX_LENGTH = 10
ED_DISABLED equ 0b100000000000 FILE_NAME_LENGTH = 256
; ------------------------------------- ;
EDIT1_MAX_LENGTH equ 1024
EDIT2_MAX_LENGTH equ 10
FILE_NAME_LENGTH equ 256
; ------------------------------------- ;
text_buffer1 equ END + STACK_SIZE
text_buffer2 equ END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2)
file_name equ END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2) + (EDIT2_MAX_LENGTH + 2)
; ------------------------------------- ;
MENUET01 db 'MENUET01'
version dd 1
program.start dd START
program.end dd END
program.memory dd END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2) + (EDIT2_MAX_LENGTH + 2) + FILE_NAME_LENGTH
program.stack dd END + STACK_SIZE
program.params dd 0
program.path dd 0
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
Events: Events:
@@ -67,7 +59,7 @@ edit1:
.width dd 100 .width dd 100
.left dd 48 .left dd 48
.top dd 8 .top dd 8
.color dd 0X00FFFFFF .color dd 0x00FFFFFF
.shift_color dd 0x94AECE .shift_color dd 0x94AECE
.focus_border_color dd 0 .focus_border_color dd 0
.blur_border_color dd 0 .blur_border_color dd 0
@@ -88,7 +80,7 @@ edit2:
.width dd 60 .width dd 60
.left dd 216 .left dd 216
.top dd 8 .top dd 8
.color dd 0X00FFFFFF .color dd 0x00FFFFFF
.shift_color dd 0x94AECE .shift_color dd 0x94AECE
.focus_border_color dd 0 .focus_border_color dd 0
.blur_border_color dd 0 .blur_border_color dd 0
@@ -139,57 +131,39 @@ sz_error db "error",0
; ------------------------------------- ; ; ------------------------------------- ;
digits db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" digits db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
; ------------------------------------- ; ; ------------------------------------- ;
START: program.start:
; LoadLibrary: ; LoadLibrary:
mov eax, 68 mcall SF_SYS_MISC,SSF_LOAD_DLL, sz_box_lib
mov ebx, 19
mov ecx, sz_box_lib
int 64
mov [box_lib], eax mov [box_lib], eax
push dword[box_lib] stdcall GetProcAddress,sz_edit_box,[box_lib]
push sz_edit_box
call GetProcAddress
mov [edit_box_draw], eax mov [edit_box_draw], eax
push dword[box_lib] stdcall GetProcAddress,sz_edit_box_key,[box_lib]
push sz_edit_box_key
call GetProcAddress
mov [edit_box_key], eax mov [edit_box_key], eax
push dword[box_lib] stdcall GetProcAddress,sz_edit_box_mouse,[box_lib]
push sz_edit_box_mouse
call GetProcAddress
mov [edit_box_mouse], eax mov [edit_box_mouse], eax
push dword[box_lib] stdcall GetProcAddress,sz_edit_box_set_text,[box_lib]
push sz_edit_box_set_text
call GetProcAddress
mov [edit_box_set_text], eax mov [edit_box_set_text], eax
push dword[box_lib] stdcall GetProcAddress,sz_progressbar_draw,[box_lib]
push sz_progressbar_draw
call GetProcAddress
mov [progressbar_draw], eax mov [progressbar_draw], eax
push dword[box_lib] stdcall GetProcAddress,sz_progressbar_progress,[box_lib]
push sz_progressbar_progress
call GetProcAddress
mov [progressbar_progress], eax mov [progressbar_progress], eax
; ------------------------------------- ; ; ------------------------------------- ;
; SetEventMask ; SetEventMask
mov eax, 40 mcall SF_SET_EVENTS_MASK, EVM_REDRAW or EVM_KEY or EVM_BUTTON or EVM_MOUSE
mov ebx, EM_REDRAW | EM_KEY | EM_BUTTON | EM_MOUSE
int 64
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
WaitEvent: WaitEvent:
mov eax, 10 mcall SF_WAIT_EVENT
int 64 call dword[eax * 4 + Events]
call [eax * 4 + Events]
jmp WaitEvent jmp WaitEvent
; ------------------------------------- ; ; ------------------------------------- ;
%macro CreateNextFile 0 macro CreateNextFile {
; Base36(count) ; Base36(count)
mov eax, [count] mov eax, [count]
mov ecx, 36 ; because our base is 36 mov ecx, 36 ; because our base is 36
@@ -197,14 +171,14 @@ WaitEvent:
mov edi, esi mov edi, esi
add esi, 7 ; base36(0xFFFFFFFF) = 1Z141Z3 : 7 simbols add esi, 7 ; base36(0xFFFFFFFF) = 1Z141Z3 : 7 simbols
mov [esi], byte 0 mov [esi], byte 0
%%next: @@:
xor edx, edx xor edx, edx
div ecx div ecx
dec esi dec esi
mov dl, [edx + digits] mov dl, [edx + digits]
mov [esi], dl mov [esi], dl
test eax, eax test eax, eax
jnz %%next jnz @b
mov eax, esi mov eax, esi
sub eax, edi sub eax, edi
mov ecx, 7 + 1 mov ecx, 7 + 1
@@ -218,12 +192,11 @@ WaitEvent:
push dword 0 push dword 0
push dword 0 push dword 0
push dword 0 push dword 0
push dword 2 ; SubFunction #2 Create/Rewrite file push dword SSF_CREATE_FILE ; SubFunction #2 Create/Rewrite file
mov ebx, esp mov ebx, esp
mov eax, 70 ; Function #70 mcall SF_FILE
int 64
add esp, 25 ; restore stack add esp, 25 ; restore stack
%endmacro }
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
DoAction: DoAction:
@@ -245,16 +218,12 @@ DoAction:
mov [pb.max], ecx mov [pb.max], ecx
mov [pb.value], dword 0 mov [pb.value], dword 0
; draw progressbar ; draw progressbar
push pb stdcall [progressbar_draw], pb
call [progressbar_draw]
; ------------------------------------- ; ; ------------------------------------- ;
cmp [count], dword 0 cmp [count], dword 0
jz .done jz .done
; SetCurrentDirectory ; SetCurrentDirectory
mov eax, 30 mcall SF_CURRENT_FOLDER,SSF_SET_CF, [edit1.text]
mov ebx, 1
mov ecx, [edit1.text]
int 64
; ;
mov [status_string], dword sz_doing mov [status_string], dword sz_doing
call DrawStatus call DrawStatus
@@ -263,30 +232,23 @@ DoAction:
test eax, eax test eax, eax
jnz .error jnz .error
; increase progress ; increase progress
push pb stdcall [progressbar_progress], pb
call [progressbar_progress]
; CheckEvent ; CheckEvent
mov eax, 11 mcall SF_CHECK_EVENT
int 64 call dword[eax * 4 + Events]
call [eax * 4 + Events]
dec dword [count] dec dword [count]
jnz .do jnz .do
.done: .done:
mov [status_string], dword sz_done mov [status_string], dword sz_done
call DrawStatus call DrawStatus
ret ret
.error: .error:
mov [status_string], dword sz_error mov [status_string], dword sz_error
call DrawStatus call DrawStatus
ret ret
; ------------------------------------- ; ; ------------------------------------- ;
DrawStatus: DrawStatus:
mov eax, 4 mcall SF_DRAW_TEXT, (297 shl 16) or 38, 0xD0000000, [status_string],, 0x00FFFFFF
mov ecx, 0xD0000000
mov ebx, (297 << 16) | 38
mov edx, [status_string]
mov edi, 0x00FFFFFF
int 64
ret ret
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
@@ -296,83 +258,54 @@ On_Idle:
align 4 align 4
On_Redraw: On_Redraw:
; RedrawStart ; RedrawStart
mov eax, 12 mcall SF_REDRAW,SSF_BEGIN_DRAW
mov ebx, 1
int 64
; DrawWindow ; DrawWindow
xor eax, eax
mov ebx, (50 << 16) | 360
mov ecx, (50 << 16) | 88
mov edx, 0x34FFFFFF
mov edi, sz_caption mov edi, sz_caption
xor esi, esi xor esi, esi
int 64 mcall SF_CREATE_WINDOW, (50 shl 16) or 360, (50 shl 16) or 88, 0x34FFFFFF
; draw progressbar ; draw progressbar
push pb stdcall [progressbar_draw], pb
call [progressbar_draw]
; draw edit1 ; draw edit1
push edit1 stdcall [edit_box_draw], edit1
call [edit_box_draw]
; draw edit2 ; draw edit2
push edit2 stdcall [edit_box_draw], edit2
call [edit_box_draw]
; DrawButton ; DrawButton
mov eax, 8 mcall SF_DEFINE_BUTTON, (288 shl 16) or 53, (8 shl 16) or 26, BUTTON_START, 0x00DDDDDD
mov ecx, (8 << 16) | 26
mov ebx, (288 << 16) | 53
mov edx, BUTTON_START
mov esi, 0x00DDDDDD
int 64
; DrawTexts ; DrawTexts
mov eax, 4
mov ecx, 0x90000000
; Path: ; Path:
mov ebx, (8 << 16) | 11 mcall SF_DRAW_TEXT, (8 shl 16) or 11, 0x90000000, sz_path
mov edx, sz_path
int 64
; Count: ; Count:
mov ebx, (168 << 16) | 11 mcall , (168 shl 16) or 11,, sz_count
mov edx, sz_count
int 64
; Start: ; Start:
mov ebx, (297 << 16) | 15 mcall , (297 shl 16) or 15,, sz_start
mov edx, sz_start
int 64
; draw status ; draw status
call DrawStatus call DrawStatus
; RedrawFinish ; RedrawFinish
mov eax, 12 mcall SF_REDRAW,SSF_END_DRAW
mov ebx, 2
int 64
ret ret
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
On_Key: On_Key:
; GetKeyCode ; GetKeyCode
mov eax, 2 mcall SF_GET_KEY
int 64
; notify edit1 about key event ; notify edit1 about key event
push edit1 stdcall [edit_box_key], edit1
call [edit_box_key]
; notify edit2 about key event ; notify edit2 about key event
push edit2 stdcall [edit_box_key], edit2
call [edit_box_key]
ret ret
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
On_Button: On_Button:
; GetButtonNumber ; GetButtonNumber
mov eax, 17 mcall SF_GET_BUTTON
int 64
movzx eax, ah movzx eax, ah
call [eax * 4 + ButtonEvents] call dword[eax * 4 + ButtonEvents]
ret ret
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
On_ButtonClose: On_ButtonClose:
; Terminate ; Terminate
or eax, -1 mcall SF_TERMINATE_PROCESS
int 64
; ret is not needed here because we are not back after terminate ; ret is not needed here because we are not back after terminate
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
@@ -381,31 +314,25 @@ On_ButtonStart:
or [edit1.flags], dword ED_DISABLED ; disable edit1 | we will or [edit1.flags], dword ED_DISABLED ; disable edit1 | we will
or [edit2.flags], dword ED_DISABLED ; disable edit2 | in Action or [edit2.flags], dword ED_DISABLED ; disable edit2 | in Action
; redraw edit1 after change flag ; redraw edit1 after change flag
push edit1 stdcall [edit_box_draw], edit1
call [edit_box_draw]
; redraw edit2 after change flag ; redraw edit2 after change flag
push edit2 stdcall [edit_box_draw], edit2
call [edit_box_draw]
call DoAction call DoAction
mov [ButtonEvents.2], dword On_ButtonStart ; enable ButtonStart mov [ButtonEvents.2], dword On_ButtonStart ; enable ButtonStart
and [edit1.flags], dword ~ED_DISABLED ; enable edit1 and [edit1.flags], not ED_DISABLED ; enable edit1
and [edit2.flags], dword ~ED_DISABLED ; enable edit2 and [edit2.flags], not ED_DISABLED ; enable edit2
; redraw edit1 after change flag ; redraw edit1 after change flag
push edit1 stdcall [edit_box_draw], edit1
call [edit_box_draw]
; redraw edit2 after change flag ; redraw edit2 after change flag
push edit2 stdcall [edit_box_draw], edit2
call [edit_box_draw]
ret ret
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
On_Mouse: On_Mouse:
; notify edit1 about mouse event ; notify edit1 about mouse event
push edit1 stdcall [edit_box_mouse], edit1
call [edit_box_mouse]
; notify edit2 about mouse event ; notify edit2 about mouse event
push edit2 stdcall [edit_box_mouse], edit2
call [edit_box_mouse]
ret ret
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
@@ -436,4 +363,12 @@ GetProcAddress:
ret 8 ret 8
; ------------------------------------- ; ; ------------------------------------- ;
align 4 align 4
END: program.end:
; ------------------------------------- ;
text_buffer1 rb EDIT1_MAX_LENGTH+2
text_buffer2 rb EDIT2_MAX_LENGTH+2
file_name rb FILE_NAME_LENGTH
rb 256
align 16
program.stack:
program.memory:

View File

@@ -1,2 +1,2 @@
if tup.getconfig("NO_NASM") ~= "" then return end if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("GenFiles.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "GenFiles") tup.rule("GenFiles.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "GenFiles")

View File

@@ -0,0 +1,3 @@
@fasm.exe -m 16384 GenFiles.asm GenFiles.kex
@kpack GenFiles.kex
pause

Some files were not shown because too many files have changed in this diff Show More