9 Commits

Author SHA1 Message Date
49399adda6 improvement(docs): add branch style 2025-03-15 17:43:53 +03:00
59685a6ac5 refactor(docs): limit line length by 80 2025-03-15 17:39:48 +03:00
b72d3f1035 improvement(docs): change commit title style 2025-03-15 17:39:48 +03:00
59bb13d6de Revert "CONTRIBUTING.md: removed commit categories section"
This reverts commit 46739aa601.
2025-03-15 16:31:15 +03:00
Burer
82e2b25a9e CONTIBUTING.md - Fixed broken anchor link 2025-03-14 10:03:49 +02:00
Burer
46739aa601 CONTRIBUTING.md: removed commit categories section 2025-03-13 20:40:31 +02:00
Burer
c1704a1c43 Fixed some language mistakes in CONTRIBUTING.md 2025-03-12 10:36:48 +02:00
63264c83a3 Docs: Added GNU GPL v2.0
Source: https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt

Signed-off-by: Max Logaev <maxlogaev@proton.me>
2025-03-12 01:10:12 +03:00
3cc3fa6689 Docs: Added README and contributing guide
Co-authored-by: Burer
Signed-off-by: Max Logaev <maxlogaev@proton.me>
2025-03-12 00:29:48 +03:00
100 changed files with 3757 additions and 2935 deletions

View File

@@ -1,179 +0,0 @@
# 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: kolibri-toolchain
steps:
- name: Checkout
uses: actions/checkout@v4
- 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: kolibri-toolchain
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get describe
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- 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: Build and install 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: Build and install kerpack
run: |
cd ${{ gitea.workspace }}/programs/other/kpack/kerpack_linux/
make
chmod +x kerpack
mv kerpack /home/autobuild/tools/win32/bin/.
- name: Build and install kpack
run: |
cd ${{ gitea.workspace }}/programs/other/kpack/linux/
bash build.sh
chmod +x kpack
mv kpack /home/autobuild/tools/win32/bin/.
- name: Build and install 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 }}
echo "CONFIG_KPACK_CMD= && kpack --nologo %o" | tee en_US.config ru_RU.config es_ES.config
echo "CONFIG_KERPACK_CMD= && kerpack %o" | tee en_US.config ru_RU.config es_ES.config
echo "CONFIG_PESTRIP_CMD= && EXENAME=%o fasm $ROOT/data/common/pestrip.asm %o" | tee en_US.config ru_RU.config es_ES.config
echo "CONFIG_NO_MSVC=full" | tee en_US.config ru_RU.config es_ES.config
echo "CONFIG_INSERT_REVISION_ID=1" | tee en_US.config ru_RU.config es_ES.config
tup -v
tup init
# Configure en_US
echo "CONFIG_LANG=en_US" >> en_US.config
echo "CONFIG_BUILD_TYPE=en_US" >> en_US.config
tup variant en_US.config
# Configure ru_RU
echo "CONFIG_LANG=en_US" >> en_US.config
echo "CONFIG_BUILD_TYPE=en_US" >> en_US.config
tup variant ru_RU.config
# Configure es_ES
echo "CONFIG_LANG=es_ES" >> es_ES.config
echo "CONFIG_BUILD_TYPE=es_ES" >> es_ES.config
tup variant es_ES.config
# -------------------------- Build en_US ------------------------- #
- name: (en_US) Build KolibriOS
run: |
export PATH=/home/autobuild/tools/win32/bin:$PATH
tup build-en_US
- name: (en_US) Upload floppy image
uses: actions/upload-artifact@v3
with:
name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.img
path: build-en_US/data/kolibri.img
- name: (en_US) Upload CD image
uses: actions/upload-artifact@v3
with:
name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.iso
path: build-en_US/data/kolibri.iso
- name: (en_US) Upload raw image
uses: actions/upload-artifact@v3
with:
name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.raw
path: build-en_US/data/kolibri.raw
# -------------------------- Build ru_RU ------------------------- #
- name: (ru_RU) Build KolibriOS
run: |
export PATH=/home/autobuild/tools/win32/bin:$PATH
tup build-ru_RU
- name: (ru_RU) Upload floppy image
uses: actions/upload-artifact@v3
with:
name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.img
path: build-ru_RU/data/kolibri.img
- name: (ru_RU) Upload CD image
uses: actions/upload-artifact@v3
with:
name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.iso
path: build-ru_RU/data/kolibri.iso
- name: (ru_RU) Upload raw image
uses: actions/upload-artifact@v3
with:
name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.raw
path: build-ru_RU/data/kolibri.raw
# -------------------------- Build es_ES ------------------------- #
- name: (es_ES) Build KolibriOS
run: |
export PATH=/home/autobuild/tools/win32/bin:$PATH
tup build-es_ES
- name: (es_ES) Upload floppy image
uses: actions/upload-artifact@v3
with:
name: kolibrios-es_ES-${{ steps.vars.outputs.sha_short }}.img
path: build-es_ES/data/kolibri.img
- name: (es_ES) Upload CD image
uses: actions/upload-artifact@v3
with:
name: kolibrios-es_ES-${{ steps.vars.outputs.sha_short }}.iso
path: build-es_ES/data/kolibri.iso
- name: (es_ES) Upload raw image
uses: actions/upload-artifact@v3
with:
name: kolibrios-es_ES-${{ steps.vars.outputs.sha_short }}.raw
path: build-es_ES/data/kolibri.raw

File diff suppressed because one or more lines are too long

View File

@@ -1,82 +0,0 @@
#!/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!"

118
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,118 @@
# Contributing guide
## Type of contributing
There are two main types of contributions accepted in KolibriOS:
- 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
You can help us by submitting issues about problems found in the system.
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
behavior) in some part of the system (kernel, drivers, apps, etc.) and want to
report it
- Feature Request are used, when you want to propose some **improvement** to
the system (missing features, improved user experience, etc.)
## Pull requests
You can also help us by submitting code via pull requests. The process of
submitting a pull request consists of the following steps:
1. Find what you want to implement or improve
2. Make a fork of kolibrios (or other needed) repository
3. Create a branch with a name that matches [the style](#branch-style)
4. Implement and test the changes
5. Create commits according to the [accepted style](#commit-style)
6. Create and submit a pull request into `main` branch
7. Wait for CI/CD pipelines and code review to pass
When a pull request is submitted, at least two project participants must conduct
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
### Pattern
The commit message should look like this:
```
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.

338
COPYING.TXT Normal file
View File

@@ -0,0 +1,338 @@
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.

28
README.md Normal file
View File

@@ -0,0 +1,28 @@
# KolibriOS
[![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)
KolibriOS is a hobby operating system for x86-compatible computers, which is currently being developed by a small teem of enthusiasts.
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
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).
Common list of tasks, issues and enhancement proposals can be found on [this page](https://git.kolibrios.org/KolibriOS/kolibrios/issues).
## 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.
## License
Contents of this repository are licensed under the terms of **GNU GPL 2.0** unless otherwise specified.
See [this](./COPYING.TXT) file for details.

View File

@@ -407,7 +407,6 @@ tup.append_table(img_files, {
{"@SS", VAR_PROGS .. "/system/scrsaver/scrsaver"},
{"@VOLUME", VAR_PROGS .. "/media/volume/volume"},
{"HACONFIG", VAR_PROGS .. "/other/ha/HACONFIG"},
{"ACLOCK", VAR_PROGS .. "/demos/aclock/aclock"},
{"APM", VAR_PROGS .. "/system/apm/apm"},
{"CALC", VAR_PROGS .. "/other/calc/trunk/calc"},
{"CALENDAR", VAR_PROGS .. "/system/calendar/trunk/calendar"},
@@ -442,8 +441,6 @@ tup.append_table(img_files, {
{"TERMINAL", VAR_PROGS .. "/system/terminal/terminal"},
{"TEST", VAR_PROGS .. "/testing/protection/trunk/test"},
{"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"},
{"ZKEY", VAR_PROGS .. "/system/zkey/trunk/ZKEY"},
{"3D/3DWAV", VAR_PROGS .. "/demos/3dwav/trunk/3dwav"},
@@ -466,18 +463,16 @@ tup.append_table(img_files, {
{"DEMOS/UNVWATER", VAR_PROGS .. "/demos/unvwater/trunk/unvwater"},
{"DEMOS/WEB", VAR_PROGS .. "/demos/web/trunk/web"},
{"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/DBGBOARD", VAR_PROGS .. "/system/dbgboard/dbgboard"},
{"DEVELOP/CEDIT", SRC_PROGS .. "/develop/cedit/CEDIT"},
{"DEVELOP/CHARSETS", VAR_PROGS .. "/develop/charsets/charsets"},
{"DEVELOP/COBJ", VAR_PROGS .. "/develop/cObj/trunk/cObj"},
{"DEVELOP/ENTROPYV", VAR_PROGS .. "/develop/entropyview/entropyview"},
{"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/HEED", VAR_PROGS .. "/develop/heed/trunk/heed"},
{"DEVELOP/KEYASCII", VAR_PROGS .. "/develop/keyascii/trunk/keyascii"},
{"DEVELOP/MTDBG", VAR_PROGS .. "/develop/mtdbg/mtdbg"},
{"DEVELOP/MSTATE", VAR_PROGS .. "/develop/mstate/mstate"},
{"DEVELOP/SCANCODE", VAR_PROGS .. "/develop/scancode/trunk/scancode"},
{"DEVELOP/EXAMPLES/CIRCLE", VAR_PROGS .. "/develop/examples/circle/trunk/circle"},
{"DEVELOP/EXAMPLES/COLORREF", VAR_PROGS .. "/demos/colorref/trunk/colorref"},
@@ -487,8 +482,8 @@ tup.append_table(img_files, {
{"DEVELOP/EXAMPLES/USE_MB", VAR_PROGS .. "/demos/use_mb/use_mb"},
{"File Managers/KFAR", VAR_PROGS .. "/fs/kfar/trunk/kfar"},
{"File Managers/OPENDIAL", VAR_PROGS .. "/fs/opendial/opendial"},
{"LOD", VAR_PROGS .. "/fs/lod/lod"},
{"GAMES/15", VAR_PROGS .. "/games/15/15"},
{"GAMES/DINO", VAR_PROGS .. "/games/dino/dino"},
{"GAMES/FREECELL", VAR_PROGS .. "/games/freecell/freecell"},
{"GAMES/GOMOKU", VAR_PROGS .. "/games/gomoku/gomoku"},
{"GAMES/LIGHTS", VAR_PROGS .. "/games/sq_game/SQ_GAME"},
@@ -503,7 +498,6 @@ tup.append_table(img_files, {
{"GAMES/SW", VAR_PROGS .. "/games/sw/sw"},
{"GAMES/TANKS", VAR_PROGS .. "/games/tanks/tanks"},
{"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/BOX_LIB.OBJ", VAR_PROGS .. "/develop/libraries/box_lib/trunk/box_lib.obj"},
{"LIB/BUF2D.OBJ", VAR_PROGS .. "/develop/libraries/buf2d/trunk/buf2d.obj"},
@@ -523,7 +517,6 @@ tup.append_table(img_files, {
{"LIB/SORT.OBJ", VAR_PROGS .. "/develop/libraries/sorter/sort.obj"},
{"LIB/TINYGL.OBJ", VAR_PROGS .. "/develop/libraries/TinyGL/asm_fork/tinygl.obj"},
{"MEDIA/ANIMAGE", VAR_PROGS .. "/media/animage/trunk/animage"},
{"MEDIA/FILLSCR", VAR_PROGS .. "/media/FillScr/fillscr"},
{"MEDIA/KIV", VAR_PROGS .. "/media/kiv/trunk/kiv"},
{"MEDIA/LISTPLAY", VAR_PROGS .. "/media/listplay/trunk/listplay"},
{"MEDIA/MIDAMP", VAR_PROGS .. "/media/midamp/trunk/midamp"},
@@ -606,6 +599,7 @@ tup.append_table(extra_files, {
{"kolibrios/demos/life3", VAR_PROGS .. "/games/life3/life3"},
{"kolibrios/demos/qjulia", VAR_PROGS .. "/demos/qjulia/trunk/qjulia"},
{"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/arcanii", VAR_PROGS .. "/games/arcanii/arcanii"},
{"kolibrios/games/bomber/bomber", VAR_PROGS .. "/games/bomber/bomber"},
@@ -645,6 +639,22 @@ if build_type == "ru_RU" then tup.append_table(extra_files, {
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.
if tup.getconfig('NO_JWASM') ~= 'full' then
tup.append_table(img_files, {
@@ -720,7 +730,6 @@ if tup.getconfig('NO_TCC') ~= 'full' then
tup.append_table(img_files, {
{"NETWORK/WHOIS", VAR_PROGS .. "/network/whois/whois"},
{"SHELL", VAR_PROGS .. "/system/shell/shell"},
{"GAMES/DINO", VAR_PROGS .. "/games/dino/dino"},
})
tup.append_table(extra_files, {
{"kolibrios/utils/thashview", VAR_PROGS .. "/other/TinyHashView/thashview"},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -112,7 +112,6 @@ dword _tag::get_next_param(dword ps, pe)
// "pe" - param end
// "q" - quote char
char q = NULL;
dword initial_pe = pe;
dword fixeq;
dword val;
dword attr;
@@ -146,14 +145,6 @@ dword _tag::get_next_param(dword ps, pe)
//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
while (pe>ps) && (!__isWhite(ESBYTE[pe])) pe--;
attr = pe + 1;
@@ -170,8 +161,6 @@ dword _tag::get_next_param(dword ps, pe)
}
strlwr(attr);
strrtrim(val);
//Fix case: " img.png"
while(__isWhite(ESBYTE[val])) && (val<initial_pe) val++;
attributes.add(attr);
values.add(val);

View File

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

View File

@@ -56,12 +56,15 @@ void TWebBrowser::SetStyle()
if (tag.is("tr")) { tag_table(); return; }
if (tag.is("th")) { tag_table(); return; }
if (tag.is("td")) { tag_table(); return; }
if (application_mode) {
if (tag.is("exit")) { ExitProcess(); return; }
}
}
void TWebBrowser::tag_p()
{
IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) return;
if (!tag.opened) && (streq(#tag.prior,"p")) return;
IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) || (streq(#tag.prior,"p")) return;
NewLine();
}
@@ -145,6 +148,22 @@ void TWebBrowser::tag_meta_xml()
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 (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)
@@ -245,19 +264,11 @@ void TWebBrowser::tag_h1234_caption()
} else {
style.h = tag.opened;
if (tag.opened) {
if (!style.pre) {
NewLine();
NewLine();
}
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;
if (!style.pre) NewLine();
draw_y += 10;
list.SetFont(BASIC_CHAR_W*2, 14*2, 10011001b);
list.item_h = BASIC_LINE_H * 2 - 2;
if (tag.is("h1")) style.b = true;
} else {
if (tag.is("h1")) style.b = false;
NewLine();
@@ -445,7 +456,7 @@ void TWebBrowser::tag_table()
}
} */
tallest_cell_in_row = math.max(draw_y+style.cur_line_h-list.item_h+1, tallest_cell_in_row);
tallest_cell_in_row = math.max(draw_y+style.cur_line_h-list.item_h, tallest_cell_in_row);
style.cur_line_h = list.item_h;
if (tag.opened) {

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,16 +2,15 @@
<head>
<title>Homepage</title>
</head>
<body><pre>Welcome to WebView a Text-Based Browser.
Bookmarks:
<body><pre>Bookmarks:
1. <a href=//kolibrios.org>KolibriOS homepage</a>
2. <a href="//builds.kolibrios.org">Night-builds</a>
3. <a href="//ftp.kolibrios.org">KolibriOS FTP</a>
2. <a href=//kolibri-n.org>KolibriN homepage</a>
3. <a href="//builds.kolibrios.org">Night-builds</a>
4. <a href="//store.kolibri-n.org">Kolibri Stuff</a>
<font bg=#F8F15B>By the way,</font>
<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; Pressing F6 moves a text cursor to the omnibox.
&bull; You can also use other <a href=WebView:help><font color=555555>Hotkeys</font></a>.
&bull; Click on a label in the bottom right corner to change the encoding of a page.
</font>

View File

@@ -4,13 +4,14 @@
<title><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD></title>
</head>
<body><pre><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
1. <a href=//kolibrios.org><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> KolibriOS</a>
2. <a href="//builds.kolibrios.org"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᡮન</a>
3. <a href="//ftp.kolibrios.org">KolibriOS FTP</a>
1. <a href=//kolibrios.org><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> KolibriOS</a>
2. <a href=//kolibri-n.org>KolibriN10</a>
3. <a href="//builds.kolibrios.org"><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᡮન</a>
4. <a href="//store.kolibri-n.org">Kolibri Store</a>
<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>
&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><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><EFBFBD> <EFBFBD><EFBFBD><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> <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>

View File

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

View File

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

View File

@@ -17,10 +17,8 @@
#define T_STATUS_DL_P2 " M<> <20><><EFBFBD><EFBFBD><EFBFBD> ("
#define T_STATUS_DL_P3 " K<>/<EFBFBD>) "
#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 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 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 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"
char accept_language[]= "Accept-Language: ru\n";
#else
@@ -40,10 +38,8 @@
#define T_STATUS_DL_P2 " MB received ("
#define T_STATUS_DL_P3 " KB/s) "
#define T_ERROR_TOO_MANY_REDIRECTS "'Download manager\nToo many redirects' -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 FILE_SAVED_AS "'Download manager\nFile saved as %s' -Dt"
#define 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"
char accept_language[]= "Accept-Language: en\n";
#endif

View File

@@ -11,8 +11,6 @@ bool open_file = false;
dword speed;
int redirect_count;
_http http;
checkbox autoclose = { T_AUTOCLOSE, false };
@@ -230,7 +228,6 @@ void InitDownload()
pb.progress_color = PB_COL_PROGRESS;
filepath = '\0';
active_status = T_STATUS_READY;
redirect_count = 0;
}
void MonitorProgress()
@@ -244,13 +241,6 @@ void MonitorProgress()
DrawDownloadingProgress();
} else {
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);
get_absolute_url(#redirect_url, #uEdit);
edit_box_set_text stdcall (#ed, #redirect_url);
@@ -317,9 +307,9 @@ void SaveFile(int attempt)
}
if (CreateFile(http.content_received, http.content_pointer, #filepath)==0) {
miniprintf(#notify_message, T_FILE_SAVED_AS, #filepath);
miniprintf(#notify_message, FILE_SAVED_AS, #filepath);
} else {
miniprintf(#notify_message, T_FILE_NOT_SAVED, #filepath);
miniprintf(#notify_message, FILE_NOT_SAVED, #filepath);
}
if (!autoclose.checked) notify(#notify_message);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,2 @@
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

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

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

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

View File

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

View File

@@ -19,34 +19,20 @@
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _DBGBOARD_INC
%define _DBGBOARD_INC
if DEBUG eq
%ifdef DEBUG
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
; no input
;********************************************************************
macro DBG_BOARD_PRINTNEWLINE {
%macro DBG_BOARD_PRINTNEWLINE 0
call dbg_board_printnewline
}
%endm
;********************************************************************
@@ -58,12 +44,12 @@ macro DBG_BOARD_PRINTNEWLINE {
; DBG_BOARD_PRINTCHAR [esi]
; DBG_BOARD_PRINTCHAR [somevariable]
;********************************************************************
macro DBG_BOARD_PRINTCHAR c1 {
%macro DBG_BOARD_PRINTCHAR 1
push ecx
mov cl,byte c1
mov cl,byte %1
call dbg_board_printchar
pop ecx
}
%endm
@@ -74,10 +60,10 @@ macro DBG_BOARD_PRINTCHAR c1 {
; DBG_BOARD_PRINTDWORD 0xdeadbeef
; DBG_BOARD_PRINTDWORD [somevariable]
;********************************************************************
macro DBG_BOARD_PRINTDWORD w1 {
push dword w1
%macro DBG_BOARD_PRINTDWORD 1
push dword %1
call dbg_board_printdword
}
%endm
;********************************************************************
@@ -87,14 +73,13 @@ macro DBG_BOARD_PRINTDWORD w1 {
; examples DBG_BOARD_PRINTSTRINGLITERAL "foo",0
; DBG_BOARD_PRINTSTRINGLITERAL "bar",10,13,0
;********************************************************************
macro DBG_BOARD_PRINTSTRINGLITERAL p1 {
local .foo
jmp @f
.foo db p1, 0 ; terminate string, just to be sure
@@:
push dword .foo
%macro DBG_BOARD_PRINTSTRINGLITERAL 1+
jmp %%bar
%%foo db %1, 0 ; terminate string, just to be sure
%%bar:
push dword %%foo
call dbg_board_printstring
}
%endm
;********************************************************************
@@ -104,18 +89,22 @@ macro DBG_BOARD_PRINTSTRINGLITERAL p1 {
; DBG_BOARD_PRINTSTRING esi
; DBG_BOARD_PRINTSTRING [ebx]
;********************************************************************
macro DBG_BOARD_PRINTSTRING s1 {
push dword s1
%macro DBG_BOARD_PRINTSTRING 1
push dword %1
call dbg_board_printstring
}
%endm
; no input
dbg_board_printnewline:
pushad
pushfd
mcall SF_BOARD,SSF_DEBUG_WRITE,10
mcall ,,13
mov eax,MOS_SC_DEBUGBOARD
mov ebx,1
mov ecx,10
int 0x40
mov ecx,13
int 0x40
popfd
popad
ret
@@ -125,8 +114,10 @@ dbg_board_printnewline:
dbg_board_printchar:
pushad
pushfd
mov eax,MOS_SC_DEBUGBOARD
mov ebx,1
and ecx,0xff
mcall SF_BOARD,SSF_DEBUG_WRITE
int 0x40
popfd
popad
ret
@@ -137,16 +128,19 @@ dbg_board_printdword:
enter 0,0
pushad
pushfd
; print 0x prefix
mcall SF_BOARD,SSF_DEBUG_WRITE,'0'
mcall ,,'x'
mov eax,MOS_SC_DEBUGBOARD
mov ebx,1
mov ecx,'0' ; print 0x prefix
int 0x40
mov ecx,'x'
int 0x40
mov edx,[ebp + 8] ; get dword to print
mov esi,8 ; iterate through all nibbles
.loop:
mov ecx,edx ; display hex digit
shr ecx,28
movzx ecx,byte [dbg_board_printdword_digits + ecx]
mcall
int 0x40
shl edx,4 ; next nibble
dec esi
jnz .loop
@@ -172,7 +166,8 @@ dbg_board_printstring:
or al,al ; zero ?
je .done ; yeah -> get outta here
movzx ecx,al ; nope -> display character
mcall SF_BOARD
mov eax,MOS_SC_DEBUGBOARD
int 0x40
jmp .loop
.done:
popfd
@@ -180,5 +175,26 @@ dbg_board_printstring:
leave
ret 4
end if
%else
%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,6 +17,8 @@
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
%ifndef _DRAW_INC
%define _DRAW_INC
TMR1_FACTOR dd 0.45
@@ -48,36 +50,45 @@ monthNames:
; output : nothing
; destroys : nothing
;********************************************************************
proc drawClock
locals
i dd ?
TMR1X dd ?
TMR1Y dd ?
TMR2X dd ?
TMR2Y dd ?
SECRX dd ?
SECRY dd ?
MINRX dd ?
MINRY dd ?
HOURRX dd ?
HOURRY dd ?
workwidth dd ?
workheight dd ?
foo dd ?
endl
drawClock:
%push drawClock_context
%stacksize flat
%assign %$localsize 0
%local i:dword, \
TMR1X:dword, \
TMR1Y:dword, \
TMR2X:dword, \
TMR2Y:dword, \
SECRX:dword, \
SECRY:dword, \
MINRX:dword, \
MINRY:dword, \
HOURRX:dword, \
HOURRY:dword, \
workwidth:dword, \
workheight:dword, \
foo:dword
enter %$localsize,0
pushad
pushfd
; get window dimensions
mcall SF_THREAD_INFO,procInfo,-1
mov eax,MOS_SC_GETPROCESSINFO
mov ebx,procInfo
mov ecx,-1
int 0x40
; calculate work area size (width/height = ecx/edx)
; if the work area is too small (maybe the window is shaded)
; we don't draw anything.
mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT ; get skin height (eax)
mov ecx,[procInfo.box.width]
mov eax,MOS_SC_WINDOWPROPERTIES
mov ebx,4 ; get skin height (eax)
int 0x40
mov ecx,[procInfo + MOS_PROCESSINFO.wndWidth]
sub ecx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT
mov edx,[procInfo.box.height]
mov edx,[procInfo + MOS_PROCESSINFO.wndHeight]
sub edx,eax
sub edx,MOS_WND_SKIN_BORDER_BOTTOM
cmp ecx,0 ; width too small ?
@@ -91,9 +102,9 @@ proc drawClock
mov [workheight],edx
; calculate center of clock (x/y = esi/edi)
mov esi,[procInfo.box.width]
mov esi,[procInfo + MOS_PROCESSINFO.wndWidth]
shr esi,1
mov edi,[procInfo.box.height]
mov edi,[procInfo + MOS_PROCESSINFO.wndHeight]
sub edi,MOS_WND_SKIN_BORDER_BOTTOM
sub edi,eax
shr edi,1
@@ -108,8 +119,9 @@ proc drawClock
shl ecx,16 ; (=skin height)
or ecx,edx ; height
inc ecx
mov edx,[wndColors.work]
mcall SF_DRAW_RECT
mov edx,[wndColors + MOS_WNDCOLORS.work]
mov eax,MOS_SC_DRAWBAR
int 0x40
popad
; calculate second hand radii
@@ -151,7 +163,8 @@ proc drawClock
fstp dword [TMR2Y]
; get system clock (edx)
mcall SF_GET_SYS_TIME
mov eax,MOS_SC_GETSYSCLOCK
int 0x40
mov edx,eax
; draw second hand
@@ -160,14 +173,21 @@ proc drawClock
shr eax,16
call bcdbin
mov ecx,eax ; save seconds for later
; 2*pi/60
stdcall getHandCoords,edi,esi,[SECRY],[SECRX],0.104719755,eax,ecx
push ecx
push eax
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
or ebx,esi
shl ecx,16
or ecx,edi
mov edx,[wndColors.work_text]
mcall SF_DRAW_LINE
mov edx,[wndColors + MOS_WNDCOLORS.workText]
int 0x40
pop ecx
pop edx
@@ -180,14 +200,21 @@ proc drawClock
mul edx
add eax,ecx
mov ecx,eax ; save for later
; 2*pi/60/60
stdcall getHandCoords,edi,esi,[MINRY],[MINRX],0.001745329,eax,ecx
push ecx
push eax
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
or ebx,esi
shl ecx,16
or ecx,edi
mov edx,[wndColors.work_text]
mcall SF_DRAW_LINE
mov edx,[wndColors + MOS_WNDCOLORS.workText]
int 0x40
pop ecx
pop edx
@@ -202,39 +229,55 @@ proc drawClock
mov edx,60*60
mul edx
add eax,ecx
; 2*pi/60/60/12
stdcall getHandCoords,edi,esi,[HOURRY],[HOURRX],0.000145444,eax
push eax
fpush32 0.000145444 ; 2*pi/60/60/12
push dword [HOURRX]
push dword [HOURRY]
push esi
push edi
call getHandCoords
mov eax,MOS_SC_DRAWLINE
shl ebx,16
or ebx,esi
shl ecx,16
or ecx,edi
mov edx,[wndColors.work_text]
mcall SF_DRAW_LINE
mov edx,[wndColors + MOS_WNDCOLORS.workText]
int 0x40
pop edx
; draw tick marks
mov dword [i],11 ; draw 12 marks
.drawtickmarks:
; calculate start point
; 2*pi/12
stdcall getHandCoords,edi,esi,[TMR1Y],[TMR1X],0.523598776,[i]
push dword [i] ; calculate start point
fpush32 0.523598776 ; 2*pi/12
push dword [TMR1X]
push dword [TMR1Y]
push esi
push edi
call getHandCoords
mov eax,ebx ; save in eax and edx
mov edx,ecx
; 2*pi/12
stdcall getHandCoords,edi,esi,[TMR2Y],[TMR2X],0.523598776,[i]
push dword [i]
fpush32 0.523598776 ; 2*pi/12
push dword [TMR2X]
push dword [TMR2Y]
push esi
push edi
call getHandCoords
shl eax,16
shl edx,16
or ebx,eax ; ebx = x start and end
or ecx,edx ; ecx = y start and end
mov edx,[wndColors.work_text]
mcall SF_DRAW_LINE
mov edx,[wndColors + MOS_WNDCOLORS.workText]
mov eax,MOS_SC_DRAWLINE
int 0x40
dec dword [i]
jns .drawtickmarks
DATE_WIDTH =48
%define DATE_WIDTH 48
; calculate text start position
mov eax,[procInfo.box.width]
mov eax,[procInfo+MOS_PROCESSINFO.wndWidth]
sub eax,DATE_WIDTH ; x = (wndwidth-textwidth)/2
shr eax,1 ; eax = x
fild dword [workheight] ; y = DATE_FACTOR*workheight...
@@ -249,7 +292,7 @@ proc drawClock
jb .goodbye
mov ecx,ebx ; text too high ?
add ecx,10-1
mov edx,[procInfo.box.height]
mov edx,[procInfo+MOS_PROCESSINFO.wndHeight]
sub edx,MOS_WND_SKIN_BORDER_BOTTOM
cmp ecx,edx
jnae .yousuck
@@ -263,7 +306,8 @@ proc drawClock
or ebx,eax
; get date (edi)
mcall SF_GET_SYS_DATE
mov eax,MOS_SC_GETDATE
int 0x40
mov edi,eax
; display month
@@ -271,41 +315,44 @@ proc drawClock
shr eax,8
call bcdbin
; ebx contains already position
mov ecx,[wndColors.work_text]
mov ecx,[wndColors+MOS_WNDCOLORS.workText]
lea edx,[monthNames-3+eax*2+eax]; -3 because eax = 1..12 =]
mov esi,3 ; text length
mcall SF_DRAW_TEXT
mov eax,MOS_SC_WRITETEXT
int 0x40
; display date
add ebx,(3*6+3) shl 16
add ebx,MOS_DWORD(3*6+3,0)
mov eax,edi ; get date
shr eax,16
call bcdbin
mov edx,ebx ; position must be in edx
mov ebx,0x00020000 ; number, display two digits
mov ecx,eax ; number to display
mov esi,[wndColors.work_text]
mcall SF_DRAW_NUMBER
mov esi,[wndColors+MOS_WNDCOLORS.workText]
mov eax,MOS_SC_WRITENUMBER
int 0x40
; display year. the way we avoid the y2k bug is even
; simpler, yet much better than in the last version:
; now we simply display the last two digits and let the
; user decide wether it's the year 1903 or 2003 =]
add edx,(2*6+3) shl 16
add edx,MOS_DWORD(2*6+3,0)
mov eax,edi ; get year
call bcdbin
mov ebx,0x00020000 ; number, display two digits
mov ecx,eax ; number to display
; edx contains already position
mov esi,[wndColors.work_text]
mcall SF_DRAW_NUMBER
mov esi,[wndColors+MOS_WNDCOLORS.workText]
mov eax,MOS_SC_WRITENUMBER
int 0x40
.byebye:
popfd
popad
;leave
leave
ret
endp
%pop
;**********************************************************
@@ -350,26 +397,36 @@ bcdbin:
; destroys:
; nothing
;********************************************************************
proc getHandCoords CENTERY:dword, CENTERX:dword, RADIUSY:dword, RADIUSX:dword, DEG2RAD:dword, ANGLE:dword
getHandCoords:
ANGLE equ 28
DEG2RAD equ 24
RADIUSX equ 20
RADIUSY equ 16
CENTERX equ 12
CENTERY equ 8
enter 0,0
pushfd
fild dword [ANGLE] ; get angle
fmul dword [DEG2RAD] ; convert to radians
fild dword [ebp+ANGLE] ; get angle
fmul dword [ebp+DEG2RAD] ; convert to radians
fsincos
fmul dword [RADIUSY] ; -y * radius + clockcy
fmul dword [ebp+RADIUSY] ; -y * radius + clockcy
fchs
fiadd dword [CENTERY]
fistp dword [CENTERY]
fmul dword [RADIUSX] ; x * radius + clockcx
fiadd dword [CENTERX]
fistp dword [CENTERX]
fiadd dword [ebp+CENTERY]
fistp dword [ebp+CENTERY]
fmul dword [ebp+RADIUSX] ; x * radius + clockcx
fiadd dword [ebp+CENTERX]
fistp dword [ebp+CENTERX]
mov ebx,[CENTERX]
mov ecx,[CENTERY]
mov ebx,[ebp+CENTERX]
mov ecx,[ebp+CENTERY]
popfd
;leave
ret
endp
leave
ret 4*6
%endif

View File

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

View File

@@ -0,0 +1,334 @@
; 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

@@ -0,0 +1,92 @@
; 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

@@ -0,0 +1,49 @@
; 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

@@ -1,3 +1,5 @@
; some strtok-like function
;
; Copyright (c) 2003 Thomas Mathys
; killer@vantage.ch
;
@@ -15,94 +17,8 @@
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;
;********************************************************************
; 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
%ifndef _STRTOK_INC
%define _STRTOK_INC
;********************************************************************
@@ -205,3 +121,5 @@ strtok:
ret
.adx dd 0
%endif

View File

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

View File

@@ -1,33 +0,0 @@
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

@@ -59,7 +59,7 @@ static const unsigned char cp866_page00[24] = {
0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */
};
static const unsigned char cp866_page04[96] = {
0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, /*0x00*/ 0x49, 0xf4, /* 0x00-0x07 */ // Fix BE and UK 'I'
0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0xf4, /* 0x00-0x07 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */
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 */
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */
0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, /*0x00*/ 0x69, 0xf5, /* 0x50-0x57 */ // Fix BE and UK 'i'
0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xf5, /* 0x50-0x57 */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */
};
static const unsigned char cp866_page22[8] = {

View File

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

View File

@@ -1,4 +1,2 @@
if tup.getconfig("NO_FASM") ~= "" then return end
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")
if tup.getconfig("NO_NASM") ~= "" then return end
tup.rule("mstate.asm", "nasm -t -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "mstate")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

2
programs/fs/lod/make.bat Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

305
programs/games/c4/mos.inc Normal file
View File

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

View File

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

View File

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

View File

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

View File

@@ -1,510 +0,0 @@
; 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_FASM") ~= "" then return end
tup.rule("fillscr.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "fillscr")
if tup.getconfig("NO_NASM") ~= "" then return end
tup.rule("fillscr.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "fillscr")

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,2 @@
if tup.getconfig("NO_FASM") ~= "" then return end
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")
if tup.getconfig("NO_NASM") ~= "" then return end
tup.rule("Timer.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "timer")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +0,0 @@
## 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

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

View File

@@ -1,244 +0,0 @@
; 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
y=68
[10]
name=DBGBOARD
path=/SYS/DEVELOP/DBGBOARD
name=BOARD
path=/SYS/DEVELOP/BOARD
param=
ico=19
x=-135

View File

@@ -1,7 +1,2 @@
if tup.getconfig("NO_FASM") ~= "" then return end
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")
if tup.getconfig("NO_NASM") ~= "" then return end
tup.rule("tinfo.asm", "nasm -f bin -o %o %f " .. tup.getconfig("KPACK_CMD"), "tinfo")

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,3 @@
@del GenFiles
nasm -f bin GenFiles.asm -o GenFiles
pause