initial commit
This commit is contained in:
commit
c0f9ca4017
674
LICENSE
Executable file
674
LICENSE
Executable file
@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 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 GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. 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
|
||||
them 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 prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. 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.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey 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;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If 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 convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU 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 that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
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.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
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.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
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
|
||||
state 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 3 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 does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program 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, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU 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. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
323
OVERXMS.ASM
Executable file
323
OVERXMS.ASM
Executable file
@ -0,0 +1,323 @@
|
||||
TITLE Turbo Pascal XMS support for loading overlays - By Wilbert van Leijen
|
||||
PAGE 65, 132
|
||||
LOCALS @@
|
||||
|
||||
Data SEGMENT Word Public
|
||||
ASSUME DS:Data
|
||||
|
||||
; XMS block move record
|
||||
|
||||
XmsMoveType STRUC
|
||||
BlkSize DD ?
|
||||
SrcHandle DW ?
|
||||
SrcOffset DD ?
|
||||
DestHandle DW ?
|
||||
DestOffset DD ?
|
||||
XmsMoveType ENDS
|
||||
|
||||
; TP overlay manager record
|
||||
|
||||
OvrHeader STRUC
|
||||
ReturnAddr DD ? ; Virtual return address
|
||||
FileOfs DD ? ; Offset into overlay file
|
||||
CodeSize DW ? ; Size of overlay
|
||||
FixupSize DW ? ; Size of fixup table
|
||||
EntryPts DW ? ; Number of procedures
|
||||
CodeListNext DW ? ; Segment of next overlay
|
||||
LoadSeg DW ? ; Start segment in memory
|
||||
Reprieved DW ? ; Loaded in memory flag
|
||||
LoadListNext DW ? ; Segment of next in load list
|
||||
XmsOffset DD ? ; Offset into allocated XMS block
|
||||
UserData DW 3 DUP(?)
|
||||
OvrHeader ENDS
|
||||
|
||||
XmsDriver DD ? ; Entry point of XMS driver
|
||||
ExitSave DD ? ; Pointer to previous exit proc
|
||||
XmsMove XmsMoveType <>
|
||||
OvrXmsHandle DW ? ; Returned by XMS driver
|
||||
|
||||
Extrn PrefixSeg : Word
|
||||
Extrn ExitProc : DWord
|
||||
Extrn OvrResult : Word
|
||||
Extrn OvrCodeList : Word
|
||||
Extrn OvrDosHandle : Word
|
||||
Extrn OvrHeapOrg : Word
|
||||
Extrn OvrReadBuf : DWord
|
||||
Data ENDS
|
||||
|
||||
Code SEGMENT Byte Public
|
||||
ASSUME CS:Code
|
||||
Public OvrInitXMS
|
||||
|
||||
ovrIOError EQU -4
|
||||
ovrNoXMSDriver EQU -7
|
||||
ovrNoXMSMemory EQU -8
|
||||
|
||||
OvrXmsExit PROC
|
||||
|
||||
; Release handle and XMS memory
|
||||
|
||||
MOV DX, [OvrXmsHandle]
|
||||
MOV AH, 10
|
||||
CALL [XmsDriver]
|
||||
|
||||
; Restore pointer to previous exit procedure
|
||||
|
||||
LES AX, [ExitSave]
|
||||
MOV Word Ptr [ExitProc], AX
|
||||
MOV Word Ptr [ExitProc+2], ES
|
||||
RETF
|
||||
OvrXmsExit ENDP
|
||||
|
||||
AllocateXms PROC
|
||||
|
||||
; Determine the size of the XMS block to allocate:
|
||||
; Walk the CodeListNext chain
|
||||
; Store the total codesize in DX:AX
|
||||
|
||||
XOR AX, AX
|
||||
XOR DX, DX
|
||||
MOV BX, [OvrCodeList]
|
||||
@@1: ADD BX, [PrefixSeg]
|
||||
ADD BX, 10h
|
||||
MOV ES, BX
|
||||
ADD AX, ES:[OvrHeader.CodeSize]
|
||||
ADC DX, 0
|
||||
MOV BX, ES:[OvrHeader.CodeListNext]
|
||||
OR BX, BX
|
||||
JNZ @@1
|
||||
|
||||
; Obtain number of kilobytes to allocate
|
||||
|
||||
MOV BX, 1024
|
||||
DIV BX
|
||||
XCHG DX, AX
|
||||
INC DX
|
||||
|
||||
; Allocate the block
|
||||
|
||||
MOV AH, 9
|
||||
CALL [XmsDriver]
|
||||
OR AX, AX
|
||||
JZ @@2
|
||||
MOV [OvrXmsHandle], DX
|
||||
@@2: RETN
|
||||
AllocateXms ENDP
|
||||
|
||||
; Function XmsReadFunc(OvrSeg : Word) : Integer; Far;
|
||||
|
||||
XmsReadFunc PROC
|
||||
|
||||
; Swap the code from XMS to the heap
|
||||
|
||||
PUSH BP
|
||||
MOV BP, SP
|
||||
MOV ES, [BP+6]
|
||||
MOV AX, ES:[OvrHeader.CodeSize]
|
||||
MOV Word Ptr [XmsMove.BlkSize], AX
|
||||
XOR AX, AX
|
||||
MOV Word Ptr [XmsMove.BlkSize+2], AX
|
||||
MOV AX, [OvrXmsHandle]
|
||||
MOV [XmsMove.SrcHandle], AX
|
||||
MOV AX, Word Ptr ES:[OvrHeader.XmsOffset]
|
||||
MOV Word Ptr [XmsMove.SrcOffset], AX
|
||||
MOV AX, Word Ptr ES:[OvrHeader.XmsOffset+2]
|
||||
MOV Word Ptr [XmsMove.SrcOffset+2], AX
|
||||
XOR AX, AX
|
||||
MOV [XmsMove.DestHandle], AX
|
||||
MOV Word Ptr [XmsMove.DestOffset], AX
|
||||
MOV AX, ES:[OvrHeader.LoadSeg]
|
||||
MOV Word Ptr [XmsMove.DestOffset+2], AX
|
||||
MOV AH, 11
|
||||
LEA SI, XmsMove
|
||||
CALL [XmsDriver]
|
||||
OR AX, AX
|
||||
JZ @@1
|
||||
DEC AX
|
||||
JMP @@2
|
||||
|
||||
@@1: MOV AX, ovrIOError
|
||||
@@2: POP BP
|
||||
RETF 2
|
||||
XmsReadFunc ENDP
|
||||
|
||||
; Copy an overlaid unit from the heap to XMS
|
||||
; If successful, carry flag is cleared
|
||||
; In/Out:
|
||||
; BX:DI = offset into XMS memory block
|
||||
|
||||
CopyUnitToXms PROC
|
||||
|
||||
; XMS requires that an even number of bytes is moved
|
||||
|
||||
MOV DX, ES:[OvrHeader.CodeSize]
|
||||
TEST DX, 1
|
||||
JZ @@1
|
||||
INC DX
|
||||
INC ES:[OvrHeader.CodeSize]
|
||||
|
||||
; Get the fields of the XMS block move structure
|
||||
|
||||
@@1: MOV Word Ptr [XmsMove.BlkSize], DX
|
||||
XOR AX, AX
|
||||
MOV Word Ptr [XmsMove.BlkSize+2], AX
|
||||
MOV [XmsMove.SrcHandle], AX
|
||||
MOV Word Ptr [XmsMove.SrcOffset], AX
|
||||
MOV AX, [OvrHeapOrg]
|
||||
MOV Word Ptr [XmsMove.SrcOffset+2], AX
|
||||
MOV AX, [OvrXmsHandle]
|
||||
MOV [XmsMove.DestHandle], AX
|
||||
MOV Word Ptr [XmsMove.DestOffset], DI
|
||||
MOV Word Ptr [XmsMove.DestOffset+2], BX
|
||||
MOV AH, 11
|
||||
LEA SI, XmsMove
|
||||
CALL [XmsDriver]
|
||||
|
||||
; Bump code size
|
||||
|
||||
ADD DI, DX
|
||||
ADC BX, 0
|
||||
|
||||
; Check return code from XMS driver
|
||||
|
||||
OR AX, AX
|
||||
JZ @@2
|
||||
CLC
|
||||
RETN
|
||||
|
||||
@@2: STC
|
||||
RETN
|
||||
CopyUnitToXms ENDP
|
||||
|
||||
OvrXmsLoad PROC
|
||||
PUSH BP
|
||||
MOV BP, SP
|
||||
|
||||
; Walk the CodeList chain
|
||||
; First segment is PrefixSeg+10h+OvrCodeList
|
||||
; Push each element of overlaid unit list on the stack
|
||||
; Keep the size of the linked list in CX
|
||||
|
||||
MOV AX, [OvrCodeList]
|
||||
XOR CX, CX
|
||||
@@1: ADD AX, [PrefixSeg]
|
||||
ADD AX, 10h
|
||||
MOV ES, AX
|
||||
PUSH AX
|
||||
INC CX
|
||||
MOV AX, ES:[OvrHeader.CodeListNext]
|
||||
OR AX, AX
|
||||
JNZ @@1
|
||||
|
||||
; Loop:
|
||||
; Pop each element of the overlaid unit list from the stack
|
||||
|
||||
XOR BX, BX
|
||||
XOR DI, DI
|
||||
@@2: POP ES
|
||||
PUSH CX
|
||||
MOV AX, [OvrHeapOrg]
|
||||
MOV ES:[OvrHeader.LoadSeg], AX
|
||||
MOV Word Ptr ES:[OvrHeader.XmsOffset+2], BX
|
||||
MOV Word Ptr ES:[OvrHeader.XmsOffset], DI
|
||||
|
||||
; Load overlay from disk
|
||||
|
||||
PUSH BX
|
||||
PUSH DI
|
||||
PUSH ES
|
||||
PUSH ES
|
||||
CALL [OvrReadBuf]
|
||||
POP ES
|
||||
POP DI
|
||||
POP BX
|
||||
|
||||
; Flag unit as 'unloaded'; check return code
|
||||
|
||||
MOV ES:[OvrHeader.LoadSeg], 0
|
||||
NEG AX
|
||||
JC @@3
|
||||
|
||||
CALL CopyUnitToXms
|
||||
JC @@3
|
||||
|
||||
POP CX
|
||||
LOOP @@2
|
||||
|
||||
@@3: MOV SP, BP
|
||||
POP BP
|
||||
RETN
|
||||
OvrXMSLoad ENDP
|
||||
|
||||
OvrInitXMS PROC
|
||||
|
||||
; Make sure the file's been opened
|
||||
|
||||
XOR AX, AX
|
||||
CMP AX, [OvrDOSHandle]
|
||||
JNE @@1
|
||||
DEC AX ; ovrError
|
||||
JMP @@5
|
||||
|
||||
; Check presence of XMS driver
|
||||
|
||||
@@1: MOV AX, 4300h
|
||||
INT 2Fh
|
||||
CMP AL, 80h
|
||||
JE @@2
|
||||
MOV AX, ovrNoXmsDriver
|
||||
JMP @@5
|
||||
|
||||
; Get XMS driver's entry point
|
||||
|
||||
@@2: MOV AX, 4310h
|
||||
INT 2Fh
|
||||
MOV Word Ptr [XmsDriver], BX
|
||||
MOV Word Ptr [XmsDriver+2], ES
|
||||
CALL AllocateXms
|
||||
JNZ @@3
|
||||
MOV AX, ovrNoXMSMemory
|
||||
JMP @@5
|
||||
|
||||
; Load the overlay into XMS
|
||||
|
||||
@@3: CALL OvrXmsLoad
|
||||
JNC @@4
|
||||
|
||||
; An error occurred. Release handle and XMS memory
|
||||
|
||||
MOV DX, [OvrXmsHandle]
|
||||
MOV AH, 10
|
||||
CALL [XmsDriver]
|
||||
MOV AX, ovrIOError
|
||||
JMP @@5
|
||||
|
||||
; Close file
|
||||
|
||||
@@4: MOV BX, [OvrDOSHandle]
|
||||
MOV AH, 3Eh
|
||||
INT 21h
|
||||
|
||||
; OvrReadBuf := XmsReadFunc
|
||||
|
||||
MOV Word Ptr [OvrReadBuf], Offset XmsReadFunc
|
||||
MOV Word Ptr [OvrReadBuf+2], CS
|
||||
|
||||
; ExitSave := ExitProc
|
||||
; ExitProc := OvrXmsExit
|
||||
|
||||
LES AX, [ExitProc]
|
||||
MOV Word Ptr [ExitSave], AX
|
||||
MOV Word Ptr [ExitSave+2], ES
|
||||
MOV Word Ptr [ExitProc], Offset OvrXmsExit
|
||||
MOV Word Ptr [ExitProc+2], CS
|
||||
|
||||
; Return result of initialisation
|
||||
|
||||
XOR AX, AX
|
||||
@@5: MOV [OvrResult], AX
|
||||
RETF
|
||||
OvrInitXMS ENDP
|
||||
|
||||
Code ENDS
|
||||
END
|
21
OVERXMS.PAS
Executable file
21
OVERXMS.PAS
Executable file
@ -0,0 +1,21 @@
|
||||
{ OVERXMS - Loads overlays in XMS. Written by Wilbert van Leijen }
|
||||
|
||||
Unit OverXMS;
|
||||
|
||||
{$O-}
|
||||
|
||||
Interface
|
||||
uses Overlay;
|
||||
|
||||
Const
|
||||
ovrNoXMSDriver = -7; { No XMS driver installed }
|
||||
ovrNoXMSMemory = -8; { Insufficient XMS memory available }
|
||||
|
||||
Procedure OvrInitXMS;
|
||||
|
||||
Implementation
|
||||
|
||||
Procedure OvrInitXMS; External;
|
||||
{$L OVERXMS.OBJ}
|
||||
|
||||
end. { OverXMS }
|
4
README.md
Executable file
4
README.md
Executable file
@ -0,0 +1,4 @@
|
||||
# xpacket
|
||||
Xpacket - the porpular Packet-Radio Terminal
|
||||
|
||||
These are the original Sources from dl6ib. The original homepage of xpacket is http://www.dl6ib.de/xpacket In late 2008 the idea came up to port xpacket to modern operating systems and make it os independent. Badly nobody had the time. Xpacket is written in TurboPascal - Maybe it compiles with FreePascal. 73 de DLM274
|
223
XP7PL.PAS
Executable file
223
XP7PL.PAS
Executable file
@ -0,0 +1,223 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ Primaryfile: X P . P A S ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ Routinen fuer den Empfang von 7Plusfiles ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Open_Close_7Plus (* Kanal : Byte; Zeile : Str80 *);
|
||||
Const Cnt = 'CNT';
|
||||
Var i,i1 : Byte;
|
||||
Result : Word;
|
||||
Sstr : String[8];
|
||||
Nstr : String[12];
|
||||
Vstr : String[80];
|
||||
Suf : String[3];
|
||||
Flag : Boolean;
|
||||
f : Text;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if SplSave then
|
||||
begin
|
||||
Vstr := FName_aus_FVar(SplFile);
|
||||
SplSave := false;
|
||||
Spl_COR_ERR := false;
|
||||
FiResult := CloseBin(SplFile);
|
||||
Umlaut := Spl_UmlMerk;
|
||||
|
||||
Vstr := copy(Vstr,1,pos(Pkt,Vstr)) + Cnt;
|
||||
Assign(f,Vstr);
|
||||
if RewriteTxt(f) = 0 then
|
||||
begin
|
||||
Writeln(f,Spl_gCount);
|
||||
FiResult := CloseTxt(f);
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
if MldOk = 11 then (* 7PL .. P0X *)
|
||||
begin
|
||||
Spl_Time := Uhrzeit;
|
||||
Spl_tCount := 0;
|
||||
Spl_tLaenge := str_int('$' + ParmStr(7,B1,Zeile));
|
||||
Spl_tLaenge := (Spl_tLaenge div 64) + 2;
|
||||
|
||||
i1 := str_int(ParmStr(4,B1,Zeile));
|
||||
Spl_gLaenge := str_int(ParmStr(6,B1,Zeile));
|
||||
Spl_gLaenge := (Spl_gLaenge div 62) + 2 * i1;
|
||||
if Spl_gLaenge mod 62 > 0 then inc(Spl_gLaenge);
|
||||
Spl_gLaenge := Spl_gLaenge * 69;
|
||||
Spl_tLaenge := Spl_tLaenge * 69;
|
||||
Nstr := copy(Zeile,20,8);
|
||||
i := pos(Pkt,Nstr);
|
||||
if i > 0 then Nstr := copy(Nstr,1,i-1);
|
||||
KillEndBlanks(Nstr);
|
||||
if Nstr = '' then
|
||||
begin
|
||||
Nstr := Call;
|
||||
Strip(Nstr);
|
||||
end;
|
||||
if i1 = 1 then Suf := '7PL'
|
||||
else Suf := 'P' + Hex(str_int(ParmStr(2,B1,Zeile)),2);
|
||||
Nstr := Nstr + Pkt + Suf;
|
||||
end;
|
||||
|
||||
if MldOk = 14 then (* COR und ERR-File *)
|
||||
begin
|
||||
Spl_COR_ERR := true;
|
||||
Nstr := ParmStr(2,B1,Zeile);
|
||||
i := 0;
|
||||
While Exists(Konfig.SplVerz + copy(Nstr,1,pos(Pkt,Nstr)-1) + BS + Nstr) do
|
||||
begin
|
||||
inc(i);
|
||||
delete(Nstr,length(Nstr)-1,2);
|
||||
Nstr := Nstr + SFillStr(2,'0',Hex(i,2));
|
||||
end;
|
||||
end;
|
||||
|
||||
if MldOk = 41 then (* INF-File *)
|
||||
begin
|
||||
Spl_COR_ERR := true;
|
||||
Nstr := ParmStr(2,B1,Zeile);
|
||||
i := 0;
|
||||
While Exists(Konfig.SplVerz + copy(Nstr,1,pos(Pkt,Nstr)-1) + BS + Nstr) do
|
||||
begin
|
||||
inc(i);
|
||||
delete(Nstr,length(Nstr)-1,2);
|
||||
Nstr := Nstr + SFillStr(2,'0',Hex(i,2));
|
||||
end;
|
||||
end;
|
||||
|
||||
Vstr := copy(Nstr,1,pos(Pkt,Nstr)-1);
|
||||
|
||||
if MkSub(Konfig.SplVerz + Vstr) then
|
||||
begin
|
||||
if not Exists(Konfig.SplVerz + Vstr + BS + Nstr) then
|
||||
begin
|
||||
Vstr := Konfig.SplVerz + Vstr + BS + Nstr;
|
||||
Assign(SplFile,Vstr);
|
||||
Result := RewriteBin(SplFile,T);
|
||||
end else
|
||||
begin
|
||||
i := 0;
|
||||
Repeat
|
||||
inc(i);
|
||||
Sstr := Call;
|
||||
Strip(Sstr);
|
||||
Sstr := int_str(i) + Sstr;
|
||||
Flag := not Exists(Konfig.SplVerz + Vstr + BS + Sstr + BS + Nstr);
|
||||
Until Flag or (i > 250);
|
||||
if Flag then
|
||||
begin
|
||||
if MkSub(Konfig.SplVerz + Vstr + BS + Sstr) then
|
||||
begin
|
||||
Vstr := konfig.SplVerz + Vstr + BS + Sstr + BS + Nstr;
|
||||
Assign(SplFile,Vstr);
|
||||
Result := RewriteBin(SplFile,T);
|
||||
end else Result := 1;
|
||||
end else Result := 1;
|
||||
end;
|
||||
|
||||
if Result = 0 then
|
||||
begin
|
||||
SplSave := true;
|
||||
Spl_UmlMerk := Umlaut;
|
||||
Umlaut := 0;
|
||||
|
||||
Vstr := copy(Vstr,1,pos(Pkt,Vstr)) + Cnt;
|
||||
Assign(f,Vstr);
|
||||
if ResetTxt(f) = 0 then
|
||||
begin
|
||||
Readln(f,Spl_gCount);
|
||||
FiResult := CloseTxt(f);
|
||||
end else Spl_gCount := 0;
|
||||
end else
|
||||
begin
|
||||
Triller;
|
||||
MldOk := 0;
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
Triller;
|
||||
MldOk := 0;
|
||||
end;
|
||||
end;
|
||||
SetzeFlags(Kanal);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Close_7Plus (* Kanal : Byte *);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if SplSave then
|
||||
begin
|
||||
SplSave := false;
|
||||
Spl_COR_ERR := false;
|
||||
FiResult := CloseBin(SplFile);
|
||||
Umlaut := Spl_UmlMerk;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Write_SplFile (* Kanal : Byte; Zeile : String *);
|
||||
Type FPtr = Array [1..500] of Char;
|
||||
|
||||
Var i : Byte;
|
||||
Result : Word;
|
||||
Count : Word;
|
||||
ch : Char;
|
||||
Feld : ^FPtr;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
GetMem(Feld,SizeOf(Feld^));
|
||||
FillChar(Feld^,SizeOf(Feld^),0);
|
||||
Count := 0;
|
||||
for i := 1 to length(Zeile) do
|
||||
Begin
|
||||
ch := Zeile[i];
|
||||
case ch of
|
||||
|
||||
{ #32..#41,
|
||||
#43..#126,
|
||||
#128..#144,
|
||||
#146,
|
||||
#148..#252 : (ALT! bis 1.71)}
|
||||
#32..#126,
|
||||
#128..#254:
|
||||
|
||||
begin
|
||||
inc(Count);
|
||||
Feld^[Count] := ch;
|
||||
if not Spl_COR_ERR then
|
||||
begin
|
||||
inc(Spl_gCount);
|
||||
inc(Spl_tCount);
|
||||
end;
|
||||
end;
|
||||
|
||||
M1 : begin
|
||||
inc(Count);
|
||||
Feld^[Count] := #13;
|
||||
inc(Count);
|
||||
Feld^[Count] := #10;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
BlockWrite(SplFile,Feld^,Count,Result);
|
||||
FreeMem(Feld,SizeOf(Feld^));
|
||||
|
||||
if not Spl_COR_ERR then
|
||||
FileInfo(Kanal,2,Spl_gLaenge,Spl_gCount,Spl_tLaenge,Spl_tCount);
|
||||
end;
|
||||
End;
|
||||
|
314
XPACKET.PAS
Executable file
314
XPACKET.PAS
Executable file
@ -0,0 +1,314 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ Primaryfile: X P . P A S ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ XP ist ein auf TOP 1.50-Routinen aufgebautes Programm. ³
|
||||
³ TOP ist eine Weiterentwicklung des schon bekannten Terminalprogramms ³
|
||||
³ THP 2.6 von DL1BHO . Es gelten auch hier die gleichen Kriterien wie ³
|
||||
³ bei THP. Das heiát: ³
|
||||
³ ³
|
||||
³ Das Programm ist ausdruecklich PUBLIC DOMAIN, koennen also an jeden ³
|
||||
³ interessierten Funkamateur zur NICHT-KOMMERZIELLEN NUTZUNG weiterge- ³
|
||||
³ geben werden. ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ A C H T U N G : ³
|
||||
³ ³
|
||||
³ Dieses Programm ist ein reines Hobby-Produkt! ³
|
||||
³ ³
|
||||
³ F<>r Fehler, insbesondere f<>r eventuelle Datenverluste, kann ³
|
||||
³ KEINERLEI HAFTUNG <20>bernommen werden! ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ Compiliert wird mit TURBO-PASCAL 7.0 ³
|
||||
³ ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
{ XPLOAD nach 101 suchen, um die richtige versi zu erstellen }
|
||||
|
||||
PROGRAM Packet_HOSTMODE_Terminal(Input,Output);
|
||||
{$M 22000,0,655360}
|
||||
{$F+}
|
||||
{-$DEFINE extovl} {**Zum Start in TP aktivieren}
|
||||
{-$DEFINE code} {** Aktiv f<>r Code-Fassung, Deaktiv f<>r offizielle
|
||||
auch XPACT, XPOVR6}
|
||||
{-$DEFINE Sound} {**Wenn aktiv, wird SB-Unterst<73>tzung mit
|
||||
compilliert, ist es deaktiv, nicht
|
||||
auch XPACT, XPACT1, XPOVR, XPOVR4, XPOVR6, XPDEFS}
|
||||
{-$DEFINE no_Netrom} {**Wenn aktiv wird keine NetRom-Unterstuetzung
|
||||
mit compiliert //db1ras}
|
||||
{-$DEFINE no_Bake} {**Wenn aktiv, alle Bakenfunktionen deaktiviert //db1ras}
|
||||
|
||||
{-$DEFINE ReadOldMemo} {**Wenn aktiv, kann XP auch die Vorgaengerversion der
|
||||
memo.xp lesen (waehrend der Uebergangsphase wichtig),
|
||||
die alte Version wird als memo.<versionsnummer>
|
||||
gesichert, geschrieben wird immer die neue Version
|
||||
//db1ras}
|
||||
|
||||
USES OVERLAY,
|
||||
CRT,
|
||||
DOS,
|
||||
|
||||
{ GRAPH,}
|
||||
|
||||
XPEMS,
|
||||
XPXMS,
|
||||
XPDEFS,
|
||||
XPACT,
|
||||
XPACT1,
|
||||
|
||||
XPOVR,
|
||||
XPOVR1,
|
||||
XPOVR2,
|
||||
XPOVR3,
|
||||
XPOVR4,
|
||||
XPOVR5,
|
||||
XPOVR6,
|
||||
OVERXMS;
|
||||
|
||||
|
||||
{$O XPOVR}
|
||||
{$O XPOVR1}
|
||||
{$O XPOVR2}
|
||||
{$O XPOVR3}
|
||||
{$O XPOVR4}
|
||||
{$O XPOVR5}
|
||||
|
||||
Var i : Integer;
|
||||
spf:dirstr..dirstr;
|
||||
|
||||
|
||||
BEGIN (**** H A U P T P R O G R A M M ****)
|
||||
|
||||
Check_Loaded; {Ueberprueft, ob XP schon geladen ist}
|
||||
|
||||
Old_IntMask := Port[$21];
|
||||
|
||||
Inline($FA);
|
||||
FillChar(neue_Table,SizeOf(neue_Table),$FF);
|
||||
alte_Table := Ptr(PrefixSeg,$18);
|
||||
move(alte_Table^[1],neue_Table[1],20);
|
||||
|
||||
TabAdresse := Ptr(PrefixSeg,$34);
|
||||
TabAdresse^ := @neue_Table[1];
|
||||
TabLaenge := Ptr(PrefixSeg,$32);
|
||||
TabLaenge^ := maxTable;
|
||||
Inline($FB);
|
||||
|
||||
{ SPf := Dir;}
|
||||
SysPfad:=UpCaseStr(ParamStr(0)); { Pfad f<>r Config-Dateien }
|
||||
OvrDatei := SysPfad;
|
||||
|
||||
{$IFDEF extovl}
|
||||
OVRDatei := 'XPACKET.OVR';
|
||||
{$ENDIF}
|
||||
|
||||
|
||||
While (length(SysPfad) > 0) and (SysPfad[length(SysPfad)] <> BS)
|
||||
do delete(SysPfad,length(SysPfad),1);
|
||||
if (Length(SysPfad) > 0) and (SysPfad[Length(SysPfad)] <> BS)
|
||||
then SysPfad := SysPfad + BS;
|
||||
|
||||
Sys1Pfad := SysPfad;
|
||||
OvrInit(OvrDatei);
|
||||
if OvrResult <> 0 then
|
||||
|
||||
begin
|
||||
Writeln;
|
||||
Writeln('Failure with ',OvrDatei,' !');
|
||||
PRG_Stoppen(0);
|
||||
end;
|
||||
|
||||
ParamZeile := Ptr(PrefixSeg,$80);
|
||||
UebergabeAuswert;
|
||||
|
||||
if Nutze_XMS then Init_XMS;
|
||||
if Nutze_EMS then Init_EMS;
|
||||
|
||||
if Nutze_XMS and OVRtoXMS then
|
||||
begin
|
||||
OvrInitXMS;
|
||||
i := OvrResult;
|
||||
OVRtoEMS:=false;
|
||||
if i = 0 then Mstr := EmsStr + OvrDatei + B1 + 'load into XMS'
|
||||
else Mstr := EmsStr + OvrDatei + B1 + 'F-Nr.' + GL + int_str(i);
|
||||
end;
|
||||
|
||||
if Nutze_EMS and OVRtoEMS then
|
||||
begin
|
||||
OvrInitEMS;
|
||||
i := OvrResult;
|
||||
if i = 0 then Mstr := EmsStr + OvrDatei + B1 + 'load into EMS'
|
||||
else Mstr := EmsStr + OvrDatei + B1 + 'F-Nr.' + GL + int_str(i);
|
||||
end;
|
||||
|
||||
OrigExit := ExitProc;
|
||||
ExitProc := @Exit_XP;
|
||||
|
||||
FreeRam := $A0000 - Adr_absolut(Ptr(PrefixSeg,0));
|
||||
|
||||
GetMem(G,SizeOf(G^));
|
||||
FillChar(G^,SizeOf(G^),0);
|
||||
|
||||
CheckBreak := false; { kein Abbruch durch ctrl-C }
|
||||
GetCBreak(BreakStatus); { Break-Status holen und retten }
|
||||
SetCBreak(false); { Break off }
|
||||
|
||||
CheckSnow := false;
|
||||
GetVideoMode;
|
||||
StartVideoMode := LastMode; { derzeitigen VideoMode merken }
|
||||
LastModeStore := StartVideoMode;
|
||||
|
||||
if Hercules then maxZ := 25
|
||||
else maxZ := WindMax div 256 + 1;
|
||||
|
||||
Cursor_aus;
|
||||
TextAttr := StartColor;
|
||||
ClrScr;
|
||||
|
||||
GenCrcTab;
|
||||
Mstr := ParamStr(0);
|
||||
|
||||
if CRC_PR_EXE then
|
||||
begin
|
||||
NormVideo;
|
||||
ClrScr;
|
||||
SetzeCursor(1,25);
|
||||
Mstr := ParamStr(0);
|
||||
CRC_Datei(Mstr);
|
||||
Writeln(Mstr);
|
||||
Writeln;
|
||||
PRG_Stoppen(0);
|
||||
end;
|
||||
|
||||
Var_Init(99); { Erstmal nur globale Variablen initialisieren }
|
||||
|
||||
getdate(Jahr_,Monat_, Tag_, woTag_);
|
||||
LastLTCheck:=0;
|
||||
|
||||
Cursor_aus;
|
||||
Emblem_zeigen;
|
||||
{$IFNDEF Sound}
|
||||
writeln('NoSound-Version'); {//db1ras}
|
||||
{$ENDIF}
|
||||
LastLTCheck:=SizeOf(lokalptr);
|
||||
LastLTCheck:=SizeOf(Kanalptr);
|
||||
LastLTCheck:=SizeOf(TNC_Typ);
|
||||
LastLTCheck:=0;
|
||||
|
||||
ConfigLesen;
|
||||
|
||||
{ GetNetRom;}
|
||||
(* Konfig.WavOut:=true; {************************ L™SCHEN}*)
|
||||
|
||||
{$IFDEF Sound}
|
||||
if (konfig.wavout) or (konfig.wavsprach) then
|
||||
begin
|
||||
FindBlaster;
|
||||
assign (SoundFile, 'TEST.WAV');
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
{ Mstr := ParamStr(0);
|
||||
GetNetRom (Mstr);}
|
||||
|
||||
Infos_Lesen;
|
||||
Strings_Lesen;
|
||||
Merker_Conn_Lesen;
|
||||
Merker_File_Lesen;
|
||||
Fenster_Berechnen;
|
||||
V24_Init;
|
||||
|
||||
AttributFile_Lesen;
|
||||
ESC_Lesen;
|
||||
QRG_Lesen;
|
||||
REM_Lesen;
|
||||
PWD_Lesen;
|
||||
HELP_Lesen;
|
||||
|
||||
if (SSAV > 0) then Puffer_lesen;
|
||||
|
||||
max_path_ermitteln;
|
||||
|
||||
Switch_VGA_Mono;
|
||||
ColorItensity(HighCol);
|
||||
maxZ := WindMax div 256 + 1;
|
||||
Cursor_aus;
|
||||
|
||||
show := 0;
|
||||
for i := 1 to 4 do StatusOut(0,1,i,Attrib[9],ConstStr(B1,20),1);
|
||||
Neu_Bild;
|
||||
VorCurEnd;
|
||||
|
||||
M_aus(Attrib[28],^J, 0);
|
||||
|
||||
Ini_Start_Tnc;
|
||||
if MhKill then FillChar(MH^,SizeOf(MH^),0);
|
||||
|
||||
K[0]^.TncNummer := 1;
|
||||
|
||||
SwitchChannel(FirstConCh);
|
||||
|
||||
if Exists(Konfig.makverz + AutoExecFile) then
|
||||
begin
|
||||
MakroInit;
|
||||
Makro_aktivieren(konfig.makverz + AutoExecFile);
|
||||
end;
|
||||
|
||||
if klingel<>(not quiet) then
|
||||
begin
|
||||
Klingel:=not Quiet;
|
||||
setzeFlags(show);
|
||||
end;
|
||||
|
||||
UserAnwesend;
|
||||
|
||||
{for i:=1 to maxlink do } {//db1ras}
|
||||
{ if (not K[i]^.connected) and (not K[i]^.Mo.MonActive) then }
|
||||
{ K[i]^.ignore:=false; }
|
||||
|
||||
|
||||
|
||||
Repeat (**** H A U P T S C H L E I F E ****)
|
||||
Check_Keyboard;
|
||||
Uhr_aus;
|
||||
|
||||
|
||||
If Idle then
|
||||
begin
|
||||
if (Idle_TCount > 0) and (Idle_TMerk <> TimerTick) then
|
||||
begin
|
||||
Idle_TMerk := TimerTick;
|
||||
dec(Idle_TCount);
|
||||
end;
|
||||
|
||||
if Idle_Count > 0 then dec(Idle_Count);
|
||||
|
||||
if (Idle_TCount = 0) and ((Idle_Pos and (Idle_Count = 0)) or
|
||||
(not Idle_Pos and (Idle_Count > 0))) then
|
||||
begin
|
||||
IdleDOS;
|
||||
if Idle_Pos then Idle_Count := Idle_Anz;
|
||||
end;
|
||||
end;
|
||||
|
||||
if not Idle or
|
||||
Idle and (Idle_Pos or
|
||||
(not Idle_Pos and (Idle_Count = 0) and (Idle_TCount = 0))) then
|
||||
begin
|
||||
if Idle and not Idle_Pos then Idle_Count := Idle_Anz;
|
||||
if polling then TNCs_Pollen;
|
||||
set_Hardwarecursor(show);
|
||||
end;
|
||||
Until QRT; (* E N D E der H A U P T S C H L E I F E *)
|
||||
TschuessFenster;
|
||||
TncIni(1);
|
||||
Abschluss_XP;
|
||||
Init_HardDrive;
|
||||
ExitProc := OrigExit;
|
||||
End.
|
4561
XPACKSET.PAS
Executable file
4561
XPACKSET.PAS
Executable file
File diff suppressed because it is too large
Load Diff
109
XPACT.PAS
Executable file
109
XPACT.PAS
Executable file
@ -0,0 +1,109 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P A C T . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der staendig im RAM des Rechners geladen ist ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Unit XPACT;
|
||||
{$F+}
|
||||
{-$DEFINE Sound}
|
||||
{-$DEFINE code}
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
OVERLAY,
|
||||
MEMORY,
|
||||
|
||||
XPDEFS,
|
||||
XPEMS,
|
||||
XPXMS;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPIO.PAS *)
|
||||
Procedure Screen_aus(Art : Byte);
|
||||
Procedure Uhr_aus;
|
||||
Procedure GetTNC(Kanal : Byte);
|
||||
Procedure S_PAC(Kanal,Art : Byte; All : Boolean; Zeile : String);
|
||||
Procedure TxRxTNC(Kanal,Art : Byte; Zeile : String);
|
||||
Procedure SendTNC(Var Kanal : Byte; Art : Byte; Zeile : String);
|
||||
Procedure Moni_Off(Art : Byte);
|
||||
Procedure Moni_On;
|
||||
Procedure Check_Mld(Kanal: Byte; Zeile : Str80);
|
||||
Procedure TNC_Info(Kanal,Attr : Byte; Zeile : String);
|
||||
Procedure Comp_Sammler(Kanal,Attr : Byte; FrEnd : Boolean; Zeile : String);
|
||||
Function XComp_Sammler (Kanal: Byte; Zeile : String) : String;
|
||||
Procedure Connect_Info(Kanal,Attr : Byte; FrEnd : Boolean; Zeile : String);
|
||||
Function FreiePuffer(Kanal : Byte) : Word;
|
||||
Procedure Mon_Header_Auswerten;
|
||||
Procedure TNCs_Pollen;
|
||||
Procedure Kanal_Pollen(Kanal : Byte);
|
||||
Procedure Get_Linkstatus(Kanal : Byte);
|
||||
Procedure Check_Keyboard;
|
||||
Procedure Rufz_TNC_init(Kanal : Byte);
|
||||
Function QuerCheck(Zeile : String) : Word;
|
||||
Procedure MH_Check(TNC_Nr : Byte; Zeile : Str128);
|
||||
Procedure TickerOut;
|
||||
Function FormMonFr(TNr : Byte; Hstr : Str5; Zeile : String) : String;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPV24.PAS *)
|
||||
Procedure IRQsLock;
|
||||
Procedure IRQsFree;
|
||||
Procedure get_Chr_TFPC;
|
||||
Procedure get_Chr_Hs (V24Nr : Byte);
|
||||
Procedure V24_Init;
|
||||
Procedure WriteAux (V24Nr : Byte; Zeile : String);
|
||||
Procedure V24_Close;
|
||||
Procedure Switch_TNC (TNr : Byte);
|
||||
Function ReSync (V24Nr : Byte) : Boolean;
|
||||
Procedure Wait_Read (V24Nr : Byte);
|
||||
Procedure ClearV24Buffer;
|
||||
Procedure get_Response (Kanal : Byte);
|
||||
Procedure BufToResp (Kanal : Byte);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPKEY.PAS *)
|
||||
Procedure _ReadKey(var SK : Sondertaste; var VC : char);
|
||||
Function _KeyPressed : Boolean;
|
||||
Procedure MakroKey(var SK : Sondertaste; var VC : char);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPAUS.PAS *)
|
||||
Procedure Scroll(Art : str2; Aufruf,Y1,Y2 : Byte);
|
||||
Procedure _aus(Attr,Kanal : Byte; Zeile : String);
|
||||
Procedure M_aus(Attr : Byte; Zeile : String; Kanal : Byte);
|
||||
Procedure Write_Notiz(Kanal : Byte);
|
||||
Procedure Write_Notstr(Kanal : Byte; ch : Char);
|
||||
Procedure Write_BoxStr(Kanal,Art : Byte);
|
||||
Procedure Morse(Kanal : Byte; Zeile : str80);
|
||||
Function Compress (Zeile : String; Kanal : Byte) : String;
|
||||
Function DeCompress (Zeile : String; Kanal : Byte) : String;
|
||||
Function SPCompress (Zeile : String; Kanal : Byte) : String;
|
||||
Function SPDeCompress (Zeile : String; Kanal : Byte) : String;
|
||||
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT1,
|
||||
|
||||
XPOVR,
|
||||
XPOVR1,
|
||||
XPOVR2,
|
||||
XPOVR3,
|
||||
XPOVR4,
|
||||
xpovr5,
|
||||
xpovr6;
|
||||
|
||||
|
||||
{$I XPIO}
|
||||
{$I XPV24}
|
||||
{$I XPKEY}
|
||||
{$I XPAUS}
|
||||
|
||||
End.
|
162
XPACT1.PAS
Executable file
162
XPACT1.PAS
Executable file
@ -0,0 +1,162 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P A C T 1 . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der staendig im RAM des Rechners geladen ist ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Unit XPACT1;
|
||||
{$F+}
|
||||
{-$DEFINE Sound}
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
OVERLAY,
|
||||
MEMORY,
|
||||
|
||||
XPDEFS,
|
||||
XPEMS,
|
||||
XPXMS;
|
||||
|
||||
(* Proceduren und Funtionen der XPSTR.PAS *)
|
||||
Function str_int(Zeile : Str10) : LongInt;
|
||||
Function int_str(i : LongInt) : str10;
|
||||
Function ConstStr(VC : Char; L : Byte) : Str80;
|
||||
Function RetStr(Zeile : String) : String;
|
||||
Function CutStr(Zeile : String) : String;
|
||||
Function RestStr(Zeile : String) : String;
|
||||
Function UpCaseStr (Zeile : String) : String;
|
||||
Procedure KillEndBlanks(var Zeile : String);
|
||||
Procedure KillStartBlanks(Var Zeile : String); (* f<>hrende Leerz. l”schen *)
|
||||
Function ParmStr(Nr : Byte; VC : Char; Zeile : String) : String;
|
||||
Function SFillStr(Anz : Byte; VC : Char; Zeile : String) : String;
|
||||
Function EFillStr (Anz : Byte; VC : Char; Zeile : String) : String;
|
||||
Function CEFillStr (Anz : Byte; VC : Char; Zeile : String) : String; {gleich wie efill, nur wird bei <20>berl„nge abgeschnitten}
|
||||
Function ZFillStr (Anz : Byte; VC : Char; Zeile : String) : String;
|
||||
Function Hex(Dezimal : LongInt; Stellenzahl : Byte) : Str8;
|
||||
Function Adr_absolut(Zeiger : Pointer) : LongInt;
|
||||
Function Pointer_Str(Zeiger : Pointer) : Str9;
|
||||
Function FormByte(Zeile : str11) : str11;
|
||||
Function Bin(Dezimal : LongInt ; Stellenzahl : Byte) : Str32;
|
||||
Procedure Strip(Var Call: str9); (* SSID entfernen *)
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPLIB.PAS *)
|
||||
Procedure Fenster (H:Byte);
|
||||
Procedure clrFenster;
|
||||
Procedure Neu_Bild;
|
||||
Procedure Status2;
|
||||
Procedure Triller;
|
||||
Procedure Bimmel(kan:byte);
|
||||
Procedure C_Bell(call:str9; kan:byte);
|
||||
Procedure D_Bell(kan:byte);
|
||||
Procedure Daten_Bell;
|
||||
Procedure Cursor_aus;
|
||||
Procedure Cursor_ein;
|
||||
Procedure Beep(Ton,Laenge : Word);
|
||||
Function Datum : Str11;
|
||||
Procedure GetTime_ (VAR Hr, Mn, Sk, Sk100 : Word);
|
||||
Function Uhrzeit : Str8;
|
||||
Function Channel_ID (Kanal : Byte) : Str8;
|
||||
Procedure Warten;
|
||||
Procedure Alarm;
|
||||
Procedure StatusOut(Kanal,x,Nr,Attr : Byte ; Zeile : str80; StZ : Byte);
|
||||
Procedure NodeConnect(Kanal : Byte; Zeile : Str80);
|
||||
Function Exists(name : Str80) : Boolean;
|
||||
Procedure Teil_Bild_Loesch(y,y1,Attr : Byte);
|
||||
Procedure InfoOut(Kanal,AL,NewPic : Byte; Zeile : Str80);
|
||||
Function InfoZeile(Nr : Word) : Str80;
|
||||
Procedure max_path_ermitteln;
|
||||
Procedure WritePage(Kanal,X_Pos,Y_Pos,Attr,Aufruf : Byte ; Zeile : Str80);
|
||||
Procedure WriteRam(X_Pos,Y_Pos,Attr,Aufruf : Byte ; Zeile : Str80);
|
||||
Procedure WriteTxt(X_Pos,Y_Pos,Attr : Byte ; Zeile : Str80);
|
||||
Procedure WriteBios(Kanal,X_Pos,Y_Pos,Attr,Aufruf : Byte ; Zeile : Str80);
|
||||
Procedure WriteAttr(X_Pos,Y_Pos,Count,Attr,Aufruf : Byte);
|
||||
Function KanalFrei(Kanal : Byte) : Byte;
|
||||
Function Line_convert(Kanal,Art : Byte; Zeile : String) : String;
|
||||
Procedure SetzeCursor(X,Y : ShortInt);
|
||||
Procedure InitCursor(X,Y : ShortInt);
|
||||
Procedure SetzeFlags(Kanal : Byte);
|
||||
Procedure ScreenFill;
|
||||
Procedure Check_Eig_Mail(von,bis : Byte);
|
||||
Procedure EMS_Seite_einblenden(Kanal : Byte; Art : Byte);
|
||||
Procedure Open_Scroll(Kanal : Byte);
|
||||
Procedure Close_Scroll(Kanal : Byte);
|
||||
Function PhantasieCall : str9;
|
||||
Procedure set_Hardwarecursor(Kanal : Byte);
|
||||
Procedure SwitchChannel(Kanal : Byte);
|
||||
Procedure SwitchKanal(VC : Char);
|
||||
Procedure SwitchMonitor;
|
||||
Function FreeStr(Lw : char) : str11;
|
||||
Function V24(Kanal : Byte) : Byte;
|
||||
Procedure ReInstall;
|
||||
Procedure ColorItensity(CFlag : Boolean);
|
||||
Function ChAttr(Attr : Byte) : Byte;
|
||||
Procedure Init_HardDrive;
|
||||
Procedure New2BVec(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP: Word); Interrupt;
|
||||
Procedure Check_Loaded;
|
||||
Procedure Exit_XP;
|
||||
Procedure PRG_Stoppen(Nr : Byte);
|
||||
Function BackScroll(Kanal : Byte) : Boolean;
|
||||
Procedure Call_DOS(Zeile : Str128);
|
||||
Function AppendTxt(Var f : Text) : Integer;
|
||||
Function ResetTxt(Var f : Text) : Integer;
|
||||
Function ResetBin(Var f : File; Fpos : LongInt) : Integer;
|
||||
Function RewriteTxt(Var f : Text) : Integer;
|
||||
Function RewriteBin(Var f : File; Fpos : LongInt) : Integer;
|
||||
Function CloseTxt(Var f : Text) : Integer;
|
||||
Function CloseBin(Var f : File) : Integer;
|
||||
Function EraseTxt(Var f : Text) : Integer;
|
||||
Function EraseBin(Var f : File) : Integer;
|
||||
Procedure IdleDOS;
|
||||
Procedure Verzoegern(Wert : Word);
|
||||
Procedure LockIntFlag(Art : Byte);
|
||||
Procedure Sound_ (Tonh, Lang : Integer);
|
||||
Procedure Sprachwav;
|
||||
Procedure StopWave_;
|
||||
|
||||
(* Proceduren und Funtionen der XPCHR.PAS *)
|
||||
Procedure Chr_Darstell(Kanal : Byte; KC : Sondertaste; VC : char);
|
||||
Procedure Chr_Cmd_Show(Kanal : Byte; KC : Sondertaste; VC : char);
|
||||
Procedure Chr_Vor_Show(Kanal : Byte; KC : Sondertaste; VC : char);
|
||||
Procedure ChangeXYST(Kanal,Art : Byte; Var X1,Y1,st : Byte);
|
||||
Procedure Vor_Feld_Scroll(Kanal : Byte);
|
||||
Procedure Vor_Dn_Scroll(Kanal : Byte);
|
||||
Procedure Neu_BildVor(Kanal : Byte);
|
||||
Procedure Soft_Cursor(Kanal : Byte);
|
||||
Procedure Set_st_Szeile(Kanal,Art,st : Byte);
|
||||
Procedure TX_Out(Kanal : Byte; All : Boolean);
|
||||
Procedure Del_Wort(Var Zeile : Str80; X1 : Byte);
|
||||
Procedure Cur_Wort(Zeile : Str80; KC : Sondertaste; Var X1 : Byte; XM : Byte);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPTAST.PAS *)
|
||||
Function ESC_Auswert(Zeile : Str9) : Byte;
|
||||
Procedure Auswert_CMD(Kanal : Byte; InputZeile : Str80);
|
||||
Procedure Key_Active(Kanal : Byte; KC : Sondertaste; VC : char);
|
||||
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT,
|
||||
|
||||
XPOVR,
|
||||
XPOVR1,
|
||||
XPOVR2,
|
||||
XPOVR3,
|
||||
XPOVR4,
|
||||
xpovr5,
|
||||
xpovr6;
|
||||
|
||||
|
||||
{$I XPSTR}
|
||||
{$I XPLIB}
|
||||
{$I XPCHR}
|
||||
{$I XPTAST}
|
||||
|
||||
End.
|
296
XPAUTO.PAS
Executable file
296
XPAUTO.PAS
Executable file
@ -0,0 +1,296 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P A U T O . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die Abarbeitung der automatischen CMD-Dateien. ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Auto_Init (* Kanal : Byte *);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
{
|
||||
Werte f<>r CSelf:
|
||||
----------------
|
||||
1 = Auto startet zu einer bestimmten Zeit.
|
||||
2 = Auto startet alle X Minuten.
|
||||
3 = Bedingung 1 oder 2 sind erf<72>llt.
|
||||
4 = Auto befindet sich im Wartestadium und wartet X Minuten ab.
|
||||
5 = Auto erwartet den Empfang der Abfragezeile (einfache Pr<50>fung)
|
||||
6 = Auto erwartet den Empfang der Abfragezeile (strenge Pr<50>fung,
|
||||
die Abfragezeile muá mit Return beendet sein).
|
||||
7 = Bedingung 5 oder 6 sind erf<72>llt.
|
||||
8 = Auto hat Gleichheit zwischen Auto1Zeile und eintreffender
|
||||
Zeile festgestellt.
|
||||
9 = Das Terminal ist momentan im Backscrollmode und eine ESC-Zeile
|
||||
aus dem Autofile kann deswegen nicht bedient werden. Erst wenn
|
||||
der Backscroll verlassen wird, wird die ESC-Zeile bearbeitet.
|
||||
10 = kurze Ruhephase f<>r Auto.
|
||||
}
|
||||
|
||||
Cself := 0;
|
||||
AutoZeile := '';
|
||||
Auto1Zeile := '';
|
||||
AutoTime := '';
|
||||
AutoWait := 0;
|
||||
AutoChMerk := 0;
|
||||
AutoZaehl := 0;
|
||||
AutoJump := 0;
|
||||
AutoZyCount := 0;
|
||||
AutoToCount := 0;
|
||||
AutoToConst := 0;
|
||||
AutoToAnz := 0;
|
||||
AutoToMax := 0;
|
||||
AutoToAnzJmp := 0;
|
||||
AutoArt := 0;
|
||||
AutoJmpPtr := 1;
|
||||
FillChar(AutoJmpRet,SizeOf(AutoJmpRet),0);
|
||||
if AutoZyConst > 0 then CSelf := 2;
|
||||
SetzeFlags(Kanal);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Autozeile_Holen (* Kanal : Byte *);
|
||||
Var Hstr : String[80];
|
||||
w : Word;
|
||||
Flag,
|
||||
EFlag,
|
||||
TxFlag : Boolean;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Flag := false;
|
||||
EFlag := false;
|
||||
Hstr := Konfig.MakVerz + AutoDatei + SFillStr(3,'0',int_str(Kanal));
|
||||
Assign(G^.AutoFile,Hstr);
|
||||
if ResetTxt(G^.AutoFile) = 0 then
|
||||
begin
|
||||
for w := 1 to AutoZaehl do Readln(G^.AutoFile);
|
||||
if not Eof(G^.AutoFile) then
|
||||
begin
|
||||
TxFlag := false;
|
||||
CSelf := 11;
|
||||
Repeat
|
||||
inc(AutoZaehl);
|
||||
Readln(G^.AutoFile,AutoZeile);
|
||||
KillEndBlanks(AutoZeile);
|
||||
|
||||
if pos('* ',AutoZeile) = 1 then
|
||||
begin
|
||||
CSelf := 9;
|
||||
if BackScroll(show) then dec(AutoZaehl)
|
||||
else Auswert_CMD(Kanal,AutoZeile);
|
||||
EFlag := true;
|
||||
end else
|
||||
|
||||
if pos('? ',AutoZeile) = 1 then
|
||||
begin
|
||||
AutoZeile := UpCaseStr(RestStr(AutoZeile));
|
||||
AutoToCount := AutoToConst;
|
||||
CSelf := 5;
|
||||
EFlag := true;
|
||||
end else
|
||||
|
||||
if pos('?G ',AutoZeile) = 1 then
|
||||
begin
|
||||
AutoZeile := RestStr(AutoZeile);
|
||||
AutoJump := AutoJmpZnNr(Kanal,CutStr(AutoZeile));
|
||||
Auto1Zeile := UpCaseStr(RestStr(AutoZeile));
|
||||
end else
|
||||
|
||||
if pos('?L ',AutoZeile) = 1 then
|
||||
begin
|
||||
Auto1Zeile := UpCaseStr(RestStr(AutoZeile));
|
||||
AutoArt := 1;
|
||||
end else
|
||||
|
||||
begin
|
||||
AutoZeile := Line_convert(Kanal,1,AutoZeile);
|
||||
NodeConnect(Kanal,UpCaseStr(AutoZeile));
|
||||
EigFlag := Echo in [1,3,5,7];
|
||||
S_PAC(Kanal,NU,false,AutoZeile + M1);
|
||||
EigFlag := false;
|
||||
TxFlag := true;
|
||||
end;
|
||||
Until EFlag or Eof(G^.AutoFile);
|
||||
if TxFlag then S_PAC(Kanal,NU,true,'');
|
||||
end else Flag := true;
|
||||
FiResult := CloseTxt(G^.AutoFile);
|
||||
end;
|
||||
if Flag then Auto_Init(Kanal)
|
||||
else SetzeFlags(Kanal);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Auto_Aktivieren (* Kanal : Byte; Zeile : Str60 *);
|
||||
Var Hstr : String[80];
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Zeile := UpCaseStr(RestStr(Zeile));
|
||||
|
||||
if CSelf = 0 then
|
||||
begin
|
||||
Hstr := Konfig.MakVerz + AutoDatei + SFillStr(3,'0',int_str(Kanal));
|
||||
|
||||
if Exists(Hstr) then
|
||||
begin
|
||||
Hstr := CutStr(Zeile);
|
||||
|
||||
if (length(Zeile) = 5) and (pos(DP,Zeile) = 3) then
|
||||
begin
|
||||
AutoTime := Zeile;
|
||||
CSelf := 1;
|
||||
InfoOut(Kanal,0,1,InfoZeile(294) + B1 + AutoTime);
|
||||
end else
|
||||
|
||||
if Hstr = 'Z' then
|
||||
begin
|
||||
AutoZyConst := Word(str_int(RestStr(Zeile)));
|
||||
if AutoZyConst > 0 then
|
||||
begin
|
||||
CSelf := 2;
|
||||
AutoZyCount := 0;
|
||||
InfoOut(Kanal,0,1,InfoZeile(275) + B1 + RestStr(Zeile) + B1 + 'min');
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
Autozeile_Holen(Kanal);
|
||||
AutoToAnz := AutoToMax;
|
||||
end;
|
||||
end else InfoOut(Kanal,1,1,InfoZeile(293) + B1 + Hstr);
|
||||
end else
|
||||
begin
|
||||
Hstr := CutStr(Zeile);
|
||||
|
||||
if Hstr = 'A' then
|
||||
begin
|
||||
AutoToMax := Word(str_int(ParmStr(2,B1,Zeile)));
|
||||
AutoToAnzJmp := AutoJmpZnNr(Kanal,ParmStr(3,B1,Zeile));
|
||||
AutoToAnz := AutoToMax;
|
||||
end else
|
||||
|
||||
if Hstr = 'E' then
|
||||
begin
|
||||
AutoZeile := '';
|
||||
CSelf := 9;
|
||||
end else
|
||||
|
||||
if Hstr = 'G' then
|
||||
begin
|
||||
AutoJmpRet[AutoJmpPtr] := AutoZaehl;
|
||||
inc(AutoJmpPtr);
|
||||
if AutoJmpPtr > maxAutoJmpPtr then AutoJmpPtr := 1;
|
||||
AutoZaehl := AutoJmpZnNr(Kanal,RestStr(Zeile));
|
||||
CSelf := 3;
|
||||
end else
|
||||
|
||||
if Hstr = 'J' then
|
||||
begin
|
||||
AutoZaehl := AutoJmpZnNr(Kanal,RestStr(Zeile));
|
||||
CSelf := 3;
|
||||
end else
|
||||
|
||||
if Hstr = 'K' then
|
||||
begin
|
||||
Auto1Zeile := '';
|
||||
end else
|
||||
|
||||
if Hstr = 'L' then
|
||||
begin
|
||||
if AutoArt = 2 then
|
||||
begin
|
||||
AutoJmpRet[AutoJmpPtr] := AutoZaehl;
|
||||
inc(AutoJmpPtr);
|
||||
if AutoJmpPtr > maxAutoJmpPtr then AutoJmpPtr := 1;
|
||||
AutoZaehl := AutoJmpZnNr(Kanal,RestStr(Zeile));
|
||||
AutoArt := 0;
|
||||
end;
|
||||
CSelf := 3;
|
||||
end else
|
||||
|
||||
if Hstr = 'R' then
|
||||
begin
|
||||
dec(AutoJmpPtr);
|
||||
if AutoJmpPtr = 0 then AutoJmpPtr := maxAutoJmpPtr;
|
||||
AutoZaehl := AutoJmpRet[AutoJmpPtr];
|
||||
CSelf := 3;
|
||||
end else
|
||||
|
||||
if Hstr = 'S' then
|
||||
begin
|
||||
InfoOut(Kanal,0,1,AutoZeile);
|
||||
end else
|
||||
|
||||
if Hstr = 'T' then
|
||||
begin
|
||||
AutoToConst := Word(str_int(RestStr(Zeile)));
|
||||
end else
|
||||
|
||||
if Hstr = 'W' then
|
||||
begin
|
||||
AutoWait := Word(str_int(RestStr(Zeile)));
|
||||
if AutoWait > 0 then CSelf := 4;
|
||||
end else
|
||||
|
||||
if Hstr = 'Y' then
|
||||
begin
|
||||
dec(AutoJmpPtr);
|
||||
if AutoJmpPtr = 0 then AutoJmpPtr := 1;
|
||||
AutoJmpRet[AutoJmpPtr] := 0;
|
||||
CSelf := 3;
|
||||
end else
|
||||
|
||||
if Hstr = '+' then
|
||||
begin
|
||||
AutoChMerk := show;
|
||||
SwitchChannel(Kanal);
|
||||
end else
|
||||
|
||||
if Hstr = '-' then
|
||||
begin
|
||||
SwitchChannel(AutoChMerk);
|
||||
end else
|
||||
begin
|
||||
AutoZyConst := 0;
|
||||
Auto_Init(Kanal);
|
||||
InfoOut(Kanal,0,1,InfoZeile(274));
|
||||
end;
|
||||
end;
|
||||
SetzeFlags(Kanal);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Function AutoJmpZnNr (* Kanal : Byte; Zeile : Str40) : Word *);
|
||||
Var w : Word;
|
||||
Hstr : String[80];
|
||||
Flag : Boolean;
|
||||
Begin
|
||||
w := 0;
|
||||
Flag := false;
|
||||
Zeile := UpCaseStr(Zeile);
|
||||
|
||||
Hstr := Konfig.MakVerz + AutoDatei + SFillStr(3,'0',int_str(Kanal));
|
||||
Assign(G^.TFile,Hstr);
|
||||
if ResetTxt(G^.TFile) = 0 then
|
||||
begin
|
||||
While not (Flag or Eof(G^.TFile)) do
|
||||
begin
|
||||
inc(w);
|
||||
Readln(G^.TFile,Hstr);
|
||||
Flag := UpCaseStr(CutStr(Hstr)) = (DP + Zeile);
|
||||
end;
|
||||
|
||||
if Flag then AutoJmpZnNr := w
|
||||
else AutoJmpZnNr := 0;
|
||||
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
end else AutoJmpZnNr := 0;
|
||||
End;
|
123
XPBUF.PAS
Executable file
123
XPBUF.PAS
Executable file
@ -0,0 +1,123 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P B U F . P A S ³
|
||||
³ ³
|
||||
³ Routinen fuer das Pufferfilehandling ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure OpenBufferFile (* Kanal : Byte *);
|
||||
Var Ex : String[3];
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
{ if (not node) or ((node) and (Test)) then}
|
||||
begin
|
||||
Ex := SFillStr(3,'0',int_str(Kanal));
|
||||
if Vdisk_Exists and (DiskFree(ord(VDisk[1])-64) > minFreeVdisk)
|
||||
then Assign(BufFile,VDisk + BufDatei + Ex)
|
||||
else Assign(BufFile,Konfig.TempVerz + BufDatei + Ex);
|
||||
|
||||
if RewriteBin(BufFile,T) = 0 then BufExists := true;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure WriteBuffer (* Kanal : Byte; Zeile : String *);
|
||||
var Result : Word;
|
||||
Begin
|
||||
with K[Kanal]^ do if BufExists then
|
||||
begin
|
||||
Seek(BufFile,FileSize(BufFile));
|
||||
BlockWrite(BufFile,Zeile[1],length(Zeile),Result);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure SendBuffer (* Kanal : Byte *);
|
||||
Var Result : Word;
|
||||
Zeile : String;
|
||||
BufTill : LongInt;
|
||||
BufStr : String[10];
|
||||
Begin
|
||||
with K[Kanal]^ do if BufExists then
|
||||
begin
|
||||
Seek(BufFile,BufPos);
|
||||
BlockRead(BufFile,Zeile[1],PacLen,Result);
|
||||
BufPos := FilePos(BufFile);
|
||||
|
||||
BufStr := '';
|
||||
BufTill := FileSize(BufFile) - BufPos;
|
||||
if BufTill > 9999 then
|
||||
begin
|
||||
BufTill := BufTill div 1024;
|
||||
BufStr := 'K';
|
||||
end;
|
||||
if BufTill > 9999 then
|
||||
begin
|
||||
BufTill := BufTill div 1024;
|
||||
BufStr := 'M';
|
||||
end;
|
||||
BufStr := int_str(BufTill) + BufStr;
|
||||
StatusOut(Kanal,6,4,Attrib[7],SFillStr(5,B1,BufStr),2);
|
||||
|
||||
if Result > 0 then
|
||||
begin
|
||||
Zeile[0] := chr(Result);
|
||||
TxRxTNC(Kanal,0,Zeile);
|
||||
end else EraseBufferFile(Kanal);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure EraseBufferFile (* Kanal : Byte *);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
FiResult:=CloseBin(BufFile);
|
||||
FiResult := EraseBin(BufFile);
|
||||
BufExists := false;
|
||||
WishBuf := false;
|
||||
BufPos := 0;
|
||||
SetzeFlags(Kanal);
|
||||
end;
|
||||
{ with K[Kanal]^ do if BufExists then
|
||||
begin
|
||||
if CloseBin(BufFile) = 0 then
|
||||
begin
|
||||
FiResult := EraseBin(BufFile);
|
||||
BufExists := false;
|
||||
WishBuf := false;
|
||||
BufPos := 0;
|
||||
SetzeFlags(Kanal);
|
||||
end;
|
||||
end; }
|
||||
End;
|
||||
|
||||
|
||||
Procedure SendTestBuffer (* Kanal : Byte *);
|
||||
Var Result : Word;
|
||||
Zeile : String;
|
||||
Begin
|
||||
with K[Kanal]^ do if BufExists then
|
||||
begin
|
||||
Seek(BufFile,0);
|
||||
Repeat
|
||||
BlockRead(BufFile,Zeile[1],PacLen,Result);
|
||||
if Result > 0 then
|
||||
begin
|
||||
Zeile[0] := chr(Result);
|
||||
if (SPComp) and (Test) and (RXComp) then
|
||||
begin
|
||||
while Zeile[length(Zeile)]=#0 do
|
||||
delete(Zeile, Length(Zeile), 1);
|
||||
Zeile[0]:=chr(length(Zeile));
|
||||
end;
|
||||
|
||||
TNC_Info(TestMerk,Attrib[18],Zeile);
|
||||
end else EraseBufferFile(Kanal);
|
||||
Until not BufExists;
|
||||
end;
|
||||
End;
|
730
XPCHR.PAS
Executable file
730
XPCHR.PAS
Executable file
@ -0,0 +1,730 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P C H R . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r den Vorschreib-Bildschirm ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
|
||||
|
||||
Procedure Chr_Darstell (* Kanal : Byte; KC : Sondertaste; VC : char *);
|
||||
Begin
|
||||
if K[Kanal]^.Cmd then Chr_Cmd_Show(Kanal,KC,VC)
|
||||
else Chr_Vor_Show(Kanal,KC,VC);
|
||||
End;
|
||||
|
||||
|
||||
Procedure Chr_Cmd_Show (* Kanal : Byte; KC : Sondertaste; VC : char *);
|
||||
var i,i1,
|
||||
XLV,XH,
|
||||
VAnz : Byte;
|
||||
Neben,
|
||||
NeuPage : Boolean;
|
||||
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
Begin
|
||||
if Vor_im_EMS then EMS_Seite_einblenden(Kanal,Vor);
|
||||
|
||||
NeuPage := true;
|
||||
|
||||
VAnz := VEnd - VBeg + 1;
|
||||
if VAnz > VorCmdZeilen then VAnz := VorCmdZeilen;
|
||||
|
||||
XLV := length(VorWrite[Kanal]^[stC]);
|
||||
|
||||
Case KC of
|
||||
_Andere : Case VC of
|
||||
#1..#7,#11,#12, #14..#19, #21..#24, #26..#31, #32..#254
|
||||
: if XLV < 79 then
|
||||
begin
|
||||
NeuPage := false;
|
||||
if Gross then VC := UpCase(VC);
|
||||
if not insert_ON then delete(VorWrite[Kanal]^[stC],X1C,1);
|
||||
insert(VC,VorWrite[Kanal]^[stC],X1C);
|
||||
inc(X1C);
|
||||
end else Alarm;
|
||||
|
||||
^J : Alarm;
|
||||
|
||||
^T : if X1C <= XLV then
|
||||
begin
|
||||
Del_Wort(VorWrite[Kanal]^[stC],X1C);
|
||||
NeuPage := false;
|
||||
end else Alarm;
|
||||
|
||||
|
||||
^Y : begin
|
||||
VorWrite[Kanal]^[stC] := CvCh;
|
||||
X1C := 3;
|
||||
end;
|
||||
|
||||
#255: ;
|
||||
End;
|
||||
|
||||
_Ret : begin
|
||||
Auswert_CMD(Kanal,VorWrite[Kanal]^[stC]);
|
||||
Vor_Feld_Scroll(Kanal);
|
||||
Cmd := false;
|
||||
end;
|
||||
|
||||
_Back : begin
|
||||
NeuPage := false;
|
||||
if X1C > 3 then
|
||||
begin
|
||||
delete(VorWrite[Kanal]^[stC],X1C-1,1);
|
||||
dec(X1C);
|
||||
end else Alarm;
|
||||
end;
|
||||
|
||||
_AltK : Gross := not Gross;
|
||||
|
||||
_AltY : begin (* ALT-Y *)
|
||||
for i := stC to (VorZeilen - 1) do
|
||||
VorWrite[Kanal]^[i] := VorWrite[Kanal]^[i+1];
|
||||
VorWrite[Kanal]^[VorZeilen] := CvCh;
|
||||
X1C := 3;
|
||||
end;
|
||||
|
||||
_Del : if (XLV > 0) and (X1C <= XLV) then (* DEL *)
|
||||
begin
|
||||
delete(VorWrite[Kanal]^[stC],X1C,1);
|
||||
NeuPage := false;
|
||||
end else Alarm;
|
||||
|
||||
_Up : begin (* Cursor Up *)
|
||||
dec(stC); dec(Y1C);
|
||||
if Y1C < 1 then Y1C := 1;
|
||||
if stC < ((VorZeilen - VorCmdZeilen) + 1) then
|
||||
begin
|
||||
stC := (VorZeilen - VorCmdZeilen) + 1;
|
||||
Alarm;
|
||||
end;
|
||||
if length(VorWrite[Kanal]^[stC]) < X1C then X1C := length(VorWrite[Kanal]^[stC]) + 1;
|
||||
end;
|
||||
|
||||
_Dn : begin (* Cursor Dn *)
|
||||
inc(Y1C); inc(stC);
|
||||
if Y1C > VAnz then Y1C := VAnz;
|
||||
if stC > VorZeilen then
|
||||
begin
|
||||
stC := VorZeilen;
|
||||
if VorWrite[Kanal]^[stC] <> CvCh then Vor_Feld_Scroll(Kanal)
|
||||
else Alarm;
|
||||
end;
|
||||
if length(VorWrite[Kanal]^[stC]) < X1C then
|
||||
X1C := length(VorWrite[Kanal]^[stC]) + 1;
|
||||
end;
|
||||
|
||||
_Left : begin (* Cursor left *)
|
||||
if X1C > 3 then dec(X1C) else Alarm;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_Right : begin (* Cursor right *)
|
||||
if X1C <= XLV then inc(X1C) else Alarm;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_Home : begin (* Home *)
|
||||
X1C := 3;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_Ins : begin (* Ins *)
|
||||
Insert_ON := not Insert_ON;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_End : begin (* END *)
|
||||
X1C := XLV + 1;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_CtrlLeft,
|
||||
_CtrlRight: begin
|
||||
Cur_Wort(VorWrite[Kanal]^[stC],KC,X1C,3);
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_CtrlPgUp : begin (* Ctrl-Page-Up *)
|
||||
stC := (VorZeilen - VorCmdZeilen) + 1;
|
||||
X1C := 3; Y1C := 1;
|
||||
end;
|
||||
|
||||
_CtrlPgDn : begin (* Ctrl-Page-Dn *)
|
||||
i := VorZeilen;
|
||||
While (copy(VorWrite[Kanal]^[i],3,77) = '') and
|
||||
(i > VorZeilen-VorCmdZeilen+1) do dec(i);
|
||||
stC := i;
|
||||
if i < VorZeilen - VorCmdZeilen + VAnz
|
||||
then Y1C := i - (VorZeilen - VorCmdZeilen)
|
||||
else Y1C := VAnz;
|
||||
X1C := length(VorWrite[Kanal]^[stC]) + 1;
|
||||
end;
|
||||
|
||||
_Esc : Cmd := false;
|
||||
|
||||
_Nix :;
|
||||
|
||||
else Alarm;
|
||||
|
||||
end; {case KC of}
|
||||
|
||||
if show = Kanal then if NeuPage
|
||||
then Neu_BildVor(Kanal)
|
||||
else WritePage(Kanal,1,Y1C+Vofs,Attrib[23],0,VorWrite[Kanal]^[stC] + G^.Leer);
|
||||
|
||||
Soft_Cursor(Kanal);
|
||||
|
||||
end; {with Kanal}
|
||||
End;
|
||||
|
||||
|
||||
|
||||
Procedure Chr_Vor_Show (* Kanal : Byte; KC : Sondertaste; VC : char *);
|
||||
var i,i1,XH,
|
||||
XLV,VAnz : Byte;
|
||||
Hstr : String[80];
|
||||
Flag,
|
||||
Umbruch,
|
||||
Neben,
|
||||
NeuPage,
|
||||
ZWechsel : Boolean;
|
||||
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
Begin
|
||||
if Vor_im_EMS then EMS_Seite_einblenden(Kanal,Vor);
|
||||
|
||||
Hstr := '';
|
||||
Umbruch := false;
|
||||
NeuPage := true;
|
||||
VAnz := VEnd - VBeg + 1;
|
||||
|
||||
XLV := length(VorWrite[Kanal]^[stV]);
|
||||
|
||||
if (vc=^J) and ((SPComp) or (G^.ZeilenwTX)) then KC:=_RET;
|
||||
|
||||
Case KC of
|
||||
|
||||
_Andere : Begin
|
||||
if (VC in [#1..#7,#11,#12, #14..#19, #21..#24, #26..#31, #32..#254])
|
||||
or AltQFlag then if (not FileSend) then
|
||||
begin
|
||||
if not((XLV >= 79) and (X1V < 79)) then
|
||||
begin
|
||||
NeuPage := false;
|
||||
if ((TxByte + length(VorWrite[Kanal]^[stV])) > 254) then
|
||||
begin
|
||||
Tx_Out(Kanal,false);
|
||||
NeuPage := true;
|
||||
end;
|
||||
|
||||
if not insert_ON then delete(VorWrite[Kanal]^[stV],X1V,1);
|
||||
insert(VC,VorWrite[Kanal]^[stV],X1V);
|
||||
inc(X1V);
|
||||
|
||||
if (X1V > 79) then
|
||||
begin
|
||||
i := 1;
|
||||
i1 := 79;
|
||||
While (not(VorWrite[Kanal]^[stV][i1] in UmMenge)) and (i1 > 0) and (i < 79) do
|
||||
begin
|
||||
inc(i);
|
||||
dec(i1);
|
||||
end;
|
||||
if (i > 1) and (i1 > 1) then
|
||||
begin
|
||||
Hstr := copy(VorWrite[Kanal]^[stV],i1+1,i-1);
|
||||
delete(VorWrite[Kanal]^[stV],i1+1,i-1);
|
||||
Umbruch := true;
|
||||
end else ZWechsel := True;
|
||||
KillEndBlanks(VorWrite[Kanal]^[stV]);
|
||||
|
||||
|
||||
Set_st_Szeile(Kanal,0,stV);
|
||||
Vor_Feld_Scroll(Kanal);
|
||||
if VorWrite[Kanal]^[stV] > '' then Vor_Dn_Scroll(Kanal);
|
||||
if Umbruch then VorWrite[Kanal]^[stV] := Hstr
|
||||
else VorWrite[Kanal]^[stV] := '';
|
||||
X1V := length(VorWrite[Kanal]^[stV]) + 1;
|
||||
|
||||
if ((umbruch) or (ZWechsel)) and ((SPComp) or (G^.ZeilenwTX)) then
|
||||
begin
|
||||
{VorWrite[Kanal]^[stV];}
|
||||
Tx_Out(Kanal,true);
|
||||
Set_St_SZeile(Kanal,1,1);
|
||||
end;
|
||||
ZWechsel:=False;
|
||||
|
||||
NeuPage := true;
|
||||
end;
|
||||
end else Alarm;
|
||||
end else
|
||||
begin
|
||||
Alarm;
|
||||
if FileSend then InfoOut(Kanal,1,1,InfoZeile(25));
|
||||
if KompressUpd then InfoOut(Kanal,1,1,InfoZeile(399));
|
||||
end;
|
||||
|
||||
if AltQFlag then VC := #255;
|
||||
AltQFlag := false;
|
||||
|
||||
case VC of
|
||||
^J : begin
|
||||
KillEndBlanks(VorWrite[Kanal]^[stV]);
|
||||
if X1V > XLV then
|
||||
begin
|
||||
if (TxByte + XLV) > 254 then TX_Out(Kanal,false);
|
||||
Set_st_Szeile(Kanal,0,stV);
|
||||
Vor_Feld_Scroll(Kanal);
|
||||
X1V := length(VorWrite[Kanal]^[stV]) + 1;
|
||||
end else
|
||||
begin
|
||||
Hstr := copy(VorWrite[Kanal]^[stV],X1V,(XLV-X1V)+1);
|
||||
delete(VorWrite[Kanal]^[stV],X1V,(XLV-X1V)+1);
|
||||
Set_st_Szeile(Kanal,0,stV);
|
||||
Vor_Feld_Scroll(Kanal);
|
||||
if VorWrite[Kanal]^[stV] > '' then Vor_Dn_Scroll(Kanal);
|
||||
VorWrite[Kanal]^[stV] := Hstr;
|
||||
X1V := length(VorWrite[Kanal]^[stV]) + 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
^T : if X1V <= XLV then
|
||||
begin
|
||||
Del_Wort(VorWrite[Kanal]^[stV],X1V);
|
||||
NeuPage := false;
|
||||
end else Alarm;
|
||||
|
||||
^Y : begin
|
||||
VorWrite[Kanal]^[stV] := '';
|
||||
X1V := 1;
|
||||
end;
|
||||
|
||||
#255: ;
|
||||
end;
|
||||
End;
|
||||
|
||||
{(FileSend) or (SPlSave) or (RX_bin>1)}
|
||||
_Ret : if ((not FileSend)) and (not KompressUpd) then
|
||||
begin
|
||||
KillEndBlanks(VorWrite[Kanal]^[stV]);
|
||||
if (TxByte + length(VorWrite[Kanal]^[stV])) > 254
|
||||
then Tx_Out(Kanal,false);
|
||||
Set_st_Szeile(Kanal,0,stV);
|
||||
Tx_Out(Kanal,true);
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
Vor_Feld_Scroll(Kanal);
|
||||
end else
|
||||
begin
|
||||
if (FileSend) or (SPlSave) or (RX_bin>1) then InfoOut(Kanal,1,1,InfoZeile(25));
|
||||
if KompressUpd then InfoOut(Kanal,1,1,InfoZeile(399));
|
||||
end;
|
||||
|
||||
_Back : begin
|
||||
NeuPage := false;
|
||||
if X1V > 1 then
|
||||
begin
|
||||
delete(VorWrite[Kanal]^[stV],X1V-1,1);
|
||||
dec(X1V);
|
||||
end else Alarm;
|
||||
end;
|
||||
|
||||
_Alt7 : begin
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
Vor_Feld_Scroll(Kanal);
|
||||
VorWrite[Kanal]^[stV] := '';
|
||||
X1V := 1;
|
||||
end;
|
||||
|
||||
_Alt8 : begin
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
end;
|
||||
|
||||
_Alt9 : begin
|
||||
Tx_Out(Kanal,false);
|
||||
NeuPage := true;
|
||||
end;
|
||||
|
||||
_AltY : begin
|
||||
for i := stV to (VorZeilen - VorCmdZeilen)-1 do
|
||||
VorWrite[Kanal]^[i] := VorWrite[Kanal]^[i+1];
|
||||
VorWrite[Kanal]^[VorZeilen - VorCmdZeilen] := '';
|
||||
X1V := 1;
|
||||
end;
|
||||
|
||||
_Del : if (XLV > 0) and (X1V <= XLV) then
|
||||
begin
|
||||
delete(VorWrite[Kanal]^[stV],X1V,1);
|
||||
NeuPage := false;
|
||||
end else
|
||||
begin
|
||||
if (X1V > XLV) and (X1V < 79) and (
|
||||
stV < (VorZeilen - VorCmdZeilen)) then
|
||||
begin
|
||||
i1 := 79 - X1V;
|
||||
Hstr := copy(VorWrite[Kanal]^[stV+1],1,i1);
|
||||
VorWrite[Kanal]^[stV] := VorWrite[Kanal]^[stV] + Hstr;
|
||||
delete(VorWrite[Kanal]^[stV+1],1,i1);
|
||||
if VorWrite[Kanal]^[stV+1] = '' then
|
||||
begin
|
||||
for i := stV+1 to (VorZeilen - VorCmdZeilen)-1 do
|
||||
VorWrite[Kanal]^[i] := VorWrite[Kanal]^[i+1];
|
||||
VorWrite[Kanal]^[VorZeilen - VorCmdZeilen] := '';
|
||||
end;
|
||||
end else Alarm;
|
||||
end;
|
||||
|
||||
_Up : begin (* Cursor Up *)
|
||||
dec(stV); dec(Y1V);
|
||||
if Y1V < 1 then Y1V := 1;
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
if stV < 1 then
|
||||
begin
|
||||
stV := 1;
|
||||
Alarm;
|
||||
end;
|
||||
if length(VorWrite[Kanal]^[stV]) < X1V then X1V := length(VorWrite[Kanal]^[stV]) + 1;
|
||||
end;
|
||||
|
||||
_Dn : begin (* Cursor Dn *)
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
inc(stV); inc(Y1V);
|
||||
if Y1V > VAnz then Y1V := VAnz;
|
||||
if stV > (VorZeilen - VorCmdZeilen) then
|
||||
begin
|
||||
stV := VorZeilen - VorCmdZeilen;
|
||||
if VorWrite[Kanal]^[stV] > '' then Vor_Feld_Scroll(Kanal)
|
||||
else Alarm;
|
||||
end;
|
||||
if length(VorWrite[Kanal]^[stV]) < X1V then X1V := length(VorWrite[Kanal]^[stV]) + 1;
|
||||
end;
|
||||
|
||||
_Left : begin (* Cursor left *)
|
||||
if X1V > 1 then dec(X1V) else Alarm;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_Right : begin (* Cursor right *)
|
||||
if X1V <= XLV then inc(X1V) else Alarm;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_Home : begin (* Home *)
|
||||
X1V := 1;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_Ins : begin (* Ins *)
|
||||
Insert_ON := not Insert_ON;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_End : begin (* END *)
|
||||
X1V := XLV + 1;
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_Tab : begin
|
||||
Flag := false;
|
||||
if (stV > 1) and TabFill then Hstr := VorWrite[Kanal]^[stV-1]
|
||||
else Hstr := '';
|
||||
if Hstr > '' then
|
||||
begin
|
||||
if X1V <= length(Hstr) then
|
||||
begin
|
||||
delete(Hstr,1,X1V);
|
||||
Hstr := ConstStr('#',X1V) + Hstr;
|
||||
if pos(B1,Hstr) in [X1V..78] then
|
||||
begin
|
||||
i := pos(B1,Hstr);
|
||||
While (Hstr[i] = B1) and (i < length(Hstr)) do inc(i);
|
||||
if XLV + (i - X1V) > 78 then i := Byte(78 - XLV) + X1V;
|
||||
if i - X1V = 0 then Alarm;
|
||||
Insert(ConstStr(B1,i-X1V),VorWrite[Kanal]^[stV],X1V);
|
||||
X1V := i;
|
||||
end else Flag := true;
|
||||
end else Flag := true;
|
||||
end else Flag := true;
|
||||
if Flag then
|
||||
begin
|
||||
i := length(G^.TabStr);
|
||||
if (XLV + i) > 78 then i := Byte(78 - XLV);
|
||||
if i = 0 then Alarm;
|
||||
Insert(copy(G^.TabStr,1,i),VorWrite[Kanal]^[stV],X1V);
|
||||
X1V := X1V + i;
|
||||
end;
|
||||
end;
|
||||
|
||||
_CtrlLeft,
|
||||
_CtrlRight: begin
|
||||
Cur_Wort(VorWrite[Kanal]^[stV],KC,X1V,1);
|
||||
NeuPage := false;
|
||||
end;
|
||||
|
||||
_CtrlPgUp : begin (* Ctrl-Page-Up *)
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
stV := 1; X1V := 1; Y1V := 1;
|
||||
end;
|
||||
|
||||
_CtrlPgDn : begin (* Ctrl-Page-Dn *)
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
i := (VorZeilen - VorCmdZeilen);
|
||||
While (VorWrite[Kanal]^[i] = '') and (i > 1) do dec(i);
|
||||
stV := i;
|
||||
if i < VAnz then Y1V := stV else Y1V := VAnz;
|
||||
X1V := length(VorWrite[Kanal]^[stV]) + 1;
|
||||
end;
|
||||
|
||||
_Esc : begin
|
||||
Cmd := true;
|
||||
X1C := length(VorWrite[Kanal]^[stC]) + 1;
|
||||
end;
|
||||
|
||||
_Nix :;
|
||||
|
||||
else Alarm;
|
||||
|
||||
end; { case KC of }
|
||||
|
||||
if show = Kanal then if NeuPage
|
||||
then Neu_BildVor(Kanal)
|
||||
else WritePage(Kanal,1,Y1V+Vofs,Attrib[24],0,VorWrite[Kanal]^[stV] + G^.Leer);
|
||||
|
||||
Soft_Cursor(Kanal);
|
||||
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure ChangeXYst (* Kanal,Art : Byte; Var X1,Y1,st : Byte *);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if Vor_im_EMS then EMS_Seite_einblenden(Kanal,Vor);
|
||||
if Art = 0 then
|
||||
begin
|
||||
if Cmd then
|
||||
begin
|
||||
st := stC; X1 := X1C; Y1 := Y1C;
|
||||
end else
|
||||
begin
|
||||
st := stV; X1 := X1V; Y1 := Y1V;
|
||||
end;
|
||||
end;
|
||||
|
||||
if Art = 1 then
|
||||
begin
|
||||
if Cmd then
|
||||
begin
|
||||
stC := st; X1C := X1; Y1C := Y1;
|
||||
end else
|
||||
begin
|
||||
stV := st; X1V := X1; Y1V := Y1;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
(* scrollt das Array f<>r den Vorschreibschirm nach oben *)
|
||||
Procedure Vor_Feld_Scroll (* Kanal : Byte *);
|
||||
var VAnz : Byte;
|
||||
i : Integer;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if Vor_im_EMS then EMS_Seite_einblenden(Kanal,Vor);
|
||||
VAnz := VEnd - VBeg + 1;
|
||||
if Cmd then
|
||||
begin
|
||||
X1C := 3;
|
||||
inc(stC); inc(Y1C);
|
||||
if Y1C > VorCmdZeilen then Y1C := VorCmdzeilen;
|
||||
if Y1C > VAnz then Y1C := VAnz;
|
||||
if stC > VorZeilen then
|
||||
begin
|
||||
for i := VorZeilen-VorCmdZeilen+1 to VorZeilen - 1
|
||||
do VorWrite[Kanal]^[i] := VorWrite[Kanal]^[i+1];
|
||||
stC := VorZeilen;
|
||||
VorWrite[Kanal]^[stC][0] := Chr(2);
|
||||
end;
|
||||
end else
|
||||
|
||||
begin
|
||||
X1V := 1;
|
||||
inc(stV); inc(Y1V);
|
||||
if Y1V > VAnz then Y1V := VAnz;
|
||||
if (stV > (VorZeilen - VorCmdZeilen)) and (Y1V = VAnz) then
|
||||
begin
|
||||
for i := 1 to VorZeilen - VorCmdZeilen - 1 do
|
||||
begin
|
||||
VorWrite[Kanal]^[i] := VorWrite[Kanal]^[i+1];
|
||||
stTX[i] := stTX[i+1];
|
||||
end;
|
||||
stV := VorZeilen - VorCmdZeilen;
|
||||
VorWrite[Kanal]^[stV] := '';
|
||||
stTX[stV] := false;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
(* scrollt das Array f<>r den Vorschreibschirm ab der Position 'st' nach unten *)
|
||||
Procedure Vor_Dn_Scroll (* Kanal : Byte *);
|
||||
Var i,i1 : Integer;
|
||||
X1,Y1,st : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
ChangeXYst(Kanal,0,X1,Y1,st);
|
||||
i1 := VorZeilen - VorCmdZeilen;
|
||||
if st < i1 then for i := 1 to i1 - st do
|
||||
VorWrite[Kanal]^[i1-i+1] := VorWrite[Kanal]^[i1-i];
|
||||
ChangeXYst(Kanal,1,X1,Y1,st);
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure Neu_BildVor (* Kanal : Byte *);
|
||||
Var st,X1,Y1,i,i1,
|
||||
VAnz,Attr,AMerk : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
ChangeXYst(Kanal,0,X1,Y1,st);
|
||||
VAnz := VEnd - VBeg + 1;
|
||||
if Cmd then
|
||||
begin
|
||||
Attr := Attrib[23];
|
||||
if VAnz > VorCmdZeilen then
|
||||
begin
|
||||
VAnz := VorCmdZeilen;
|
||||
Teil_Bild_Loesch(VBeg+VAnz,VEnd,Attr);
|
||||
end;
|
||||
end else Attr := Attrib[24];
|
||||
i1 := st - Y1;
|
||||
for i := 1 to VAnz do
|
||||
begin
|
||||
AMerk := Attr;
|
||||
if stTX[i1+i] then Attr := Attrib[6];
|
||||
WritePage(Kanal,1,i+Vofs,Attr,0,VorWrite[Kanal]^[i1+i] + G^.Leer);
|
||||
Attr := AMerk;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure Soft_Cursor (* Kanal : Byte *);
|
||||
Var X1,Y1,st,
|
||||
Xh,Attr : Byte;
|
||||
Neben : Boolean;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
ChangeXYst(Kanal,0,X1,Y1,st);
|
||||
if not HardCur then
|
||||
begin
|
||||
Neben := false;
|
||||
Xh := X1;
|
||||
if Xh > 80 then Xh := 80;
|
||||
if Xh > length(VorWrite[Kanal]^[st]) then Neben := true;
|
||||
if Neben then Attr := Attrib[21] else Attr := Attrib[22];
|
||||
if not Insert_ON then Attr := Attr + 128;
|
||||
if Neben then WritePage(Kanal,Xh,Y1+Vofs,Attr,0,'Û')
|
||||
else WriteAttr(Xh,Y1+Vofs,1,Attr,1);
|
||||
end else InitCursor(X1,Y1+Vofs);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Set_st_Szeile (* Kanal,Art,st : Byte *);
|
||||
var i : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if Vor_im_EMS then EMS_Seite_einblenden(Kanal,Vor);
|
||||
if Art = 0 then
|
||||
begin
|
||||
stTX[st] := true;
|
||||
Einer_st := true;
|
||||
TxByte := TxByte + length(VorWrite[Kanal]^[st]) + 1;
|
||||
end else if Art = 1 then
|
||||
begin
|
||||
for i := 1 to VorZeilen do stTX[i] := false;
|
||||
Einer_st := false;
|
||||
TxByte := 0;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure TX_Out (* Kanal : Byte; All : Boolean *);
|
||||
Var i : Byte;
|
||||
Hstr : String[80];
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
Begin
|
||||
Hstr := '';
|
||||
Auto_CON := false;
|
||||
if Kanal = 0 then K[0]^.TncNummer := Unproto;
|
||||
|
||||
if Vor_im_EMS then EMS_Seite_einblenden(Kanal,Vor);
|
||||
|
||||
if Conv.Active and (Kanal = ConvHilfsPort) then Conv_Tx_All(Kanal) else
|
||||
begin
|
||||
EigFlag := Echo in [1,3,5,7];
|
||||
for i := 1 to VorZeilen - VorCmdZeilen do if stTX[i] then
|
||||
begin
|
||||
Hstr := Line_convert(Kanal,1,VorWrite[Kanal]^[i]);
|
||||
if Kanal > 0 then NodeConnect(Kanal,UpCaseStr(Hstr));
|
||||
S_PAC(Kanal,NU,false,Hstr + M1);
|
||||
end;
|
||||
if All then S_PAC(Kanal,NU,true,'');
|
||||
EigFlag := false;
|
||||
end;
|
||||
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
End;
|
||||
End; (* TX_out *)
|
||||
|
||||
|
||||
Procedure Del_Wort (* Var Zeile : Str80; X1 : Byte *);
|
||||
Begin
|
||||
if Zeile[X1] in Menge then delete(Zeile,X1,1) else
|
||||
begin
|
||||
Repeat
|
||||
delete(Zeile,X1,1);
|
||||
Until (X1 > length(Zeile)) or (Zeile[X1] in Menge);
|
||||
end;
|
||||
While (Zeile[X1] = B1) and (X1 <= length(Zeile)) do delete(Zeile,X1,1);
|
||||
End;
|
||||
|
||||
Procedure Cur_Wort (* Zeile : Str80; KC : Sondertaste; Var X1 : Byte; XM : Byte *);
|
||||
Var XLV : Byte;
|
||||
Begin
|
||||
if KC = _CtrlLeft then
|
||||
begin
|
||||
if X1 > XM then
|
||||
begin
|
||||
Repeat
|
||||
dec(X1);
|
||||
Until (X1 < XM ) or (not(Zeile[X1] in Menge));
|
||||
While (X1 >= XM) and (not(Zeile[X1] in Menge)) do dec(X1);
|
||||
inc(X1);
|
||||
end else Alarm;
|
||||
end else if KC = _CtrlRight then
|
||||
begin
|
||||
XLV := length(Zeile);
|
||||
if X1 <= XLV then
|
||||
begin
|
||||
While (X1 <= XLV) and (not(Zeile[X1] in Menge)) do inc(X1);
|
||||
While (X1 <= XLV) and (Zeile[X1] in Menge) do inc(X1);
|
||||
end else Alarm;
|
||||
end;
|
||||
End;
|
185
XPCOL.PAS
Executable file
185
XPCOL.PAS
Executable file
@ -0,0 +1,185 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P C O L . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die Farbeinstellung ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Color_Einstellung;
|
||||
Const xb = 5;
|
||||
ya = 5;
|
||||
lp = '²' + Chr(16);
|
||||
rp = Chr(17) + '²';
|
||||
Cstr = 'Color-Nr = ';
|
||||
Zstr = 'Zeile: ';
|
||||
|
||||
Type ColPtr = Array[1..maxAttr] of String[70];
|
||||
|
||||
Var Old_Attrib,
|
||||
i,yb,ym,yl : Byte;
|
||||
ch : Char;
|
||||
KC : Sondertaste;
|
||||
Merker,
|
||||
Flag : Boolean;
|
||||
Hstr : String[3];
|
||||
ADoc : ^ColPtr;
|
||||
|
||||
Procedure Attrib_Read(Art : Byte);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
FiResult := ResetTxt(G^.TFile);
|
||||
i1 := ya;
|
||||
for i := 1 to maxAttr do
|
||||
begin
|
||||
Readln(G^.TFile,DZeile);
|
||||
ADoc^[i] := EFillStr(70,B1,B2 + RestStr(DZeile));
|
||||
if Art = 1 then Attrib[i] := Byte(str_int(CutStr(DZeile)));
|
||||
if i1 <= ym then
|
||||
begin
|
||||
WriteRam(xb,i1,Attrib[i],0,ADoc^[i]);
|
||||
inc(i1);
|
||||
end;
|
||||
end;
|
||||
Readln(G^.TFile,DZeile);
|
||||
HighCol := Byte(str_int(copy(DZeile,1,1))) = 1;
|
||||
ColorItensity(HighCol);
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
End;
|
||||
|
||||
Procedure KillPfeil;
|
||||
Begin
|
||||
WriteRam(xb-2,yb,15,0,B2);
|
||||
WriteRam(xb+70,yb,15,0,B2);
|
||||
End;
|
||||
|
||||
Begin
|
||||
Assign(G^.TFile,Sys1Pfad + AttrDatei + LngExt);
|
||||
flag := false;
|
||||
Merker := true;
|
||||
Neu_Bild;
|
||||
Teil_Bild_Loesch(1,maxZ,0);
|
||||
GetMem(ADoc,SizeOf(ADoc^));
|
||||
FillChar(ADoc^,SizeOf(ADoc^),0);
|
||||
|
||||
i := length(InfoZeile(33));
|
||||
WriteRam(40-i div 2,1,15,0,InfoZeile(33));
|
||||
WriteRam(40-i div 2,2,15,0,ConstStr('-',i));
|
||||
|
||||
ym := maxZ - 5;
|
||||
yb := ya;
|
||||
yl := 1;
|
||||
|
||||
Attrib_Read(0);
|
||||
|
||||
WriteRam(xb,maxZ-1,15,0,InfoZeile(22));
|
||||
WriteRam(xb,maxZ,15,0,InfoZeile(23));
|
||||
|
||||
Repeat
|
||||
if Merker then Old_Attrib := Attrib[yl];
|
||||
WriteRam(xb,maxZ-3,15,0,Cstr +
|
||||
EFillStr(4,B1,int_str(Attrib[yl])) +
|
||||
EFillStr(8,B1,'(' + int_str(Old_Attrib) + ')') +
|
||||
EFillStr(length(Zstr)+3,B1,Zstr + int_str(yl)));
|
||||
WriteRam(xb,yb,Attrib[yl],0,ADoc^[yl]);
|
||||
WriteRam(xb-2,yb,15,0,lp);
|
||||
WriteRam(xb+70,yb,15,0,rp);
|
||||
|
||||
_ReadKey(KC,ch);
|
||||
case KC of
|
||||
_Ret,
|
||||
_Esc :;
|
||||
|
||||
_AltH : XP_Help(G^.OHelp[6]);
|
||||
|
||||
_Up : if (yl > 1) then
|
||||
begin
|
||||
KillPfeil;
|
||||
dec(yl);
|
||||
if yb > ya then dec(yb) else Scroll(Dn,0,ya,ym);
|
||||
end else Alarm;
|
||||
|
||||
_Dn : if (yl < maxAttr) then
|
||||
begin
|
||||
KillPfeil;
|
||||
inc(yl);
|
||||
if yb < ym then inc(yb) else Scroll(Up,0,ya,ym);
|
||||
end else Alarm;
|
||||
|
||||
_F1 : begin
|
||||
yl := 1;
|
||||
yb := ya;
|
||||
Teil_Bild_Loesch(ya,ym,0);
|
||||
Attrib_Read(1);
|
||||
Flag := false;
|
||||
end;
|
||||
|
||||
_Right : if Attrib[yl] < 255 then inc(Attrib[yl]);
|
||||
|
||||
_Left : if Attrib[yl] > 0 then dec(Attrib[yl]);
|
||||
|
||||
_F5 : if Attrib[yl] >= 16 then dec(Attrib[yl],16);
|
||||
|
||||
_F6 : if Attrib[yl] <= 239 then inc(Attrib[yl],16);
|
||||
|
||||
_F7 : begin
|
||||
dec(Attrib[yl]);
|
||||
if (Attrib[yl]+1) mod 16 = 0 then inc(Attrib[yl],16);
|
||||
end;
|
||||
|
||||
_F8 : begin
|
||||
inc(Attrib[yl]);
|
||||
if Attrib[yl] mod 16 = 0 then dec(Attrib[yl],16);
|
||||
end;
|
||||
|
||||
_F9 : begin
|
||||
HighCol := not HighCol;
|
||||
ColorItensity(HighCol);
|
||||
end;
|
||||
|
||||
_F10 : if Attrib[yl] > 127 then Attrib[yl] := Attrib[yl] - 128
|
||||
else Attrib[yl] := Attrib[yl] + 128;
|
||||
|
||||
_Andere : if ch in ['0'..'9'] then
|
||||
begin
|
||||
Hstr := ch;
|
||||
GetString(Hstr,15,3,xb+length(Cstr),maxZ-3,KC,3,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
Attrib[yl] := Byte(str_int(Hstr));
|
||||
Flag := true;
|
||||
end;
|
||||
KC := _Nix;
|
||||
end else Alarm;
|
||||
else Alarm;
|
||||
end;
|
||||
|
||||
Merker := not(KC in [_F5.._F10,_Right,_Left]);
|
||||
if (KC in [_F5.._F10,_Right,_Left]) then Flag := true;
|
||||
Until KC in [_Esc,_Ret];
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
Teil_Bild_Loesch(ym+1,maxZ,0);
|
||||
WriteRam(xb,maxZ-1,15,0,InfoZeile(34));
|
||||
_ReadKey(KC,ch);
|
||||
|
||||
if (UpCase(ch) in YesMenge) or (KC in [_Ret]) then
|
||||
begin
|
||||
FiResult := RewriteTxt(G^.TFile);
|
||||
for i := 1 to maxAttr do
|
||||
Writeln(G^.TFile,EFillStr(3,B1,int_str(Attrib[i])) + ADoc^[i]);
|
||||
if HighCol then i := 1
|
||||
else i := 0;
|
||||
Writeln(G^.TFile,i);
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
end;
|
||||
Cursor_aus;
|
||||
end;
|
||||
|
||||
FreeMem(ADoc,SizeOf(ADoc^));
|
||||
Neu_Bild;
|
||||
End;
|
298
XPCOMP.PAS
Executable file
298
XPCOMP.PAS
Executable file
@ -0,0 +1,298 @@
|
||||
HTable : Array [0..257] of Table_Typ =
|
||||
|
||||
((Tab : $AB2C; Len : 15), (Tab : $AA84; Len : 15), (Tab : $9FC4; Len : 15),
|
||||
(Tab : $AB3C; Len : 15), (Tab : $AB1C; Len : 15), (Tab : $AAFC; Len : 15),
|
||||
(Tab : $AAEC; Len : 15), (Tab : $AAD4; Len : 15), (Tab : $AAB4; Len : 15),
|
||||
(Tab : $F340; Len : 10), (Tab : $AAA4; Len : 15), (Tab : $7D64; Len : 15),
|
||||
(Tab : $AADC; Len : 15), (Tab : $F400; Len : 7), (Tab : $AA94; Len : 15),
|
||||
(Tab : $9FF4; Len : 15), (Tab : $9FD4; Len : 15), (Tab : $7D74; Len : 15),
|
||||
(Tab : $AB44; Len : 15), (Tab : $AB34; Len : 15), (Tab : $AB24; Len : 15),
|
||||
(Tab : $AB14; Len : 15), (Tab : $AB04; Len : 15), (Tab : $AAF4; Len : 15),
|
||||
(Tab : $AAE4; Len : 15), (Tab : $AB60; Len : 14), (Tab : $AB0C; Len : 15),
|
||||
(Tab : $AACC; Len : 15), (Tab : $AABC; Len : 15), (Tab : $AAAC; Len : 15),
|
||||
(Tab : $AA9C; Len : 15), (Tab : $AA8C; Len : 15), (Tab : $C000; Len : 3),
|
||||
(Tab : $3A80; Len : 9), (Tab : $ABC0; Len : 10), (Tab : $0060; Len : 11),
|
||||
(Tab : $7D40; Len : 12), (Tab : $AB5C; Len : 14), (Tab : $0000; Len : 12),
|
||||
(Tab : $AB58; Len : 14), (Tab : $7C00; Len : 9), (Tab : $3C80; Len : 9),
|
||||
(Tab : $7D00; Len : 11), (Tab : $0010; Len : 12), (Tab : $1200; Len : 7),
|
||||
(Tab : $7A00; Len : 7), (Tab : $B800; Len : 6), (Tab : $3200; Len : 7),
|
||||
(Tab : $2200; Len : 7), (Tab : $F600; Len : 8), (Tab : $3D00; Len : 8),
|
||||
(Tab : $9E00; Len : 9), (Tab : $BD80; Len : 9), (Tab : $7C80; Len : 9),
|
||||
(Tab : $0080; Len : 9), (Tab : $AA00; Len : 9), (Tab : $BD00; Len : 9),
|
||||
(Tab : $9F00; Len : 9), (Tab : $0300; Len : 8), (Tab : $AB78; Len : 13),
|
||||
(Tab : $AB68; Len : 13), (Tab : $3C00; Len : 9), (Tab : $3000; Len : 9),
|
||||
(Tab : $0020; Len : 11), (Tab : $7D50; Len : 12), (Tab : $3800; Len : 7),
|
||||
(Tab : $7800; Len : 7), (Tab : $9C00; Len : 7), (Tab : $FE00; Len : 7),
|
||||
(Tab : $2400; Len : 6), (Tab : $BC00; Len : 8), (Tab : $0200; Len : 8),
|
||||
(Tab : $0100; Len : 8), (Tab : $F100; Len : 8), (Tab : $0040; Len : 11),
|
||||
(Tab : $3100; Len : 8), (Tab : $F200; Len : 8), (Tab : $3400; Len : 7),
|
||||
(Tab : $1C00; Len : 7), (Tab : $1E00; Len : 7), (Tab : $BE00; Len : 7),
|
||||
(Tab : $ABA0; Len : 11), (Tab : $3E00; Len : 7), (Tab : $1400; Len : 6),
|
||||
(Tab : $3600; Len : 7), (Tab : $F380; Len : 9), (Tab : $F080; Len : 9),
|
||||
(Tab : $2000; Len : 8), (Tab : $FC00; Len : 8), (Tab : $9F80; Len : 10),
|
||||
(Tab : $9E80; Len : 9), (Tab : $AB90; Len : 12), (Tab : $3B80; Len : 9),
|
||||
(Tab : $AB80; Len : 12), (Tab : $AB54; Len : 14), (Tab : $3A50; Len : 13),
|
||||
(Tab : $AB50; Len : 14), (Tab : $A000; Len : 5), (Tab : $1800; Len : 6),
|
||||
(Tab : $9800; Len : 6), (Tab : $7000; Len : 5), (Tab : $4000; Len : 3),
|
||||
(Tab : $0400; Len : 6), (Tab : $AC00; Len : 6), (Tab : $F800; Len : 6),
|
||||
(Tab : $6000; Len : 4), (Tab : $3A00; Len : 10), (Tab : $FD00; Len : 8),
|
||||
(Tab : $2800; Len : 5), (Tab : $B000; Len : 6), (Tab : $8000; Len : 4),
|
||||
(Tab : $B400; Len : 6), (Tab : $1000; Len : 7), (Tab : $7D20; Len : 12),
|
||||
(Tab : $E000; Len : 5), (Tab : $9000; Len : 5), (Tab : $E800; Len : 5),
|
||||
(Tab : $0800; Len : 5), (Tab : $F700; Len : 8), (Tab : $A800; Len : 7),
|
||||
(Tab : $7D80; Len : 9), (Tab : $F300; Len : 10), (Tab : $7E00; Len : 7),
|
||||
(Tab : $AB48; Len : 14), (Tab : $3A48; Len : 13), (Tab : $AB4C; Len : 14),
|
||||
(Tab : $3A60; Len : 12), (Tab : $9FFC; Len : 15), (Tab : $9FEC; Len : 15),
|
||||
(Tab : $2100; Len : 8), (Tab : $9FDC; Len : 15), (Tab : $9FCC; Len : 15),
|
||||
(Tab : $F000; Len : 9), (Tab : $7D7C; Len : 15), (Tab : $7D6C; Len : 15),
|
||||
(Tab : $3A40; Len : 14), (Tab : $AB40; Len : 15), (Tab : $AB38; Len : 15),
|
||||
(Tab : $AB30; Len : 15), (Tab : $AB28; Len : 15), (Tab : $AB20; Len : 15),
|
||||
(Tab : $AB18; Len : 15), (Tab : $AB70; Len : 13), (Tab : $AB10; Len : 15),
|
||||
(Tab : $AB08; Len : 15), (Tab : $AB00; Len : 15), (Tab : $AAF8; Len : 15),
|
||||
(Tab : $AAF0; Len : 15), (Tab : $3B00; Len : 9), (Tab : $AAE8; Len : 15),
|
||||
(Tab : $AAE0; Len : 15), (Tab : $AAD8; Len : 15), (Tab : $AAD0; Len : 15),
|
||||
(Tab : $AB64; Len : 14), (Tab : $7D30; Len : 12), (Tab : $AAC8; Len : 15),
|
||||
(Tab : $AAC0; Len : 15), (Tab : $AAB8; Len : 15), (Tab : $AAB0; Len : 15),
|
||||
(Tab : $AAA8; Len : 15), (Tab : $AAA0; Len : 15), (Tab : $AA98; Len : 15),
|
||||
(Tab : $AA90; Len : 15), (Tab : $AA88; Len : 15), (Tab : $AA80; Len : 15),
|
||||
(Tab : $9FF8; Len : 15), (Tab : $9FF0; Len : 15), (Tab : $9FE8; Len : 15),
|
||||
(Tab : $9FE0; Len : 15), (Tab : $9FD8; Len : 15), (Tab : $9FD0; Len : 15),
|
||||
(Tab : $9FC8; Len : 15), (Tab : $9FC0; Len : 15), (Tab : $7D78; Len : 15),
|
||||
(Tab : $7D70; Len : 15), (Tab : $3A58; Len : 13), (Tab : $7D68; Len : 15),
|
||||
(Tab : $7D60; Len : 15), (Tab : $AB46; Len : 15), (Tab : $AB42; Len : 15),
|
||||
(Tab : $AB3E; Len : 15), (Tab : $AB3A; Len : 15), (Tab : $AB36; Len : 15),
|
||||
(Tab : $AB32; Len : 15), (Tab : $AB2E; Len : 15), (Tab : $AB2A; Len : 15),
|
||||
(Tab : $AB26; Len : 15), (Tab : $AB22; Len : 15), (Tab : $AB1E; Len : 15),
|
||||
(Tab : $AB1A; Len : 15), (Tab : $AB16; Len : 15), (Tab : $AB12; Len : 15),
|
||||
(Tab : $AB0E; Len : 15), (Tab : $AB0A; Len : 15), (Tab : $AB06; Len : 15),
|
||||
(Tab : $AB02; Len : 15), (Tab : $AAFE; Len : 15), (Tab : $AAFA; Len : 15),
|
||||
(Tab : $AAF6; Len : 15), (Tab : $AAF2; Len : 15), (Tab : $AAEE; Len : 15),
|
||||
(Tab : $AAEA; Len : 15), (Tab : $AAE6; Len : 15), (Tab : $AAE2; Len : 15),
|
||||
(Tab : $AADE; Len : 15), (Tab : $AADA; Len : 15), (Tab : $AAD6; Len : 15),
|
||||
(Tab : $AAD2; Len : 15), (Tab : $AACE; Len : 15), (Tab : $AACA; Len : 15),
|
||||
(Tab : $AAC6; Len : 15), (Tab : $AAC2; Len : 15), (Tab : $AABE; Len : 15),
|
||||
(Tab : $AABA; Len : 15), (Tab : $AAB6; Len : 15), (Tab : $AAB2; Len : 15),
|
||||
(Tab : $AAAE; Len : 15), (Tab : $AAAA; Len : 15), (Tab : $AAA6; Len : 15),
|
||||
(Tab : $AAA2; Len : 15), (Tab : $AA9E; Len : 15), (Tab : $3A44; Len : 15),
|
||||
(Tab : $AA9A; Len : 15), (Tab : $AA96; Len : 15), (Tab : $AA92; Len : 15),
|
||||
(Tab : $3080; Len : 9), (Tab : $AA8E; Len : 15), (Tab : $AA8A; Len : 15),
|
||||
(Tab : $AA86; Len : 15), (Tab : $AA82; Len : 15), (Tab : $9FFE; Len : 15),
|
||||
(Tab : $9FFA; Len : 15), (Tab : $9FF6; Len : 15), (Tab : $9FF2; Len : 15),
|
||||
(Tab : $9FEE; Len : 15), (Tab : $9FEA; Len : 15), (Tab : $9FE6; Len : 15),
|
||||
(Tab : $9FE2; Len : 15), (Tab : $9FDE; Len : 15), (Tab : $9FDA; Len : 15),
|
||||
(Tab : $9FD6; Len : 15), (Tab : $9FD2; Len : 15), (Tab : $9FCE; Len : 15),
|
||||
(Tab : $9FCA; Len : 15), (Tab : $9FC6; Len : 15), (Tab : $9FC2; Len : 15),
|
||||
(Tab : $7D7E; Len : 15), (Tab : $7D7A; Len : 15), (Tab : $7D76; Len : 15),
|
||||
(Tab : $7D72; Len : 15), (Tab : $7D6E; Len : 15), (Tab : $7D6A; Len : 15),
|
||||
(Tab : $7D66; Len : 15), (Tab : $7D62; Len : 15), (Tab : $3A46; Len : 15),
|
||||
(Tab : $3A70; Len : 12), (Tab : $AAC4; Len : 15), (Tab : $9FE4; Len : 15));
|
||||
|
||||
|
||||
{Kompressionsroutine}
|
||||
Function Compress (* Zeile : String, Kanal : Byte) : String *);
|
||||
Var Hs2, Hstr : String;
|
||||
t : Word;
|
||||
s : Word;
|
||||
i : Byte;
|
||||
a : Integer;
|
||||
b,c : Byte;
|
||||
ch,ch2 : Char;
|
||||
long : Boolean;
|
||||
lang1,
|
||||
lang2,
|
||||
rate,
|
||||
diff : byte;
|
||||
s1:string;
|
||||
Begin
|
||||
lang2:=length(zeile);
|
||||
hstr:='';
|
||||
|
||||
FillChar(Hstr,SizeOf(Hstr),0);
|
||||
a := 7;
|
||||
b := 1;
|
||||
long := false;
|
||||
diff:=1;
|
||||
if K[Kanal]^.KompressUpd then
|
||||
begin
|
||||
Zeile:='';
|
||||
for i:=1 to 127 do
|
||||
Zeile:=Zeile+chr(K[Kanal]^.Kompression[i]);
|
||||
end;
|
||||
|
||||
|
||||
i := 0;
|
||||
While (i < length(Zeile)) and not long do
|
||||
begin
|
||||
inc(i);
|
||||
t := HTable[ord(Zeile[i])].Tab;
|
||||
s := $8000;
|
||||
C := 0;
|
||||
|
||||
While (C < HTable[ord(Zeile[i])].Len) and not long do
|
||||
begin
|
||||
inc(C);
|
||||
if t and s = s then Hstr[b] := Chr(ord(Hstr[b]) + 1 shl a);
|
||||
s := s shr 1;
|
||||
dec(a);
|
||||
if a < 0 then
|
||||
begin
|
||||
a := 7;
|
||||
inc(b);
|
||||
if b > 254 then long := true;
|
||||
end;
|
||||
end;
|
||||
Hstr[0] := chr(b);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
if (length(Hstr) > length(Zeile)) or long then
|
||||
begin
|
||||
Hstr := Zeile[0] + ccoding(kanal, Zeile);
|
||||
ch := #255;
|
||||
diff:=2;
|
||||
end else ch := Chr(length(Hstr));
|
||||
|
||||
|
||||
|
||||
Hstr := ch + Hstr;
|
||||
ch2:=ch;
|
||||
|
||||
|
||||
|
||||
if (K[Kanal]^.CompC) and (not K[kanal]^.KompressUpd) then
|
||||
begin
|
||||
Hs2:='';
|
||||
for i := 3 to length(Hstr) do
|
||||
begin
|
||||
Hstr[i] := Chr(Ord(Hstr[i]) xor K[Kanal]^.Kompression[i]);
|
||||
end;
|
||||
end;
|
||||
|
||||
if K[Kanal]^.KompressUpd then
|
||||
begin
|
||||
Hs2:='';
|
||||
for i := 3 to length(Hstr) do
|
||||
begin
|
||||
Hstr[i] := Chr(Ord(Hstr[i]) xor Comp_Key_Tab [I]);
|
||||
end;
|
||||
K[Kanal]^.KompressUpd:=false;
|
||||
k[kanal]^.FileSendWait:=k[kanal]^.fileSendWaitS;
|
||||
end;
|
||||
TestCom:=hstr;
|
||||
Compress:=Hstr;
|
||||
lang1:=length(hstr)-diff;
|
||||
rate:=CompRate(Lang1, Lang2);
|
||||
if rate>=100 then rate:=k[kanal]^.tXKompRate;
|
||||
k[kanal]^.tXKompRate:=rate;
|
||||
SetzeFlags(kanal);
|
||||
End;
|
||||
|
||||
|
||||
{Dekompressions-Routine}
|
||||
Function DeCompress (* Zeile : String, Kanal : Byte) : String *);
|
||||
Var Hstr, Hstr2 : String;
|
||||
b,i,i1,l : Byte;
|
||||
a : Integer;
|
||||
t,t2 : Word;
|
||||
Bit : LongInt;
|
||||
ch : Char;
|
||||
lang1,
|
||||
rate,
|
||||
lang2 : Byte;
|
||||
s2:string;
|
||||
|
||||
Begin
|
||||
lang1:=length(zeile)-1;
|
||||
|
||||
Hstr:='';
|
||||
Hstr2:='';
|
||||
|
||||
if kanal=0 then delete(Zeile, Length(Zeile),1);
|
||||
if K[Kanal]^.KompressUpd then
|
||||
begin
|
||||
for i := 3 to length(Zeile) do
|
||||
begin
|
||||
Zeile[i] := Chr(Ord(Zeile[i]) xor Comp_Key_Tab[I]);
|
||||
end;
|
||||
|
||||
end else Hstr2:=Zeile;
|
||||
|
||||
if (K[Kanal]^.CompC) and (not K[kanal]^.KompressUpd) then
|
||||
begin
|
||||
for i := 3 to length(Zeile) do
|
||||
begin
|
||||
Zeile[i] := Chr(Ord(Zeile[i]) xor K[Kanal]^.Kompression[I]);
|
||||
end;
|
||||
|
||||
end else Hstr2:=Zeile;
|
||||
|
||||
|
||||
HStr:=''; i:=0;
|
||||
ch := Zeile[1];
|
||||
delete(Zeile,1,1);
|
||||
if ch = #255 then
|
||||
begin
|
||||
delete(Zeile,1,1);
|
||||
if lang1>0 then dec(lang1);
|
||||
end;
|
||||
|
||||
if (ch < #255) and (Zeile[0] > #0) then
|
||||
begin
|
||||
Hstr := '';
|
||||
l := 0;
|
||||
Bit := 0;
|
||||
|
||||
for i := 1 to length(Zeile) do
|
||||
begin
|
||||
Bit := (Bit shl 8) or ord(Zeile[i]);
|
||||
l := Byte(l + 8);
|
||||
|
||||
a := 0;
|
||||
|
||||
Repeat
|
||||
b := HTable[a].Len;
|
||||
if l >= b then
|
||||
begin
|
||||
t := HTable[a].Tab;
|
||||
t2 := Word(Bit shr (l-b)) shl (16-b);
|
||||
|
||||
if t = t2 then
|
||||
begin
|
||||
Hstr := Hstr + chr(a);
|
||||
l := l - b;
|
||||
a := -1;
|
||||
end;
|
||||
end;
|
||||
inc(a);
|
||||
Until (a > 257) or (l < 3);
|
||||
end;
|
||||
end else Hstr := Zeile;
|
||||
|
||||
if K[Kanal]^.KompressUpd then
|
||||
begin
|
||||
for i:=1 to length(Zeile) do
|
||||
begin
|
||||
inc(K[Kanal]^.CompCUpdZahl);
|
||||
K[Kanal]^.Kompression[K[Kanal]^.CompCUpdZahl]:=ord(Zeile[i]);
|
||||
if K[Kanal]^.CompCUpdZahl=127 then
|
||||
begin
|
||||
k[kanal]^.KompressUpd:=false;
|
||||
k[kanal]^.FileSendWait:=k[kanal]^.fileSendWaitS;
|
||||
For i1:=1 to 127 do
|
||||
k[kanal]^.Kompression[i1+127]:=k[kanal]^.Kompression[i1] xor Comp_Key_Tab[I1];
|
||||
k[kanal]^.Kompression[255]:=k[kanal]^.Kompression[1];
|
||||
end;
|
||||
end;
|
||||
|
||||
zeile:='';
|
||||
Hstr:='';
|
||||
end;
|
||||
|
||||
DeCompress := Hstr;
|
||||
lang2:=length(hstr);
|
||||
rate:=CompRate(Lang1, Lang2);
|
||||
if rate>=100 then rate:=k[kanal]^.RXKompRate;
|
||||
k[kanal]^.RXKompRate:=rate;
|
||||
setzeflags(kanal);
|
||||
End;
|
435
XPCONV.PAS
Executable file
435
XPCONV.PAS
Executable file
@ -0,0 +1,435 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P C O N V . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r den Conversmode. ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Conv_Tx_All (* Kanal : Byte *);
|
||||
Var i : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
for i := 1 to VorZeilen - VorCmdZeilen do if stTX[i] then
|
||||
begin
|
||||
ConversTX(Kanal,false,false,VorWrite[Kanal]^[i] + M1);
|
||||
inc(Conv.Count);
|
||||
end;
|
||||
ConversTX(Kanal,true,false,'');
|
||||
Conv.Count := 0;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure ConversTX (* Kanal : Byte; All,Head : Boolean; Zeile : String *);
|
||||
Const ML = 8;
|
||||
MZ = 71;
|
||||
|
||||
Var i,i1 : Byte;
|
||||
Flag : Boolean;
|
||||
CallStr : String[20];
|
||||
Bstr,
|
||||
Hstr : String;
|
||||
|
||||
Procedure Send_Blanks(Kanal : Byte);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if not Flag and (Conv.LLen = 0) then
|
||||
begin
|
||||
if Kanal = ConvHilfsPort then _aus(Attrib[18],Kanal,ConstStr(B1,ML))
|
||||
else S_PAC(Kanal,NU,false,ConstStr(B1,ML));
|
||||
end;
|
||||
Flag := false;
|
||||
end;
|
||||
End;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do if Conv.Active then
|
||||
begin
|
||||
CallStr := ConversCall(Kanal);
|
||||
|
||||
for i := 1 to maxLink do with K[i]^ do
|
||||
begin
|
||||
if (i <> Kanal) and Conv.Active and (Zeile > '') and
|
||||
(K[Kanal]^.Conv.Chan = Conv.Chan) then
|
||||
begin
|
||||
Flag := false;
|
||||
if (K[Kanal]^.Conv.Count = 0) and
|
||||
((K[Kanal]^.Call <> Conv.LCall) or not Conv.NoCHead or Head) then
|
||||
begin
|
||||
if i = ConvHilfsPort then _aus(Attrib[18],i,CallStr)
|
||||
else S_PAC(i,NU,false,CallStr);
|
||||
Flag := true;
|
||||
end;
|
||||
|
||||
Bstr := Line_convert(i,1,Zeile);
|
||||
KillStartBlanks(Bstr);
|
||||
KillEndBlanks(Bstr);
|
||||
While pos(M1,Bstr) > 0 do Bstr[pos(M1,Bstr)] := B1;
|
||||
|
||||
While Bstr > '' do
|
||||
begin
|
||||
if (length(Bstr) + Conv.LLen) > MZ then
|
||||
begin
|
||||
Hstr := copy(Bstr,1,MZ-Conv.LLen);
|
||||
KillEndBlanks(Hstr);
|
||||
if ((length(Hstr)+Conv.LLen) = MZ) and
|
||||
(copy(Bstr,MZ-Conv.LLen+1,1) <> B1) and
|
||||
(pos(B1,Hstr) > 0) then
|
||||
begin
|
||||
i1 := length(Hstr);
|
||||
While Hstr[i1] <> B1 do dec(i1);
|
||||
Send_Blanks(i);
|
||||
if i = ConvHilfsPort
|
||||
then _aus(Attrib[18],i,copy(Bstr,1,i1-1) + M1)
|
||||
else S_PAC(i,NU,false,copy(Bstr,1,i1-1) + M1);
|
||||
Conv.LLen := 0;
|
||||
delete(Bstr,1,i1);
|
||||
KillStartBlanks(Bstr);
|
||||
end else
|
||||
begin
|
||||
Send_Blanks(i);
|
||||
if i = ConvHilfsPort
|
||||
then _aus(Attrib[18],i,Hstr + M1)
|
||||
else S_PAC(i,NU,false,Hstr + M1);
|
||||
Conv.LLen := 0;
|
||||
delete(Bstr,1,length(Hstr));
|
||||
KillStartBlanks(Bstr);
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
Send_Blanks(i);
|
||||
if i = ConvHilfsPort
|
||||
then _aus(Attrib[18],i,Bstr)
|
||||
else S_PAC(i,NU,false,Bstr);
|
||||
Conv.LLen := Conv.LLen + length(Bstr);
|
||||
Bstr := '';
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
if All then
|
||||
begin
|
||||
if i = ConvHilfsPort then
|
||||
begin
|
||||
if not RxLRet then _aus(Attrib[18],i,M1);
|
||||
if Conv.Ret then _aus(Attrib[18],i,M1);
|
||||
end else
|
||||
begin
|
||||
if not TxLRet then S_PAC(i,NU,false,M1);
|
||||
if Conv.Ret then S_PAC(i,NU,false,M1);
|
||||
S_PAC(i,NU,true,'');
|
||||
end;
|
||||
Conv.LLen := 0;
|
||||
end;
|
||||
|
||||
Conv.LCall := K[Kanal]^.Call;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure ConversUser (* Kanal : Byte *);
|
||||
Var i : Byte;
|
||||
Hstr : String;
|
||||
Bstr : String[20];
|
||||
Begin
|
||||
S_PAC(Kanal,NU,false,Plus + InfoZeile(314) + M1);
|
||||
Hstr := '';
|
||||
for i := 1 to maxLink do with K[i]^ do
|
||||
begin
|
||||
if Conv.Active then
|
||||
begin
|
||||
if i = ConvHilfsPort then Bstr := OwnCall + '=SYSOP'
|
||||
else Bstr := Call;
|
||||
Bstr := '(' + int_str(Conv.Chan) + ')-' + Bstr + B1;
|
||||
if length(Hstr) > 65 then
|
||||
begin
|
||||
KillEndBlanks(Hstr);
|
||||
S_PAC(Kanal,NU,false,Hstr + M1);
|
||||
Hstr := '';
|
||||
end;
|
||||
Hstr := Hstr + Bstr;
|
||||
end;
|
||||
end;
|
||||
KillEndBlanks(Hstr);
|
||||
S_PAC(Kanal,NU,true,Hstr + M2);
|
||||
End;
|
||||
|
||||
|
||||
Procedure ConversRemote (* Kanal : Byte; Zeile : String *);
|
||||
Var i,ic,afu : Byte;
|
||||
CoFlag,
|
||||
Flag : Boolean;
|
||||
Rstr : String[2];
|
||||
Cstr,
|
||||
Vstr,
|
||||
Hstr,
|
||||
Bstr : String[6];
|
||||
|
||||
Procedure CHeader(Kanal : Byte);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Cstr := OwnCall;
|
||||
Strip(Cstr);
|
||||
if Conv.Ret then Rstr := M2
|
||||
else Rstr := M1;
|
||||
end;
|
||||
End;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
delete(Zeile,1,1);
|
||||
Vstr := UpCaseStr(CutStr(Zeile));
|
||||
Zeile := RestStr(Zeile);
|
||||
|
||||
if (Vstr = 'Q') or (Vstr = 'D') then
|
||||
begin
|
||||
ConversTX(Kanal,true,true,Plus + InfoZeile(244) + M1);
|
||||
ConversIni(Kanal,false);
|
||||
if Vstr = 'D' then S_PAC(Kanal,CM,true,'D')
|
||||
else Send_Prompt(Kanal,FF);
|
||||
end else
|
||||
|
||||
if Vstr = 'C' then
|
||||
begin
|
||||
CHeader(Kanal);
|
||||
i := Byte(str_int(Zeile));
|
||||
if i in [1..99] then
|
||||
begin
|
||||
CoFlag:=false;
|
||||
ic:=0;
|
||||
Afu:=Conv.AfuStatus;
|
||||
while not CoFlag do
|
||||
begin
|
||||
inc(ic);
|
||||
if ic=maxlink then CoFlag:=true;
|
||||
if (K[ic]^.Conv.Active) and (K[ic]^.Conv.Chan = i) then
|
||||
begin
|
||||
CoFlag:=true;
|
||||
Afu:=K[ic]^.Conv.AfuStatus;
|
||||
end;
|
||||
end;
|
||||
if Afu=Conv.AfuStatus then
|
||||
begin
|
||||
S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr) + '*' + B1 + Plus +
|
||||
InfoZeile(248) + B1 + int_str(i) + Rstr);
|
||||
ConversTX(Kanal,true,true,Plus + InfoZeile(247) + B1 + int_str(i) + M1);
|
||||
Conv.Chan := i;
|
||||
ConversTX(Kanal,true,true,Plus + InfoZeile(245) + M1);
|
||||
end else
|
||||
begin
|
||||
S_Pac(kanal,nu,true,EFillStr(6,B1,Cstr) + '*' + B1 + Plus +InfoZeile(442)+m1);
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr) + '*' + B1 + Plus +
|
||||
InfoZeile(249) + B1 + int_str(Conv.Chan) + Rstr);
|
||||
end;
|
||||
end else
|
||||
|
||||
if Vstr = 'R' then
|
||||
begin
|
||||
Conv.Ret := not Conv.Ret;
|
||||
CHeader(Kanal);
|
||||
if Conv.Ret
|
||||
then S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr)+'*'+B1+Plus+InfoZeile(312) + M2)
|
||||
else S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr)+'*'+B1+Plus+InfoZeile(313) + M1)
|
||||
end else
|
||||
|
||||
if Vstr = 'S' then
|
||||
begin
|
||||
Hstr := UpCaseStr(CutStr(Zeile));
|
||||
Strip(Hstr);
|
||||
Zeile := RestStr(Zeile);
|
||||
if Zeile > '' then
|
||||
begin
|
||||
i := 0;
|
||||
Repeat
|
||||
inc(i);
|
||||
if i = ConvHilfsPort then Bstr := K[i]^.OwnCall
|
||||
else Bstr := K[i]^.Call;
|
||||
Strip(Bstr);
|
||||
Flag := (i <> Kanal) and K[i]^.Conv.Active and
|
||||
(Hstr = Bstr) and (K[i]^.Conv.Chan = Conv.Chan);
|
||||
Until Flag or (i = maxLink);
|
||||
if Flag then
|
||||
begin
|
||||
if K[i]^.Conv.AfuStatus = Conv.AfuStatus then
|
||||
begin
|
||||
Hstr := Call;
|
||||
Strip(Hstr);
|
||||
if i = ConvHilfsPort then
|
||||
begin
|
||||
_aus(Attrib[18],i,EFillStr(6,B1,Hstr) + '*' + B1 + Zeile + M1);
|
||||
if K[i]^.Conv.Ret then _aus(Attrib[18],i,M1);
|
||||
CHeader(Kanal);
|
||||
S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr) + '*' + B1 + Plus +
|
||||
InfoZeile(242) + B1 + Hstr + Rstr);
|
||||
end else
|
||||
begin
|
||||
S_PAC(i,NU,false,EFillStr(6,B1,Hstr) + '*' + B1 + Zeile + M1);
|
||||
if K[i]^.Conv.Ret then S_PAC(i,NU,false,M1);
|
||||
S_PAC(i,NU,true,'');
|
||||
CHeader(Kanal);
|
||||
S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr) + '*' + B1 + Plus +
|
||||
InfoZeile(242) + B1 + Hstr + Rstr);
|
||||
end;
|
||||
end else
|
||||
S_Pac(Kanal, NU, true, EFillStr(6,B1,Cstr) + '*' + B1 + Plus +infozeile(442));
|
||||
end else
|
||||
begin
|
||||
CHeader(Kanal);
|
||||
S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr) + '*' + B1 + Plus +
|
||||
InfoZeile(50) + B1 + Hstr + Rstr);
|
||||
end;
|
||||
end;
|
||||
end else
|
||||
|
||||
if (Vstr = 'H') or (Vstr = '?') then
|
||||
begin
|
||||
WishBuf := true;
|
||||
Send_Hilfe(Kanal,G^.OHelp[17]);
|
||||
S_PAC(Kanal,NU,true,'');
|
||||
end else
|
||||
|
||||
if Vstr = 'U' then
|
||||
begin
|
||||
ConversUser(Kanal);
|
||||
end else
|
||||
|
||||
if Vstr = 'V' then
|
||||
begin
|
||||
CHeader(Kanal);
|
||||
Conv.NoCHead := not Conv.NoCHead;
|
||||
if Conv.NoCHead
|
||||
then S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr)+'*'+B1+Plus+InfoZeile(220) + Rstr)
|
||||
else S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr)+'*'+B1+Plus+InfoZeile(219) + Rstr);
|
||||
end else
|
||||
|
||||
begin
|
||||
CHeader(Kanal);
|
||||
S_PAC(Kanal,NU,true,EFillStr(6,B1,Cstr) + '*' + B1 + Plus +
|
||||
InfoZeile(280) + B1 + '/' + Vstr + Rstr);
|
||||
end;
|
||||
|
||||
Conv.LCall := '';
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Function ConversIni (* Kanal : Byte; INI : Boolean *);
|
||||
var ic, AfuCSt : Byte;
|
||||
coflag:boolean;
|
||||
Begin
|
||||
COFlag:=False;
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if INI then
|
||||
begin
|
||||
if TNC[TNCNummer]^.AfuPort then AfuCSt:=1 else AfuCSt:=2;
|
||||
|
||||
{if (kanal=25) or (kanal=24) then AfucSt:=1; NUR FšR TESTS!!}
|
||||
|
||||
if Conv.AfuStatus=0 then Conv.AfuStatus:=AfuCSt;
|
||||
|
||||
|
||||
|
||||
ic:=0;
|
||||
COFlag:=false;
|
||||
|
||||
while not coflag do
|
||||
begin
|
||||
inc(ic);
|
||||
if ic=MaxLink then COFlag:=True;
|
||||
if (K[ic]^.Conv.Active) and (K[ic]^.Conv.Chan=Conv.Chan) then
|
||||
begin
|
||||
AfuCSt:=K[ic]^.Conv.AfuStatus;
|
||||
COFlag:=true;
|
||||
end;
|
||||
end;
|
||||
|
||||
COFlag:=False;
|
||||
|
||||
if Conv.AfuStatus=AfuCSt then
|
||||
begin
|
||||
Kanal_Benutz := true;
|
||||
COFlag:=true;
|
||||
with Conv do
|
||||
begin
|
||||
Active := true;
|
||||
Ret := false;
|
||||
NoCHead := false;
|
||||
LCall := '';
|
||||
end;
|
||||
end else Conv.Fehler:=InfoZeile(442); {Conv.AfuStatus}
|
||||
end else
|
||||
begin
|
||||
FillChar(Conv,SizeOf(Conv),0);
|
||||
Kanal_Benutz := false;
|
||||
COFlag:=true;
|
||||
end;
|
||||
end;
|
||||
ConversIni:=COFlag;
|
||||
End;
|
||||
|
||||
|
||||
Procedure ConversAuswert (* Kanal,Nr : Byte *);
|
||||
Const SYSOP = '(Sysop)';
|
||||
Var i : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if ConvHilfsPort > 0 then
|
||||
begin
|
||||
i := ConvHilfsPort;
|
||||
ConversTX(i,true,true,Plus + InfoZeile(244) + B1 + SYSOP + M1);
|
||||
S_PAC(i,CM,true,'I ' + K[i]^.OwnCall);
|
||||
ConversIni(i,false);
|
||||
ConvHilfsPort := 0;
|
||||
InfoOut(Kanal,0,T,InfoZeile(258));
|
||||
end else
|
||||
begin
|
||||
i := KanalFrei(0);
|
||||
if Nr in [1..99] then
|
||||
begin
|
||||
if i <> 0 then
|
||||
begin
|
||||
ConvHilfsPort := i;
|
||||
S_PAC(i,CM,true,'I ' + PhantasieCall);
|
||||
K[i]^.Conv.Chan := Nr;
|
||||
ConversIni(i,true);
|
||||
InfoOut(show,0,T,InfoZeile(259) + B1 + '(Port' + B1 + int_str(i) + ')');
|
||||
ConversTX(i,true,true,Plus + InfoZeile(245) + B1 + SYSOP + M1);
|
||||
end else InfoOut(Kanal,T,T,InfoZeile(94));
|
||||
end else InfoOut(Kanal,T,T,InfoZeile(281));
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Function ConversCall (* (Kanal : Byte) : Str20 *);
|
||||
Var Hstr : String[6];
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if Kanal = ConvHilfsPort then Hstr := OwnCall
|
||||
else Hstr := Call;
|
||||
Strip(Hstr);
|
||||
ConversCall := EFillStr(6,B1,Hstr) + DP + B1;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure ConversQuit (* Kanal : Byte *);
|
||||
Begin
|
||||
ConversTX(Kanal,true,true,Plus + InfoZeile(244) + M1);
|
||||
ConversIni(Kanal,false);
|
||||
End;
|
126
XPCOPY.PAS
Executable file
126
XPCOPY.PAS
Executable file
@ -0,0 +1,126 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P C O P Y . P A S ³
|
||||
³ ³
|
||||
³ Filekopier-Routinen ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure FileKopieren (* Var Zeile : String *);
|
||||
Var i,i1,i2,
|
||||
Anzahl : Integer;
|
||||
fq,fz : File;
|
||||
Par : Array[1..3] of String[80];
|
||||
Hstr,Joker : String;
|
||||
srec : SearchRec;
|
||||
maxPuffer : Word;
|
||||
|
||||
|
||||
|
||||
Procedure Kopieren(von,nach : String);
|
||||
Var rResult,
|
||||
wResult : Word;
|
||||
Attr : Word;
|
||||
FTime : LongInt;
|
||||
|
||||
Begin
|
||||
Assign(fq,von);
|
||||
GetFAttr(fq,Attr);
|
||||
SetFAttr(fq,$20);
|
||||
|
||||
Assign(fz,nach);
|
||||
|
||||
if ResetBin(fq,T) = 0 then
|
||||
begin
|
||||
GetFTime(fq,FTime);
|
||||
if RewriteBin(fz,T) = 0 then
|
||||
begin
|
||||
Repeat
|
||||
Blockread(fq,Page^,maxPuffer,rResult);
|
||||
BlockWrite(fz,Page^,rResult,wResult);
|
||||
Until Eof(fq);
|
||||
SetFTime(fz,FTime);
|
||||
FiResult := CloseBin(fz);
|
||||
SetFAttr(fz,Attr);
|
||||
end else dec(Anzahl);
|
||||
FiResult := CloseBin(fq);
|
||||
end else dec(Anzahl);
|
||||
End;
|
||||
|
||||
|
||||
Begin
|
||||
if MaxAvail > maxNotChBuf then maxPuffer := maxNotChBuf
|
||||
else maxPuffer := MaxAvail - 1024;
|
||||
GetMem(Page,maxPuffer);
|
||||
FillChar(Page^,maxPuffer,0);
|
||||
|
||||
for i := 1 to 3 do Par[i] := ParmStr(i,' ',Zeile);
|
||||
|
||||
if pos(DP,Par[1]) = 0 then Par[1] := Par[3] + Par[1];
|
||||
if pos(DP,Par[2]) = 0 then Par[2] := Par[3] + Par[2];
|
||||
|
||||
if not (((pos(Pkt ,Par[2]) > 0) and (pos('*',Par[1]) > 0))) then
|
||||
begin
|
||||
Joker := '';
|
||||
i := length(Par[1]);
|
||||
While (Par[1][length(Par[1])] <> BS) and (length(Par[1]) > 0) do
|
||||
begin
|
||||
Joker := Par[1][i] + Joker;
|
||||
delete(Par[1],length(Par[1]),1);
|
||||
dec(i);
|
||||
end;
|
||||
if pos(Pkt ,Par[2]) = 0 then
|
||||
begin
|
||||
if Par[2][length(Par[2])] <> BS then Par[2] := Par[2] + BS;
|
||||
end;
|
||||
|
||||
if PfadOk(1,Par[2]) then
|
||||
begin
|
||||
Anzahl := 0;
|
||||
FindFirst(Par[1] + Joker,AnyFile-Directory,srec);
|
||||
While DosError = 0 do
|
||||
begin
|
||||
inc(Anzahl);
|
||||
if pos(Pkt ,Par[2]) = 0 then
|
||||
begin
|
||||
Hstr := Par[2] + srec.Name;
|
||||
end else Hstr := Par[2];
|
||||
if Hstr <> (Par[1] + srec.Name) then Kopieren(Par[1] + srec.Name,Hstr) else
|
||||
begin
|
||||
dec(Anzahl);
|
||||
end;
|
||||
Hstr := '';
|
||||
FindNext(srec);
|
||||
end;
|
||||
str(Anzahl,Hstr);
|
||||
Zeile := Hstr + ' ' + InfoZeile(315);
|
||||
end else Zeile := InfoZeile(316);
|
||||
end else Zeile := InfoZeile(317);
|
||||
FreeMem(Page,maxPuffer);
|
||||
End;
|
||||
|
||||
|
||||
Procedure Delete_Datei (* var Zeile : str80 *);
|
||||
var Anzahl : Word;
|
||||
f,fd : Text;
|
||||
Hstr : String[80];
|
||||
srec : SearchRec;
|
||||
|
||||
Begin
|
||||
Anzahl := 0;
|
||||
Hstr := Zeile;
|
||||
While (length(Hstr) > 3) and (Hstr[length(Hstr)] <> BS)
|
||||
do delete(Hstr,length(Hstr),1);
|
||||
if Hstr[length(Hstr)] <> BS then Hstr := '';
|
||||
FindFirst(Zeile,AnyFile-Directory,srec);
|
||||
While DosError = 0 do
|
||||
begin
|
||||
Assign(fd,Hstr + srec.Name);
|
||||
if EraseTxt(fd) = 0 then inc(Anzahl);
|
||||
FindNext(srec);
|
||||
end;
|
||||
Zeile := int_str(Anzahl) + B1 + InfoZeile(35);
|
||||
End;
|
252
XPCRC.PAS
Executable file
252
XPCRC.PAS
Executable file
@ -0,0 +1,252 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P C R C . P A S ³
|
||||
³ ³
|
||||
³ CRC - Ermittlung ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure CRC_Datei (* var Zeile : str80 *);
|
||||
Const PufferGroesse = $FFD0;
|
||||
Type PufferPtr = Array[0..Puffergroesse] of Byte;
|
||||
|
||||
Var i,Anz,i1 : Integer;
|
||||
lergebnis,
|
||||
CRC,Anzahl,
|
||||
maxPuffer : Word;
|
||||
Groesse,
|
||||
absolut,z,
|
||||
von,bis : LongInt;
|
||||
Puffer : ^PufferPtr;
|
||||
Datei : File;
|
||||
ok : Boolean;
|
||||
Files,
|
||||
Hstr : string[80];
|
||||
PuffPtr,
|
||||
CrcPtr : Pointer;
|
||||
Begin
|
||||
ok := false;
|
||||
KillEndBlanks(Zeile);
|
||||
Files := UpCaseStr(ParmStr(1,' ',Zeile));
|
||||
Anz := ParmAnz;
|
||||
CRC := 0;
|
||||
Assign(Datei,Files);
|
||||
if ResetBin(Datei,T) = 0 then
|
||||
begin
|
||||
Puffer := Nil;
|
||||
if MaxAvail < maxPuffer then maxPuffer := MaxAvail;
|
||||
GetMem(Puffer,maxPuffer);
|
||||
FillChar(Puffer^,maxPuffer,#0);
|
||||
Groesse := Filesize(Datei);
|
||||
absolut := Groesse;
|
||||
if Anz = 3 then
|
||||
begin
|
||||
Zeile := RestStr(Zeile);
|
||||
von := str_int(CutStr(Zeile));
|
||||
bis := str_int(RestStr(Zeile));
|
||||
if (bis >= von) and (bis < Groesse) and (von >= 0) then
|
||||
begin
|
||||
ok := true;
|
||||
absolut := bis - von + 1;
|
||||
end;
|
||||
end else
|
||||
|
||||
if Anz = 2 then
|
||||
begin
|
||||
von := str_int(RestStr(Zeile));
|
||||
if (von >= 0) and (von < Groesse) then
|
||||
begin
|
||||
ok := true;
|
||||
bis := Groesse - 1;
|
||||
absolut := bis - von + 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
if not ok then
|
||||
begin
|
||||
absolut := Groesse;
|
||||
von := 0;
|
||||
bis := Groesse - 1;
|
||||
end else Seek(Datei,von);
|
||||
z := absolut;
|
||||
|
||||
PuffPtr := Addr(Puffer^[0]);
|
||||
CrcPtr := Addr(G^.CrcFeld[0]);
|
||||
|
||||
Repeat
|
||||
if z > maxPuffer then
|
||||
begin
|
||||
Anzahl := maxPuffer;
|
||||
z := z - Anzahl;
|
||||
end else
|
||||
begin
|
||||
Anzahl := Word(z);
|
||||
z := 0;
|
||||
end;
|
||||
Blockread(Datei,Puffer^,Anzahl,lergebnis);
|
||||
|
||||
asm push ds
|
||||
les di,PuffPtr
|
||||
mov dx,lergebnis
|
||||
mov cl,8
|
||||
mov ax,CRC
|
||||
lds si,CrcPtr
|
||||
@Again:
|
||||
mov bx,ax
|
||||
shl ax,cl
|
||||
or al,[es:di]
|
||||
shr bx,cl
|
||||
shl bx,1
|
||||
xor ax,[ds:si+bx]
|
||||
inc di
|
||||
dec dx
|
||||
ja @Again
|
||||
|
||||
pop ds
|
||||
mov CRC,ax
|
||||
end;
|
||||
|
||||
(*
|
||||
for z := 0 to lergebnis-1
|
||||
do CRC := crcFeld[(CRC shr 8)] xor ((CRC shl 8) or Puffer^[z]);
|
||||
*)
|
||||
|
||||
Until z = 0;
|
||||
|
||||
FiResult := CloseBin(Datei);
|
||||
While pos(BS ,Files) <> 0 do delete(Files,1,pos(BS ,Files));
|
||||
Zeile := 'CRC = ' + int_str(CRC) + '(dez) ' + Hex(CRC,4) + '(hex) '+
|
||||
Files + ' -> Anzahl = ' + int_str(absolut) + ' Bytes (' + int_str(von) +
|
||||
'-' + int_str(bis) + ')';
|
||||
FreeMem(Puffer,maxPuffer);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure GetNetRom;
|
||||
Const PufferGroesse = $FFD0;
|
||||
Type PufferPtr = Array[0..Puffergroesse] of Byte;
|
||||
|
||||
Var i,Anz,i1 : Integer;
|
||||
lergebnis,
|
||||
CRC,Anzahl,
|
||||
maxPuffer : Word;
|
||||
Groesse,
|
||||
absolut,z,
|
||||
von,bis : LongInt;
|
||||
Puffer : ^PufferPtr;
|
||||
Datei : File;
|
||||
ok : Boolean;
|
||||
zeile,
|
||||
Files,
|
||||
Hstr : string[80];
|
||||
PuffPtr,
|
||||
CrcPtr : Pointer;
|
||||
Begin
|
||||
maxpuffeR:=puffergroesse;
|
||||
Zeile:='XPACKET.EXE';
|
||||
ok := false;
|
||||
KillEndBlanks(Zeile);
|
||||
Files := UpCaseStr(ParmStr(1,' ',Zeile));
|
||||
Anz := ParmAnz;
|
||||
CRC := 0;
|
||||
Assign(Datei,Files);
|
||||
if ResetBin(Datei,T) = 0 then
|
||||
begin
|
||||
Puffer := Nil;
|
||||
if MaxAvail < maxPuffer then maxPuffer := MaxAvail;
|
||||
GetMem(Puffer,maxPuffer);
|
||||
FillChar(Puffer^,maxPuffer,#0);
|
||||
Groesse := Filesize(Datei);
|
||||
absolut := Groesse;
|
||||
if Anz = 3 then
|
||||
begin
|
||||
Zeile := RestStr(Zeile);
|
||||
von := str_int(CutStr(Zeile));
|
||||
bis := str_int(RestStr(Zeile));
|
||||
if (bis >= von) and (bis < Groesse) and (von >= 0) then
|
||||
begin
|
||||
ok := true;
|
||||
absolut := bis - von + 1;
|
||||
end;
|
||||
end else
|
||||
|
||||
if Anz = 2 then
|
||||
begin
|
||||
von := str_int(RestStr(Zeile));
|
||||
if (von >= 0) and (von < Groesse) then
|
||||
begin
|
||||
ok := true;
|
||||
bis := Groesse - 1;
|
||||
absolut := bis - von + 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
if not ok then
|
||||
begin
|
||||
absolut := Groesse;
|
||||
von := 0;
|
||||
bis := Groesse - 1;
|
||||
end else Seek(Datei,von);
|
||||
z := absolut;
|
||||
|
||||
PuffPtr := Addr(Puffer^[0]);
|
||||
CrcPtr := Addr(G^.CrcFeld[0]);
|
||||
|
||||
Repeat
|
||||
if z > maxPuffer then
|
||||
begin
|
||||
Anzahl := maxPuffer;
|
||||
z := z - Anzahl;
|
||||
end else
|
||||
begin
|
||||
Anzahl := Word(z);
|
||||
z := 0;
|
||||
end;
|
||||
Blockread(Datei,Puffer^,Anzahl,lergebnis);
|
||||
|
||||
asm push ds
|
||||
les di,PuffPtr
|
||||
mov dx,lergebnis
|
||||
mov cl,8
|
||||
mov ax,CRC
|
||||
lds si,CrcPtr
|
||||
@Again:
|
||||
mov bx,ax
|
||||
shl ax,cl
|
||||
or al,[es:di]
|
||||
shr bx,cl
|
||||
shl bx,1
|
||||
xor ax,[ds:si+bx]
|
||||
inc di
|
||||
dec dx
|
||||
ja @Again
|
||||
|
||||
pop ds
|
||||
mov CRC,ax
|
||||
end;
|
||||
|
||||
(*
|
||||
for z := 0 to lergebnis-1
|
||||
do CRC := crcFeld[(CRC shr 8)] xor ((CRC shl 8) or Puffer^[z]);
|
||||
*)
|
||||
|
||||
Until z = 0;
|
||||
hstr:=Hex(CRC,4);
|
||||
if hstr<>CRCNROM then
|
||||
begin
|
||||
{$I-}
|
||||
{ rewrite(datei);
|
||||
if ioresult<>0 then HALT;}
|
||||
HALT;
|
||||
{$I+}
|
||||
end;
|
||||
FiResult := CloseBin(Datei);
|
||||
FreeMem(Puffer,maxPuffer);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
161
XPDEBUG.PAS
Executable file
161
XPDEBUG.PAS
Executable file
@ -0,0 +1,161 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P D E B U G . P A S ³
|
||||
³ ³
|
||||
³ Verschiedene Systemausk<73>nfte ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Debug_Info (* Kanal,Aufruf : Byte *);
|
||||
Var A : Byte;
|
||||
i,i1 : Integer;
|
||||
l : LongInt;
|
||||
Istr,
|
||||
Chan : String[2];
|
||||
Frei : String[10];
|
||||
Hstr : String[80];
|
||||
f : Text;
|
||||
|
||||
|
||||
Begin
|
||||
A := Aufruf;
|
||||
Assign(G^.TFile,G^.TempPfad + DebDatei);
|
||||
FiResult := RewriteTxt(G^.TFile);
|
||||
if A = 0 then Moni_Off(0);
|
||||
|
||||
Frei := B1 + InfoZeile(325) + B1;
|
||||
|
||||
Writeln(G^.TFile);
|
||||
Writeln(G^.TFile,'':5,'D E B U G - I N F O','':10,Version,B2,lastEdit);
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Prefix-Segment : ' + Hex(PrefixSeg,4)) +
|
||||
'³ OvrDosHandle : ' + int_str(OvrDosHandle));
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Code-Segment : ' + Hex(CSeg,4)) +
|
||||
'³ OvrEmsHandle : ' + int_str(OvrEmsHandle));
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Daten-Segment : ' + Hex(DSeg,4)) +
|
||||
'³ OvrHeapBegin : ' + Pointer_Str(Ptr(OvrHeapOrg,0)));
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Stack-Segment : ' + Hex(SSeg,4)) +
|
||||
'³ OvrHeapEnde : ' + Pointer_Str(Ptr(OvrHeapEnd,0)));
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Stack-Pointer : ' + Hex(SPtr,4)) +
|
||||
'³ OvrHeapPtr : ' + Pointer_Str(Ptr(OvrHeapPtr,0)));
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Heap-Anfang : ' + Pointer_Str(HeapOrg)) +
|
||||
'³ OvrHeapSize : ' + FormByte(int_str(OvrHeapSize)) + B1 + Bytes);
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Akt.HeapSpitze : ' + Pointer_Str(HeapPtr)) +
|
||||
'³ OvrGetBuf : ' + FormByte(int_str(OvrGetBuf)) + B1 + Bytes);
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Heap-Ende : ' + Pointer_Str(HeapEnd)) +
|
||||
'³ OvrLoadCount : ' + int_str(OvrLoadCount));
|
||||
Writeln(G^.TFile,EFillStr(30,B1,'Video-Pointer : ' + Pointer_Str(Bild)) +
|
||||
'³ OvrLoadList : ' + int_str(OvrLoadList));
|
||||
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
|
||||
for i := 1 to 4 do
|
||||
begin
|
||||
Hstr := 'Port LPT-' + int_str(i) + ' = ' + Hex(LPT_Base[i],4);
|
||||
if not LPT_Error(i) then Hstr := Hstr + ' Printer exist.';
|
||||
Writeln(G^.TFile,Hstr);
|
||||
end;
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
|
||||
for i := 0 to maxLink do
|
||||
begin
|
||||
l := SizeOf(K[i]^);
|
||||
Chan := SFillStr(2,B1,int_str(i));
|
||||
Hstr := Chan + '.Kanal-Pointer: ' + Pointer_Str(K[i]) + ' => '
|
||||
+ FormByte(int_str(l)) + B1 + Bytes
|
||||
+ ' ³ Syncherrors = ' + int_str(K[i]^.SynchErrAnz);
|
||||
Writeln(G^.TFile,Hstr);
|
||||
end;
|
||||
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
|
||||
for i := 1 to maxTNC do
|
||||
begin
|
||||
if TNC_used[i] then l := SizeOf(TNC[i]^) else l := 0;
|
||||
Hstr := int_str(i) + '.TNC-Pointer : ' + Pointer_Str(TNC[i]) +
|
||||
' => ' + SFillStr(4,B1,FormByte(int_str(l))) + B1 + Bytes + B1;
|
||||
if TNC_used[i] then
|
||||
begin
|
||||
if TNC[i]^.RS232 <> 5 then
|
||||
begin
|
||||
if HwHs then Istr := '--'
|
||||
else Istr := SFillStr(2,B1,int_str(Com[TNC[i]^.RS232].IRQ_Nr));
|
||||
Hstr := Hstr + ' COM/PORT/IRQ/BAUD = ' +
|
||||
int_str(TNC[i]^.RS232) + '/' +
|
||||
Hex(Com[TNC[i]^.RS232].Base,4) + '/' +
|
||||
Istr + '/' +
|
||||
int_str(Com[TNC[i]^.RS232].Baudrate)
|
||||
end else Hstr := Hstr + B1 + PcxStr;
|
||||
end;
|
||||
Writeln(G^.TFile,Hstr);
|
||||
end;
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
Writeln(G^.TFile,ConstStr(B1,10) + 'IRQs - 76543210');
|
||||
Writeln(G^.TFile,'IRQ-Maske : ' + Bin(Port[$21],8));
|
||||
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
Writeln(G^.TFile,'System-Pfad : ' +
|
||||
SFillStr(11,B1,FreeStr(SysPfad[1])) + B1 + Bytes + frei + SysPfad);
|
||||
Writeln(G^.TFile,'Mailbox-Pfad : ' +
|
||||
SFillStr(11,B1,FreeStr(G^.MailPfad[1])) + B1 + Bytes + Frei + G^.MailPfad);
|
||||
Writeln(G^.TFile,'Remote-Pfad : ' +
|
||||
SFillStr(11,B1,FreeStr(K[show]^.RemPath[1])) + B1 + Bytes + Frei + K[show]^.RemPath);
|
||||
Writeln(G^.TFile,'Runfile-Pfad : ' +
|
||||
SFillStr(11,B1,FreeStr(G^.RunPfad[1])) + B1 + Bytes + Frei + G^.RunPfad);
|
||||
Writeln(G^.TFile,'Speakfile-Pfad : ' +
|
||||
SFillStr(11,B1,FreeStr(G^.SpkPfad[1])) + B1 + Bytes + Frei + G^.SpkPfad);
|
||||
|
||||
if use_VDisk then
|
||||
Writeln(G^.TFile,'RAM-Floppy : ' +
|
||||
SFillStr(11,B1,FreeStr(Vdisk[1])) + B1 + Bytes + Frei + Vdisk);
|
||||
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
|
||||
Assign(f,SysPfad + BootDatei);
|
||||
if ResetTxt(f) = 0 then
|
||||
begin
|
||||
Readln(f);
|
||||
Readln(f);
|
||||
while not Eof(f) do
|
||||
begin
|
||||
Readln(f,Hstr);
|
||||
Writeln(G^.TFile,Hstr);
|
||||
end;
|
||||
FiResult := CloseTxt(f);
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
end;
|
||||
|
||||
Writeln(G^.TFile,'Freier RAM insgesamt : ' + SFillStr(8,B1,FormByte(int_str(MemAvail))) + B1 + Bytes);
|
||||
Writeln(G^.TFile,'gr. freier RAM-Block : ' + SFillStr(8,B1,FormByte(int_str(MaxAvail))) + B1 + Bytes);
|
||||
Writeln(G^.TFile,'RAM vor dem Start : ' + SFillStr(8,B1,FormByte(int_str(FreeRam))) + B1 + Bytes);
|
||||
Writeln(G^.TFile,'Belegter Heap : ' +
|
||||
SFillStr(8,B1,FormByte(int_str(Adr_absolut(HeapPtr) - Adr_absolut(HeapOrg) + OvrGetBuf))) + B1 + Bytes);
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
|
||||
for i := 0 to maxLink do
|
||||
begin
|
||||
l := K[i]^.maxNotCh;
|
||||
Chan := SFillStr(2,B1,int_str(i));
|
||||
Hstr := Chan + '.Scroll : ' + Pointer_Str(NotCh[i]) + ' => ' +
|
||||
SFillStr(6,B1,FormByte(int_str(l))) + B1 + Bytes + ' ³ ';
|
||||
l := K[i]^.VorZeilen * 81;
|
||||
Hstr := Hstr + Chan + '.Vor : ' + Pointer_Str(VorWrite[i]) + ' => ' +
|
||||
SFillStr(6,B1,FormByte(int_str(l))) + B1 + Bytes + B1;
|
||||
Writeln(G^.TFile,Hstr);
|
||||
end;
|
||||
Writeln(G^.TFile,ConstStr('Ä',79));
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
|
||||
if Aufruf = 0 then
|
||||
begin
|
||||
ExecDOS(G^.Ext_View_Path + B1 + G^.TempPfad + DebDatei);
|
||||
Neu_Bild;
|
||||
Moni_On;
|
||||
end;
|
||||
if Aufruf = 1 then SF_Text(Kanal,G^.TempPfad + DebDatei);
|
||||
KillFile(G^.TempPfad + DebDatei);
|
||||
END;
|
2504
XPDEFS.PAS
Executable file
2504
XPDEFS.PAS
Executable file
File diff suppressed because it is too large
Load Diff
216
XPDOS.PAS
Executable file
216
XPDOS.PAS
Executable file
@ -0,0 +1,216 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P D O S . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r den DOS-Austieg ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure DosAufruf (* Var Zeile : Str128; Art : Byte *);
|
||||
Var Flag : Boolean;
|
||||
f : File;
|
||||
INr,
|
||||
i,Z : Byte;
|
||||
|
||||
Begin
|
||||
Ini_TNC_Text(1);
|
||||
if Art = 1 then Teil_Bild_Loesch(1,maxZ,7);
|
||||
if Art = 2 then Teil_Bild_Loesch(1,maxZ,Attrib[18]);
|
||||
|
||||
SetzeCursor(1,2);
|
||||
|
||||
Flag := (Zeile = '');
|
||||
if Flag then WriteRam(1,1,Attrib[5],0,InfoZeile(254));
|
||||
|
||||
if Zeile > '' then Zeile := COM_C + Zeile;
|
||||
|
||||
Close_SaveFiles;
|
||||
StoreHeap;
|
||||
|
||||
Call_DOS(Zeile);
|
||||
|
||||
LoadHeap;
|
||||
if DosError = 0 then Zeile := 'OK' else Zeile := '';
|
||||
Open_SaveFiles;
|
||||
|
||||
Z := Zeilen_ermitteln;
|
||||
|
||||
if (Art = 1) and not Flag then
|
||||
begin
|
||||
Teil_Bild_Loesch(Z,Z,7);
|
||||
WriteRam(1,Z,Attrib[5],0,InfoZeile(78));
|
||||
SetzeCursor(length(InfoZeile(78))+2,Z);
|
||||
Warten;
|
||||
end;
|
||||
|
||||
if Art = 2 then
|
||||
begin
|
||||
Assign(f,Konfig.TempVerz + DosBild);
|
||||
if ResetBin(f,T) = 0 then
|
||||
begin
|
||||
if FileSize(f) = 0 then
|
||||
begin
|
||||
FiResult := CloseBin(f);
|
||||
FiResult := EraseBin(f);
|
||||
DosBildSave(Z);
|
||||
end else FiResult := CloseBin(f);
|
||||
end else DosBildSave(Z);
|
||||
end;
|
||||
|
||||
if Z <> maxZ then Switch_VGA_Mono;
|
||||
ColorItensity(HighCol);
|
||||
Cursor_Aus;
|
||||
|
||||
if not HwHs and HardCur then for i := 1 to 4 do
|
||||
with COM[i] do if Active then
|
||||
begin
|
||||
Port[Base + $01] := $01;
|
||||
end;
|
||||
|
||||
Ini_TNC_Text(0);
|
||||
Neu_Bild;
|
||||
Init_HardDrive;
|
||||
End;
|
||||
|
||||
Procedure ExecDOS (* Zeile : str128 *);
|
||||
Var Z : Byte;
|
||||
Begin
|
||||
if Zeile > '' then Zeile := COM_C + Zeile;
|
||||
|
||||
Ini_TNC_Text(1);
|
||||
Teil_Bild_Loesch(1,maxZ,7);
|
||||
SetzeCursor(1,1);
|
||||
Close_SaveFiles;
|
||||
StoreHeap;
|
||||
|
||||
Call_DOS(Zeile);
|
||||
|
||||
LoadHeap;
|
||||
Open_SaveFiles;
|
||||
|
||||
Z := Zeilen_ermitteln;
|
||||
if Z <> maxZ then Switch_VGA_Mono;
|
||||
ColorItensity(HighCol);
|
||||
Cursor_aus;
|
||||
Init_HardDrive;
|
||||
Ini_TNC_Text(0);
|
||||
End;
|
||||
|
||||
Procedure DosBildSave (* Zeilen : Byte *);
|
||||
var i,i1,
|
||||
max : Word;
|
||||
f : text;
|
||||
H : string[80];
|
||||
|
||||
Begin
|
||||
H := '';
|
||||
Assign(f,Konfig.TempVerz + DosBild);
|
||||
FiResult := RewriteTxt(f);
|
||||
i1 := 1;
|
||||
max := Zeilen * 160;
|
||||
for i := 1 to max do
|
||||
begin
|
||||
if i mod 2 = 1 then
|
||||
begin
|
||||
if Bild^[i] in [#32..#254] then H := H + Bild^[i];
|
||||
inc(i1);
|
||||
if i1 > 80 then
|
||||
begin
|
||||
KillEndBlanks(H);
|
||||
if H <> '' then Writeln(f,H);
|
||||
H := '';
|
||||
i1 := 1;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
Writeln(f);
|
||||
FiResult := CloseTxt(f);
|
||||
End;
|
||||
|
||||
Procedure StoreHeap;
|
||||
var Result : Word;
|
||||
Zaehl : LongInt;
|
||||
Begin
|
||||
HeapFeld := HeapOrg;
|
||||
Zaehl := Adr_absolut(HeapPtr) - Adr_absolut(HeapOrg);
|
||||
SizeHeap := Zaehl;
|
||||
if use_XMS and ((LongInt(get_XMS_Free) * 1024) > Zaehl) then
|
||||
begin
|
||||
SwpHandle := get_XMS_Ram((Zaehl div 1024) + 2);
|
||||
Data_to_XMS(HeapOrg,SwpHandle,0,SizeHeap);
|
||||
SwapXms := true;
|
||||
end else
|
||||
begin
|
||||
if Vdisk_Exists and (DiskFree(ord(VDisk[1])-64) > (Zaehl + 2048))
|
||||
then Assign(HeapFile,VDisk + SwapDatei)
|
||||
else Assign(HeapFile,Konfig.TempVerz + SwapDatei);
|
||||
FiResult := RewriteBin(HeapFile,T);
|
||||
if Zaehl > $FFFF then
|
||||
Repeat
|
||||
if Zaehl >= $FFFF then BlockWrite(HeapFile,HeapFeld^,$FFFF,Result)
|
||||
else BlockWrite(HeapFile,HeapFeld^,Word(Zaehl),Result);
|
||||
Zaehl := Zaehl - Result;
|
||||
HeapFeld := Ptr(Seg(HeapFeld^) + $1000,Ofs(HeapFeld^));
|
||||
Until Zaehl <= 0 else BlockWrite(HeapFile,HeapFeld^,Zaehl,Result);
|
||||
FiResult := CloseBin(HeapFile);
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure LoadHeap;
|
||||
var Result : Word;
|
||||
Begin
|
||||
HeapFeld := HeapOrg;
|
||||
if use_XMS and SwapXms then
|
||||
begin
|
||||
XMS_to_Data(HeapOrg,SwpHandle,0,SizeHeap);
|
||||
SwapXMS := false;
|
||||
Free_XMS_Ram(SwpHandle);
|
||||
end else
|
||||
begin
|
||||
FiResult := ResetBin(HeapFile,T);
|
||||
Repeat
|
||||
BlockRead(HeapFile,HeapFeld^,$FFFF,Result);
|
||||
HeapFeld := Ptr(Seg(HeapFeld^) + $1000,Ofs(HeapFeld^));
|
||||
Until Result <= 0;
|
||||
FiResult := CloseBin(HeapFile);
|
||||
FiResult := EraseBin(HeapFile);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Function Zeilen_ermitteln (* : Byte *);
|
||||
var r : Registers;
|
||||
i : Integer;
|
||||
Begin
|
||||
if Hercules then Zeilen_ermitteln := 25 else
|
||||
begin
|
||||
r.ah := $11;
|
||||
r.al := $30;
|
||||
intr($10,r);
|
||||
i := r.dl + 1;
|
||||
if i in [25,30,34,43,50,60] then Zeilen_ermitteln := Byte(i)
|
||||
else Zeilen_ermitteln := 25;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure Switch_VGA_Mono;
|
||||
Begin
|
||||
if not Hercules then
|
||||
begin
|
||||
if _VGA then TextMode(LastModeStore or $100)
|
||||
else TextMode(LastModeStore and $FF);
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure Ini_TNC_Text (* Art : Byte *);
|
||||
Var i : Byte;
|
||||
Begin
|
||||
for i := 1 to TNC_Anzahl do
|
||||
begin
|
||||
K[0]^.TncNummer := i;
|
||||
S_PAC(0,CM,true,'U' + int_str(Art));
|
||||
end;
|
||||
End;
|
309
XPEMS.PAS
Executable file
309
XPEMS.PAS
Executable file
@ -0,0 +1,309 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P E M S . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die EMS-Verwaltung. ³
|
||||
³ ³
|
||||
³ Abschrift mit leichten Žnderungen aus der Fachzeitschrift ³
|
||||
³ " DOS - International " ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
Unit XPEMS;
|
||||
{$F+}
|
||||
|
||||
Interface
|
||||
|
||||
Uses DOS;
|
||||
|
||||
{ Globale Vereinbarungen f<>r Konstanten }
|
||||
|
||||
Const
|
||||
{
|
||||
EMS_NoError = 0;
|
||||
EMS_DriverError = 1;
|
||||
EMS_HardwareError = 2;
|
||||
EMS_InvalidHandle = 3;
|
||||
EMS_InvalidFunction = 4;
|
||||
EMS_NoHandlesAvail = 5;
|
||||
EMS_NoPageAvail = 6;
|
||||
EMS_InvalidPageNumber = 7;
|
||||
EMS_InvalidPage = 8;
|
||||
EMS_MappingNotSaved = 9;
|
||||
EMS_MappingAlreadySaved = 10;
|
||||
EMS_NoEMSAvail = 11;
|
||||
}
|
||||
|
||||
EMS_errortext : array[0..11] of string[40] =
|
||||
('Keinen Fehler erkannt',
|
||||
'Fehler im EMS-Treiber',
|
||||
'Fehler in der EMS-Hardware',
|
||||
'Ung<6E>ltiges EMS-Handle',
|
||||
'Ung<6E>ltige EMS-Funktionsnummer',
|
||||
'Keine EMS-Handles verf<72>gbar',
|
||||
'Keine freien EMS-Seiten verf<72>gbar',
|
||||
'Falsche EMS-Seitenzahl',
|
||||
'Ung<6E>ltige EMS-Seitennummer',
|
||||
'EMS-Mapping kann nicht gesichert werden',
|
||||
'EMS-Mapping ist bereits gesichert',
|
||||
'Kein EMS-Treiber installiert');
|
||||
|
||||
{ Globale Typ-Definitionen }
|
||||
|
||||
Type EMS_Handle = Word;
|
||||
EMS_Seite = Byte;
|
||||
EMS_SeiteImFenster = 0..3;
|
||||
EMS_AlleHandles = array[0..255] of record
|
||||
Handle,
|
||||
SeitenAnzahl : Word;
|
||||
end;
|
||||
|
||||
{ Globale Variablen-Definitionen }
|
||||
|
||||
Var EMS_Segment : Word;
|
||||
EMS_Error : Byte;
|
||||
EMS_Installiert : Boolean;
|
||||
EMS_Fenster : array[0..3] of Word;
|
||||
|
||||
|
||||
Function EMS_Status : Byte;
|
||||
Function EMS_GesamtSeiten : Word;
|
||||
Function EMS_FreieSeiten : Word;
|
||||
Function EMS_Belegen(Anzahl : Word) : EMS_Handle;
|
||||
Procedure EMS_Zuordnung(Handle : EMS_Handle; Fensterseite : EMS_SeiteImFenster; Seite : EMS_Seite);
|
||||
Procedure EMS_Freigeben(Handle : EMS_Handle);
|
||||
Function EMS_Version : Byte;
|
||||
Procedure EMS_ZuordnungSichern(Handle : EMS_Handle);
|
||||
Procedure EMS_ZuordnungEntsichern(Handle : EMS_Handle);
|
||||
Function EMS_HandleAnzahl : Word;
|
||||
Function EMS_BelegteSeiten(Handle : EMS_Handle) : Word;
|
||||
Procedure EMS_AlleHandlesFeststellen(var tab : EMS_AlleHandles);
|
||||
Procedure Init_EMS;
|
||||
|
||||
Implementation
|
||||
|
||||
Type EMS_Kopf = record
|
||||
dummy : array[1..9] of Byte;
|
||||
name : string[8];
|
||||
end;
|
||||
|
||||
EMS_Zeiger = ^EMS_Kopf;
|
||||
|
||||
var cpu : Registers;
|
||||
I : Byte;
|
||||
|
||||
Procedure Fehler(code : Byte);
|
||||
Begin
|
||||
Case code of
|
||||
$80 : EMS_Error := 0;
|
||||
$81 : EMS_Error := 1;
|
||||
$83 : EMS_Error := 2;
|
||||
$84 : EMS_Error := 3;
|
||||
$85 : EMS_Error := 4;
|
||||
$87 : EMS_Error := 5;
|
||||
$88 : EMS_Error := 6;
|
||||
$8A : EMS_Error := 7;
|
||||
$8C : EMS_Error := 8;
|
||||
$8D : EMS_Error := 9;
|
||||
end;
|
||||
End;
|
||||
|
||||
Function get_EMS_Window : Word;
|
||||
Begin
|
||||
cpu.ah := $41;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah <> 0 then
|
||||
begin
|
||||
Fehler(cpu.ah);
|
||||
get_EMS_Window := 0;
|
||||
end else
|
||||
begin
|
||||
EMS_Error := 0;
|
||||
get_EMS_Window := cpu.bx;
|
||||
end;
|
||||
End;
|
||||
|
||||
Function get_EMS_Installiert : Boolean;
|
||||
Const id : string = 'EMMXXXX0';
|
||||
var kopf : EMS_Zeiger;
|
||||
flag : Boolean;
|
||||
Index : Byte;
|
||||
|
||||
Begin
|
||||
cpu.ah := $35;
|
||||
cpu.al := $67;
|
||||
MsDos(cpu);
|
||||
kopf := Ptr(cpu.es,0);
|
||||
flag := true;
|
||||
index := 1;
|
||||
Repeat
|
||||
if kopf^.name[index] <> id[index] then flag := false;
|
||||
inc(index);
|
||||
Until (index = 9) or (flag = false);
|
||||
get_EMS_Installiert := flag;
|
||||
End;
|
||||
|
||||
Function EMS_Status : Byte;
|
||||
Begin
|
||||
cpu.ah := $40;
|
||||
Intr($67,cpu);
|
||||
EMS_Status := cpu.ah;
|
||||
if cpu.ah <> 0 then Fehler(cpu.ah) else EMS_Error := 0;
|
||||
End;
|
||||
|
||||
Function EMS_GesamtSeiten : Word;
|
||||
Begin
|
||||
cpu.ah := $42;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then
|
||||
begin
|
||||
EMS_Error := 0;
|
||||
EMS_GesamtSeiten := cpu.dx;
|
||||
end else
|
||||
begin
|
||||
Fehler(cpu.ah);
|
||||
EMS_GesamtSeiten := 0;
|
||||
end;
|
||||
End;
|
||||
|
||||
Function EMS_FreieSeiten : Word;
|
||||
Begin
|
||||
cpu.ah := $42;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then
|
||||
begin
|
||||
EMS_Error := 0;
|
||||
EMS_FreieSeiten := cpu.bx;
|
||||
end else
|
||||
begin
|
||||
Fehler(cpu.ah);
|
||||
EMS_FreieSeiten := 0;
|
||||
end;
|
||||
end;
|
||||
|
||||
Function EMS_Belegen(anzahl : Word) : EMS_Handle;
|
||||
Begin
|
||||
cpu.ah := $43;
|
||||
cpu.bx := anzahl;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then
|
||||
begin
|
||||
EMS_Error := 0;
|
||||
EMS_Belegen := cpu.dx;
|
||||
end else
|
||||
begin
|
||||
Fehler(cpu.ah);
|
||||
EMS_Belegen := 0;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure EMS_Zuordnung(Handle : EMS_Handle; Fensterseite : EMS_SeiteImFenster; Seite : EMS_Seite);
|
||||
Begin
|
||||
cpu.ah := $44;
|
||||
cpu.al := Fensterseite;
|
||||
cpu.bx := Seite;
|
||||
cpu.dx := Handle;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then EMS_Error := 0 else Fehler(cpu.ah);
|
||||
End;
|
||||
|
||||
Procedure EMS_Freigeben(Handle : EMS_Handle);
|
||||
Begin
|
||||
cpu.ah := $45;
|
||||
cpu.dx := Handle;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then EMS_Error := 0 else Fehler(cpu.ah);
|
||||
End;
|
||||
|
||||
Function EMS_Version : Byte;
|
||||
Begin
|
||||
cpu.ah := $46;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then
|
||||
begin
|
||||
EMS_Error := 0;
|
||||
EMS_Version := cpu.al;
|
||||
end else
|
||||
begin
|
||||
Fehler(cpu.ah);
|
||||
EMS_Error := 0;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure EMS_ZuordnungSichern(Handle : EMS_Handle);
|
||||
Begin
|
||||
cpu.ah := $47;
|
||||
cpu.dx := Handle;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then EMS_Error := 0 else Fehler(cpu.ah);
|
||||
End;
|
||||
|
||||
Procedure EMS_ZuordnungEntsichern(Handle : EMS_Handle);
|
||||
Begin
|
||||
cpu.ah := $48;
|
||||
cpu.dx := Handle;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then EMS_Error := 0 else Fehler(cpu.ah);
|
||||
End;
|
||||
|
||||
Function EMS_HandleAnzahl : Word;
|
||||
Begin
|
||||
cpu.ah := $4B;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then
|
||||
begin
|
||||
EMS_Error := 0;
|
||||
EMS_HandleAnzahl := cpu.bx;
|
||||
end else
|
||||
begin
|
||||
Fehler(cpu.ah);
|
||||
EMS_HandleAnzahl := 0;
|
||||
end;
|
||||
End;
|
||||
|
||||
Function EMS_BelegteSeiten(Handle : EMS_Handle) : Word;
|
||||
Begin
|
||||
cpu.ah := $4C;
|
||||
cpu.dx := Handle;
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then
|
||||
begin
|
||||
EMS_Error := 0;
|
||||
EMS_BelegteSeiten := cpu.bx;
|
||||
end else
|
||||
begin
|
||||
Fehler(0);
|
||||
EMS_BelegteSeiten := 0;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure EMS_AlleHandlesFeststellen(var tab : EMS_AlleHandles);
|
||||
var I : Byte;
|
||||
|
||||
Begin
|
||||
for I := 0 to 255 do
|
||||
begin
|
||||
tab[i].Handle := 0;
|
||||
tab[i].SeitenAnzahl := 0;
|
||||
end;
|
||||
cpu.ah := $4D;
|
||||
cpu.es := Seg(tab);
|
||||
cpu.di := Ofs(tab);
|
||||
Intr($67,cpu);
|
||||
if cpu.ah = 0 then EMS_Error := 0 else Fehler(cpu.ah);
|
||||
End;
|
||||
|
||||
Procedure Init_EMS;
|
||||
Begin
|
||||
EMS_Installiert := get_EMS_Installiert;
|
||||
if EMS_Installiert then
|
||||
begin
|
||||
EMS_Segment := get_EMS_Window;
|
||||
for I := 0 to 3 do EMS_Fenster[I] := EMS_Segment + I*1024;
|
||||
end else EMS_Error := 11;
|
||||
End;
|
||||
|
||||
End.
|
||||
|
1196
XPFILE.PAS
Executable file
1196
XPFILE.PAS
Executable file
File diff suppressed because it is too large
Load Diff
863
XPFRX.PAS
Executable file
863
XPFRX.PAS
Executable file
@ -0,0 +1,863 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P F R X . P A S ³
|
||||
³ ³
|
||||
³ Routinen fuer die Speicherung von Savefiles ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure FileRxMenu (* Kanal : Byte *);
|
||||
Const ArtMax = 5;
|
||||
Var i : Byte;
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
Flag : Boolean;
|
||||
X,Y,
|
||||
Art : Byte;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Moni_Off(0);
|
||||
Flag := false;
|
||||
for i := 9 to 15 do G^.Fstx[i] := 2;
|
||||
G^.Fstr[7] := InfoZeile(329);
|
||||
G^.Fstr[9] := InfoZeile(330);
|
||||
G^.Fstr[10] := InfoZeile(331);
|
||||
G^.Fstr[11] := InfoZeile(332);
|
||||
G^.Fstr[12] := InfoZeile(333);
|
||||
|
||||
case RX_Bin of
|
||||
1 : Art := 1;
|
||||
2 : Art := 2;
|
||||
3,
|
||||
4,
|
||||
5 : Art := 3;
|
||||
else Art := 4;
|
||||
end;
|
||||
|
||||
Repeat
|
||||
for i := 9 to 12 do
|
||||
begin
|
||||
G^.Fstr[i][vM+1] := B1;
|
||||
G^.Fstr[i][hM+1] := B1;
|
||||
G^.Fstr[i][vM] := B1;
|
||||
G^.Fstr[i][hM] := B1;
|
||||
end;
|
||||
|
||||
if Art in [1..4] then
|
||||
begin
|
||||
X := vM;
|
||||
Y := Art + 8;
|
||||
end else
|
||||
begin
|
||||
X := hM;
|
||||
Y := Art + 4;
|
||||
end;
|
||||
G^.Fstr[Y][X] := A_ch;
|
||||
|
||||
if HardCur then SetzeCursor(X+1,Y);
|
||||
|
||||
case RX_Bin of
|
||||
1 : G^.Fstr[9][vM+1] := X_ch;
|
||||
2 : G^.Fstr[10][vM+1] := X_ch;
|
||||
3,
|
||||
4 : G^.Fstr[11][vM+1] := 'x';
|
||||
5 : G^.Fstr[11][vM+1] := X_ch;
|
||||
end;
|
||||
|
||||
if Save then G^.Fstr[12][vM+1] := X_ch;
|
||||
|
||||
G^.Fstr[13] := '';
|
||||
G^.Fstr[14] := '';
|
||||
G^.Fstr[15] := '';
|
||||
Fenster(15);
|
||||
|
||||
_ReadKey(KC,VC);
|
||||
Case KC of
|
||||
_Esc : Flag := true;
|
||||
|
||||
_Ret : ;
|
||||
|
||||
_F1 : Art := 1;
|
||||
_F2 : Art := 2;
|
||||
_F3 : Art := 3;
|
||||
_F4 : Art := 4;
|
||||
_F5 : Art := 5;
|
||||
_F6,
|
||||
_F7,
|
||||
_F8,
|
||||
_F9,
|
||||
_F10 : Alarm;
|
||||
|
||||
_Up : if Art > 1 then dec(Art)
|
||||
else Alarm;
|
||||
|
||||
_Dn : if Art < ArtMax then inc(Art)
|
||||
else Alarm;
|
||||
|
||||
_Right : if Art < ArtMax then
|
||||
begin
|
||||
Art := Art + 4;
|
||||
if Art > ArtMax then Art := ArtMax;
|
||||
end else Alarm;
|
||||
|
||||
_Left : if Art > 1 then
|
||||
begin
|
||||
if Art <= 4 then Art := 1
|
||||
else Art := Art - 4;
|
||||
end else Alarm;
|
||||
|
||||
_AltH : XP_Help(G^.OHelp[21]);
|
||||
|
||||
else Alarm;
|
||||
End;
|
||||
|
||||
if KC in [_F1.._F5,_Ret] then
|
||||
case Art of
|
||||
1,
|
||||
2,
|
||||
3 : begin
|
||||
case Art of
|
||||
1 : G^.Fstr[9][vM] := S_ch;
|
||||
2 : G^.Fstr[10][vM] := S_ch;
|
||||
3 : G^.Fstr[11][vM] := S_ch;
|
||||
end;
|
||||
Fenster(15);
|
||||
Datei_Empfangen(Kanal,Art);
|
||||
if RX_Bin > 0 then Flag := true;
|
||||
end;
|
||||
|
||||
4 : begin
|
||||
G^.Fstr[12][vM] := S_ch;
|
||||
SaveFile(Kanal);
|
||||
if Save then Flag := true;
|
||||
end;
|
||||
|
||||
5 : Kill_Save_File(Kanal);
|
||||
end;
|
||||
|
||||
SetzeFlags(Kanal);
|
||||
Until Flag;
|
||||
ClrFenster;
|
||||
Neu_Bild;
|
||||
Moni_On;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Datei_Empfangen (* Kanal : Byte; Art : Byte *);
|
||||
Var Flag,
|
||||
Fehler : Boolean;
|
||||
l,
|
||||
Size : LongInt;
|
||||
KC : Sondertaste;
|
||||
SizeStr : String[10];
|
||||
Hstr : String[60];
|
||||
i : Byte;
|
||||
Begin
|
||||
if Kanal > 0 then with K[Kanal]^ do
|
||||
begin
|
||||
if RX_Save then
|
||||
begin
|
||||
Size := FilePos(RXFile);
|
||||
CloseRxFile(Kanal,1);
|
||||
if Size < 1 then FiResult := EraseBin(RXFile);
|
||||
RemoteSave := false;
|
||||
Ignore := false;
|
||||
RX_Save := false;
|
||||
RX_Bin := 0;
|
||||
AutoBinOn := AutoBin;
|
||||
BoxZaehl:=5;
|
||||
end else
|
||||
begin
|
||||
if RX_Bin = 0 then
|
||||
begin
|
||||
Fehler := false;
|
||||
Flag := false;
|
||||
Remotesave := false;
|
||||
RX_Bin := Art;
|
||||
G^.Fstr[14]:=InfoZeile(204);
|
||||
Fenster(15);
|
||||
|
||||
GetString(FRxName,Attrib[3],60,2,15,KC,1,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
FRxName := SvFRxCheck(Kanal,FRxName,TxtName);
|
||||
|
||||
if not PfadOk(1,FRxName) then
|
||||
begin
|
||||
Hstr := FRxName;
|
||||
While Hstr[length(Hstr)] <> BS do delete(Hstr,length(Hstr),1);
|
||||
Flag := MkSub(Hstr) and PfadOk(1,FRxName);
|
||||
end else Flag := true;
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
if RX_Bin = 1 then (* Textfile *)
|
||||
begin
|
||||
if OpenTextFile(Kanal) then
|
||||
begin
|
||||
RX_Count := 0;
|
||||
RX_Laenge := 0;
|
||||
RX_TextZn := 0;
|
||||
RX_Time := Uhrzeit;
|
||||
RX_Save := true;
|
||||
end else Fehler := true;
|
||||
end else
|
||||
|
||||
if RX_Bin = 2 then (* Bin„r *)
|
||||
begin
|
||||
Assign(RXFile,FRxName);
|
||||
if ResetBin(RxFile,T) = 0 then
|
||||
begin (* File vorhanden !!! *)
|
||||
SizeStr := int_str(FileSize(RXFile));
|
||||
G^.Fstr[14] := FRxName + B1 + InfoZeile(156);
|
||||
G^.Fstr[15] := InfoZeile(286) + B1+ FormByte(SizeStr) + B3 + InfoZeile(287);
|
||||
Size := FileSize(RXFile);
|
||||
if Size mod 1000 < 300 then Size := Size - 1000;
|
||||
if Size < 0 then Size := 0;
|
||||
SizeStr := int_str((Size div 1000) * 1000);
|
||||
Fenster(15);
|
||||
Alarm;
|
||||
GetString(SizeStr,Attrib[3],10,length(G^.Fstr[15])+3,15,KC,3,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
Size := str_int(SizeStr);
|
||||
if Size < 0 then Size := 0;
|
||||
if Size < FileSize(RXFile) then
|
||||
begin
|
||||
Seek(RXFile,Size);
|
||||
Truncate(RXFile);
|
||||
if Size > 0 then
|
||||
begin
|
||||
VorWrite[Kanal]^[stV] := VorWrite[Kanal]^[stV] + B1 + SizeStr;
|
||||
Chr_Vor_Show(Kanal,_End,#255);
|
||||
end;
|
||||
end;
|
||||
RX_CRC := 0;
|
||||
RX_Count := 0;
|
||||
RX_Laenge := 0;
|
||||
RX_Save := true;
|
||||
end else
|
||||
begin
|
||||
FiResult := CloseBin(RXFile);
|
||||
RX_Bin := 0;
|
||||
end;
|
||||
end else
|
||||
begin (* alles klar, File ist nicht da *)
|
||||
if RewriteBin(RXFile,T) = 0 then
|
||||
begin
|
||||
RX_CRC := 0;
|
||||
RX_Count := 0;
|
||||
RX_Laenge := 0;
|
||||
RX_Save := true;
|
||||
end else Fehler := true;
|
||||
end;
|
||||
end else
|
||||
|
||||
if RX_Bin = 3 then (* Auto-Bin„r *)
|
||||
begin
|
||||
if Exists(FRxName) then
|
||||
begin (* File vorhanden !!! *)
|
||||
Assign(RXFile,FRxName);
|
||||
FiResult := ResetBin(RxFile,T);
|
||||
Size := FileSize(RXFile);
|
||||
FiResult := CloseBin(RxFile);
|
||||
l := Size;
|
||||
SizeStr := int_str(l);
|
||||
G^.Fstr[14] := FRxName + B1 + InfoZeile(156);
|
||||
G^.Fstr[15] := InfoZeile(286) + B1+ FormByte(SizeStr) + B3 + InfoZeile(287);
|
||||
if l mod 1000 < 300 then l := l - 1000;
|
||||
if l < 0 then l := 0;
|
||||
SizeStr := int_str((l div 1000) * 1000);
|
||||
Fenster(15);
|
||||
Alarm;
|
||||
GetString(SizeStr,Attrib[3],10,length(G^.Fstr[15])+3,15,KC,3,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
l := str_int(SizeStr);
|
||||
if l < 0 then l := 0;
|
||||
if l < Size then
|
||||
begin
|
||||
RX_Count := l;
|
||||
if l > 0 then
|
||||
begin
|
||||
VorWrite[Kanal]^[stV] := VorWrite[Kanal]^[stV] + B1 + SizeStr;
|
||||
Chr_Vor_Show(Kanal,_End,#255);
|
||||
end;
|
||||
end else RX_Count := Size;
|
||||
end else RX_Bin := 0;
|
||||
end else AutoBinOn := true; (* alles klar, File ist nicht da *)
|
||||
end else RX_Bin := 0;
|
||||
end else Fehler := true;
|
||||
end else RX_Bin := 0;
|
||||
|
||||
if Fehler then
|
||||
begin
|
||||
RX_Bin := 0;
|
||||
Alarm;
|
||||
G^.Fstr[15] := FRxName + B2 + InfoZeile(75) + B2 + InfoZeile(78);
|
||||
Fenster(15);
|
||||
SetzeCursor(length(G^.Fstr[15])+2,15);
|
||||
Warten;
|
||||
end;
|
||||
Cursor_aus;
|
||||
end else RX_Bin := 0;
|
||||
end;
|
||||
end else Alarm;
|
||||
End;
|
||||
|
||||
|
||||
Function OpenTextFile (* Kanal : Byte) : Boolean *);
|
||||
Var Result : Word;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Assign(RXFile,FRxName);
|
||||
Result := ResetBin(RxFile,T);
|
||||
if Result = 0 then Seek(RXFile,FileSize(RXFile))
|
||||
else Result := RewriteBin(RxFile,T);
|
||||
OpenTextFile := Result = 0;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure OpenBinFile (* Kanal : Byte; Zeile : Str80 *);
|
||||
Var i, ier : Byte;
|
||||
Free : LongInt;
|
||||
XFsize:longint;
|
||||
xfile : file of byte;
|
||||
FlagPkt:Boolean;
|
||||
Schnibbel:string[10];
|
||||
|
||||
Function NewName(Kanal,Art : Byte; NStr : Str12) : Str25;
|
||||
var i : Byte;
|
||||
Ext : String[4];
|
||||
Sstr : String[8];
|
||||
Hstr : String[12];
|
||||
Flag : Boolean;
|
||||
|
||||
begin
|
||||
Hstr := K[Kanal]^.Call;
|
||||
Strip(Hstr);
|
||||
i := 0;
|
||||
|
||||
if Art = 0 then
|
||||
begin
|
||||
Repeat
|
||||
inc(i);
|
||||
Sstr := int_str(i) + Hstr;
|
||||
Flag := not Exists(Konfig.BinVerz + Sstr + BS + Nstr);
|
||||
Until Flag or (i > 250);
|
||||
if Flag then
|
||||
begin
|
||||
if MkSub(Konfig.BinVerz + Sstr) then NewName := Sstr + BS + Nstr;
|
||||
end else
|
||||
begin
|
||||
Ext := Pkt + ParmStr(2,Pkt,Nstr);
|
||||
Repeat
|
||||
inc(i);
|
||||
Until not Exists(Konfig.BinVerz + Hstr + SFillStr(2,'0',int_str(i)) + Ext);
|
||||
NewName := Hstr + SFillStr(2,'0',int_str(i)) + Ext;
|
||||
end;
|
||||
end;
|
||||
|
||||
if Art = 1 then
|
||||
begin
|
||||
Repeat
|
||||
inc(i);
|
||||
Ext := Pkt + SFillStr(3,'0',int_str(i));
|
||||
Until not Exists(Konfig.BinVerz + Hstr + Ext);
|
||||
NewName := Hstr + Ext;
|
||||
end;
|
||||
end;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
KillEndBlanks(Zeile);
|
||||
Zeile := UpCaseStr(Zeile);
|
||||
|
||||
{ #BIN#818#|32501#$1AC785A4#A:\TREMEX\VIRUS.TXT }
|
||||
{ #BIN#205453#|55561#$1EB98723?#fpac391.Lzh }
|
||||
|
||||
if not (XBIN.An) then delete(Zeile,1,5) else delete(Zeile,1,6);
|
||||
|
||||
i := pos('#',Zeile);
|
||||
if i = 0 then i := length(Zeile)
|
||||
else dec(i);
|
||||
if i > 0 then RX_Laenge := LongInt(str_int(copy(Zeile,1,i)))
|
||||
else RX_Laenge := 0;
|
||||
|
||||
if RX_laenge > 0 then
|
||||
begin
|
||||
Free := DiskFree(ord(FRxName[1])-64);
|
||||
if (Free + FFFF) > RX_Laenge then
|
||||
begin
|
||||
if pos(Pipe,Zeile) > 0 then
|
||||
begin
|
||||
delete(Zeile,1,pos(Pipe,Zeile));
|
||||
i := pos(LZ,Zeile);
|
||||
if i > 0 then
|
||||
begin
|
||||
RX_Soll_CRC := Word(str_int(copy(Zeile,1,i-1)));
|
||||
delete(Zeile,1,i);
|
||||
end else RX_Soll_CRC := 0;
|
||||
end else RX_Soll_CRC := 0;
|
||||
|
||||
if (pos('$',Zeile) = 1) and (pos(LZ,Zeile) in [10,11]) then
|
||||
begin
|
||||
RX_Date := str_int(copy(Zeile,1,9));
|
||||
delete(Zeile,1,pos(LZ,Zeile));
|
||||
end else RX_Date := 0;
|
||||
xfsize:=0;
|
||||
if RX_Bin = 0 then
|
||||
begin
|
||||
While pos(DP,Zeile) > 0 do delete(Zeile,1,pos(DP,Zeile));
|
||||
While pos(BS,Zeile) > 0 do delete(Zeile,1,pos(BS,Zeile));
|
||||
|
||||
{**Check f<>r <20>berl„nge}
|
||||
flagpkt:=false;
|
||||
if pos(Pkt,Zeile) = 0 then
|
||||
begin
|
||||
Zeile := Zeile + Pkt;
|
||||
flagpkt:=true;
|
||||
end;
|
||||
|
||||
if pos(Pkt, Zeile)>9 then
|
||||
begin
|
||||
Zeile[7]:='~';
|
||||
ier:=0;
|
||||
repeat
|
||||
inc(ier);
|
||||
Schnibbel:=int_str(ier);
|
||||
Zeile[8]:=Schnibbel[1];
|
||||
until (not Exists(Konfig.BinVerz + Zeile)) or (ier>8);
|
||||
repeat
|
||||
delete(Zeile,9,1);
|
||||
until Zeile[9]='.';
|
||||
end; {>9}
|
||||
|
||||
if (length(zeile)-pos(pkt, Zeile))>3 then
|
||||
begin
|
||||
repeat
|
||||
delete(Zeile, length(zeile), 1);
|
||||
until (length(zeile)-pos(pkt, Zeile))<=3;
|
||||
end;
|
||||
if FlagPkt then delete(Zeile, length(zeile), 1);
|
||||
FlagPkt:=false;
|
||||
{**Check f<>r <20>berl„nge Ende}
|
||||
|
||||
if SaveNameCheck(0,Zeile) then
|
||||
begin
|
||||
if pos(Pkt,Zeile) > 0 then
|
||||
begin
|
||||
if Exists(Konfig.BinVerz + Zeile) then
|
||||
begin
|
||||
if xbin.an then
|
||||
begin
|
||||
assign(xfile, Konfig.BinVerz+Zeile);
|
||||
reset(XFile);
|
||||
xfsize:=filesize(XFile);
|
||||
if (rx_laenge>xfsize) and (xFsize>1999) then
|
||||
begin
|
||||
xfsize:=xfsize-1000
|
||||
end else xfsize:=0;
|
||||
close(XFile);
|
||||
end;
|
||||
if (not xbin.an) or (xfsize=0) then Zeile := NewName(Kanal,0,Zeile);
|
||||
end;
|
||||
end else Zeile := NewName(Kanal,1,Zeile);
|
||||
end else Zeile := NewName(Kanal,1,Zeile);
|
||||
FRxName := Konfig.BinVerz + Zeile;
|
||||
end;
|
||||
|
||||
Assign(RXFile,FRxName);
|
||||
|
||||
if RX_Bin = 0 then
|
||||
begin
|
||||
RemoteSave := true;
|
||||
if (not XBin.An) or (XFsize=0) then FiResult := RewriteBin(RXFile,T);
|
||||
end;
|
||||
|
||||
if RX_Bin = 3 then
|
||||
begin
|
||||
FiResult := ResetBin(RXFile,T);
|
||||
if FiResult = 0 then
|
||||
begin
|
||||
Seek(RXFile,RX_Count);
|
||||
Truncate(RXFile);
|
||||
end else FiResult := RewriteBin(RXFile,T);
|
||||
end;
|
||||
|
||||
if RX_Bin = 4 then
|
||||
begin
|
||||
RemoteSave := true;
|
||||
FiResult := RewriteBin(RXFile,T);
|
||||
end;
|
||||
|
||||
if FiResult = 0 then
|
||||
begin
|
||||
if not FileSend then
|
||||
begin
|
||||
if (not xbin.an) or ((xbin.an) and (xfsize=0)) then
|
||||
begin
|
||||
S_PAC(Kanal,NU,true,Meldung[9] + M1); { #OK# }
|
||||
InfoOut(Kanal,0,1,Meldung[9]);
|
||||
XBin.FrameNr:=0;
|
||||
end;
|
||||
|
||||
if (xbin.an) and (xfsize>0) then
|
||||
begin
|
||||
XBin.FrameNr:=0;
|
||||
S_PAC(Kanal,NU,true,Meldung[9] + int_str(xFsize)+ M1);
|
||||
reset(RXFile, T);
|
||||
Seek(RXFile,xfsize);
|
||||
Truncate(RXFile);
|
||||
InfoOut(Kanal,0,1,Meldung[9]+Int_Str(XFsize));
|
||||
rx_Count:=xfsize;
|
||||
end;
|
||||
|
||||
if xbin.an then xbin.rx:=true;
|
||||
end;
|
||||
if not xbin.rx then
|
||||
begin
|
||||
RX_Save := true;
|
||||
Ignore := true;
|
||||
end;
|
||||
xbin.rtxOK:=true;
|
||||
RX_Time := Uhrzeit;
|
||||
RX_Count := 0;
|
||||
RX_TextZn := 0;
|
||||
RX_CRC := 0;
|
||||
if not XBin.An then RX_Bin := 5 else XBin.RX:=true;
|
||||
end else
|
||||
begin
|
||||
S_Aus(Kanal,3,M1 + Meldung[10] + M1); { #ABORT# }
|
||||
S_PAC(Kanal,NU,true,'');
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
RX_Bin := 0;
|
||||
RemoteSave := false;
|
||||
Ignore := false;
|
||||
S_Aus(Kanal,3,M1 + Meldung[10] + M1); { #ABORT# }
|
||||
S_PAC(Kanal,NU,true,'');
|
||||
SetzeFlags(Kanal);
|
||||
end;
|
||||
end;
|
||||
if xbin.an then rx_bin:=0;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Write_RxFile (* Kanal : Byte; Zeile : String *);
|
||||
Var i,i1 : Integer;
|
||||
Free : LongInt;
|
||||
DatPos:longint;
|
||||
Result : Word;
|
||||
Hstr : String[80];
|
||||
VC : Char;
|
||||
Bstr : String;
|
||||
XBinRX : string;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
Begin
|
||||
case RX_Bin of
|
||||
|
||||
1 : begin (* normales Textfile *)
|
||||
if RemoteSave and (MldOk in [16,17]) then
|
||||
begin
|
||||
CloseRxFile(Kanal,0);
|
||||
RX_Save := false;
|
||||
BoxZaehl:=5;
|
||||
RX_Bin := 0;
|
||||
RemoteSave := false;
|
||||
If Not FWD then
|
||||
S_Aus(Kanal,3,M1 + InfoZeile(117) + B1 +
|
||||
int_Str(RX_TextZn) + B1 + InfoZeile(118)+ M1);
|
||||
if MsgToMe then
|
||||
begin
|
||||
MsgToMe := false;
|
||||
Eig_Mail_Zeile := '';
|
||||
Check_Eig_Mail(1,maxLink);
|
||||
if Eig_Mail_Zeile > '' then
|
||||
begin
|
||||
InfoOut(show,0,1,InfoZeile(153) + Eig_Mail_Zeile);
|
||||
If Klingel then Triller;
|
||||
end;
|
||||
end;
|
||||
Ignore := false;
|
||||
SetzeFlags(Kanal);
|
||||
Send_Prompt(Kanal,FF);
|
||||
end else
|
||||
if RemoteSave and (MldOk = 10) then
|
||||
begin
|
||||
CloseRxFile(Kanal,0);
|
||||
RX_Save := false;
|
||||
BoxZaehl:=5;
|
||||
RX_Bin := 0;
|
||||
RemoteSave := false;
|
||||
Ignore := false;
|
||||
if EraseBin(RXFile) = 0
|
||||
then S_Aus(Kanal,3,M1 + Star + InfoZeile(41) + M1);
|
||||
SetzeFlags(Kanal);
|
||||
Send_Prompt(Kanal,FF);
|
||||
end else
|
||||
begin
|
||||
RX_Count := RX_Count + length(Zeile);
|
||||
Zeile := Line_Convert(Kanal,2,Zeile);
|
||||
Bstr := '';
|
||||
for i := 1 to length(Zeile) do
|
||||
Begin
|
||||
VC := Zeile[i];
|
||||
case VC of
|
||||
^I : Bstr := Bstr + VC;
|
||||
M1 : begin
|
||||
Bstr := Bstr + #13 + #10;
|
||||
inc(RX_TextZn);
|
||||
end;
|
||||
|
||||
#1..#31
|
||||
: Bstr := Bstr + '^' + chr(ord(VC)+64);
|
||||
|
||||
^Z :;
|
||||
#0 :;
|
||||
#127:;
|
||||
|
||||
else Bstr := Bstr + VC;
|
||||
end;
|
||||
|
||||
if (length(Bstr) > 250) or (i = length(Zeile)) then
|
||||
begin
|
||||
BlockWrite(RXFile,Bstr[1],length(Bstr),Result);
|
||||
Bstr := '';
|
||||
end;
|
||||
End;
|
||||
|
||||
FileInfo(Kanal,0,0,RX_Count,0,0);
|
||||
end;
|
||||
end;
|
||||
|
||||
2 : begin (* normales Bin„rfile-Empfangen *)
|
||||
BlockWrite(RXFile,Zeile[1],length(Zeile),Result);
|
||||
RX_Count := RX_Count + length(Zeile);
|
||||
FileInfo(Kanal,0,0,RX_Count,0,0);
|
||||
end;
|
||||
|
||||
5 : begin (* Automatischer Bin„rfile-Empfang *)
|
||||
if MldOk in [5,6,10] then
|
||||
begin
|
||||
if MldOk = 10 then
|
||||
begin
|
||||
FiResult := CloseBin(RxFile);
|
||||
FiResult := EraseBin(RxFile);
|
||||
S_PAC(Kanal,NU,false,InfoZeile(41) + M1);
|
||||
Send_Prompt(Kanal,FF);
|
||||
end else CloseRxFile(Kanal,1);
|
||||
RX_Bin := 0;
|
||||
RX_Save := false;
|
||||
BoxZaehl:=5;
|
||||
Remotesave := false;
|
||||
Ignore := false;
|
||||
AutoBinOn := AutoBin;
|
||||
SetzeFlags(Kanal);
|
||||
end else
|
||||
begin
|
||||
if xbin.an then
|
||||
begin
|
||||
if length(zeile)>8 then
|
||||
begin
|
||||
XBinRX := copy (Zeile, 1, 8);
|
||||
delete (Zeile,1,8);
|
||||
end else
|
||||
begin
|
||||
XBinRX := Zeile;
|
||||
zeile:='';
|
||||
end;
|
||||
DatPos:=filePos(RXFile);
|
||||
XBinCHECK(Kanal, XBinRX, DatPos, Zeile);
|
||||
end;
|
||||
i1 := length(Zeile);
|
||||
if (RX_Count + i1) > RX_Laenge then i1 := Byte(RX_Laenge - RX_Count);
|
||||
BlockWrite(RXFile,Zeile[1],i1,Result);
|
||||
RX_CRC := Compute_CRC(RX_CRC,copy(Zeile,1,Result));
|
||||
RX_Count := RX_Count + i1;
|
||||
FileInfo(Kanal,0,RX_Laenge,RX_Count,0,0);
|
||||
|
||||
if RX_Count >= RX_Laenge then
|
||||
begin
|
||||
CloseRxFile(Kanal,0);
|
||||
Result := Word(RX_CRC);
|
||||
RX_Save := false;
|
||||
BoxZaehl:=5;
|
||||
RX_Bin := 0;
|
||||
AutoBinOn := AutoBin;
|
||||
Ignore := false;
|
||||
SetzeFlags(Kanal);
|
||||
|
||||
Hstr := Time_Differenz(RX_Time,Uhrzeit);
|
||||
Zeile := FName_aus_FVar(RxFile);
|
||||
While pos(BS,Zeile) > 0 do delete(Zeile,1,pos(BS,Zeile));
|
||||
|
||||
{ Zeile := M1 + B1 + InfoZeile(103) + B1 + }
|
||||
Zeile := B1 + InfoZeile(103) + B1 + {//db1ras}
|
||||
EFillStr(14,B1,Zeile) + InfoZeile(100) +
|
||||
int_str(Result) + B2 + LRK + Hex(Result,4) + B1 +
|
||||
BdStr + FileBaud(Hstr,int_str(RX_Count)) + B2 +
|
||||
LRK + Hstr + RRK + M1;
|
||||
|
||||
if (RX_Soll_CRC > 0) and (Result <> RX_Soll_CRC)
|
||||
then Zeile := Zeile + B1 + InfoZeile(113) + ^G + M1;
|
||||
{ Zeile := Zeile + M1; }
|
||||
|
||||
{//db1ras}
|
||||
if SysArt in [0,17,21] then begin {XP, PROFI}
|
||||
S_PAC(Kanal,NU,false,Zeile);
|
||||
Send_Prompt(Kanal,FF);
|
||||
end else if SysArt = 3 then {FBB}
|
||||
S_PAC(Kanal,NU,true,M1);
|
||||
|
||||
Remotesave := false;
|
||||
if RxComp then MeldeCompZ := ''
|
||||
else MeldeZeile := '';
|
||||
DZeile := Zeile;
|
||||
WeFlag := true;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end; (* case RX_Bin of ... *)
|
||||
End; (* with ... do *)
|
||||
End;
|
||||
|
||||
|
||||
Procedure CloseRxFile (* Kanal,Art : Byte *);
|
||||
Var dt : DateTime;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if ((RX_Bin = 5) or (Xbin.An)) and (RX_Date > 0) then
|
||||
begin
|
||||
if Art = 1 then
|
||||
begin
|
||||
UnpackTime(RX_Date,dt);
|
||||
dt.Year := dt.Year + 50;
|
||||
PackTime(dt,RX_Date);
|
||||
end;
|
||||
SetFTime(RxFile,RX_Date);
|
||||
end;
|
||||
FiResult := CloseBin(RxFile);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure SaveFile (* Kanal : Byte *);
|
||||
var Result : Word;
|
||||
Hstr : String[60];
|
||||
KC : Sondertaste;
|
||||
Flag : Boolean;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if Save then
|
||||
begin
|
||||
Save := false;
|
||||
FiResult := CloseBin(SFile);
|
||||
end else
|
||||
begin
|
||||
Flag := false;
|
||||
Fenster(15);
|
||||
GetString(SvName,Attrib[3],60,2,15,KC,1,Ins);
|
||||
svname:=upcasestr(SvName);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
SvName := SvFRxCheck(Kanal,SvName,SaveName);
|
||||
|
||||
if not PfadOk(1,SvName) then
|
||||
begin
|
||||
Hstr := SvName;
|
||||
While Hstr[length(Hstr)] <> BS do delete(Hstr,length(Hstr),1);
|
||||
Flag := MkSub(Hstr) and PfadOk(1,SvName);
|
||||
end else Flag := true;
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
Assign(SFile,SvName);
|
||||
Result := ResetBin(SFile,T);
|
||||
If Result = 0 then Seek(SFile,FileSize(SFile))
|
||||
else if Result = 2 then Result := RewriteBin(SFile,T);
|
||||
if Result in [0,2] then Save := true;
|
||||
end;
|
||||
|
||||
if not Save then
|
||||
begin
|
||||
Alarm;
|
||||
G^.Fstr[15] := InfoZeile(295) + B2 + InfoZeile(78);
|
||||
Fenster(15);
|
||||
SetzeCursor(length(G^.Fstr[15])+2,15);
|
||||
Warten;
|
||||
Cursor_aus;
|
||||
end else SvLRet := true;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Write_SFile (* Kanal : Byte; Zeile : String *);
|
||||
Var i : Byte;
|
||||
Result : Word;
|
||||
VC : Char;
|
||||
Flag : Boolean;
|
||||
Hstr : String;
|
||||
|
||||
Begin
|
||||
Flag := K[Kanal]^.EigFlag or K[Kanal]^.FileFlag or K[Kanal]^.RemFlag;
|
||||
|
||||
Zeile := Line_Convert(Kanal,2,Zeile);
|
||||
Hstr := '';
|
||||
for i := 1 to length(Zeile) do
|
||||
Begin
|
||||
VC := Zeile[i];
|
||||
|
||||
if Flag and (Kanal > 0) and K[Kanal]^.SvLRet then Hstr := Hstr + EchoCh + B1;
|
||||
K[Kanal]^.SvLRet := false;
|
||||
|
||||
case VC of
|
||||
^I : Hstr := Hstr + VC;
|
||||
^J : if Kanal = 0 then Hstr := Hstr + #13 + #10;
|
||||
M1 : begin
|
||||
if (Kanal = 0) and ZeigeRET then Hstr := Hstr + '^' + chr(ord(^J)+64);
|
||||
Hstr := Hstr + #13 + #10;
|
||||
K[Kanal]^.SvLRet := true;
|
||||
end;
|
||||
^Z :;
|
||||
#0 :;
|
||||
#127:;
|
||||
#1..#31
|
||||
: Hstr := Hstr + '^' + chr(ord(VC)+64)
|
||||
else Hstr := Hstr + VC;
|
||||
end;
|
||||
|
||||
if (length(Hstr) > 250) or (i = length(Zeile)) then
|
||||
begin
|
||||
BlockWrite(K[Kanal]^.SFile,Hstr[1],length(Hstr),Result);
|
||||
Hstr := '';
|
||||
end;
|
||||
End;
|
||||
End;
|
||||
|
||||
|
||||
Function SvFRxCheck (* Kanal : Byte; Zeile : Str60; Name : Str12) : Str60 *);
|
||||
Begin
|
||||
if (Zeile = '') or (Zeile[length(Zeile)] = BS) or not SaveNameCheck(1,Zeile)
|
||||
then Zeile := Konfig.SavVerz + Name + SFillStr(3,'0',int_str(Kanal));
|
||||
if pos(Pkt,Zeile) = 0 then Zeile := Zeile + Pkt + SFillStr(3,'0',int_str(Kanal));
|
||||
if pos(DP,Zeile) = 0 then Zeile := Konfig.SavVerz + Zeile;
|
||||
SvFRxCheck := Zeile;
|
||||
End;
|
735
XPFTX.PAS
Executable file
735
XPFTX.PAS
Executable file
@ -0,0 +1,735 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P T R X . P A S ³
|
||||
³ ³
|
||||
³ Routinen fuer die Aussendung von Files ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure FileTxMenu (* Kanal : Byte *);
|
||||
Const ArtMax = 8;
|
||||
Var i : Byte;
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
Fehler,
|
||||
Flag : Boolean;
|
||||
X,Y,
|
||||
Art : Byte;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if node then Wishbuf:=false;
|
||||
Moni_Off(0);
|
||||
Flag := false;
|
||||
for i := 9 to 15 do G^.Fstx[i] := 2;
|
||||
G^.Fstr[7] := InfoZeile(334);
|
||||
G^.Fstr[9] := InfoZeile(335);
|
||||
G^.Fstr[10] := InfoZeile(336);
|
||||
G^.Fstr[11] := InfoZeile(337);
|
||||
G^.Fstr[12] := InfoZeile(338);
|
||||
G^.FStr[13] := InfoZeile(339);
|
||||
|
||||
if FileSendWait then Art := 5 else
|
||||
begin
|
||||
if FileSend then
|
||||
begin
|
||||
case TX_Bin of
|
||||
0 : Art := 1;
|
||||
1 : Art := 2;
|
||||
2,
|
||||
3 : Art := 3;
|
||||
end;
|
||||
if XBin.TX then Art:=5;
|
||||
end else
|
||||
if TNC_Puffer then Art := 6 else
|
||||
if WishBuf then Art := 7
|
||||
else Art := 1;
|
||||
end;
|
||||
Repeat
|
||||
for i := 9 to 13 do
|
||||
begin
|
||||
G^.Fstr[i][vM+1] := B1;
|
||||
G^.Fstr[i][hM+1] := B1;
|
||||
G^.Fstr[i][vM] := B1;
|
||||
G^.Fstr[i][hM] := B1;
|
||||
end;
|
||||
|
||||
if Art in [1..5] then
|
||||
begin
|
||||
X := vM;
|
||||
Y := Art + 8;
|
||||
end else
|
||||
begin
|
||||
X := hM;
|
||||
Y := Art + 4;
|
||||
end;
|
||||
|
||||
{ if Art= 9 then
|
||||
begin
|
||||
x:=vm;
|
||||
y:=art+8;
|
||||
end;}
|
||||
|
||||
G^.Fstr[Y][X] := A_ch;
|
||||
|
||||
if HardCur then SetzeCursor(X+1,Y);
|
||||
|
||||
if FileSend then
|
||||
begin
|
||||
case TX_Bin of
|
||||
0 : G^.Fstr[9][vM+1] := X_ch;
|
||||
1 : G^.Fstr[10][vM+1] := X_ch;
|
||||
2 : G^.Fstr[11][vM+1] := 'x';
|
||||
3 : G^.Fstr[11][vM+1] := X_ch;
|
||||
end;
|
||||
end;
|
||||
|
||||
if FileSendWait then G^.Fstr[9][hM+1] := X_ch;
|
||||
if TNC_Puffer then G^.Fstr[10][hM+1] := X_ch;
|
||||
if WishBuf then G^.Fstr[11][hM+1] := X_ch;
|
||||
if BufExists then G^.Fstr[12][hM+1] := X_ch;
|
||||
{if XBin.AN then G^.FSTR[13]:='XBIN AN ' else G^.Fstr[13]:='XBIN Aus';}
|
||||
|
||||
{G^.Fstr[13] := '';}
|
||||
G^.Fstr[14] := '';
|
||||
G^.Fstr[15] := '';
|
||||
Fenster(15);
|
||||
|
||||
_ReadKey(KC,VC);
|
||||
Case KC of
|
||||
_Esc : Flag := true;
|
||||
|
||||
_AltH : XP_Help(G^.OHelp[22]);
|
||||
|
||||
_Ret : ;
|
||||
|
||||
_F1 : Art := 1; {text}
|
||||
_F2 : Art := 2; {bin}
|
||||
_F3 : Art := 3; {autobin}
|
||||
_F4 : Art := 4; {autobin sof}
|
||||
_F5 : Art := 5; {xbin}
|
||||
_F6 : Art := 6; {ftx anhalten}
|
||||
_F7 : Art := 7; {tnc-puffer}
|
||||
_F8 : Art := 8; {ZWP anlegen}
|
||||
_F9 : Art := 9; {ZWP l”schen}
|
||||
_F10 : Alarm;
|
||||
|
||||
_Up : if Art > 1 then dec(Art)
|
||||
else Alarm;
|
||||
|
||||
_Dn : if Art < ArtMax then inc(Art)
|
||||
else Alarm;
|
||||
|
||||
_Right : if Art < ArtMax then
|
||||
begin
|
||||
Art := Art + 4;
|
||||
if Art > ArtMax then Art := ArtMax;
|
||||
end else Alarm;
|
||||
|
||||
_Left : if Art > 1 then
|
||||
begin
|
||||
if Art <= 4 then Art := 1
|
||||
else Art := Art - 4;
|
||||
end else Alarm;
|
||||
|
||||
else Alarm;
|
||||
End;
|
||||
|
||||
if KC in [_F1.._F9,_Ret] then
|
||||
case Art of
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5 : begin
|
||||
if Art=5 then XBin.AN:=true;
|
||||
if (not FileSend) and (not SPlSave) and (RX_bin=0) then
|
||||
begin
|
||||
case Art of
|
||||
1 : G^.Fstr[9][vM] := S_ch;
|
||||
2 : G^.Fstr[10][vM] := S_ch;
|
||||
3 : G^.Fstr[11][vM] := S_ch;
|
||||
4 : G^.Fstr[12][vM] := S_ch;
|
||||
5 : G^.Fstr[13][vM] := S_ch;
|
||||
end;
|
||||
Fenster(15);
|
||||
if art=5 then art:=3;
|
||||
Datei_Senden(Kanal,Art);
|
||||
if FileSend then
|
||||
begin
|
||||
Flag := true;
|
||||
end else if xbin.an then art:=5;
|
||||
end else Alarm;
|
||||
end;
|
||||
|
||||
6 : if (FileSend) and (not XBin.TX) then
|
||||
begin
|
||||
if (not XBin.TX) then FileSendWait := not FileSendWait
|
||||
else
|
||||
begin
|
||||
xbinWait:=not XBinWait;
|
||||
{if not FileSendWait then
|
||||
begin
|
||||
FileSendWait:=true;
|
||||
end;}
|
||||
end;
|
||||
end
|
||||
else Alarm;
|
||||
|
||||
7 : begin
|
||||
if not TNC_Puffer then
|
||||
begin
|
||||
Fehler:=false;
|
||||
For i:=1 to maxlink do
|
||||
if K[i]^.TNC_Puffer then Fehler:=true;
|
||||
if not fehler then
|
||||
TNC_Puffer := not TNC_Puffer
|
||||
else Alarm;
|
||||
end else TNC_Puffer := not TNC_Puffer;
|
||||
end;
|
||||
|
||||
8 : if not node then WishBuf := not WishBuf else Alarm;
|
||||
|
||||
9 : If BufExists then EraseBufferFile(Kanal);
|
||||
end;
|
||||
|
||||
SetzeFlags(Kanal);
|
||||
Until Flag;
|
||||
|
||||
|
||||
if (filesend) and (XBin.AN) then TNC_Puffer:=false;
|
||||
{bei XBIN-protokoll unbedingt vorzeitiges senden an TNC verbieten,
|
||||
zwecks Pr<50>fsummenerstellung und Framez„hler!!}
|
||||
|
||||
|
||||
ClrFenster;
|
||||
Neu_Bild;
|
||||
Moni_On;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Datei_Senden (* Kanal : Byte; Art : Byte *);
|
||||
Var Hstr : String[80];
|
||||
abByte : Boolean;
|
||||
KC : Sondertaste;
|
||||
Flag : Boolean;
|
||||
Begin
|
||||
if Kanal > 0 then with K[Kanal]^ do
|
||||
begin
|
||||
xbin.rtxok:=true;
|
||||
if FileSend then
|
||||
begin
|
||||
FileSend := false;
|
||||
BoxZaehl:=5;
|
||||
FiResult := CloseBin(TxFile);
|
||||
S_PAC(Kanal,NU,true,'');
|
||||
TNC_Puffer := false;
|
||||
end else
|
||||
begin
|
||||
Flag := false;
|
||||
Case Art of
|
||||
1 : TX_Bin := 0;
|
||||
2 : TX_Bin := 1;
|
||||
3 : TX_Bin := 2;
|
||||
4 : begin
|
||||
TX_Bin := 2;
|
||||
Flag := true;
|
||||
end;
|
||||
End;
|
||||
G^.Fstr[14]:=InfoZeile(204);
|
||||
Fenster(15);
|
||||
GetString(FTxName,Attrib[3],60,2,15,KC,1,Ins);
|
||||
G^.Fstr[14]:='';
|
||||
Fenster(15);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
if pos(B1,FTxName) > 0 then
|
||||
begin
|
||||
Hstr := RestStr(FTxName);
|
||||
FTxName := CutStr(FTxName);
|
||||
abByte := true;
|
||||
end else abByte := false;
|
||||
FTxName := UpCaseStr(FTxName);
|
||||
if pos(DP,FTxName) = 0 then FTxName := Konfig.SavVerz + FTxName;
|
||||
if SaveNameCheck(1,FTxName) then Assign(TxFile,FTxName)
|
||||
else Assign(TxFile,'###***##');
|
||||
if ResetBin(TxFile,T) = 0 then
|
||||
begin (* File vorhanden *)
|
||||
TX_Laenge := FileSize(TxFile);
|
||||
TX_Count := 0;
|
||||
TX_Time := Uhrzeit;
|
||||
if abByte then FileSendVon(Kanal,Hstr);
|
||||
abByte := false;
|
||||
FileSend := true;
|
||||
if TX_Bin = 2 then
|
||||
begin (* Bei Auto-Bin-Send die Filel„nge <20>bertragen *)
|
||||
Hstr := MakeBinStr(Kanal,FTxName);
|
||||
if paclen<30 then paclen:=30;
|
||||
TX_CRC := 0;
|
||||
S_PAC(Kanal,NU,not Flag,Hstr);
|
||||
if Flag then TX_Bin := 3;
|
||||
end;
|
||||
end else
|
||||
begin (* File nicht vorhanden *)
|
||||
Alarm;
|
||||
G^.Fstr[15] := FTxName + B1 + InfoZeile(157) + B2 + InfoZeile(78);
|
||||
Fenster(15);
|
||||
SetzeCursor(length(G^.Fstr[15])+2,15);
|
||||
Warten;
|
||||
Cursor_aus;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end else Alarm;
|
||||
End;
|
||||
|
||||
|
||||
Procedure FileSendVon (* Kanal : Byte; Zeile : Str40 *);
|
||||
Var von,bis : LongInt;
|
||||
Hstr : String[20];
|
||||
|
||||
Function Pos_ZlNr(Kanal : Byte; ZNr : LongInt) : LongInt;
|
||||
Var i,
|
||||
Result : Word;
|
||||
ir,iz : LongInt;
|
||||
Hstr : String;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
iz := 0;
|
||||
ir := 0;
|
||||
Seek(TxFile,0);
|
||||
While not Eof(TxFile) and (ir < ZNr) do
|
||||
begin
|
||||
BlockRead(TxFile,Hstr[1],FF,Result);
|
||||
Hstr[0] := Chr(Result);
|
||||
for i := 1 to Result do
|
||||
begin
|
||||
if ir < ZNr then inc(iz);
|
||||
if Hstr[i] = M1 then inc(ir);
|
||||
end;
|
||||
end;
|
||||
Pos_ZlNr := iz;
|
||||
end;
|
||||
End;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Hstr := CutStr(Zeile);
|
||||
if Hstr > '' then
|
||||
begin
|
||||
if copy(Hstr,1,1) = '$' then
|
||||
begin
|
||||
delete(Hstr,1,1);
|
||||
von := Pos_ZlNr(Kanal,str_int(Hstr)-1);
|
||||
end else von := str_int(Hstr);
|
||||
end else von := 0;
|
||||
|
||||
Hstr := RestStr(Zeile);
|
||||
if Hstr > '' then
|
||||
begin
|
||||
if copy(Hstr,1,1) = '$' then
|
||||
begin
|
||||
delete(Hstr,1,1);
|
||||
bis := Pos_ZlNr(Kanal,str_int(Hstr));
|
||||
end else bis := str_int(Hstr);
|
||||
end else bis := TX_Laenge - 1;
|
||||
|
||||
if (von < 0) or (von >= TX_Laenge) then von := 0;
|
||||
if (bis <= 0) or (bis >= TX_Laenge) or (bis < von) then bis := TX_Laenge - 1;
|
||||
|
||||
TX_Laenge := bis - von + 1;
|
||||
Seek(TxFile,von);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Send_File (* Kanal : Byte; OFlag : Boolean; *);
|
||||
Var Zeile : String;
|
||||
Hstr : String[9];
|
||||
i,l : Byte;
|
||||
ch : Char;
|
||||
FileEnde : Boolean;
|
||||
Result : Word;
|
||||
XBTrans : Boolean;
|
||||
DatPos : longint;
|
||||
Begin
|
||||
|
||||
FileEnde := false;
|
||||
Zeile := '';
|
||||
with K[Kanal]^ do
|
||||
Begin
|
||||
XBTrans:=(XBIN.AN) and (TX_BIN=3);
|
||||
FileFlag := (TX_Bin = 0) and (Echo in [2,3,6,7]);
|
||||
if TX_Bin <> 2 then
|
||||
Begin
|
||||
if TxComp then l := maxCompPac
|
||||
else l := FF;
|
||||
|
||||
if XBTrans then l:=paclen-8;
|
||||
if xbtrans and txcomp then l:=paclen-10;
|
||||
if xbtrans then DatPos:=filepos(TXFile);
|
||||
BlockRead(TxFile,Zeile[1],l,Result);
|
||||
if (TX_Count + Result) > TX_Laenge then Result := TX_Laenge - TX_Count;
|
||||
|
||||
Zeile[0] := chr(Byte(Result));
|
||||
if XBTRANS then Zeile:=XBinStr(Kanal, Zeile, DatPos)+Zeile;
|
||||
|
||||
{if XBTrans then Zeile[0] := chr(Byte(Result+7));}
|
||||
|
||||
TX_Count := TX_Count + Result;
|
||||
IF (TX_Count >= TX_Laenge) then FileEnde := true;
|
||||
|
||||
|
||||
if TX_Bin = 0 then (* Textfile senden *)
|
||||
Begin
|
||||
While pos(^J,Zeile) > 0 do delete(Zeile,pos(^J,Zeile),1);
|
||||
While pos(^Z,Zeile) > 0 do delete(Zeile,pos(^Z,Zeile),1);
|
||||
for i := 1 to length(Zeile) do
|
||||
case Zeile[i] of
|
||||
^I : ;
|
||||
M1 : ;
|
||||
#1..#31 : Zeile[i] := '^';
|
||||
end;
|
||||
Zeile := Line_convert(Kanal,1,Zeile);
|
||||
end else TX_CRC := Compute_CRC(TX_CRC,Zeile);
|
||||
|
||||
S_PAC(Kanal,NU,false,Zeile);
|
||||
FileInfo(Kanal,1,TX_Laenge,TX_Count,0,0);
|
||||
|
||||
if FileEnde then
|
||||
Begin
|
||||
TNC_Puffer := false;
|
||||
FileSend := false;
|
||||
Result := Word(TX_CRC);
|
||||
boxzaehl:=5;
|
||||
FiResult := CloseBin(TxFile);
|
||||
if not DirScroll then SetzeFlags(Kanal);
|
||||
case TX_Bin of
|
||||
0 : begin
|
||||
if FileSendRem then Send_Prompt(Kanal,FF)
|
||||
else S_PAC(Kanal,NU,true,'');
|
||||
end;
|
||||
|
||||
1 : begin
|
||||
_aus(Attrib[20],Kanal,M2 + InfoZeile(100) + M1);
|
||||
S_PAC(Kanal,NU,true,'');
|
||||
if FileSendRem then S_PAC(Kanal,CM,true,'D');
|
||||
end;
|
||||
|
||||
3 : begin
|
||||
Hstr := Time_Differenz(TX_Time,Uhrzeit);
|
||||
Zeile := FName_aus_FVar(TxFile);
|
||||
While pos(BS,Zeile) > 0 do delete(Zeile,1,pos(BS,Zeile));
|
||||
|
||||
Zeile := M1 + B1 + InfoZeile(102) + B1 +
|
||||
EFillStr(14,B1,Zeile) + InfoZeile(100) +
|
||||
int_str(Result) + B2 + LRK + Hex(Result,4) + B1 +
|
||||
BdStr + FileBaud(Hstr,int_str(TX_Count)) + B2 +
|
||||
LRK + Hstr + RRK + M1;
|
||||
|
||||
if OFlag then _aus(Attrib[20],Kanal,Zeile);
|
||||
{ if FileSendRem then
|
||||
begin }
|
||||
|
||||
{//db1ras}
|
||||
if SysArt = 3 then {FBB}
|
||||
S_PAC(Kanal,NU,true,M1)
|
||||
else begin
|
||||
if (SysArt in [0,17,21]) and not XBin.An then begin
|
||||
{XP, PROFI}
|
||||
S_PAC(Kanal,NU,false,Zeile);
|
||||
Send_Prompt(Kanal,FF);
|
||||
end else if XBin.An then begin
|
||||
S_pac(kanal,NU,TRUE,'');
|
||||
s_pac(kanal,nu,true,xprot+COMD+chr(TRASK));
|
||||
|
||||
xbin.framenr:=0;
|
||||
xbin.ok:=false;
|
||||
xbin.pdat:=false;
|
||||
xbin.datpos:=0;
|
||||
xbin.retries:=0;
|
||||
end else
|
||||
S_PAC(Kanal,NU,true,'');
|
||||
end;
|
||||
{ end else S_PAC(Kanal,NU,true,''); }
|
||||
end;
|
||||
end;
|
||||
FileSendRem := false;
|
||||
End;
|
||||
End;
|
||||
FileFlag := false;
|
||||
End;
|
||||
End;
|
||||
|
||||
|
||||
Procedure SF_Text (* Kanal : Byte; Zeile : Str80 *);
|
||||
var f : Text;
|
||||
i : Byte;
|
||||
Hstr : String;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Assign(f,Zeile);
|
||||
if ResetTxt(f) = 0 then
|
||||
begin
|
||||
WishBuf := true;
|
||||
While not Eof(f) do
|
||||
begin
|
||||
Readln(f,Hstr);
|
||||
Hstr := Line_convert(Kanal,1,Platzhalter(Kanal,Hstr)) + M1;
|
||||
S_PAC(Kanal,NU,false,Hstr);
|
||||
end;
|
||||
FiResult := CloseTxt(f);
|
||||
end else S_PAC(Kanal,NU,true,InfoZeile(114) + B1 + Zeile + B1 + InfoZeile(115) +M1);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure TXT_Senden (* Kanal,Art,FNr : Byte *);
|
||||
Var Hstr : String;
|
||||
EndText,
|
||||
First,
|
||||
Flag,
|
||||
FixFlag : Boolean;
|
||||
TNr : String[1];
|
||||
GegCall : String[6];
|
||||
Kenner : Str32;
|
||||
|
||||
Function FindLine(TncStr,ArtStr,CallStr : Str9) : Boolean;
|
||||
Var Find : Boolean;
|
||||
Tstr : String[4];
|
||||
Cstr,
|
||||
Rstr : String[9];
|
||||
Begin
|
||||
Tstr := copy(TncStr,1,3) + 'A';
|
||||
Repeat
|
||||
Readln(G^.TFile,Hstr);
|
||||
KillEndBlanks(Hstr);
|
||||
Find := (pos(TncStr + ArtStr,Hstr) = 1) or (pos(TStr + ArtStr,Hstr) = 1);
|
||||
if Find and (RestStr(Hstr) > '') then
|
||||
begin
|
||||
Find := false;
|
||||
Repeat
|
||||
Hstr := RestStr(Hstr);
|
||||
Rstr := CutStr(Hstr);
|
||||
if Rstr[length(Rstr)] = '-' then
|
||||
begin
|
||||
delete(Rstr,length(Rstr),1);
|
||||
Cstr := copy(CallStr,1,length(Rstr));
|
||||
end else Cstr := CallStr;
|
||||
Find := Cstr = Rstr;
|
||||
Until Find or (length(Hstr) = 0);
|
||||
end;
|
||||
|
||||
Until Find or Eof(G^.TFile);
|
||||
FindLine := Find;
|
||||
End;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Assign(G^.TFile,Sys1Pfad + TxtDatei);
|
||||
if ResetTxt(G^.TFile) = 0 then
|
||||
begin
|
||||
Hstr := '';
|
||||
Flag := false;
|
||||
First := true;
|
||||
FixFlag := false;
|
||||
TNr := int_str(TncNummer);
|
||||
GegCall := Call;
|
||||
Strip(GegCall);
|
||||
|
||||
case Art of
|
||||
1 : begin (* INFO *)
|
||||
Flag := FindLine(TncI + TNr,TInf + int_str(TNC[TncNummer]^.Info),OwnCall);
|
||||
end;
|
||||
2 : begin (* AKTUELL *)
|
||||
Flag := FindLine(TncI + TNr,TAkt + int_str(TNC[TncNummer]^.Aktuell),OwnCall);
|
||||
end;
|
||||
3 : begin (* CTEXT *)
|
||||
Flag := FindLine(TncI + TNr,TCtx + int_str(TNC[TncNummer]^.CText),OwnCall);
|
||||
end;
|
||||
4 : begin (* QTEXT *)
|
||||
Flag := FindLine(TncI + TNr,TQtx + int_str(TNC[TncNummer]^.QText),OwnCall);
|
||||
end;
|
||||
5 : begin (* FIX *)
|
||||
Flag := FindLine(TncI + TNr,TFix + int_str(FNr) + GL +
|
||||
int_str(TNC[TncNummer]^.FIX),OwnCall);
|
||||
FixFlag := Flag;
|
||||
end;
|
||||
6 : begin (* GRT *)
|
||||
Flag := FindLine(TncI + TNr,TGrt,GegCall);
|
||||
GrtFlag := Flag;
|
||||
end;
|
||||
end;
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
|
||||
if FixFlag then
|
||||
begin
|
||||
if Vor_im_EMS then EMS_Seite_Einblenden(Kanal,Vor);
|
||||
Set_st_Szeile(Kanal,1,1);
|
||||
if VorWrite[Kanal]^[stV] <> '' then
|
||||
begin
|
||||
Vor_Feld_Scroll(Kanal);
|
||||
Vor_Dn_Scroll(Kanal);
|
||||
end;
|
||||
end;
|
||||
|
||||
EndText:=False;
|
||||
|
||||
if (Art=3) or (art=6) then
|
||||
begin
|
||||
{Kenner:=AutoSysKenner[3]+copy(Version,Pos(' ',Version)+1,Length(Version));
|
||||
if node then Kenner:=Kenner + NodeK + M1
|
||||
else Kenner:=Kenner+ ']' + M1; }
|
||||
Kenner:=AutoSysKenner[3];
|
||||
if node then Kenner:=Kenner + NodeK;
|
||||
Kenner:=Kenner+copy(Version,Pos(' ',Version)+1,Length(Version))+DatenKenner+int_str(Umlaut);
|
||||
if ((user_komp=1) or (user_komp=3)) and (not node) then kenner:=kenner+'C'+int_str(user_komp-1);
|
||||
kenner:=kenner+']'+m1;
|
||||
S_PAC(Kanal,NU,false,Kenner);
|
||||
end;
|
||||
|
||||
EigFlag := SysTextEcho;
|
||||
While (not Eof(G^.TFile)) and (Not EndText) do
|
||||
begin
|
||||
Readln(G^.TFile,Hstr);
|
||||
if (pos('#ENDE#',UpcaseStr(Hstr)) > 0) then EndText:=true;
|
||||
if Not EndText then
|
||||
begin
|
||||
Hstr := Line_convert(Kanal,1,Platzhalter(Kanal,Hstr));
|
||||
if FixFlag then
|
||||
begin
|
||||
if not First then
|
||||
begin
|
||||
Set_st_Szeile(Kanal,0,stV);
|
||||
Vor_Feld_Scroll(Kanal);
|
||||
end;
|
||||
First := false;
|
||||
VorWrite[Kanal]^[stV] := Hstr;
|
||||
Chr_Vor_Show(Kanal,_End,#255);
|
||||
Chr_Vor_Show(Kanal,_Andere,#255);
|
||||
end else
|
||||
begin
|
||||
S_PAC(Kanal,NU,FALSE,Hstr + M1);
|
||||
end;
|
||||
end;
|
||||
end; {while}
|
||||
end;
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
EigFlag:=false;
|
||||
end;
|
||||
if art= 3 then RequestName(Kanal);
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure RequestName (* (Kanal) *);
|
||||
var hstr:String;
|
||||
begin
|
||||
with k[kanal]^ do
|
||||
if (not node) and ((not einstiegskanal) and (not ausstiegskanal)) then
|
||||
if (not reqName) and (konfig.ReqNam) then
|
||||
begin
|
||||
hstr:='';
|
||||
if User_Name='' then hstr:=hstr+'+' else hstr:=hstr+'-';
|
||||
if User_QTH='' then hstr:=hstr+'+' else hstr:=hstr+'-';
|
||||
if User_LOC='' then hstr:=hstr+'+' else hstr:=hstr+'-';
|
||||
hstr:=Meldung[36]+hstr+'#';
|
||||
if pos('+', hstr)>0 then s_pac(kanal, nu, true, hstr+#13);
|
||||
reqName:=true;
|
||||
end;
|
||||
end;
|
||||
|
||||
Procedure BIN_TX_File_Sofort (* Kanal : Byte ; Zeile : Str80 *);
|
||||
Var Bstr : String[80];
|
||||
RResult,
|
||||
WResult : Word;
|
||||
HeapFree : LongInt;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Assign(TxFile,Zeile);
|
||||
if ResetBin(TxFile,T) = 0 then
|
||||
begin
|
||||
FileSend := true;
|
||||
TX_Laenge := FileSize(TxFile);
|
||||
|
||||
if TxComp then
|
||||
begin
|
||||
TX_Count := 0;
|
||||
TX_CRC := 0;
|
||||
TX_Bin := 3;
|
||||
TX_Time := Uhrzeit;
|
||||
WishBuf := true;
|
||||
S_PAC(Kanal,NU,false,MakeBinStr(Kanal,Zeile));
|
||||
FertigSenden(Kanal);
|
||||
end else
|
||||
begin
|
||||
WishBuf := true;
|
||||
if not BufExists then OpenBufferFile(Kanal);
|
||||
Bstr := MakeBinStr(Kanal,Zeile);
|
||||
BlockWrite(BufFile,Bstr[1],length(Bstr),RResult);
|
||||
|
||||
HeapFree := MaxAvail;
|
||||
if HeapFree > FA00 then HeapFree := FA00;
|
||||
if HeapFree > TX_Laenge then HeapFree := TX_Laenge;
|
||||
|
||||
GetMem(BFeld,HeapFree);
|
||||
FillChar(BFeld^,HeapFree,0);
|
||||
Seek(BufFile,FileSize(BufFile));
|
||||
|
||||
Repeat
|
||||
BlockRead(TxFile,BFeld^,HeapFree,RResult);
|
||||
if RResult > 0 then TxLRet := BFeld^[RResult] = 13;
|
||||
BlockWrite(BufFile,BFeld^,RResult,WResult);
|
||||
Until RResult = 0;
|
||||
|
||||
FreeMem(BFeld,HeapFree);
|
||||
FiResult := CloseBin(TxFile);
|
||||
FileSend := false;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure TXT_TX_File_Sofort (* Kanal : Byte ; Zeile : Str80 *);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Assign(TxFile,Zeile);
|
||||
if ResetBin(TxFile,T) = 0 then
|
||||
begin
|
||||
FileSend := true;
|
||||
TX_Laenge := FileSize(TxFile);
|
||||
TX_Count := 0;
|
||||
TX_CRC := 0;
|
||||
TX_Bin := 0;
|
||||
TX_Time := Uhrzeit;
|
||||
FertigSenden(Kanal);
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure FertigSenden (* Kanal : Byte *);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
WishBuf := true;
|
||||
Repeat
|
||||
if TX_Bin = 2 then inc(TX_Bin);
|
||||
Send_File(Kanal,false);
|
||||
Until not FileSend;
|
||||
end;
|
||||
End;
|
639
XPHELP.PAS
Executable file
639
XPHELP.PAS
Executable file
@ -0,0 +1,639 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P H E L P . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die Hilfe durch ALT-H aus TOP ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Hlp_Laden (* Istr : Str6 *);
|
||||
Var Nstr : String[6];
|
||||
Hstr : String[HlpRec];
|
||||
Result : Word;
|
||||
Flag,
|
||||
Find : Boolean;
|
||||
Begin
|
||||
FillChar(Hlp^,SizeOf(Hlp^),0);
|
||||
Hlp_Anz := 0;
|
||||
Flag := false;
|
||||
KillEndBlanks(Istr);
|
||||
Assign(G^.BFile,Konfig.TempVerz + THlpDatei);
|
||||
if ResetBin(G^.BFile,HlpRec) = 0 then
|
||||
begin
|
||||
Hlp_ZlnNr := str_int(Istr);
|
||||
if Hlp_ZlnNr > 0 then
|
||||
begin
|
||||
dec(Hlp_ZlnNr);
|
||||
Seek(G^.BFile,Hlp_ZlnNr);
|
||||
Repeat
|
||||
BlockRead(G^.BFile,Hstr[1],1,Result);
|
||||
Hstr[0] := Chr(HlpRec);
|
||||
Flag := LZ = copy(Hstr,1,1);
|
||||
if not Flag then
|
||||
begin
|
||||
inc(Hlp_Anz);
|
||||
Nstr := copy(Hstr,1,6);
|
||||
KillEndBlanks(Nstr);
|
||||
if Nstr > '' then
|
||||
begin
|
||||
Hlp^[Hlp_Anz].ID := Nstr;
|
||||
Hlp^[Hlp_Anz].Attr := Attrib[31];
|
||||
end else Hlp^[Hlp_Anz].Attr := Attrib[2];
|
||||
Hlp^[Hlp_Anz].Sp7 := Hstr[7];
|
||||
delete(Hstr,1,7);
|
||||
Hlp^[Hlp_Anz].Entry := Hstr;
|
||||
end;
|
||||
Until Flag or (Hlp_Anz >= maxHelpZln) or Eof(G^.BFile);
|
||||
end;
|
||||
FiResult := CloseBin(G^.BFile);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure XP_Help (* IDstr : Str6 *);
|
||||
Const Bofs = 1;
|
||||
Kl = '[ ]';
|
||||
|
||||
Type AnwTyp = Record
|
||||
IDk : String[6];
|
||||
Dmp : Integer;
|
||||
Bmp : Byte;
|
||||
End;
|
||||
|
||||
Var i,i1,i2,
|
||||
xc,yc,
|
||||
Klpos,
|
||||
Bpos,
|
||||
yM,aM,
|
||||
Zmax : Byte;
|
||||
show2 : byte;
|
||||
Dpos : Integer;
|
||||
w : Word;
|
||||
Flag,
|
||||
CurSh,
|
||||
CurFlag,
|
||||
Fertig : Boolean;
|
||||
Vstr : String[6];
|
||||
Hstr : String[80];
|
||||
Save_Name : String[60];
|
||||
Such : String[80];
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
Result : Word;
|
||||
OldBild : ^BildPtr;
|
||||
HlpAnw : Array [1..maxHlpAnw] of AnwTyp;
|
||||
HlpAnwPtr : Byte;
|
||||
|
||||
Procedure StepHlpAnw (AnId : Str6; Dpar : Integer; Bpar : Byte);
|
||||
Var i : Byte;
|
||||
Flag : Boolean;
|
||||
Begin
|
||||
Flag := false;
|
||||
i := 0;
|
||||
While not Flag and (i < maxHlpAnw) do
|
||||
begin
|
||||
inc(i);
|
||||
if HlpAnw[i].IDk = AnId then
|
||||
begin
|
||||
Flag := true;
|
||||
move(HlpAnw[1],HlpAnw[i],SizeOf(HlpAnw[1]));
|
||||
end;
|
||||
end;
|
||||
|
||||
if not Flag then move(HlpAnw[1],HlpAnw[2],SizeOf(HlpAnw[1])*(maxHlpAnw-1));
|
||||
HlpAnw[1].IDk := AnId;
|
||||
HlpAnw[1].Dmp := Dpar;
|
||||
HlpAnw[1].Bmp := Bpar;
|
||||
End;
|
||||
|
||||
Procedure HlpPage(beg : Word);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
Teil_Bild_Loesch(2,maxZ-1,Attrib[2]);
|
||||
i1 := Zmax;
|
||||
if i1 > Hlp_Anz then i1 := Hlp_Anz;
|
||||
for i := 1 to i1 do
|
||||
WriteRam(1,i+Bofs,Hlp^[beg-1+i].Attr,1,
|
||||
EFillStr(80,B1,B1+Hlp^[beg-1+i].Entry));
|
||||
yM := 0;
|
||||
End;
|
||||
|
||||
Begin
|
||||
if HeapFrei(SizeOf(Hlp^) + SizeOf(OldBild^)) then
|
||||
begin
|
||||
{ OnlHelp:=true;
|
||||
Show2:=show;
|
||||
show:=0; }
|
||||
NowFenster := false;
|
||||
Moni_Off(0);
|
||||
GetMem(Hlp,SizeOf(Hlp^));
|
||||
GetMem(OldBild,SizeOf(OldBild^));
|
||||
|
||||
move(Bild^,OldBild^,SizeOf(OldBild^));
|
||||
|
||||
CurFlag := Cursor_On;
|
||||
xc := WhereX;
|
||||
yc := WhereY;
|
||||
Cursor_Aus;
|
||||
|
||||
|
||||
Bpos := 1;
|
||||
Dpos := 1;
|
||||
|
||||
HlpAnwPtr := 0;
|
||||
FillChar(HlpAnw,SizeOf(HlpAnw),0);
|
||||
Hlp_Laden(IDstr);
|
||||
|
||||
Such := '';
|
||||
Zmax := maxZ - (1 + Bofs);
|
||||
Fertig := false;
|
||||
CurSh := true;
|
||||
|
||||
Hstr := B1 + InfoZeile(56);
|
||||
Klpos := pos(Kl,Hstr);
|
||||
WriteRam(1,1,Attrib[15],1,ZFillStr(80,B1,InfoZeile(55)));
|
||||
WriteRam(1,maxZ,Attrib[15],1,EFillStr(80,B1,Hstr));
|
||||
HlpPage(Dpos);
|
||||
yM := 1;
|
||||
aM := Hlp^[Dpos].Attr;
|
||||
WriteAttr(1,Bpos+Bofs,80,Attrib[4],1);
|
||||
|
||||
Repeat
|
||||
if CurSh then InitCursor(1,Bpos+Bofs)
|
||||
else InitCursor(1,1);
|
||||
|
||||
WriteRam(71,1,Attrib[15],1,EFillStr(10,B1,Such));
|
||||
if (Klpos > 0) then
|
||||
begin
|
||||
if (Hlp^[Dpos].ID > '') then
|
||||
begin
|
||||
WriteRam(Klpos+1,maxZ,Attrib[15],1,X_ch);
|
||||
WriteRam(Klpos+5,maxZ,Attrib[15],1,EFillStr(10,B1,LRK + Hlp^[Dpos].ID + RRK));
|
||||
end else
|
||||
begin
|
||||
WriteRam(Klpos+1,maxZ,Attrib[15],1,B1);
|
||||
WriteRam(Klpos+5,maxZ,Attrib[15],1,EFillStr(10,B1,B1));
|
||||
end;
|
||||
WriteRam(74,maxZ,Attrib[15],1, SFillStr(7,B1,LRK + int_str(Hlp_ZlnNr + Dpos) + RRK));
|
||||
end;
|
||||
|
||||
_ReadKey(KC,VC);
|
||||
|
||||
if KC <> _Andere then Such := '';
|
||||
|
||||
case KC of
|
||||
_Esc, _Del
|
||||
: Fertig := true;
|
||||
|
||||
_Dn
|
||||
: if Dpos < Hlp_Anz then
|
||||
begin
|
||||
inc(Dpos);
|
||||
if Bpos < Zmax then inc(Bpos) else
|
||||
begin
|
||||
WriteAttr(1,Bofs+yM,80,aM,1);
|
||||
Scroll(Up,1,1+Bofs,Zmax+Bofs);
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],1,EFillStr(80,B1,B1+Hlp^[Dpos].Entry));
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_Up
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
dec(Dpos);
|
||||
if Bpos > 1 then dec(Bpos) else
|
||||
begin
|
||||
WriteAttr(1,Bofs+yM,80,aM,1);
|
||||
Scroll(Dn,1,1+Bofs,Zmax+Bofs);
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],1,EFillStr(80,B1,B1+Hlp^[Dpos].Entry));
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_Left
|
||||
: if (HlpAnwPtr < maxHlpAnw) and (HlpAnw[HlpAnwPtr+1].IDk > '') then
|
||||
begin
|
||||
inc(HlpAnwPtr);
|
||||
IDstr := HlpAnw[HlpAnwPtr].IDk;
|
||||
Hlp_Laden(IDstr);
|
||||
Dpos := HlpAnw[HlpAnwPtr].Dmp;
|
||||
Bpos := HlpAnw[HlpAnwPtr].Bmp;
|
||||
Such := '';
|
||||
HlpPage(Dpos - Bpos + 1);
|
||||
end else Alarm;
|
||||
|
||||
_PgDn
|
||||
: if Dpos < Hlp_Anz then
|
||||
begin
|
||||
if Dpos + Zmax - Bpos >= Hlp_Anz then
|
||||
begin
|
||||
Dpos := Hlp_Anz;
|
||||
Bpos := Zmax;
|
||||
if Bpos > Hlp_Anz then Bpos := Hlp_Anz;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos + Zmax - 1;
|
||||
if Dpos + Zmax - 1 > Hlp_Anz then Dpos := Hlp_Anz - Zmax + Bpos;
|
||||
HlpPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_PgUp
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
if Dpos <= Bpos then
|
||||
begin
|
||||
Dpos := 1;
|
||||
Bpos := 1;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos - Zmax + 1;
|
||||
if Dpos - Zmax + 1 < 1 then Dpos := Bpos;
|
||||
HlpPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_CtrlPgUp
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
Dpos := 1;
|
||||
Bpos := 1;
|
||||
HlpPage(1);
|
||||
end else Alarm;
|
||||
|
||||
_CtrlPgDn
|
||||
: if Dpos < Hlp_Anz then
|
||||
begin
|
||||
Dpos := Hlp_Anz;
|
||||
Bpos := Zmax;
|
||||
if Bpos > Hlp_Anz then Bpos := Hlp_Anz;
|
||||
HlpPage(Dpos - Bpos + 1);
|
||||
end else Alarm;
|
||||
|
||||
_CtrlHome
|
||||
: begin
|
||||
Dpos := Dpos - Bpos + 1;
|
||||
Bpos := 1;
|
||||
end;
|
||||
|
||||
_CtrlEnd
|
||||
: if Hlp_Anz < Zmax then
|
||||
begin
|
||||
Dpos := Hlp_Anz;
|
||||
Bpos := Hlp_Anz;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos + Zmax - Bpos;
|
||||
Bpos := Zmax;
|
||||
end;
|
||||
|
||||
_ShTab
|
||||
: CurSh := not CurSh;
|
||||
|
||||
_F1.._F5, _F10, _AltH
|
||||
: begin
|
||||
case KC of
|
||||
_F1 : Vstr := G^.OHelp[12];
|
||||
_F2 : Vstr := G^.OHelp[13];
|
||||
_F3 : Vstr := G^.OHelp[14];
|
||||
_F4 : Vstr := G^.OHelp[15];
|
||||
_F5 : Vstr := G^.OHelp[16];
|
||||
_F10 : Vstr := G^.OHelp[11];
|
||||
_AltH : Vstr := G^.OHelp[28];
|
||||
else Vstr := '';
|
||||
end;
|
||||
|
||||
if Vstr > '' then
|
||||
begin
|
||||
StepHlpAnw(IDstr,Dpos,Bpos);
|
||||
Hlp_Laden(Vstr);
|
||||
IDstr := Vstr;
|
||||
HlpAnwPtr := 0;
|
||||
yM := 1;
|
||||
Bpos := 1;
|
||||
Dpos := 1;
|
||||
Such := '';
|
||||
HlpPage(1);
|
||||
end else Alarm;
|
||||
end;
|
||||
|
||||
_AltS
|
||||
: begin
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],1,EFillStr(80,B1,B1 + 'Pfad =' + B1));
|
||||
Save_Name := Konfig.SavVerz + 'HELP.' + TxtExt;
|
||||
GetString(Save_Name,Attrib[4],60,9,Bofs+Bpos,KC,0,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
Assign(G^.TFile,Save_Name);
|
||||
Result := AppendTxt(G^.TFile);
|
||||
if Result <> 0 then Result := RewriteTxt(G^.TFile);
|
||||
if Result = 0 then
|
||||
begin
|
||||
for w := Dpos to Hlp_Anz do
|
||||
begin
|
||||
Hstr := Hlp^[w].Entry;
|
||||
Writeln(G^.TFile,Hstr);
|
||||
end;
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
end else
|
||||
begin
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],1,
|
||||
EFillStr(80,B1,B1 + InfoZeile(75) + DP + B2 + Save_Name));
|
||||
Alarm;
|
||||
Verzoegern(ZWEI);
|
||||
end;
|
||||
end;
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],1,EFillStr(80,B1,B1+Hlp^[Dpos].Entry));
|
||||
end;
|
||||
|
||||
_Ret
|
||||
: begin
|
||||
Vstr := Hlp^[Dpos].ID;
|
||||
if Vstr > '' then
|
||||
begin
|
||||
StepHlpAnw(IDstr,Dpos,Bpos);
|
||||
Hlp_Laden(Vstr);
|
||||
IDstr := Vstr;
|
||||
HlpAnwPtr := 0;
|
||||
yM := 1;
|
||||
Bpos := 1;
|
||||
Dpos := 1;
|
||||
Such := '';
|
||||
HlpPage(1);
|
||||
end else Alarm;
|
||||
end;
|
||||
|
||||
_Andere
|
||||
: begin
|
||||
Such := Such + UpCase(VC);
|
||||
w := 0;
|
||||
Flag := false;
|
||||
While (w < Hlp_Anz) and not Flag do
|
||||
begin
|
||||
inc(w);
|
||||
if pos(Such,Hlp^[w].Entry) = 1 then
|
||||
begin
|
||||
Flag := true;
|
||||
Dpos := w;
|
||||
if (Dpos < Bpos) or (Hlp_Anz <= Zmax) then Bpos := Dpos;
|
||||
if ((Hlp_Anz - Dpos + Bpos) < Zmax) and
|
||||
(Hlp_Anz > Zmax) and (Dpos > Bpos)
|
||||
then Bpos := Zmax - (Hlp_Anz - Dpos);
|
||||
end;
|
||||
end;
|
||||
|
||||
if not Flag then
|
||||
begin
|
||||
Alarm;
|
||||
Such := '';
|
||||
end else HlpPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
|
||||
else Alarm;
|
||||
end;
|
||||
|
||||
if yM > 0 then WriteAttr(1,Bofs+yM,80,aM,1);
|
||||
WriteAttr(1,Bofs+Bpos,80,Attrib[4],1);
|
||||
yM := Bpos;
|
||||
aM := Hlp^[Dpos].Attr;
|
||||
Until Fertig;
|
||||
|
||||
move(OldBild^,Bild^,SizeOf(OldBild^));
|
||||
FreeMem(OldBild,SizeOf(OldBild^));
|
||||
FreeMem(Hlp,SizeOf(Hlp^));
|
||||
|
||||
Cursor_Aus;
|
||||
if CurFlag then
|
||||
begin
|
||||
GotoXY(xc,yc);
|
||||
Cursor_Ein;
|
||||
end;
|
||||
Moni_On;
|
||||
{ show:=show2;
|
||||
OnlHelp:=false;
|
||||
SwitchChannel (show);
|
||||
SetzeFlags(show); }
|
||||
end else Alarm;
|
||||
OnlHelp:=false;
|
||||
End;
|
||||
|
||||
|
||||
Procedure REM_Help (* Kanal : Byte; HNr : Byte *);
|
||||
Var i : Byte;
|
||||
w : Word;
|
||||
IDstr : String[10];
|
||||
Hstr : String[80];
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
i := Byte(HlpRemBeg-1+HNr);
|
||||
if i in [1..maxOHelp] then
|
||||
begin
|
||||
IDstr := G^.OHelp[i];
|
||||
if HeapFrei(SizeOf(Hlp^)) then
|
||||
begin
|
||||
GetMem(Hlp,SizeOf(Hlp^));
|
||||
Hlp_Laden(IDstr);
|
||||
for w := 1 to Hlp_Anz do
|
||||
begin
|
||||
if Hlp^[w].Sp7 = DP then
|
||||
begin
|
||||
Hstr:=Hlp^[w].Entry;
|
||||
if (Node) and (Pos('//', HStr)>0) then delete(HStr,pos('//', Hstr), 2);
|
||||
S_PAC(Kanal,NU,false,B1 + Hstr + M1);
|
||||
end;
|
||||
end;
|
||||
FreeMem(Hlp,SizeOf(Hlp^));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Send_Hilfe (* Kanal : Byte; IDstr : Str6 *);
|
||||
Var w : Word;
|
||||
Hstr : String[80];
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if HeapFrei(SizeOf(Hlp^)) then
|
||||
begin
|
||||
GetMem(Hlp,SizeOf(Hlp^));
|
||||
Hlp_Laden(IDstr);
|
||||
for w := 1 to Hlp_Anz do if Hlp^[w].Sp7 = DP then
|
||||
begin
|
||||
Hstr := Line_convert(Kanal,1,Hlp^[w].Entry);
|
||||
KillEndBlanks(Hstr);
|
||||
S_PAC(Kanal,NU,false,B1 + Hstr + M1);
|
||||
end;
|
||||
FreeMem(Hlp,SizeOf(Hlp^));
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Help_Compile;
|
||||
Var l,Hlpl : LongInt;
|
||||
w,
|
||||
Result : Word;
|
||||
X7 : Byte;
|
||||
Nstr : String[6];
|
||||
Bstr,
|
||||
Hstr : String[HlpRec];
|
||||
Flag,
|
||||
EFlag : Boolean;
|
||||
HlpNr : ^HlpNrPtr;
|
||||
BalkSt : str8;
|
||||
BalkZa : Byte;
|
||||
z1,z2 : char;
|
||||
BalkK : Boolean;
|
||||
|
||||
|
||||
Procedure HlpAnzeige(l : LongInt);
|
||||
Begin
|
||||
BalkSt:='';
|
||||
if not Balkk then
|
||||
begin
|
||||
inc(BalkZa);
|
||||
z1:='²';
|
||||
z2:='°';
|
||||
end
|
||||
else begin
|
||||
dec(BalkZa);
|
||||
z2:='²';
|
||||
z1:='°';
|
||||
end;
|
||||
if BalkZa=6 then Balkk:=true;
|
||||
if BalkZa=1 then Balkk:=false;
|
||||
BalkSt:=SFillStr(BalkZa,z1,BalkSt);
|
||||
WriteTxt(X7,SZ2,StartColor,EFillStr(6,z2,BalkSt));
|
||||
{ WriteTxt(X7,SZ2,StartColor,EFillStr(6,B1,int_str(l))); }
|
||||
End;
|
||||
|
||||
|
||||
Function NrExists(Kstr : Str6) : Word;
|
||||
Var z : Word;
|
||||
Flag : Boolean;
|
||||
Begin
|
||||
z := 0;
|
||||
Flag := false;
|
||||
if Kstr > '' then
|
||||
Repeat
|
||||
inc(z);
|
||||
if CutStr(HlpNr^[z]) = Kstr then Flag := true;
|
||||
Until Flag or (z >= maxHlpNr);
|
||||
|
||||
if Flag then NrExists := z
|
||||
else NrExists := 0;
|
||||
End;
|
||||
|
||||
Begin
|
||||
BalkZa:=0;
|
||||
BalkK:=false;
|
||||
Hstr := HelpDatei + B1 + GL + RSK + B1 + THlpDatei + B1;
|
||||
WriteTxt(30,SZ2,StartColor,Hstr);
|
||||
X7 := 30 + length(Hstr);
|
||||
Assign(G^.TFile,SysPfad + HelpDatei);
|
||||
if ResetTxt(G^.TFile) = 0 then
|
||||
begin
|
||||
GetMem(HlpNr,SizeOf(HlpNr^));
|
||||
FillChar(HlpNr^,SizeOf(HlpNr^),0);
|
||||
Assign(G^.BFile,Konfig.TempVerz + THlpDatei);
|
||||
if RewriteBin(G^.BFile,HlpRec) = 0 then
|
||||
begin
|
||||
l := 0;
|
||||
w := 0;
|
||||
While not Eof(G^.TFile) do
|
||||
begin
|
||||
inc(l);
|
||||
if ((l mod 50)=0) then HlpAnzeige(l);
|
||||
Readln(G^.TFile,Hstr);
|
||||
if pos(DP,Hstr) = 1 then
|
||||
begin
|
||||
inc(w);
|
||||
delete(Hstr,1,1);
|
||||
if w <= maxHlpNr then
|
||||
HlpNr^[w] := EFillStr(7,B1,CutStr(Hstr)) +
|
||||
SFillStr(6,'0',int_str(l));
|
||||
Hstr := ConstStr(B1,HlpRec);
|
||||
BlockWrite(G^.BFile,Hstr[1],1,Result);
|
||||
end else
|
||||
begin
|
||||
Hstr := EFillStr(HlpRec,B1,Hstr);
|
||||
BlockWrite(G^.BFile,Hstr[1],1,Result);
|
||||
end;
|
||||
end;
|
||||
Hlpl := FilePos(G^.BFile);
|
||||
if Hlpl = 0 then Hlpl := 1;
|
||||
FiResult := CloseBin(G^.BFile);
|
||||
end;
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
|
||||
if ResetBin(G^.BFile,HlpRec) = 0 then
|
||||
begin
|
||||
Flag := false;
|
||||
EFlag := false;
|
||||
Repeat
|
||||
dec(l);
|
||||
if ((l mod 50)=0) then HlpAnzeige(l);
|
||||
BlockRead(G^.BFile,Hstr[1],1,Result);
|
||||
Hstr[0] := Chr(HlpRec);
|
||||
KillEndBlanks(Hstr);
|
||||
if Hstr = LZ then EFlag := true;
|
||||
KillStartBlanks(Hstr);
|
||||
if (Hstr > '') and not EFlag then
|
||||
begin
|
||||
if Flag then
|
||||
begin
|
||||
Bstr := ConstStr(B1,7);
|
||||
While Hstr > '' do
|
||||
begin
|
||||
Nstr := CutStr(Hstr);
|
||||
w := NrExists(Nstr);
|
||||
if w > 0 then Bstr := Bstr + RestStr(HlpNr^[w]) + B3
|
||||
else Bstr := Bstr + ConstStr('0',7) + B3;
|
||||
Hstr := RestStr(Hstr);
|
||||
end;
|
||||
Bstr := EFillStr(HlpRec,B1,Bstr);
|
||||
Seek(G^.BFile,FilePos(G^.BFile)-1);
|
||||
BlockWrite(G^.BFile,Bstr[1],1,Result);
|
||||
end else if (OHelpStr = Hstr) then Flag := true;
|
||||
end;
|
||||
Until Eof(G^.BFile) or EFlag;
|
||||
|
||||
{ Writeln(G^.Bootfile);}
|
||||
|
||||
While not Eof(G^.BFile) do
|
||||
begin
|
||||
dec(l);
|
||||
if ((l mod 50)=0) then HlpAnzeige(l);
|
||||
BlockRead(G^.BFile,Hstr[1],1,Result);
|
||||
Hstr[0] := Chr(HlpRec);
|
||||
Nstr := copy(Hstr,1,6);
|
||||
KillEndBlanks(Nstr);
|
||||
w := NrExists(Nstr);
|
||||
if w > 0 then
|
||||
begin
|
||||
Seek(G^.BFile,FilePos(G^.BFile)-1);
|
||||
delete(Hstr,1,6);
|
||||
Hstr := RestStr(HlpNr^[w]) + Hstr;
|
||||
BlockWrite(G^.BFile,Hstr[1],1,Result);
|
||||
end else
|
||||
begin
|
||||
if (Nstr > '') and (Nstr <> LZ) then
|
||||
begin
|
||||
Alarm;
|
||||
WriteTxt(7,SZ2+1,StartColor,Hstr);
|
||||
KillEndBlanks(Hstr);
|
||||
{Writeln(G^.Bootfile,Hstr);}
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
FiResult := CloseBin(G^.BFile);
|
||||
end;
|
||||
FreeMem(HlpNr,SizeOf(HlpNr^));
|
||||
end;
|
||||
writetxt(30,sz2,startcolor,' ');
|
||||
End;
|
495
XPINI.PAS
Executable file
495
XPINI.PAS
Executable file
@ -0,0 +1,495 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P I N I . P A S ³
|
||||
³ ³
|
||||
³ Initialisierung der globalen Variablen in XPDEFS.PAS ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Var_INIT (* Kanal : Byte *);
|
||||
var i,i1 : Integer;
|
||||
Begin
|
||||
BackupBremsen:=false;
|
||||
BackupJetzt:=true;
|
||||
if Kanal <> 99 then
|
||||
Begin
|
||||
|
||||
with K[Kanal]^ do { Variablen eines jeden Kanals initialisieren }
|
||||
Begin
|
||||
PWMerk:='';
|
||||
SPRxCount:=0;
|
||||
SPRxSoll:=0;
|
||||
|
||||
XBIN.AN:=false;
|
||||
xbin.pdat:=false;
|
||||
xbin.ok:=false;
|
||||
xbin.retries:=0;
|
||||
xbin.frameNr:=0;
|
||||
xbin.DatPos:=0;
|
||||
xbin.pdat:=false;
|
||||
xbin.eof:=false;
|
||||
|
||||
BellCount:=0;
|
||||
|
||||
StopCODE:=0;
|
||||
STOPComp:=False;
|
||||
|
||||
CompC:=false;
|
||||
KompressUpd:=false;
|
||||
SPComp:=false;
|
||||
ReqName := false;
|
||||
|
||||
for i:=1 to 255 do
|
||||
begin
|
||||
Kompression[i]:=0;
|
||||
end;
|
||||
OnAct:='';
|
||||
|
||||
Node := FALSE;
|
||||
|
||||
|
||||
FBBStreng:=false;
|
||||
NZeile := '';
|
||||
NodeTimeOut:=30;
|
||||
TermTimeOut:=0;
|
||||
TX_CRC:=0;
|
||||
RX_CRC:=0;
|
||||
ACZeile := '';
|
||||
FTxName := Konfig.SavVerz;
|
||||
FRxName := Konfig.SavVerz;
|
||||
Autokenn:=false;
|
||||
SystemErkannt:='';
|
||||
RxLRet := true;
|
||||
TxLRet := true;
|
||||
SvLRet := true;
|
||||
OwnCall := '*';
|
||||
Call := ' ';
|
||||
connected := false;
|
||||
Outside := true;
|
||||
QSO_Date := '';
|
||||
QSO_Begin := '';
|
||||
QSO_End := '';
|
||||
ConText := '';
|
||||
LogMerker := '';
|
||||
BeLogEintr := false;
|
||||
SendZeile := '';
|
||||
TxByte := 0;
|
||||
Loesch := false;
|
||||
Insert_ON := true;
|
||||
Rx_Beep := false;
|
||||
Echo := 0;
|
||||
SysTextEcho := false;
|
||||
Cmd := false;
|
||||
ObStat := 5;
|
||||
if Kanal = 0 then UnStat := ObStat + 1
|
||||
else UnStat := maxZ - 3;
|
||||
X2 := 1;
|
||||
Response := '';
|
||||
for i := 1 to 6 do L_Status[i] := 0;
|
||||
FlagTxBeep := false;
|
||||
TxBeepAck := false;
|
||||
First_Frame := true;
|
||||
RemPath := '';
|
||||
RX_Bin := 0;
|
||||
RX_Save := false;
|
||||
Save := false;
|
||||
SplSave := false;
|
||||
Spl_Time := '';
|
||||
Spl_Baud := 0;
|
||||
Spl_UmlMerk := 0;
|
||||
FileSend := false;
|
||||
FileSendRem := false;
|
||||
FileSendWait := false;
|
||||
TX_Bin := 0;
|
||||
TX_Time := '';
|
||||
TX_Baud := 0;
|
||||
Drucker := false;
|
||||
Umlaut := 0;
|
||||
UmlautMerk := 0;
|
||||
NR_Stelle := 0;
|
||||
ConnectMerk := '';
|
||||
ACMerk := '';
|
||||
Pause := 0;
|
||||
Paclen := 230;
|
||||
MaxFrame := 3;
|
||||
TNCKanal := #0;
|
||||
{FwdMails:=0;
|
||||
fwdstarted:=false;}
|
||||
fwd:= false;
|
||||
fwdgo:=false;
|
||||
Kan_Char := #0;
|
||||
TNC_Code := 0;
|
||||
TNC_Count := 0;
|
||||
Auto := true;
|
||||
Auto_CON := false;
|
||||
Ziel_Call := '';
|
||||
Ignore := false;
|
||||
NochNichtGelesen := false;
|
||||
RemoteSave := false;
|
||||
AnzLines := 0;
|
||||
AnzNotiz := 0;
|
||||
stV := 1;
|
||||
Y1V := 1;
|
||||
Y1C := 1;
|
||||
X1V := 1;
|
||||
X1C := 3;
|
||||
NodeCon := false;
|
||||
NodeCmd := false;
|
||||
Mail_SP := false;
|
||||
MerkInfo := '';
|
||||
EinstiegsKanal := false;
|
||||
AusstiegsKanal := false;
|
||||
GegenKanal := 0;
|
||||
Kanal_benutz := false;
|
||||
RemConReady := false;
|
||||
FoundCall := false;
|
||||
Last_CR_Pos := 0;
|
||||
unknown := false;
|
||||
notRC := false;
|
||||
ParmWrong := false;
|
||||
Hold := false;
|
||||
HoldStr := '';
|
||||
HoldTime := 0;
|
||||
RTF := false;
|
||||
Cself := 0;
|
||||
AutoZeile := '';
|
||||
Auto1Zeile := '';
|
||||
AutoTime := '';
|
||||
AutoZaehl := 0;
|
||||
AutoJump := 0;
|
||||
AutoZyConst := 0;
|
||||
AutoZyCount := 0;
|
||||
AutoToConst := 0;
|
||||
AutoToCount := 0;
|
||||
AutoToAnz := 0;
|
||||
AutoToMax := 0;
|
||||
AutoToAnzJmp := 0;
|
||||
AutoWait := 0;
|
||||
AutoChMerk := 0;
|
||||
AutoArt := 0;
|
||||
AutoCheckLn := false;
|
||||
AutoJmpPtr := 1;
|
||||
FillChar(AutoJmpRet,SizeOf(AutoJmpRet),0);
|
||||
Test := false;
|
||||
TestMerk := 0;
|
||||
Priv_Modus := false;
|
||||
RemAll := false;
|
||||
SysopParm := false;
|
||||
Priv_Errechnet := '';
|
||||
SysopStr := '';
|
||||
SysopArt := '';
|
||||
FillChar(StatZeile,SizeOf(StatZeile),0);
|
||||
Rekonnekt := false;
|
||||
Now_Msg_holen := true;
|
||||
MeldeCompZ := '';
|
||||
MeldeZeile := '';
|
||||
MldOk := 0;
|
||||
EigMail := false;
|
||||
MsgToMe := false;
|
||||
TNC_Puffer := false;
|
||||
NotPos := 0;
|
||||
Einer_st := false;
|
||||
for i := 1 to maxVorZeilen do stTX[i] := false;
|
||||
for i := 0 to 3 do PagesNot[i] := 0;
|
||||
PagesAnz := 0;
|
||||
BufPos := 0;
|
||||
BufExists := false;
|
||||
BufToLow := false;
|
||||
FillChar(Conv,SizeOf(Conv),0);
|
||||
RX_DatenPieps := false;
|
||||
User_Name := '';
|
||||
NeueZeilen := 0;
|
||||
ScrZlnMerk := 0;
|
||||
BoxZlnMerk := 0;
|
||||
with Mo do
|
||||
begin
|
||||
MonBeide := false;
|
||||
MonActive := false;
|
||||
MonDisAbr := false;
|
||||
MonHCall := false;
|
||||
MonStrict := false;
|
||||
MonSignal := false;
|
||||
MonIFr := true;
|
||||
MonUFr := false;
|
||||
MonLast := '';
|
||||
for i := 1 to 2 do
|
||||
begin
|
||||
MonNow[i] := false;
|
||||
MonStr[i] := '';
|
||||
MonFirst[i] := true;
|
||||
MonFrameNr[i] := 0;
|
||||
for i1 := 0 to 7 do MonCtrl[i][i1] := 0;
|
||||
end;
|
||||
end;
|
||||
QsoScroll := false;
|
||||
AutoBin := true;
|
||||
AutoBinOn := true;
|
||||
SPlus := true;
|
||||
Spl_COR_ERR := false;
|
||||
Ext_Poll := false;
|
||||
C_Poll := false;
|
||||
DieBoxPW := '';
|
||||
DBoxScaned := false;
|
||||
SysArt := 0;
|
||||
UserArt := 0;
|
||||
for i := 0 to maxSCon do SCon[i] := false;
|
||||
ChkLstOpen := false;
|
||||
FillChar(BoxStr,SizeOf(BoxStr),0);
|
||||
FillChar(Rubrik,SizeOf(Rubrik),0);
|
||||
FillChar(RunRub,SizeOf(RunRub),0);
|
||||
NewChkLst := 0;
|
||||
BoxScroll := false;
|
||||
ChecksSorted := false;
|
||||
PassRetry := 1;
|
||||
PassRight := 1;
|
||||
RxComp := false;
|
||||
TxComp := false;
|
||||
CompZeile := '';
|
||||
TncAkt := 0;
|
||||
TncNix := false;
|
||||
Kopieren := 0;
|
||||
KopierenFm:=0;
|
||||
WishBuf := false;
|
||||
NoCurJump := false;
|
||||
use_RomLw := false;
|
||||
SynchErrAnz := 0;
|
||||
GrtFlag := false;
|
||||
EigFlag := false;
|
||||
FileFlag := false;
|
||||
RemFlag := false;
|
||||
User_AutoPW:=false;
|
||||
user_komp:=0;
|
||||
End;
|
||||
End;
|
||||
|
||||
if Kanal = 99 then { globale Variablen intialisieren..(keine Kanalvariablen)}
|
||||
begin
|
||||
G^.ZeilenwTX := False;
|
||||
G^.StatusModus:=0;
|
||||
gotLastHr:=false;
|
||||
lminute:=61;
|
||||
ESC_Call:=false;
|
||||
Versi:='';
|
||||
Scan_:=false;
|
||||
MailInBox:=Mailsvorhanden;
|
||||
_OnAct:=false;
|
||||
for i := 1 to maxArrayTNC do TNC_used[i] := false;
|
||||
maxLink := 0;
|
||||
Tnc_Anzahl := 0;
|
||||
Mon_Anz := 0;
|
||||
MPort := 0;
|
||||
FirstA := false;
|
||||
QRT := false;
|
||||
FreiKanal := 0;
|
||||
show := 0;
|
||||
ShowMerk := 0;
|
||||
maxPath := 0;
|
||||
Unproto := 1;
|
||||
TopBox := true;
|
||||
NeuCall := '';
|
||||
RemoteCall := '';
|
||||
LastInfoCount := 0;
|
||||
LastInfoFlag := false;
|
||||
HistoryCount := 0;
|
||||
Del := false;
|
||||
FillChar(G^.Leer[1],80,B1);
|
||||
G^.Leer[0] := Chr(80);
|
||||
notScroll := false;
|
||||
ZeigeRET := false;
|
||||
Aufwaerts := false;
|
||||
for i := 7 to 15 do
|
||||
begin
|
||||
G^.Fstr[i] := '';
|
||||
G^.Fstx[i] := 1;
|
||||
end;
|
||||
FirstConCh := 1;
|
||||
ch_aus := false;
|
||||
DZeile := '';
|
||||
CNr := 0; { Anzahl Connects auf 0 setzen, danach Wert lesen }
|
||||
WBox := '';
|
||||
WCall := '';
|
||||
LaufZeit := 0;
|
||||
Poll := 0;
|
||||
PollTnr := 1;
|
||||
PollRate := 5;
|
||||
TNC_ReadOut := false;
|
||||
JumpRxScr := true;
|
||||
JumpRxZaehl := 5;
|
||||
Win_Rout := false;
|
||||
Win_Time := 5;
|
||||
Box_Time := 10;
|
||||
BoxZaehl := 10;
|
||||
NowCurBox := false;
|
||||
Priv_PassWord := '';
|
||||
D_Spalte := 1;
|
||||
Time_stamp := false;
|
||||
PacOut := false;
|
||||
Resync_Z := 0;
|
||||
Nodes_Change := false;
|
||||
Old_active_TNC := 0;
|
||||
Klingel := true;
|
||||
CtrlBeep := true;
|
||||
_VGA := false;
|
||||
ScreenSTBY := false;
|
||||
TNC_K := false;
|
||||
Ausgabe := true;
|
||||
NTimeOut := 30;
|
||||
VDisk := '';
|
||||
use_Vdisk := true;
|
||||
RomDisk := '';
|
||||
Rom_Exists := false;
|
||||
Print := false;
|
||||
for i := 1 to 4 do LPT_Base[i] := LPT_PORTs[i];
|
||||
LPT_vorhanden := false;
|
||||
PrtPort := 1;
|
||||
PrtFailure := false;
|
||||
morsen := false;
|
||||
MPause := 50;
|
||||
HardCur := false;
|
||||
Gross := true;
|
||||
minTncBuf := 200;
|
||||
maxTncBuf := minTncBuf - 50;
|
||||
NowFenster := false;
|
||||
ScrollVor := false;
|
||||
BlTon := false;
|
||||
XL := 0;
|
||||
XR := 0;
|
||||
ParmAnz := 0;
|
||||
ParmPos := 254;
|
||||
G^.DArt:=1;
|
||||
G^.C1_Ton := 800;
|
||||
G^.C1_TonTime := 100;
|
||||
G^.C2_Ton := 1200;
|
||||
G^.C2_TonTime := 100;
|
||||
G^.Alarm_Freq := 1200;
|
||||
G^.Alarm_Time := 20;
|
||||
G^.RxPiepFreq := 1300;
|
||||
G^.RxPiepTime := 50;
|
||||
G^.TxPiepFreq := 400;
|
||||
G^.TxPiepTime := 30;
|
||||
G^.RemPiepFreq := 600;
|
||||
G^.RemPiepTime := 400;
|
||||
G^.PopFreq := 1400;
|
||||
G^.PopFreqTime := 30;
|
||||
G^.CTRL_G_Freq := 880;
|
||||
G^.CTRL_G_Time := 80;
|
||||
G^.TonHoehe := 1300;
|
||||
G^.BLockAnfFreq := 700;
|
||||
G^.BLockEndFreq := 350;
|
||||
G^.BlockPiep1Time := 10;
|
||||
G^.BlockPiep2Time := 10;
|
||||
for i := 1 to 4 do NrStat[i] := i;
|
||||
Eig_Mail_Zeile := '';
|
||||
TNC_Halt := false;
|
||||
polling := true;
|
||||
IrqMask := 0;
|
||||
XCP := 1;
|
||||
Color := false;
|
||||
EMS_Pages_Ins := 0;
|
||||
File_Frame_max := 20;
|
||||
Pseudo := false;
|
||||
ConvHilfsPort := 0;
|
||||
ReconMorsen := false;
|
||||
ConMorsen := false;
|
||||
{ ReconVoice := false;
|
||||
ConVoice := false;}
|
||||
MonID := 1;
|
||||
ShTab_Pressed := false;
|
||||
Braille80 := false;
|
||||
ZeitArt := 'MEZ';
|
||||
ZeitDiff := 0;
|
||||
UseUTC := false;
|
||||
TagOver := false;
|
||||
ScreenInit := 5;
|
||||
GesamtNotCh := 0;
|
||||
GesamtVorCh := 0;
|
||||
PortStufe := 0;
|
||||
volle_Breite := false;
|
||||
Vor_im_EMS := false;
|
||||
use_EMS := false;
|
||||
use_XMS := false;
|
||||
Speek := false;
|
||||
VSpeed := 400;
|
||||
UeberNr := '';
|
||||
SwapXms := false;
|
||||
SwpHandle := 0;
|
||||
SizeHeap := 0;
|
||||
KeyDelay := 1;
|
||||
GlobalTrenn := false;
|
||||
BinOut := false;
|
||||
Ins := true;
|
||||
HighCol := false;
|
||||
Kbd := 0;
|
||||
TimeOut := 0;
|
||||
HD_was_Active := false;
|
||||
AnyConnect := false;
|
||||
SortMhNr := 3;
|
||||
Cursor_on := false;
|
||||
CurX := 1;
|
||||
CurY := 1;
|
||||
DateiInfo := 1;
|
||||
SSAV := 1;
|
||||
RTC := false;
|
||||
WishBoxLst := true;
|
||||
WishDXC := true;
|
||||
KillEsc := false;
|
||||
WCTRL := true;
|
||||
LogArt := 1;
|
||||
Upload := false;
|
||||
K_Record_on_Heap := false;
|
||||
QRT_Text := true;
|
||||
WeekDayStr := '';
|
||||
WochenTag := '';
|
||||
SynchError := false;
|
||||
OverRun := false;
|
||||
ColMon := 0;
|
||||
MonCode5 := false;
|
||||
HD_Read := 0;
|
||||
KStat := false;
|
||||
KStatTr := ' ';
|
||||
ZlnMerk := true;
|
||||
NoBinMon := true;
|
||||
RX_TX_Win := false;
|
||||
SplCountLines := false;
|
||||
BiosOut := false;
|
||||
MhKill := false;
|
||||
AltQFlag := false;
|
||||
HoldDXc := false;
|
||||
HoldDXcStr := '';
|
||||
G^.PromptStr := '#CALL# de #MCAL#>';
|
||||
G^.TabStr := ' ';
|
||||
maxMH := 25;
|
||||
KeyCheck := false;
|
||||
RecCheck := false;
|
||||
for i := 1 to 10 do G^.SETL[i] := 7;
|
||||
SETNr := 1;
|
||||
TicAnz := 0;
|
||||
ModMonFr := false;
|
||||
WeFlag := false;
|
||||
DirScroll := false;
|
||||
KeyOpt := 0;
|
||||
EraseChk := 0;
|
||||
LogChk := 0;
|
||||
SiAltD := false;
|
||||
SiAltK := false;
|
||||
TabFill := false;
|
||||
MoniStaAnz := 0;
|
||||
Idle := false;
|
||||
Idle_Pos := true;
|
||||
Idle_Anz := 10;
|
||||
Idle_Count := 0;
|
||||
Idle_Tout := 20;
|
||||
Idle_TCount := 0;
|
||||
Idle_TMerk := 0;
|
||||
DelayCor := 1;
|
||||
LockInt := false;
|
||||
BackUpProc:=false;
|
||||
BackUpLauf:=false;
|
||||
{$IFDEF Sound}
|
||||
WavStream:='';
|
||||
{$ENDIF}
|
||||
end;
|
||||
End;
|
277
XPKEY.PAS
Executable file
277
XPKEY.PAS
Executable file
@ -0,0 +1,277 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P K E Y . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die Tastaturabfrage ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure _ReadKey (* var SK : Sondertaste; var VC : char *);
|
||||
var Code,
|
||||
Scan : Byte;
|
||||
Shift : Boolean;
|
||||
|
||||
Procedure FunktionsTaste(cch: char);
|
||||
begin
|
||||
case cch of
|
||||
#59 : SK := _F1; #84 : SK := _ShF1; #94 : SK := _CtrlF1;
|
||||
#60 : SK := _F2; #85 : SK := _ShF2; #95 : SK := _CtrlF2;
|
||||
#61 : SK := _F3; #86 : SK := _ShF3; #96 : SK := _CtrlF3;
|
||||
#62 : SK := _F4; #87 : SK := _ShF4; #97 : SK := _CtrlF4;
|
||||
#63 : SK := _F5; #88 : SK := _ShF5; #98 : SK := _CtrlF5;
|
||||
#64 : SK := _F6; #89 : SK := _ShF6; #99 : SK := _CtrlF6;
|
||||
#65 : SK := _F7; #90 : SK := _ShF7; #100 : SK := _CtrlF7;
|
||||
#66 : SK := _F8; #91 : SK := _ShF8; #101 : SK := _CtrlF8;
|
||||
#67 : SK := _F9; #92 : SK := _ShF9; #102 : SK := _CtrlF9;
|
||||
#68 : SK := _F10; #93 : SK := _ShF10; #103 : SK := _CtrlF10;
|
||||
#133 : SK := _F11; #135 : SK := _ShF11; #137 : SK := _CtrlF11;
|
||||
#134 : SK := _F12; #136 : SK := _ShF12; #138 : SK := _CtrlF12;
|
||||
|
||||
#104 : SK := _AltF1; #120 : SK := _Alt1;
|
||||
#105 : SK := _AltF2; #121 : SK := _Alt2;
|
||||
#106 : SK := _AltF3; #122 : SK := _Alt3;
|
||||
#107 : SK := _AltF4; #123 : SK := _Alt4;
|
||||
#108 : SK := _AltF5; #124 : SK := _Alt5;
|
||||
#109 : SK := _AltF6; #125 : SK := _Alt6;
|
||||
#110 : SK := _AltF7; #126 : SK := _Alt7;
|
||||
#111 : SK := _AltF8; #127 : SK := _Alt8;
|
||||
#112 : SK := _AltF9; #128 : SK := _Alt9;
|
||||
#113 : SK := _AltF10; #129 : SK := _Alt0;
|
||||
#139 : SK := _AltF11;
|
||||
#140 : SK := _AltF12;
|
||||
|
||||
#16 : SK := _AltQ; #30 : SK := _AltA; #44 : SK := _AltZ;
|
||||
#17 : SK := _AltW; #31 : SK := _AltS; #45 : SK := _AltX;
|
||||
#18 : SK := _AltE; #32 : SK := _AltD; #46 : SK := _AltC;
|
||||
#19 : SK := _AltR; #33 : SK := _AltF; #47 : SK := _AltV;
|
||||
#20 : SK := _AltT; #34 : SK := _AltG; #48 : SK := _AltB;
|
||||
#21 : SK := _AltY; #35 : SK := _AltH; #49 : SK := _AltN;
|
||||
#22 : SK := _AltU; #36 : SK := _AltJ; #50 : SK := _AltM;
|
||||
#23 : SK := _AltI; #37 : SK := _AltK;
|
||||
#24 : SK := _AltO; #38 : SK := _AltL;
|
||||
#25 : SK := _AltP;
|
||||
|
||||
#71 : SK := _Home; #114 : SK := _CtrlPrtSc;
|
||||
#73 : SK := _PgUp; #115 : SK := _CtrlLeft;
|
||||
#79 : SK := _End; #116 : SK := _CtrlRight;
|
||||
#81 : SK := _PgDn; #117 : SK := _CtrlEnd;
|
||||
#82 : SK := _Ins; #118 : SK := _CtrlPgDn;
|
||||
#83 : SK := _Del; #119 : SK := _CtrlHome;
|
||||
#72 : SK := _Up; #132 : SK := _CtrlPgUp;
|
||||
#80 : SK := _Dn;
|
||||
#77 : SK := _Right;
|
||||
#75 : SK := _Left;
|
||||
#15 : SK := _ShTab;
|
||||
#76 : SK := _Fuenf;
|
||||
else SK := _Nix;
|
||||
end; { case }
|
||||
VC := cch;
|
||||
if Shift then
|
||||
begin
|
||||
case SK of
|
||||
_Left : SK := _ShLeft;
|
||||
_Right : SK := _ShRight;
|
||||
_Up : SK := _ShUp;
|
||||
_Dn : SK := _ShDn;
|
||||
_Ins : SK := _ShIns;
|
||||
_Del : SK := _ShDel;
|
||||
_Home : SK := _ShHome;
|
||||
_End : SK := _ShEnd;
|
||||
_PgUp : SK := _ShPgUp;
|
||||
_PgDn : SK := _ShPgDn;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
Begin
|
||||
if G^.Makro then MakroKey(SK,VC) else
|
||||
begin
|
||||
|
||||
{-------------------------------------------------------------|
|
||||
| Status liefert den Status der Sondertasten |
|
||||
+-------------------------------------------------------------|
|
||||
| Bit 0 = 1 : Rechte Shift-Taste gedr<64>ckt |
|
||||
| Bit 1 = 1 : Linke Shift-Taste gedr<64>ckt |
|
||||
| Bit 2 = 1 : Crtl-Taste gedr<64>ckt |
|
||||
| Bit 3 = 1 : Alt-Taste gedr<64>ckt |
|
||||
| Bit 4 = 1 : [Scroll Lock] gedr<64>ckt |
|
||||
| Bit 5 = 1 : [Num Lock] gedr<64>ckt |
|
||||
| Bit 6 = 1 : [Caps Lock] gedr<64>ckt |
|
||||
| Bit 7 = 1 : [Ins] gedr<64>ckt |
|
||||
+-------------------------------------------------------------}
|
||||
|
||||
|
||||
Case Kbd of
|
||||
0 : begin
|
||||
Repeat
|
||||
{ if OnlHelp then TNCs_pollen; }
|
||||
Until Key1A <> Key1C;
|
||||
code := TastPuffer[Key1A];
|
||||
scan := TastPuffer[Key1A+1];
|
||||
if Key1A + 2 > $3D then Key1A := $1E
|
||||
else Key1A := Key1A + 2;
|
||||
end;
|
||||
1 : begin
|
||||
asm
|
||||
mov ah, $10
|
||||
int $16
|
||||
mov code,al
|
||||
mov scan,ah
|
||||
end;
|
||||
end;
|
||||
2 : begin
|
||||
asm
|
||||
mov ah, $00
|
||||
int $16
|
||||
mov code,al
|
||||
mov scan,ah
|
||||
end;
|
||||
end;
|
||||
3 : begin
|
||||
asm
|
||||
mov ah,$07
|
||||
int $21
|
||||
mov code,al
|
||||
cmp code,0
|
||||
jnz @1
|
||||
mov ah,$07
|
||||
int $21
|
||||
mov scan,al
|
||||
@1:
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
if (code = $E0) and (scan > 0) then code := $00;
|
||||
if (code = $F0) and (scan > 0) then code := $00;
|
||||
VC := Chr(Code);
|
||||
Shift := (KeyStatus and 3) in [1..3];
|
||||
|
||||
if VC = #0 then FunktionsTaste(Chr(scan)) else
|
||||
begin
|
||||
case VC of
|
||||
M1 : SK := _Ret;
|
||||
^I : SK := _Tab;
|
||||
^H : SK := _Back;
|
||||
#27 : SK := _Esc;
|
||||
else SK := _Andere;
|
||||
end;
|
||||
|
||||
if Shift and (KeyOpt in [1,3]) then
|
||||
case VC of
|
||||
'1' : SK := _ShEnd;
|
||||
'2' : SK := _ShDn;
|
||||
'3' : SK := _ShPgDn;
|
||||
'4' : SK := _ShLeft;
|
||||
'6' : SK := _ShRight;
|
||||
'7' : SK := _ShHome;
|
||||
'8' : SK := _ShUp;
|
||||
'9' : SK := _ShPgUp;
|
||||
end;
|
||||
|
||||
if KeyOpt in [2,3] then
|
||||
case VC of
|
||||
'+': if scan = 78 then SK := _Plus;
|
||||
'-': if scan = 74 then SK := _Minus;
|
||||
'*': if scan = 55 then SK := _Star;
|
||||
'/': if scan = 53 then SK := _Slash;
|
||||
end;
|
||||
|
||||
end;
|
||||
if G^.MakroLearn then Makro_Erlernen(SK,VC);
|
||||
end;
|
||||
End;
|
||||
|
||||
Function _KeyPressed (* : Boolean *);
|
||||
Var w : Word;
|
||||
Begin
|
||||
Case Kbd of
|
||||
0 : _KeyPressed := Key1A <> Key1C;
|
||||
1 : begin
|
||||
asm
|
||||
mov ah, $11
|
||||
int $16
|
||||
pushf
|
||||
pop w
|
||||
and w, $40
|
||||
end;
|
||||
_KeyPressed := w = 0;
|
||||
end;
|
||||
2 : begin
|
||||
asm
|
||||
mov ah, $01
|
||||
int $16
|
||||
pushf
|
||||
pop w
|
||||
and w, $40
|
||||
end;
|
||||
_KeyPressed := w = 0;
|
||||
end;
|
||||
3 : _KeyPressed := KeyPressed;
|
||||
End;
|
||||
|
||||
if G^.Makro then _KeyPressed := true;
|
||||
End;
|
||||
|
||||
|
||||
Procedure MakroKey (* var SK : Sondertaste; var VC : char *);
|
||||
var Taste : Sondertaste;
|
||||
Flag : Boolean;
|
||||
|
||||
Procedure Init;
|
||||
Begin
|
||||
G^.Makro := false;
|
||||
G^.MakroZeile := '';
|
||||
SK := _Nix;
|
||||
VC := #255;
|
||||
End;
|
||||
|
||||
Begin
|
||||
if G^.MakroZeile = '' then MakroZeile_holen;
|
||||
if pos(S_ch+B1,G^.MakroZeile) = 1 then
|
||||
begin
|
||||
G^.MakroZeile := UpCaseStr(RestStr(G^.MakroZeile));
|
||||
Taste := _CtrlF1;
|
||||
Flag := false;
|
||||
While not Flag and (Taste <> _Key2) do
|
||||
begin
|
||||
if Key[Taste].Ta = G^.MakroZeile then
|
||||
begin
|
||||
SK := Taste;
|
||||
VC := Key[Taste].Ze;
|
||||
Flag := true;
|
||||
end;
|
||||
inc(Taste);
|
||||
end;
|
||||
|
||||
if not Flag then
|
||||
begin
|
||||
if (pos(CTRL,G^.MakroZeile) = 1) and (length(G^.MakroZeile) = 5) then
|
||||
begin
|
||||
VC := G^.MakroZeile[5];
|
||||
if VC in ['A'..'Z'] then
|
||||
begin
|
||||
VC := chr(ord(VC)-64);
|
||||
SK := _Andere;
|
||||
Flag := true;
|
||||
end;
|
||||
end;
|
||||
if not Flag then
|
||||
begin
|
||||
SK := _Nix;
|
||||
VC := #255;
|
||||
end;
|
||||
end;
|
||||
G^.MakroZeile := '';
|
||||
end else
|
||||
begin
|
||||
SK := _Andere;
|
||||
VC := G^.MakroZeile[1];
|
||||
delete(G^.MakroZeile,1,1);
|
||||
end;
|
||||
if G^.MakroFileEnd and (G^.MakroZeile = '') then MakroInit;
|
||||
End;
|
||||
|
3819
XPLIB1.PAS
Executable file
3819
XPLIB1.PAS
Executable file
File diff suppressed because it is too large
Load Diff
869
XPLINK.PAS
Executable file
869
XPLINK.PAS
Executable file
@ -0,0 +1,869 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P L I N K . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r den automatischen Connectaufbau ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Lnk_Sort (* Art : Byte *);
|
||||
Var x,i,j : Integer;
|
||||
Change : Boolean;
|
||||
Hilf : Lnk_Type;
|
||||
N : Word;
|
||||
Flag : Boolean;
|
||||
Hstr,
|
||||
Xstr : String[14];
|
||||
|
||||
Begin
|
||||
N := Lnk_Anz;
|
||||
|
||||
if N > 1 then
|
||||
begin
|
||||
x := 1;
|
||||
While x <= N do x := x * 3 + 1;
|
||||
x := x div 3;
|
||||
While x > 0 do
|
||||
begin
|
||||
i := x;
|
||||
While i <= N do
|
||||
begin
|
||||
j := i - x;
|
||||
Change := true;
|
||||
While (j > 0) and Change do
|
||||
begin
|
||||
case Art of
|
||||
1 : Flag := Lnk^[j].Ext;
|
||||
2 : Flag := CutStr(Lnk^[j].Entry) > CutStr(Lnk^[j+x].Entry);
|
||||
3 : Flag := RestStr(Lnk^[j].Entry) > RestStr(Lnk^[j+x].Entry);
|
||||
4 : Flag := length(RestStr(Lnk^[j].Entry)) >
|
||||
length(RestStr(Lnk^[j+x].Entry));
|
||||
else Flag := false;
|
||||
end;
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
move(Lnk^[j+x],Hilf,SizeOf(Lnk_Type));
|
||||
move(Lnk^[j],Lnk^[j+x],SizeOf(Lnk_Type));
|
||||
move(Hilf,Lnk^[j],SizeOf(Lnk_Type));
|
||||
j := j - x;
|
||||
end else Change := false;
|
||||
end;
|
||||
i := i + 1;
|
||||
end;
|
||||
x := x div 3;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Lnk_Init (* TNr : Byte; Freq : Str8 *);
|
||||
Var Hstr : String[80];
|
||||
VC : Char;
|
||||
Flag,
|
||||
Extr : Boolean;
|
||||
Begin
|
||||
Lnk_Anz := 0;
|
||||
FillChar(Lnk^,SizeOf(Lnk^),0);
|
||||
FiResult := ResetTxt(G^.LinkFile);
|
||||
|
||||
Flag := false;
|
||||
While not Eof(G^.LinkFile) and not Flag do
|
||||
begin
|
||||
Readln(G^.LinkFile,Hstr);
|
||||
KillEndBlanks(Hstr);
|
||||
Flag := (TncI + int_str(TNr) + DP + Freq) = Hstr;
|
||||
end;
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
Flag := false;
|
||||
Repeat
|
||||
Readln(G^.LinkFile,Hstr);
|
||||
if Hstr[0] > #0 then VC := Hstr[1]
|
||||
else VC := #0;
|
||||
|
||||
if VC in [B1,'ù'] then
|
||||
begin
|
||||
Extr := copy(Hstr,1,1) = 'ù';
|
||||
delete(Hstr,1,1);
|
||||
if Hstr > '' then
|
||||
begin
|
||||
inc(Lnk_Anz);
|
||||
if Lnk_Anz >= (maxLnk-1) then Flag := true;
|
||||
Lnk^[Lnk_Anz].Entry := Hstr;
|
||||
Lnk^[Lnk_Anz].Ext := Extr;
|
||||
end;
|
||||
end else Flag := true;
|
||||
Until Eof(G^.LinkFile) or Flag;
|
||||
end;
|
||||
FiResult := CloseTxt(G^.LinkFile);
|
||||
End;
|
||||
|
||||
|
||||
Procedure ALT_C_Connect (* Kanal : Byte *);
|
||||
Const Bofs = 1;
|
||||
Var TNr,
|
||||
i,i1,i2,
|
||||
Bpos : Byte;
|
||||
Dpos : Integer;
|
||||
w : Word;
|
||||
yM,
|
||||
Zmax,
|
||||
SSort : Byte;
|
||||
KeyTime : LongInt;
|
||||
OK,
|
||||
Flag,
|
||||
CurCON,
|
||||
AFlag,
|
||||
Fertig : Boolean;
|
||||
Hstr : String[80];
|
||||
Nstr,
|
||||
Astr,
|
||||
SuStr : String[9];
|
||||
Qstr : String[8];
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
|
||||
Procedure LnkPage(beg : Word);
|
||||
Var i : Byte;
|
||||
VC : Char;
|
||||
Begin
|
||||
Teil_Bild_Loesch(Bofs+1,maxZ-1,Attrib[2]);
|
||||
for i := 1 to Zmax do
|
||||
begin
|
||||
if Lnk^[beg-1+i].Ext then VC := 'ù'
|
||||
else VC := B1;
|
||||
WriteRam(1,i+Bofs,Attrib[2],0,EFillStr(80,B1,VC + Lnk^[beg-1+i].Entry));
|
||||
end;
|
||||
End;
|
||||
|
||||
Function GetLinkStr(Nr : Integer) : Str80;
|
||||
Var VC : Char;
|
||||
Begin
|
||||
if Lnk^[Nr].Ext then VC := 'ù'
|
||||
else VC := B1;
|
||||
GetLinkStr := EFillStr(80,B1,VC + Lnk^[Dpos].Entry);
|
||||
End;
|
||||
|
||||
Function GetStr_Con(Kanal : Byte; Zeile : Str80) : Str80;
|
||||
Var i : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
i := pos(RSK + Call + B1,Zeile + B1);
|
||||
if i > 0 then
|
||||
begin
|
||||
delete(Zeile,1,i-1);
|
||||
Zeile := RestStr(Zeile);
|
||||
While (pos(RSK,CutStr(Zeile)) = 0) and (length(Zeile) > 0) do
|
||||
Zeile := RestStr(Zeile);
|
||||
end;
|
||||
GetStr_Con := Zeile;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure WriteKopfzeilen;
|
||||
Begin
|
||||
WriteRam(1,1,Attrib[15],0,
|
||||
EFillStr(80,B1,B1+ TncI + int_str(TNr) + DP +
|
||||
EFillStr(20,B1,Qstr) + InfoZeile(140)));
|
||||
WriteRam(1,maxZ,Attrib[15],0,EFillStr(80,B1,B1+InfoZeile(2)));
|
||||
End;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
NowFenster := false;
|
||||
GetMem(Lnk,SizeOf(Lnk^));
|
||||
TNr := K[Kanal]^.TncNummer;
|
||||
Qstr := TNC[TNr]^.QRG_Akt;
|
||||
Lnk_Init(TNr,Qstr);
|
||||
GetMem(FreqList,SizeOf(FreqList^));
|
||||
|
||||
yM := 1;
|
||||
Bpos := 1;
|
||||
Dpos := 1;
|
||||
SSort := 0;
|
||||
|
||||
SuStr := '';
|
||||
Zmax := maxZ - (1 + Bofs);
|
||||
AFlag := false;
|
||||
Fertig := false;
|
||||
CurCON := true;
|
||||
|
||||
WriteKopfzeilen;
|
||||
|
||||
LnkPage(Dpos);
|
||||
WriteAttr(1,Bpos+Bofs,80,Attrib[4],0);
|
||||
KeyTime := TimerTick + 1;
|
||||
|
||||
Repeat
|
||||
if CurCON then InitCursor(1,Bpos+Bofs)
|
||||
else InitCursor(1,1);
|
||||
|
||||
if AFlag then VC := S_ch
|
||||
else VC := B1;
|
||||
|
||||
WriteRam(69,1,Attrib[15],0,VC + B1 + EFillStr(10,B1,SuStr));
|
||||
|
||||
Repeat
|
||||
if TimerTick > KeyTime then
|
||||
begin
|
||||
Hstr := GetConPfad(CutStr(Lnk^[Dpos].Entry));
|
||||
if connected then Hstr := GetStr_Con(Kanal,Hstr);
|
||||
WriteRam(12,Bofs+Bpos,Attrib[4],0,EFillStr(69,B1,Hstr));
|
||||
end;
|
||||
Until _KeyPressed;
|
||||
|
||||
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,GetLinkStr(Dpos));
|
||||
|
||||
_ReadKey(KC,VC);
|
||||
|
||||
KeyTime := TimerTick + 1;
|
||||
|
||||
|
||||
if KC <> _Andere then SuStr := '';
|
||||
|
||||
case KC of
|
||||
_Esc
|
||||
: Fertig := true;
|
||||
|
||||
_Del
|
||||
: begin
|
||||
Fertig := true;
|
||||
Auto_CON := false;
|
||||
ACZeile := '';
|
||||
end;
|
||||
|
||||
_Dn
|
||||
: if Dpos < Lnk_Anz then
|
||||
begin
|
||||
inc(Dpos);
|
||||
if Bpos < Zmax then inc(Bpos) else
|
||||
begin
|
||||
WriteAttr(1,Bofs+yM,80,Attrib[2],0);
|
||||
Scroll(Up,0,1+Bofs,Zmax+Bofs);
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,GetLinkStr(Dpos));
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_Up
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
dec(Dpos);
|
||||
if Bpos > 1 then dec(Bpos) else
|
||||
begin
|
||||
WriteAttr(1,Bofs+yM,80,Attrib[2],0);
|
||||
Scroll(Dn,0,1+Bofs,Zmax+Bofs);
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,GetLinkStr(Dpos));
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_PgDn
|
||||
: if Dpos < Lnk_Anz then
|
||||
begin
|
||||
if Dpos + Zmax - Bpos >= Lnk_Anz then
|
||||
begin
|
||||
Dpos := Lnk_Anz;
|
||||
Bpos := Zmax;
|
||||
if Bpos > Lnk_Anz then Bpos := Lnk_Anz;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos + Zmax - 1;
|
||||
if Dpos + Zmax - 1 > Lnk_Anz then Dpos := Lnk_Anz - Zmax + Bpos;
|
||||
LnkPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_PgUp
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
if Dpos <= Bpos then
|
||||
begin
|
||||
Dpos := 1;
|
||||
Bpos := 1;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos - Zmax + 1;
|
||||
if Dpos - Zmax + 1 < 1 then Dpos := Bpos;
|
||||
LnkPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_CtrlPgUp
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
Dpos := 1;
|
||||
Bpos := 1;
|
||||
LnkPage(1);
|
||||
end else Alarm;
|
||||
|
||||
_CtrlPgDn
|
||||
: if Dpos < Lnk_Anz then
|
||||
begin
|
||||
Dpos := Lnk_Anz;
|
||||
Bpos := Zmax;
|
||||
if Bpos > Lnk_Anz then Bpos := Lnk_Anz;
|
||||
LnkPage(Dpos - Bpos + 1);
|
||||
end else Alarm;
|
||||
|
||||
_CtrlHome
|
||||
: begin
|
||||
Dpos := Dpos - Bpos + 1;
|
||||
Bpos := 1;
|
||||
end;
|
||||
|
||||
_CtrlEnd
|
||||
: if Lnk_Anz < Zmax then
|
||||
begin
|
||||
Dpos := Lnk_Anz;
|
||||
Bpos := Lnk_Anz;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos + Zmax - Bpos;
|
||||
Bpos := Zmax;
|
||||
end;
|
||||
|
||||
_Right, _Left
|
||||
: begin
|
||||
FreqCount := 0;
|
||||
FillChar(FreqList^,SizeOf(FreqList^),0);
|
||||
FiResult := ResetTxt(G^.LinkFile);
|
||||
Repeat
|
||||
Readln(G^.LinkFile,Hstr);
|
||||
if (copy(Hstr,1,3) = TncI) and (copy(Hstr,5,1) = DP) then
|
||||
begin
|
||||
inc(FreqCount);
|
||||
FreqList^[FreqCount].TNr := str_int(copy(Hstr,4,1));
|
||||
delete(Hstr,1,5);
|
||||
Hstr := CutStr(Hstr);
|
||||
FreqList^[FreqCount].QRG := Hstr;
|
||||
end;
|
||||
Until Eof(G^.LinkFile);
|
||||
FiResult := CloseTxt(G^.LinkFile);
|
||||
|
||||
if FreqCount > 1 then
|
||||
begin
|
||||
FreqPos := 0;
|
||||
for i := 1 to FreqCount do
|
||||
begin
|
||||
if (TNr = FreqList^[i].TNr) and (Qstr = FreqList^[i].QRG)
|
||||
then FreqPos := i;
|
||||
end;
|
||||
if FreqPos = 0 then FreqPos := 1;
|
||||
if KC = _Right then
|
||||
begin
|
||||
inc(FreqPos);
|
||||
if FreqPos > FreqCount then FreqPos := 1;
|
||||
end else if KC = _Left then
|
||||
begin
|
||||
dec(FreqPos);
|
||||
if FreqPos < 1 then FreqPos := FreqCount;
|
||||
end;
|
||||
|
||||
TNr := FreqList^[FreqPos].TNr;
|
||||
Qstr := FreqList^[FreqPos].QRG;
|
||||
Lnk_Init(TNr,Qstr);
|
||||
Lnk_Sort(SSort);
|
||||
yM := 1;
|
||||
Bpos := 1;
|
||||
Dpos := 1;
|
||||
WriteKopfzeilen;
|
||||
LnkPage(Dpos);
|
||||
end;
|
||||
end;
|
||||
|
||||
_ShTab
|
||||
: CurCON := not CurCON;
|
||||
|
||||
_Ret
|
||||
: if (Lnk_Anz > 0) and
|
||||
not (Test or SplSave or Auto_CON or Mo.MonActive or
|
||||
FileSend {or Ignore} or {//db1ras}
|
||||
((SysArt in [1..4]) And connected)) then {//db1ras}
|
||||
begin
|
||||
ACZeile := GetConPfad(CutStr(Lnk^[Dpos].Entry));
|
||||
if connected then ACZeile := GetStr_Con(Kanal,ACZeile);
|
||||
if length(ACZeile) > 0 then
|
||||
begin
|
||||
Auto_CON := true;
|
||||
Hstr := GetConStr(ACZeile);
|
||||
if not connected then Connect(Kanal,Hstr)
|
||||
else S_PAC(Kanal,NU,true,Hstr + M1);
|
||||
Fertig := true;
|
||||
end else Alarm;
|
||||
end else Alarm;
|
||||
|
||||
_AltA
|
||||
: if (Lnk_Anz > 0) then
|
||||
begin
|
||||
AFlag := true;
|
||||
Lnk^[Dpos].Ext := not Lnk^[Dpos].Ext;
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,GetLinkStr(Dpos));
|
||||
end else Alarm;
|
||||
|
||||
_AltE
|
||||
: begin
|
||||
Cursor_ein;
|
||||
ExecDOS(Konfig.EditVerz + B1 + Sys1Pfad + LinkDatei);
|
||||
Cursor_aus;
|
||||
Lnk_Init(TNr,Qstr);
|
||||
Lnk_Sort(SSort);
|
||||
yM := 1;
|
||||
Bpos := 1;
|
||||
Dpos := 1;
|
||||
WriteKopfzeilen;
|
||||
LnkPage(Dpos);
|
||||
end;
|
||||
|
||||
_AltH
|
||||
: XP_Help(G^.OHelp[27]);
|
||||
|
||||
_AltL
|
||||
: if (Lnk_Anz > 0) then
|
||||
begin
|
||||
Hstr := GetConPfad(CutStr(Lnk^[Dpos].Entry));
|
||||
Hstr := copy(Hstr,1,68);
|
||||
GetString(Hstr,Attrib[4],68,12,Bofs+Bpos,KC,0,Ins);
|
||||
KillEndBlanks(Hstr);
|
||||
if KC = _Ret then
|
||||
begin
|
||||
AFlag := true;
|
||||
Lnk^[Dpos].Entry := EFillStr(10,B1,CutStr(Lnk^[Dpos].Entry)) + Hstr;
|
||||
LinkMod(Hstr);
|
||||
Lnk^[Dpos].Entry := EFillStr(10,B1,CutStr(Lnk^[Dpos].Entry)) + Hstr;
|
||||
end;
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,GetLinkStr(Dpos));
|
||||
end else Alarm;
|
||||
|
||||
_AltN
|
||||
: if (Lnk_Anz > 0) then
|
||||
begin
|
||||
Nstr := CutStr(Lnk^[Dpos].Entry);
|
||||
Astr := Nstr;
|
||||
|
||||
GetString(Nstr,Attrib[4],9,2,Bofs+Bpos,KC,0,Ins);
|
||||
While pos(B1,Nstr) > 0 do Nstr[pos(B1,Nstr)] := '-';
|
||||
KillEndBlanks(Nstr);
|
||||
if (KC = _Ret) and (Nstr > '') then
|
||||
begin
|
||||
AFlag := true;
|
||||
Lnk^[Dpos].Entry := EFillStr(10,B1,Nstr) +
|
||||
RestStr(Lnk^[Dpos].Entry);
|
||||
if (Astr > '') then for i := 1 to Lnk_Anz do
|
||||
begin
|
||||
Repeat
|
||||
i1 := pos(LSym+Astr,Lnk^[i].Entry);
|
||||
if i1 > 0 then
|
||||
begin
|
||||
Repeat
|
||||
delete(Lnk^[i].Entry,i1,1);
|
||||
Until (i1 > length(Lnk^[i].Entry)) or
|
||||
(Lnk^[i].Entry[i1] = B1);
|
||||
Insert(LSym+Nstr,Lnk^[i].Entry,i1);
|
||||
end;
|
||||
Until i1 = 0;
|
||||
end;
|
||||
end;
|
||||
LnkPage(Dpos - Bpos + 1);
|
||||
end else Alarm;
|
||||
|
||||
_AltS
|
||||
: if (Lnk_Anz > 0) then
|
||||
begin
|
||||
SaveLinks(Kanal,TNr,Qstr);
|
||||
AFlag := false;
|
||||
end else Alarm;
|
||||
|
||||
_Alt1.._Alt4
|
||||
: if (Lnk_Anz > 0) then
|
||||
begin
|
||||
case KC of
|
||||
_Alt1 : SSort := 1;
|
||||
_Alt2 : SSort := 2;
|
||||
_Alt3 : SSort := 3;
|
||||
_Alt4 : SSort := 4;
|
||||
end;
|
||||
Lnk_Sort(SSort);
|
||||
LnkPage(Dpos - Bpos + 1);
|
||||
end else Alarm;
|
||||
|
||||
_Andere
|
||||
: if (Lnk_Anz > 0) then
|
||||
begin
|
||||
SuStr := SuStr + UpCase(VC);
|
||||
w := 0;
|
||||
Flag := false;
|
||||
While (w < Lnk_Anz) and not Flag do
|
||||
begin
|
||||
inc(w);
|
||||
if pos(SuStr,Lnk^[w].Entry) = 1 then
|
||||
begin
|
||||
Flag := true;
|
||||
Dpos := w;
|
||||
if (Dpos < Bpos) or (Lnk_Anz <= Zmax) then Bpos := Dpos;
|
||||
if ((Lnk_Anz - Dpos + Bpos) < Zmax) and
|
||||
(Lnk_Anz > Zmax) and
|
||||
(Dpos > Bpos) then Bpos := Zmax - (Lnk_Anz - Dpos);
|
||||
end;
|
||||
end;
|
||||
|
||||
if not Flag then
|
||||
begin
|
||||
Alarm;
|
||||
SuStr := '';
|
||||
end else LnkPage(Dpos - Bpos + 1);
|
||||
end else Alarm;
|
||||
|
||||
else Alarm;
|
||||
end;
|
||||
|
||||
WriteAttr(1,Bofs+yM,80,Attrib[2],0);
|
||||
WriteAttr(1,Bofs+Bpos,80,Attrib[4],0);
|
||||
yM := Bpos;
|
||||
Until Fertig;
|
||||
|
||||
FreeMem(FreqList,SizeOf(FreqList^));
|
||||
FreeMem(Lnk,SizeOf(Lnk^));
|
||||
Neu_Bild;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Function GetConPfad (* Rufz : Str9) : String *);
|
||||
Const maxLoop = 30;
|
||||
|
||||
Var Hstr : String;
|
||||
Cstr : String[9];
|
||||
i,i1,
|
||||
Loop : Byte;
|
||||
FLoop : Boolean;
|
||||
|
||||
Function GetLink(Call : Str9) : String;
|
||||
Var i : Byte;
|
||||
Flag : Boolean;
|
||||
hlpst:str12;
|
||||
Begin
|
||||
i := 0;
|
||||
Call:=UpcaseStr(Call);
|
||||
Repeat
|
||||
inc(i);
|
||||
hlpst:=upcasestr(CutStr(Lnk^[i].Entry));
|
||||
Flag := Call = hlpst;
|
||||
Until (i = Lnk_Anz) or Flag;
|
||||
if Flag then GetLink := RestStr(Lnk^[i].Entry)
|
||||
else GetLink := '';
|
||||
End;
|
||||
|
||||
Begin
|
||||
Hstr := GetLink(Rufz);
|
||||
if Hstr > '' then
|
||||
begin
|
||||
Loop := 0;
|
||||
FLoop := false;
|
||||
While not Floop and (pos(LSym,Hstr) > 0) do
|
||||
begin
|
||||
i := pos(LSym,Hstr);
|
||||
delete(Hstr,i,2);
|
||||
Cstr := '';
|
||||
Repeat
|
||||
Cstr := Cstr + Hstr[i];
|
||||
delete(Hstr,i,1);
|
||||
Until (i > length(Hstr)) or (Hstr[i] = B1);
|
||||
Insert(GetLink(Cstr),Hstr,i);
|
||||
|
||||
inc(Loop);
|
||||
if Loop > maxLoop then FLoop := true;
|
||||
end;
|
||||
if FLoop then Hstr := '';
|
||||
GetConPfad := Hstr;
|
||||
end else GetConPfad := '';
|
||||
End;
|
||||
|
||||
|
||||
Function GetConStr (* var Zeile : String) : Str80 *);
|
||||
Var Hstr : String[80];
|
||||
Begin
|
||||
Hstr := '';
|
||||
Repeat
|
||||
Hstr := Hstr + CutStr(Zeile) + B1;
|
||||
While pos(RSK,Hstr) > 0 do Hstr[pos(RSK,Hstr)] := B1;
|
||||
Zeile := RestStr(Zeile);
|
||||
Until (pos(RSK,CutStr(Zeile)) > 0) or (Zeile = '');
|
||||
KillEndBlanks(Hstr);
|
||||
GetConStr := Hstr;
|
||||
End;
|
||||
|
||||
|
||||
Function LinkExists (* Name : Str9; var Gate : Byte) : Boolean *);
|
||||
var Flag,
|
||||
Find : Boolean;
|
||||
Hstr : String[9];
|
||||
Freq : String[8];
|
||||
i,
|
||||
CrNr : Byte;
|
||||
Begin
|
||||
Flag := false;
|
||||
Find := false;
|
||||
KillEndBlanks(Name);
|
||||
Freq := '';
|
||||
|
||||
FiResult := ResetTxt(G^.LinkFile);
|
||||
Repeat
|
||||
Readln(G^.LinkFile,DZeile);
|
||||
i := pos(DP,DZeile);
|
||||
if i = 5 then
|
||||
begin
|
||||
CrNr := str_int(copy(DZeile,4,1));
|
||||
delete(DZeile,1,i);
|
||||
Freq := CutStr(DZeile);
|
||||
i := 0;
|
||||
Repeat
|
||||
inc(i);
|
||||
Flag := (Freq = TNC[i]^.QRG_Akt) and (i = CrNr);
|
||||
Until Flag or (i >= TNC_Anzahl);
|
||||
end else if Flag and (copy(DZeile,1,1) = 'ù') then
|
||||
begin
|
||||
delete(DZeile,1,1);
|
||||
Hstr := UpcaseStr(CutStr(DZeile));
|
||||
Find := (Hstr = Name) and (Freq > '');
|
||||
end;
|
||||
Until Eof(G^.LinkFile) or Find;
|
||||
|
||||
if Find then
|
||||
begin
|
||||
i := 0;
|
||||
Repeat
|
||||
inc(i);
|
||||
Flag := (Freq = TNC[i]^.QRG_Akt) and (i = CrNr);
|
||||
Until Flag or (i >= TNC_Anzahl);
|
||||
Gate := i;
|
||||
end;
|
||||
|
||||
LinkExists := Find;
|
||||
FiResult := CloseTxt(G^.LinkFile);
|
||||
End;
|
||||
|
||||
|
||||
Procedure RemoteLnk (* Kanal,T : Byte; Zeile : Str9 *);
|
||||
Var Bstr,
|
||||
Hstr : String[80];
|
||||
Freq : String[8];
|
||||
LZ,
|
||||
Flag : Boolean;
|
||||
i,TNr : Byte;
|
||||
Begin
|
||||
Flag := false;
|
||||
LZ := length(Zeile) > 0;
|
||||
GetMem(Lnk,SizeOf(Lnk^));
|
||||
|
||||
S_PAC(Kanal,NU,false,M1 + B1 + InfoZeile(128) + M1 + ConstStr('-',75) + M1);
|
||||
|
||||
for TNr := 1 to TNC_Anzahl do
|
||||
begin
|
||||
Freq := TNC[TNr]^.QRG_Akt;
|
||||
Lnk_Init(TNr,Freq);
|
||||
Lnk_Sort(1);
|
||||
|
||||
for i := 1 to Lnk_Anz do
|
||||
begin
|
||||
if Lnk^[i].Ext and (not LZ or
|
||||
(LZ and (pos(Zeile,CutStr(Lnk^[i].Entry)) = 1))) then
|
||||
begin
|
||||
Hstr := CutStr(Lnk^[i].Entry);
|
||||
Bstr := GetConPfad(Hstr);
|
||||
Hstr := EFillStr(10,B1,Hstr);
|
||||
Hstr := B1 + Hstr + TncI + int_str(TNr) +
|
||||
DP + EFillStr(10,B1,Freq) + Bstr + M1;
|
||||
S_PAC(Kanal,NU,false,Hstr);
|
||||
Flag := true;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
FreeMem(Lnk,SizeOf(Lnk^));
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
if K[Kanal]^.TxLRet then Hstr := M1
|
||||
else Hstr := M2;
|
||||
Hstr := Hstr + InfoZeile(6) + M1;
|
||||
S_PAC(Kanal,NU,false,Hstr);
|
||||
end else S_PAC(Kanal,NU,false,M1 + InfoZeile(253) + M2);
|
||||
End;
|
||||
|
||||
|
||||
Procedure LinkMod (* var Zeile : Str80 *);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
i := 0;
|
||||
if Lnk_Anz > 0 then
|
||||
Repeat
|
||||
inc(i);
|
||||
i1 := pos(RestStr(Lnk^[i].Entry)+B1,Zeile+B1);
|
||||
if (i1 > 0) and (RestStr(Lnk^[i].Entry) <> Zeile) then
|
||||
begin
|
||||
delete(Zeile,i1,length(RestStr(Lnk^[i].Entry)));
|
||||
Insert(LSym+CutStr(Lnk^[i].Entry),Zeile,i1);
|
||||
i := 0;
|
||||
end;
|
||||
Until i >= Lnk_Anz;
|
||||
End;
|
||||
|
||||
|
||||
Procedure SaveLinks (* Kanal,TNr : Byte; Freq : Str8 *);
|
||||
Var i : Byte;
|
||||
f : Text;
|
||||
a,b : Integer;
|
||||
Old : String[12];
|
||||
Hstr : String[13];
|
||||
Lstr : String[80];
|
||||
VC : Char;
|
||||
First,
|
||||
Flag : Boolean;
|
||||
|
||||
Begin
|
||||
Hstr := TncI + int_str(TNr) + DP + Freq;
|
||||
|
||||
Old := ParmStr(1,Pkt ,LinkDatei) + 'OLD';
|
||||
a := 1;
|
||||
b := 0;
|
||||
File_Umbenennen(Sys1Pfad + LinkDatei,Sys1Pfad + Old,a,b);
|
||||
if a = 136 then
|
||||
begin
|
||||
Assign(f,Sys1Pfad + Old);
|
||||
FiResult := ResetTxt(f);
|
||||
FiResult := RewriteTxt(G^.LinkFile);
|
||||
|
||||
First := false;
|
||||
Repeat
|
||||
Readln(f,Lstr);
|
||||
KillEndBlanks(Lstr);
|
||||
Flag := Lstr = Hstr;
|
||||
if Lstr > '' then First := true;
|
||||
if not Flag and First then Writeln(G^.LinkFile,Lstr);
|
||||
Until Eof(f) or Flag;
|
||||
|
||||
if not Flag then for i := 1 to 2 do Writeln(G^.LinkFile);
|
||||
Writeln(G^.LinkFile,Hstr);
|
||||
|
||||
for i := 1 to Lnk_Anz do
|
||||
begin
|
||||
if Lnk^[i].Ext then VC := 'ù'
|
||||
else VC := B1;
|
||||
Writeln(G^.LinkFile,VC,EFillStr(10,B1,CutStr(Lnk^[i].Entry)),
|
||||
RestStr(Lnk^[i].Entry));
|
||||
end;
|
||||
|
||||
for i := 1 to 2 do Writeln(G^.LinkFile);
|
||||
|
||||
if Flag then
|
||||
Repeat
|
||||
Readln(f,Lstr);
|
||||
KillEndBlanks(Lstr);
|
||||
if Lstr[0] > #0 then VC := Lstr[1]
|
||||
else VC := #0;
|
||||
Flag := not(VC in [#0,B1,'ù']);
|
||||
Until Eof(f) or Flag;
|
||||
|
||||
if Flag then Writeln(G^.LinkFile,Lstr);
|
||||
|
||||
While not Eof(f) do
|
||||
begin
|
||||
Readln(f,Lstr);
|
||||
KillEndBlanks(Lstr);
|
||||
Writeln(G^.LinkFile,Lstr);
|
||||
end;
|
||||
|
||||
FiResult := CloseTxt(f);
|
||||
FiResult := EraseTxt(f);
|
||||
FiResult := CloseTxt(G^.LinkFile);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure LinkLearn (* Kanal : Byte; Zeile : Str80 *);
|
||||
Var i,
|
||||
TNr : Byte;
|
||||
Hstr : String[80];
|
||||
Flag : Boolean;
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
KillEndBlanks(Zeile);
|
||||
if Zeile > '' then
|
||||
begin
|
||||
GetMem(Lnk,SizeOf(Lnk^));
|
||||
TNr := K[Kanal]^.TncNummer;
|
||||
Lnk_Init(TNr,TNC[TNr]^.QRG_Akt);
|
||||
|
||||
LinkMod(Zeile);
|
||||
Hstr := Zeile;
|
||||
While pos(B1,Hstr) > 0 do delete(Hstr,1,pos(B1,Hstr));
|
||||
delete(Hstr,1,pos(RSK,Hstr));
|
||||
Repeat
|
||||
Flag := false;
|
||||
|
||||
G^.Fstr[7] := InfoZeile(236);
|
||||
G^.Fstr[9] := '"' + B1 + Zeile + B1 + '"';
|
||||
G^.Fstr[11] := B1 + InfoZeile(237);
|
||||
for i:=7 to 15 do
|
||||
G^.Fstx[i]:=2;
|
||||
Fenster(15);
|
||||
GetString(Hstr,Attrib[3],9,length(G^.Fstr[11])+3,11,KC,0,Ins);
|
||||
|
||||
if KC = _Ret then
|
||||
begin
|
||||
While pos(B1,Hstr) > 0 do Hstr[pos(B1,Hstr)] := '-';
|
||||
i := 0;
|
||||
Repeat
|
||||
inc(i);
|
||||
Flag := CutStr(Lnk^[i].Entry) = Hstr;
|
||||
Until Flag or (i >= Lnk_Anz);
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
G^.Fstr[13] := '"' + Hstr + '" ' + InfoZeile(238);
|
||||
G^.Fstr[15] := '"' + copy(RestStr(Lnk^[i].Entry),1,78) + '" ';
|
||||
SetzeCursor(pos('[',G^.Fstr[13])+1,13);
|
||||
Fenster(15);
|
||||
Alarm;
|
||||
_ReadKey(KC,VC);
|
||||
VC := UpCase(VC);
|
||||
if (VC in YesMenge) or (KC = _Ret) then
|
||||
begin
|
||||
Lnk^[i].Entry := EFillStr(10,B1,Hstr) + Zeile;
|
||||
end else
|
||||
begin
|
||||
Flag := false;
|
||||
G^.Fstr[14] := '';
|
||||
Hstr := '';
|
||||
KC := _Nix;
|
||||
end;
|
||||
Cursor_Aus;
|
||||
end else
|
||||
begin
|
||||
inc(Lnk_Anz);
|
||||
Lnk^[Lnk_Anz].Entry := EFillStr(10,B1,Hstr) + Zeile;
|
||||
Flag := true;
|
||||
end;
|
||||
end;
|
||||
Until Flag or (KC = _Esc);
|
||||
|
||||
if Flag then SaveLinks(Kanal,TNr,TNC[TNr]^.QRG_Akt);
|
||||
|
||||
FreeMem(Lnk,SizeOf(Lnk^));
|
||||
ClrFenster;
|
||||
Neu_Bild;
|
||||
end else InfoOut(Kanal,0,1,InfoZeile(239));
|
||||
end;
|
||||
End;
|
2065
XPLOAD.PAS
Executable file
2065
XPLOAD.PAS
Executable file
File diff suppressed because it is too large
Load Diff
280
XPLOG.PAS
Executable file
280
XPLOG.PAS
Executable file
@ -0,0 +1,280 @@
|
||||
(*
|
||||
Dieses Programm ist nicht von mir, sondern stammt von DL5FBD.
|
||||
Es dient zum Ausdruck der TOP-Logbuchdatei (LOG.TOP).
|
||||
Allerdings ist das Programm wenig getestet und muss gegebenfalls
|
||||
angepasst werden.
|
||||
*)
|
||||
|
||||
{LOGPRINT bietet folgende Moeglichkeiten:
|
||||
|
||||
1. Formattierter Druck von SP.LOG auf EPSON-komp. Druckern
|
||||
|
||||
Der Druck wird in Blaettern zu je 67 Zeilen formattiert und
|
||||
die 5 SP.LOG Kopfzeilen am Anfang jeder jedes Blatt ausgedruckt.
|
||||
|
||||
2. Anpositionieren einer gewuenschten Druckseite und Druck der
|
||||
Restdatei inklusiv dieser Seite.
|
||||
|
||||
|
||||
Der Aufruf ist:
|
||||
|
||||
LOGPRINT <Datei> fuer kompletten Ausdruck einer SP.LOG
|
||||
|
||||
LOGPRINT <Datei> (Druckseite) fuer Ausdruck ab Seite (Druckseite)
|
||||
|
||||
Sofern die Environmentvariable SPDIR gesetzt ist, wird SP.LOG in der darin de-
|
||||
finierten Directory gesucht. Ist SPDIR nicht gesetzt so wird in der aktuellen
|
||||
Directory gesucht.
|
||||
|
||||
73 de Gerd Michael}
|
||||
|
||||
|
||||
{-------------------------------------------------------------------------}
|
||||
{LOGPRINT 22.07.90 DL5FBD }
|
||||
{ }
|
||||
{Druckutility zum Ausdruck der SP.LOG Datei }
|
||||
{Erlaubt den Ausdruck von SP.LOG in Seiten formattiert wobei die }
|
||||
{Kopfzeilen am Anfang jeder Seite wiederholt werden. }
|
||||
{ }
|
||||
{Das Programm erlaubt die Positionierung auf eine gewuenschte Druckseite }
|
||||
{mittels eines Suchlaufs. }
|
||||
{ }
|
||||
{22.07.90 DL5FBD }
|
||||
{-------------------------------------------------------------------------}
|
||||
|
||||
Program LOGPRT;
|
||||
|
||||
USES Printer;
|
||||
|
||||
CONST TopOfForm = 0;
|
||||
TextFenster = 50;
|
||||
AnzKopfzeil = 3;
|
||||
unwichtig = 10;
|
||||
|
||||
VAR Datei : Text;
|
||||
Name : STRING[70];
|
||||
Seite : Word;
|
||||
Seiten : Word;
|
||||
Zeilen : Byte;
|
||||
I : Byte;
|
||||
Test : Integer;
|
||||
Zeile : String[140];
|
||||
Start : String[80];
|
||||
Ende : String[80];
|
||||
CRLF : String[2];
|
||||
SeitS : String[5];
|
||||
Fett : String[10];
|
||||
Normal : String[10];
|
||||
Kopfzeile : Array[1..5] of STRING;
|
||||
Formfeed : String[1];
|
||||
|
||||
|
||||
FUNCTION GetEnv (EnvVar : String) : String;
|
||||
|
||||
TYPE
|
||||
EnvPtr = Word;
|
||||
|
||||
VAR
|
||||
Enviro : ^EnvPtr;
|
||||
Offset : Word;
|
||||
I : Byte;
|
||||
S : String;
|
||||
|
||||
BEGIN
|
||||
GetEnv := '';
|
||||
IF Length(EnvVar) = 0 THEN Exit;
|
||||
FOR I := 1 TO Length(EnvVar) DO EnvVar[I] := UpCase(EnvVar[I]);
|
||||
EnvVar := EnvVar + '=';
|
||||
Enviro := Ptr(PrefixSeg,$2C);
|
||||
Offset := 0;
|
||||
S := '';
|
||||
Repeat
|
||||
S:='';
|
||||
|
||||
{Environmentstring komplett extrahieren}
|
||||
While Mem[Enviro^:Offset] > 0 DO
|
||||
BEGIN
|
||||
S := S+UpCase(Chr(Mem[Enviro^:Offset]));
|
||||
INC (Offset);
|
||||
END;
|
||||
|
||||
{Ist die Environmentvariable vorhanden ??}
|
||||
{Dann Zuweisungsteil holen und beenden !}
|
||||
IF (Pos(EnvVar,S) = 1) THEN
|
||||
BEGIN
|
||||
GetEnv := Copy(S,Pos('=',S)+1,Length(S));
|
||||
EXIT;
|
||||
END;
|
||||
|
||||
Inc(Offset);
|
||||
|
||||
{Endekennung Environmentvariablenbereich}
|
||||
Until (Mem[Enviro^:Offset] = 0)
|
||||
AND (Mem[Enviro^:Offset+1] = 1)
|
||||
AND (Mem[Enviro^:Offset+2] = 0);
|
||||
END;
|
||||
|
||||
|
||||
Function GetDIR(Pfad:String):String;
|
||||
|
||||
VAR Dummi :String[70];
|
||||
|
||||
BEGIN
|
||||
Dummi:=GetEnv(Pfad);
|
||||
IF LENGTH(Dummi) >0 THEN Dummi:=Dummi+'\';
|
||||
GETDIR:=Dummi;
|
||||
END;
|
||||
|
||||
|
||||
Procedure DefiniereDruckervariable;
|
||||
|
||||
Begin
|
||||
CRLF :=chr(13)+chr(10); {Zeilenabschluss CR+LF}
|
||||
Formfeed:=chr(12); {Seitenvorschub}
|
||||
Start :=chr(27)+'@'; {Drucker-Reset}
|
||||
{Start :=Start+chr(27)+chr(25)+'T'+'1';}{Druckbeginn Einzelblatteinzug Zeile 1}
|
||||
Start :=Start+chr(27)+chr(15); {Eliteschrift 96 Zeichen/Zeile}
|
||||
{Start :=Start+chr(27)+'l'+chr(1);} {Heftrand 1 Zeichen}
|
||||
Ende :=chr(27)+'@'; {Drucker-Reset}
|
||||
Fett :=chr(27)+'E'; {Fettschrift ein}
|
||||
Normal:=chr(27)+'F'; {Fettschrift aus}
|
||||
END;
|
||||
|
||||
|
||||
Procedure Druckstring(AusZeile :String);
|
||||
|
||||
VAR K :Byte;
|
||||
Z :CHAR;
|
||||
Begin
|
||||
|
||||
FOR K:=1 TO LENGTH(AusZeile) DO
|
||||
BEGIN
|
||||
Z:=AusZeile[K];
|
||||
Repeat
|
||||
{$I-} Write(LST,Z); {$I+}
|
||||
Until IOResult=0;
|
||||
END;
|
||||
END;
|
||||
|
||||
|
||||
Procedure DruckKopf;
|
||||
|
||||
Begin
|
||||
Begin
|
||||
DruckString(Fett+Name+' ');
|
||||
STR(Seite,SeitS);
|
||||
DruckString('Seite: '+SeitS+CRLF);
|
||||
Writeln(crlf,crlf);
|
||||
Writeln(Name+' Seite: '+SeitS);
|
||||
FOR I:=1 to AnzKopfZeil-1 DO
|
||||
BEGIN
|
||||
Druckstring(Kopfzeile[I]+CRLF);
|
||||
Writeln(Kopfzeile[I]);
|
||||
END;
|
||||
Druckstring(Normal);
|
||||
Zeilen:=AnzKopfZeil;
|
||||
END;
|
||||
END;
|
||||
|
||||
BEGIN
|
||||
|
||||
DefiniereDruckervariable;
|
||||
|
||||
IF ParamCount>=1 THEN Name:=ParamStr(1)
|
||||
ELSE
|
||||
BEGIN
|
||||
Writeln;
|
||||
Writeln('LOGPRINT - Formattierter Ausdruck der SP-Log-Datei');
|
||||
Writeln(' 22.07.90 DL5FBD');
|
||||
Writeln;
|
||||
Writeln('Aufruf: LOGPRINT <Dateiname> [Druckseite]');
|
||||
Writeln;
|
||||
Halt;
|
||||
END;
|
||||
|
||||
Assign(Datei,GETDIR('SPDIR')+Name);
|
||||
{$I-} Reset(Datei); {$I+}
|
||||
If IOResult<>0 THEN
|
||||
BEGIN
|
||||
Writeln;
|
||||
Writeln(GETDIR('SPDIR'),Name,' nicht gefunden!');
|
||||
Writeln;
|
||||
Halt;
|
||||
END;
|
||||
|
||||
FOR I:=1 to unwichtig DO Readln(Datei);
|
||||
FOR I:=1 to AnzKopfZeil-1 DO Readln(Datei,Kopfzeile[I]);
|
||||
|
||||
DruckString(Start);
|
||||
|
||||
IF ParamCount=2 THEN
|
||||
BEGIN
|
||||
Zeile:=ParamStr(2);
|
||||
VAL(Zeile,Seite,Test);
|
||||
IF Test <>0 THEN
|
||||
BEGIN
|
||||
Writeln;
|
||||
Writeln('Fehlerhafte Druckseitenangabe!');
|
||||
Writeln;
|
||||
Halt;
|
||||
END;
|
||||
Seite:=Seite-1
|
||||
END
|
||||
ELSE Seite:=0;
|
||||
|
||||
IF Seite>0 THEN
|
||||
BEGIN
|
||||
Seiten:=0;
|
||||
Writeln;
|
||||
Repeat
|
||||
INC(Seiten);
|
||||
Write('Positionierung steht auf Seite ',Seiten+1,CHR(13));
|
||||
Zeilen:=AnzKopfZeil;
|
||||
|
||||
Repeat
|
||||
Readln(Datei,Zeile);
|
||||
INC(Zeilen);
|
||||
Until (Eof(Datei)) OR (Zeilen=Textfenster);
|
||||
|
||||
Until Eof(Datei) OR (Seiten=Seite);
|
||||
|
||||
IF Eof(Datei) THEN
|
||||
BEGIN
|
||||
Writeln;
|
||||
Writeln('Fehlerabbruch! Das Ende der Logdatei wurde vor der');
|
||||
Writeln(' Leseposition der Druckseite erreicht!');
|
||||
Writeln;
|
||||
Halt;
|
||||
END;
|
||||
END;
|
||||
|
||||
Repeat { Druckschleife }
|
||||
|
||||
IF TopOfForm>0 THEN For I:=1 TO TopOfForm DO DruckString(CRLF);
|
||||
|
||||
INC(Seite);
|
||||
Zeilen:=0;
|
||||
|
||||
DruckKopf; {Kopfzeile bei Zusatzparametern}
|
||||
|
||||
Repeat { Seitenschleife }
|
||||
Readln(Datei,Zeile);
|
||||
Druckstring (Zeile);
|
||||
Druckstring (CRLF);
|
||||
Writeln(Zeile);
|
||||
INC(Zeilen);
|
||||
Until (Zeilen=TextFenster) OR Eof(Datei);
|
||||
|
||||
IF Zeilen=TextFenster THEN
|
||||
Begin
|
||||
Druckstring(Formfeed); { Seitenvorschub }
|
||||
End;
|
||||
|
||||
Until Eof(Datei);
|
||||
|
||||
Druckstring(Formfeed); { Seitenvorschub }
|
||||
|
||||
DruckString(Ende);
|
||||
|
||||
FiResult := CloseBin(Datei);
|
||||
END.
|
849
XPMAIL.PAS
Executable file
849
XPMAIL.PAS
Executable file
@ -0,0 +1,849 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P M A I L . P A S ³
|
||||
³ ³
|
||||
³ Mailpolling-Routinen (Pseudo-Forward) ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
Function GetS_Con(Kanal : Byte; Zeile : Str80) : Str80;
|
||||
Var i : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
i := pos(RSK + Call + B1,Zeile + B1);
|
||||
if i > 0 then
|
||||
begin
|
||||
delete(Zeile,1,i-1);
|
||||
Zeile := RestStr(Zeile);
|
||||
While (pos(RSK,CutStr(Zeile)) = 0) and (length(Zeile) > 0) do
|
||||
Zeile := RestStr(Zeile);
|
||||
end;
|
||||
GetS_Con := Zeile;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure Link_Holen (* Var TNr : Byte; Var Port : Byte; Var CString : Str80 *);
|
||||
Var ConStr, Hstr : String[80];
|
||||
QRG, Call : Str10;
|
||||
VC : Char;
|
||||
Flag,
|
||||
Extr : Boolean;
|
||||
Begin
|
||||
FiResult := ResetTxt(G^.LinkFile);
|
||||
if FiResult=0 then
|
||||
begin
|
||||
Flag := false;
|
||||
While not Eof(G^.LinkFile) and not Flag do
|
||||
begin
|
||||
Readln(G^.LinkFile,Hstr);
|
||||
if (Pos(TncI,Hstr)=1) and (Pos(DP, Hstr)=5) then
|
||||
begin
|
||||
Port:=str_int(Copy(Hstr,4,1));
|
||||
QRG:=copy(Hstr,6,length(Hstr));
|
||||
end;
|
||||
delete(hstr,1,1);
|
||||
KillEndBlanks(Hstr);
|
||||
Call:=copy(HStr,1,pos(B1,hstr)-1);
|
||||
Flag:= upcasestr(Cstring)=upcaseStr(Call);
|
||||
(* Flag := (TncI + int_str(TNr) + DP + Freq) = Hstr; *)
|
||||
end;
|
||||
end;
|
||||
CString:='';
|
||||
FiResult := CloseTxt(G^.LinkFile);
|
||||
if flag then
|
||||
begin
|
||||
LinksVorbereiten(Port,QRG);
|
||||
CString:=GetConPfad(Call);
|
||||
LinksKillen;
|
||||
end;
|
||||
{ KillStartBlanks(Cstring);}
|
||||
End;
|
||||
|
||||
Function NextPollCmd : string;
|
||||
var HStr:string;
|
||||
begin
|
||||
HStr:='';
|
||||
if Pos(';', MailPolling)>0 then
|
||||
begin
|
||||
Hstr:=copy (Mailpolling,1,Pos(';',MailPolling)-1);
|
||||
Delete(MailPolling,1,Pos(';',MailPolling));
|
||||
end else
|
||||
begin
|
||||
Hstr:=MailPolling;
|
||||
MailPolling:='';
|
||||
end;
|
||||
NextPollCmd:=HStr;
|
||||
{Lesebefehl VORHER mit *+* markiert!}
|
||||
end;
|
||||
|
||||
procedure MailSchliessen(*Kanal:Byte*);
|
||||
var dum:boolean;
|
||||
begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
CloseRxFile(Kanal,0);
|
||||
RX_Save := false;
|
||||
BoxZaehl:=5;
|
||||
RX_Bin := 0;
|
||||
RemoteSave := false;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CancelMailPoll (*Kanal:Byte*);
|
||||
begin
|
||||
PollStr:='';
|
||||
with K[kanal]^ do
|
||||
begin
|
||||
fwdgo:=false;
|
||||
fwd:=false;
|
||||
fwd_:=false;
|
||||
MailPolling:='';
|
||||
MailPrompt:='';
|
||||
MailRXCall:='';
|
||||
MailSynonym:='';
|
||||
MailSchliessen(Kanal);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
Procedure MailOeffnen(Kanal:Byte);
|
||||
var path, dummy : string;
|
||||
begin
|
||||
With K[Kanal]^ do
|
||||
begin
|
||||
Path := Konfig.MailVerz + MailRXCall + MsgExt;
|
||||
MsgToMe:=true;
|
||||
EigMail:=true;
|
||||
FRxName := Path;
|
||||
if OpenTextFile(Kanal) then
|
||||
begin
|
||||
RX_Count := 0;
|
||||
RX_TextZn := 0;
|
||||
RX_Laenge := 0;
|
||||
RX_Bin := 1;
|
||||
RX_Time := Uhrzeit;
|
||||
RX_Save := true;
|
||||
if node then Mail_sp:=true;
|
||||
RemoteSave := true;
|
||||
Dummy := M1 + InfoZeile(96) + B1+ EFillStr(10,B1,Call) +
|
||||
Datum + B2 + copy(Uhrzeit,1,5) + B1 + ZeitArt + M1;
|
||||
Dummy := Dummy + ConstStr('-',length(Dummy)) + M1;
|
||||
Write_RxFile(Kanal,Dummy);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure StartMailPolling (*(Kanal, RXCall)*);
|
||||
var path,
|
||||
dummy : String;
|
||||
Link,hstr : Str80;
|
||||
i,Port : byte;
|
||||
found,
|
||||
flag:boolean;
|
||||
CStr,
|
||||
Pstr: str10;
|
||||
User2 : User_Typ2;
|
||||
USeidx: User_idx;
|
||||
UsFile: file of user_typ2;
|
||||
USIdx : file of User_IDX;
|
||||
obf:integer;
|
||||
begin
|
||||
found:=false;
|
||||
MailPolling:='';
|
||||
Link:=rxcall;
|
||||
PStr:=RxCall;
|
||||
|
||||
if MailSynonym<>'' then Link:=MailSynonym
|
||||
else
|
||||
if not MailAusUDB then begin
|
||||
{$I-}
|
||||
assign(UsIDX, Sys1Pfad+UserIDX);
|
||||
reset(USIDX);
|
||||
obf:=ioresult;
|
||||
if obf=0 then
|
||||
begin
|
||||
Repeat
|
||||
read(UsIDX, USeIDX);
|
||||
CStr := USeidx.Call;
|
||||
Strip(CStr);
|
||||
found := cstr=PStr;
|
||||
until (Found) or (EOF(UsIDX));
|
||||
close(UsIDX);
|
||||
end;
|
||||
if found then
|
||||
begin
|
||||
assign(UsFile, Sys1Pfad+UserDatei);
|
||||
reset(UsFile);
|
||||
seek(UsFile, UseIDX.Pos);
|
||||
read(usfile, User2);
|
||||
close(usfile);
|
||||
obf:=ioresult;
|
||||
if user2.synonym<>'' then Link:=user2.Synonym;
|
||||
end;
|
||||
{$I+}
|
||||
end;
|
||||
MailSynonym:='';
|
||||
MailAusUDB:=false;
|
||||
Link_Holen(Port,Link);
|
||||
flag:=false;
|
||||
i:=0;
|
||||
repeat
|
||||
inc(i);
|
||||
if K[i]^.TNCNummer=Port then flag:=not K[i]^.connected;
|
||||
until flag;
|
||||
Kanal:=i;
|
||||
if Flag then
|
||||
begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
ACZeile:=link;
|
||||
{if connected then ACZeile := GetS_Con(Kanal,ACZeile);}
|
||||
if length(ACZeile) > 0 then
|
||||
begin
|
||||
fwd:=true;
|
||||
fwd_:=true;
|
||||
Auto_CON := true;
|
||||
Hstr := GetConStr(ACZeile);
|
||||
if not connected then Connect(Kanal,Hstr)
|
||||
else S_PAC(Kanal,NU,true,Hstr + M1);
|
||||
end;
|
||||
end;
|
||||
end; {if flag}
|
||||
end;
|
||||
|
||||
procedure LinksVorbereiten(*Port:byte;QRG:Str10*);
|
||||
begin
|
||||
GetMem(Lnk,SizeOf(Lnk^));
|
||||
Lnk_Init(Port,QRG);
|
||||
end;
|
||||
|
||||
|
||||
Procedure LinksKillen;
|
||||
begin
|
||||
FreeMem(Lnk,SizeOf(Lnk^));
|
||||
end;
|
||||
|
||||
Procedure MailPollGo (*Kanal : byte*);
|
||||
var HStr:string;
|
||||
SStr:string;
|
||||
MPTyp:byte;
|
||||
Flag : Boolean;
|
||||
begin
|
||||
if MailPolling='' then
|
||||
begin
|
||||
if MailBoxCall<>'' then MailKillen (MailBoxCall, MailRXCall, 0);
|
||||
MailBoxCall:='';
|
||||
MailRXCall:='';
|
||||
NFwd:=false;
|
||||
end
|
||||
else NFwd:=true;
|
||||
if MailPWWait then Sysop_Einloggen(Kanal,'');
|
||||
if not MailPWWait then
|
||||
begin
|
||||
with K[kanal]^ do
|
||||
begin
|
||||
MailPrompt:='';
|
||||
hstr:=UpcaseStr(NextPollCmd);
|
||||
KillEndBlanks(Hstr);
|
||||
MPTyp:=0;
|
||||
flag:=true;
|
||||
repeat
|
||||
inc(MpTyp);
|
||||
flag:=Hstr=MailPollC[MPTyp];
|
||||
until (flag) or (MPTyp=MaxMailPollCmd);
|
||||
if (not flag) then MPtyp:=0;
|
||||
SStr:='';
|
||||
case MPTyp of
|
||||
1:MailPrompt:=UpcaseStr(MailPrompt_);
|
||||
2: begin
|
||||
SStr:=#13;
|
||||
_aus(Attrib[19],Kanal,m1);
|
||||
end;
|
||||
3:SStr:=MailRXCall;
|
||||
4: begin
|
||||
Sysop_Einloggen(Kanal,'');
|
||||
MailPWWait:=true;
|
||||
end;
|
||||
5: begin
|
||||
MailPrompt:=UpcaseStr(MailPWPrompt_);
|
||||
MailPWWait:=true;
|
||||
end;
|
||||
end;
|
||||
if MPTyp=0 then
|
||||
begin
|
||||
if pos('*+*',HStr)=1 then
|
||||
begin
|
||||
MailOeffnen(Kanal);
|
||||
delete(HStr,1,3);
|
||||
end;
|
||||
if pos('+*+',HStr)=1 then
|
||||
begin
|
||||
{ MailSchliessen(Kanal);}
|
||||
delete(HStr,1,3);
|
||||
end;
|
||||
SStr:=Hstr;
|
||||
end;
|
||||
if SSTr<>'' then
|
||||
begin
|
||||
infoout(Kanal,0,0,SSTr);
|
||||
sstr:=sstr+m1;
|
||||
S_Pac(Kanal,NU,true,SStr);
|
||||
enD;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{****************************************}
|
||||
|
||||
Function OpenMailDatei (var MFile:MailDat) : word;
|
||||
begin
|
||||
{$I-}
|
||||
assign(MFile, sys1pfad+MailsDatei);
|
||||
reset(MFile);
|
||||
OpenMailDatei:=IoResult;
|
||||
{$I+}
|
||||
end;
|
||||
|
||||
Function CloseMailDatei (var MFile:MailDat) : word;
|
||||
begin
|
||||
{$I-}
|
||||
Close(MFile);
|
||||
CloseMailDatei:=IoResult;
|
||||
{$I+}
|
||||
end;
|
||||
|
||||
|
||||
procedure GetMails;
|
||||
var mfile:Maildat;
|
||||
i:integer;
|
||||
begin
|
||||
i:=OpenMailDatei(mfile);
|
||||
if i=0 then MailAnz:=FileSize(MFile);
|
||||
i:=CloseMailDatei(Mfile);
|
||||
end;
|
||||
|
||||
Procedure MailsSortieren;
|
||||
Var x,i,j : longInt;
|
||||
N : longint;
|
||||
Change : Boolean;
|
||||
MFile : MailDat;
|
||||
MTyp, MTyp1, MTyp2, MTyp3 : Mail_Typ;
|
||||
|
||||
Begin
|
||||
{if inUDB then WriteRam(1,3,Attrib[5],1,EFillStr(80,B1,B1+'Sortiere Datenbank ...'));}
|
||||
GetMails;
|
||||
i:=OpenMailDatei(MFile);
|
||||
N := MailAnz;
|
||||
if N > 1 then
|
||||
begin
|
||||
x := 1;
|
||||
While x <= N do x := x * 3 + 1;
|
||||
x := x div 3;
|
||||
While x > 0 do
|
||||
begin
|
||||
i := x;
|
||||
While i <= N do
|
||||
begin
|
||||
j := i - x;
|
||||
Change := true;
|
||||
While (j > 0) and Change do
|
||||
begin
|
||||
Seek(MFile, j-1); read(MFile, MTyp1);
|
||||
Seek(MFile, j+x-1); read(MFile, MTyp2);
|
||||
if MTyp1.Boxcall > MTyp.BoxCall then
|
||||
begin
|
||||
MTyp3 := MTyp2;
|
||||
MTyp2 := MTyp1;
|
||||
MTyp1 := MTyp3;
|
||||
Seek(MFile, j-1); write(MFile, MTyp1);
|
||||
Seek(MFile, j+x-1); write(MFile, Mtyp2);
|
||||
j := j - x;
|
||||
end else Change := false;
|
||||
end;
|
||||
i := i + 1;
|
||||
end;
|
||||
x := x div 3;
|
||||
end;
|
||||
end;
|
||||
|
||||
{$I-}
|
||||
i:=closeMailDatei(MFile);
|
||||
{$I+}
|
||||
End;
|
||||
|
||||
Function MailsVorhanden (* : Boolean *);
|
||||
var Anz:longint;
|
||||
check:word;
|
||||
MFile : MailDat;
|
||||
flag:boolean;
|
||||
begin
|
||||
flag:=false;
|
||||
if OpenMailDatei(MFile)=0 then
|
||||
begin
|
||||
anz:=FileSize(Mfile);
|
||||
if Anz>0 then flag:=true;
|
||||
check:=CloseMailDatei(MFile);
|
||||
end;
|
||||
MailsVorhanden:=flag;
|
||||
end;
|
||||
|
||||
Procedure MailVersucheRauf;
|
||||
var MFile : MailDat;
|
||||
MTyp : Mail_Typ;
|
||||
i : longint;
|
||||
begin
|
||||
i:=0;
|
||||
if OpenMailDatei(MFile)=0 then
|
||||
begin
|
||||
if FileSize(MFile)>0 then
|
||||
begin
|
||||
seek(MFile, DPos-1);
|
||||
read(MFile, MTyp);
|
||||
if MTyp.Versuche<255 then inc(MTyp.Versuche);
|
||||
seek(MFile, DPos-1);
|
||||
write(MFile, MTyp);
|
||||
end;
|
||||
i:=CloseMailDatei(MFile);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
Procedure MailKillen (*Box, RX:Str10; DPos : longint*);
|
||||
VAR Killed : Boolean;
|
||||
i:word;
|
||||
MFile : MailDat;
|
||||
MTyp : Mail_Typ;
|
||||
Max,
|
||||
Lesen,
|
||||
schreiben : Longint;
|
||||
|
||||
begin
|
||||
lesen:=0;
|
||||
schreiben:=0;
|
||||
Killed:=false;
|
||||
if DPOS=0 then
|
||||
begin
|
||||
if OpenMailDatei(MFile)=0 then
|
||||
begin
|
||||
Max:=FileSize(Mfile);
|
||||
while (not EOF(MFile)) and (lesen<Max) do
|
||||
begin
|
||||
seek(MFile,lesen);
|
||||
read(MFile, MTyp);
|
||||
inc (Lesen);
|
||||
if (MTyp.BoxCall=Box) and (Mtyp.ZielCall=RX) and (not Killed) then
|
||||
begin
|
||||
Killed:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
seek (MFile,Schreiben);
|
||||
write(MFile, Mtyp);
|
||||
inc(Schreiben);
|
||||
end;
|
||||
end; {while not eof}
|
||||
seek (MFile,Schreiben);
|
||||
Truncate(MFile);
|
||||
i:=CloseMailDatei(MFile);
|
||||
end; {if openmail}
|
||||
end;
|
||||
if DPOS>0 then
|
||||
begin
|
||||
if OpenMailDatei(MFile)=0 then
|
||||
begin
|
||||
Max:=FileSize(Mfile);
|
||||
while (not EOF(MFile)) and (lesen<Max) do
|
||||
begin
|
||||
seek(MFile,lesen);
|
||||
read(MFile, MTyp);
|
||||
inc (Lesen);
|
||||
if (LESEN=Dpos) and (not Killed) then
|
||||
begin
|
||||
Killed:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
seek (MFile,Schreiben);
|
||||
write(MFile, Mtyp);
|
||||
inc(Schreiben);
|
||||
end;
|
||||
end; {while not eof}
|
||||
seek (MFile,Schreiben);
|
||||
Truncate(MFile);
|
||||
i:=CloseMailDatei(MFile);
|
||||
end; {if openmail}
|
||||
end;
|
||||
MailInBox:=Mailsvorhanden;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
Procedure MailSpeichern (* Mail : Mail_typ *);
|
||||
var i: longint;
|
||||
MFile: Maildat;
|
||||
MDat,
|
||||
MDatH : Mail_typ;
|
||||
Flag : boolean; {gespeichert?}
|
||||
|
||||
begin
|
||||
flag:=false;
|
||||
{$i-}
|
||||
i:=-1;
|
||||
if OpenMailDatei(Mfile)=0 then
|
||||
begin
|
||||
While (not EOF(MFile)) and (not Flag) do
|
||||
begin
|
||||
inc(i);
|
||||
Read(MFile, MDat);
|
||||
if (MDat.BoxCall=Mail.BoxCall) and (MDat.ZielCall=Mail.ZielCall) then
|
||||
begin
|
||||
MDat.Datum:=Mail.Datum;
|
||||
MDat.Uhrzeit:=Mail.Uhrzeit;
|
||||
MDat.Port:=Mail.Port;
|
||||
Seek(MFile,i);
|
||||
Write(MFile,MDat);
|
||||
Flag:=true;
|
||||
end;
|
||||
end;
|
||||
end else REwrite(MFile); {if ioresult}
|
||||
if not Flag then write(MFile, Mail);
|
||||
i:=closeMailDatei(Mfile);
|
||||
{$i+}
|
||||
end;
|
||||
|
||||
Procedure MDatensatzHolen (Nr: longint; VAR Md:Mail_typ);
|
||||
var MFile : MailDat;
|
||||
i:word;
|
||||
begin
|
||||
i:=OpenMailDatei(MFile);
|
||||
if i=0 then
|
||||
begin
|
||||
seek(Mfile, Nr-1);
|
||||
read(Mfile, MD);
|
||||
end;
|
||||
i:=closeMailDatei(Mfile);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
Function MarkMailStr(Nr : longint; Sp : Byte) : Str80;
|
||||
var UDummy : String[14];
|
||||
MUS : String[80];
|
||||
MDat : Mail_typ;
|
||||
|
||||
Begin
|
||||
if Nr>MailAnz then MarkMailStr :=''
|
||||
else
|
||||
begin
|
||||
MDatensatzHolen(nr, MDat);
|
||||
if nr>-1 then
|
||||
With Mdat do
|
||||
begin
|
||||
MUS := EfillStr(12,B1,BoxCall);
|
||||
MUS:=MUS+Efillstr(12,B1,ZielCall);
|
||||
MUS:=MUS+Efillstr(14,B1,Datum);
|
||||
MUS:=MUS+EfillStr(11,B1,Uhrzeit);
|
||||
MUS:=MUS+EfillStr(7,B1,Int_Str(Versuche));
|
||||
MUS:=MUS+EfillStr(2,B1,int_str(Port));
|
||||
MarkMailStr:=MUS;
|
||||
end;
|
||||
end;
|
||||
|
||||
End;
|
||||
|
||||
Function BoxCall (DP : longint) : str9;
|
||||
var md:mail_typ;
|
||||
begin
|
||||
MDatenSatzHolen(DP,Md);
|
||||
BoxCall:=Md.BoxCall;
|
||||
MailRXCall:=MD.ZielCall;
|
||||
MailBoxCall:=MD.BoxCall;
|
||||
end;
|
||||
|
||||
Procedure MailsZeigen (* Kanal : Byte *);
|
||||
Const Bofs = 1;
|
||||
Var X : longint;
|
||||
yM,
|
||||
Bpos,
|
||||
Zmax : Byte;
|
||||
fz:file;
|
||||
NeuDpos,
|
||||
SavDpos,
|
||||
Dpos : longint;
|
||||
w,w1,
|
||||
AnzM,
|
||||
Result : longint;
|
||||
Flag,
|
||||
Fertig : Boolean;
|
||||
KC : Sondertaste;
|
||||
VC,
|
||||
VA : Char;
|
||||
f : Text;
|
||||
Hstr,
|
||||
Sstr,
|
||||
Pfad,
|
||||
XPfad : String[80];
|
||||
MHelp : Mail_typ;
|
||||
|
||||
|
||||
|
||||
Procedure DirPage(beg : Longint);
|
||||
Var i : Byte;
|
||||
Begin
|
||||
for i := 1 to Zmax do WriteRam(1,i+Bofs,Attrib[2],1,EFillStr(80,B1,MarkMailStr(beg-1+i,1)));
|
||||
|
||||
WriteRam(1,maxZ,Attrib[5],1,EFillStr(80,B1,B1+InfoZeile(49)));
|
||||
End;
|
||||
|
||||
Procedure WartenSchirm;
|
||||
Var i : Byte;
|
||||
Begin
|
||||
WriteRam(1,1,Attrib[5],1,EFillStr(80,B1,InfoZeile(47)));
|
||||
for i := 1 to Zmax do WriteRam(1,i+1,Attrib[2],1,EFillStr(80,B1,' '));
|
||||
|
||||
WriteRam(1,3,Attrib[5],1,EFillStr(80,B1,B1+InfoZeile(230)));
|
||||
WriteRam(1,maxZ-1,Attrib[5],1,EFillStr(80,B1,InfoZeile(48)) );
|
||||
WriteRam(1,maxZ,Attrib[5],1,EFillStr(80,B1,B1+InfoZeile(49)));
|
||||
End;
|
||||
|
||||
Procedure GetCursorLine;
|
||||
Begin
|
||||
WriteRam(1,Bpos+Bofs,Attrib[4],1,EFillStr(80,B1,MarkMailStr(Dpos,1)));
|
||||
End;
|
||||
|
||||
Procedure RestAuflisten;
|
||||
var i: byte;
|
||||
i2:longint;
|
||||
Begin
|
||||
i2:=DPos;
|
||||
for i:=BPos to zmax do
|
||||
begin
|
||||
WriteRam(1,i+Bofs,Attrib[2],1,EFillStr(80,B1,MarkMailStr(i2,1)));
|
||||
inc(I2);
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure InitStart(Art : Byte; Bstr : Str12);
|
||||
Var w : longint;
|
||||
|
||||
Flag : Boolean;
|
||||
Vpos : Byte;
|
||||
call1,
|
||||
call2: string[8];
|
||||
Begin
|
||||
WartenSchirm;
|
||||
Vpos := Bpos;
|
||||
yM := 1;
|
||||
Bpos := 1;
|
||||
Dpos := 1;
|
||||
AnzM := 0;
|
||||
GetMails;
|
||||
if Art = 1 then
|
||||
begin
|
||||
DirPage(Dpos);
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure CursorDn;
|
||||
Begin
|
||||
if Dpos < MailAnz then
|
||||
begin
|
||||
inc(Dpos);
|
||||
if Bpos < Zmax then inc(Bpos) else
|
||||
begin
|
||||
WriteAttr(1,yM+Bofs,80,Attrib[2],1);
|
||||
Scroll(Up,1,1+Bofs,Zmax+Bofs);
|
||||
WriteRam(1,Bpos+Bofs,Attrib[4],1,MarkMailStr(Dpos,1));
|
||||
end;
|
||||
end else Alarm;
|
||||
End;
|
||||
|
||||
|
||||
Begin
|
||||
{ INUdb:=true;}
|
||||
Moni_Off(0);
|
||||
DirScroll := true;
|
||||
NowFenster := false;
|
||||
Zmax := maxZ - 3;
|
||||
Fertig := false;
|
||||
X := 1;
|
||||
|
||||
InitStart(1,'');
|
||||
WriteAttr(1,Bpos+Bofs,80,Attrib[4],1);
|
||||
|
||||
Repeat
|
||||
InitCursor(X,Bpos+Bofs);
|
||||
hstr:=int_Str(DPos);
|
||||
if MailAnz=0 then hstr:='0';
|
||||
WriteRam(1,maxZ-1,Attrib[5],1,EFillStr(80,B1,InfoZeile(48)+' '+hstr+'/'+int_str(MailAnz)));
|
||||
WriteRam(1,1,Attrib[5],1,EFillStr(80,B1,InfoZeile(47)));
|
||||
GetCursorLine;
|
||||
_ReadKey(KC,VC);
|
||||
|
||||
|
||||
case KC of
|
||||
_Esc
|
||||
: begin
|
||||
Fertig := true;
|
||||
end;
|
||||
|
||||
_Dn
|
||||
: CursorDn;
|
||||
|
||||
_Up
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
dec(Dpos);
|
||||
if Bpos > 1 then dec(Bpos) else
|
||||
begin
|
||||
WriteAttr(1,yM+Bofs,80,Attrib[2],1);
|
||||
Scroll(Dn,1,1+Bofs,Zmax+Bofs);
|
||||
WriteRam(1,Bpos+Bofs,Attrib[4],1,MarkMailStr(Dpos,1));
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_PgDn
|
||||
: if Dpos < MailAnz then
|
||||
begin
|
||||
if Dpos + Zmax - Bpos >= MailAnz then
|
||||
begin
|
||||
Dpos := MailAnz;
|
||||
Bpos := Zmax;
|
||||
if Bpos > MailAnz then Bpos := MailAnz;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos + Zmax - 1;
|
||||
if Dpos + Zmax - 1 > MailAnz then Dpos := MailAnz - Zmax + Bpos;
|
||||
DirPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_PgUp
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
if Dpos <= Bpos then
|
||||
begin
|
||||
Dpos := 1;
|
||||
Bpos := 1;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos - Zmax + 1;
|
||||
if Dpos - Zmax + 1 < 1 then Dpos := Bpos;
|
||||
DirPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_Home
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
Dpos := 1;
|
||||
Bpos := 1;
|
||||
DirPage(1);
|
||||
end else Alarm;
|
||||
|
||||
_End
|
||||
: if Dpos < MailAnz then
|
||||
begin
|
||||
Dpos := MailAnz;
|
||||
Bpos := Zmax;
|
||||
if Bpos > MailAnz then Bpos := MailAnz;
|
||||
DirPage(Dpos - Bpos + 1);
|
||||
end else Alarm;
|
||||
|
||||
|
||||
_Ret
|
||||
: begin
|
||||
if (not fwd_) and (MailAnz>0) then
|
||||
begin
|
||||
MailVersucheRauf (DPos);
|
||||
StartMailPolling(Kanal,BoxCall(Dpos));
|
||||
Fertig:=true;
|
||||
end else alarm;
|
||||
end;
|
||||
|
||||
_altd, _del
|
||||
: begin
|
||||
if MailAnz>0 then
|
||||
begin
|
||||
SavDpos:=Dpos;
|
||||
if (SiAltD) then
|
||||
begin
|
||||
WriteRam(1,Bpos+Bofs,Attrib[5],1,EFillStr(80,B1,B2+InfoZeile(224)));
|
||||
_ReadKey(KC,VC);
|
||||
end;
|
||||
if (KC = _Ret) or (UpCase(VC) in YesMenge) or (not SiAltD) then
|
||||
begin
|
||||
userkilled:=dpos;
|
||||
MailKillen('','',DPOS);
|
||||
{ InitStart(1,'');}
|
||||
GetMails;
|
||||
if MailAnz>savDpos then
|
||||
begin
|
||||
DPos:=SavDpos;
|
||||
|
||||
if ((MailAnz-dpos)<ZMax) and (MailAnz>=ZMax) then
|
||||
begin
|
||||
BPos:=ZMax-(MailAnz-dPos);
|
||||
DirPage(Dpos-Bpos+1);
|
||||
end else RestAuflisten;
|
||||
end
|
||||
else
|
||||
begin
|
||||
DPOs:=MailAnz;
|
||||
BPos:=ZMax;
|
||||
if MailAnz<ZMax then BPos:=MailAnz;
|
||||
|
||||
if MailAnz<1 then
|
||||
begin
|
||||
Bpos:=1;
|
||||
Dpos:=1;
|
||||
end;
|
||||
DirPage(Dpos-Bpos+1);
|
||||
end;
|
||||
{ yM := 1;
|
||||
AnzM := 0;
|
||||
BPos:=1;
|
||||
DirPage(Dpos);}
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
_AltH
|
||||
: XP_Help(G^.OHelp[93 ]);
|
||||
|
||||
{ _ALTS
|
||||
: begin
|
||||
BoxSuchen(DPOs,'');
|
||||
BPos:=1;
|
||||
DirPage(Dpos);
|
||||
end;}
|
||||
|
||||
|
||||
else Alarm;
|
||||
end;
|
||||
|
||||
WriteAttr(1,yM+Bofs,80,Attrib[2],1);
|
||||
WriteAttr(1,Bpos+Bofs,80,Attrib[4],1);
|
||||
yM := Bpos;
|
||||
Until Fertig;
|
||||
DirScroll := false;
|
||||
Moni_On;
|
||||
InUDB:=false;
|
||||
End;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
149
XPMAKRO.PAS
Executable file
149
XPMAKRO.PAS
Executable file
@ -0,0 +1,149 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P M A K R O . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die Abarbeitung der Makrofunktionen. ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure MakroZeile_holen;
|
||||
Var w : Word;
|
||||
Begin
|
||||
if ResetTxt(G^.MakroFile) = 0 then
|
||||
begin
|
||||
for w := 1 to G^.MakroZaehl do Readln(G^.MakroFile);
|
||||
if not Eof(G^.MakroFile) then
|
||||
begin
|
||||
Readln(G^.MakroFile,G^.MakroZeile);
|
||||
KillEndBlanks(G^.MakroZeile);
|
||||
inc(G^.MakroZaehl);
|
||||
G^.MakroFileEnd := Eof(G^.MakroFile);
|
||||
end else MakroInit;
|
||||
FiResult := CloseTxt(G^.MakroFile);
|
||||
end else MakroInit;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Makro_aktivieren (* Zeile : Str60 *);
|
||||
Begin
|
||||
if pos(BS,Zeile) = 0 then Zeile := Konfig.MakVerz + Zeile;
|
||||
if pos(Pkt,Zeile) = 0 then Zeile := Zeile + KeyExt;
|
||||
Assign(G^.MakroFile,Zeile);
|
||||
if ResetTxt(G^.MakroFile) = 0 then
|
||||
begin
|
||||
FiResult := CloseTxt(G^.MakroFile);
|
||||
G^.Makro := true;
|
||||
G^.MakroZeile := '';
|
||||
end else
|
||||
begin
|
||||
MakroInit;
|
||||
InfoOut(show,1,1,InfoZeile(27) + B1 + Zeile);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure MakroInit;
|
||||
Begin
|
||||
G^.MakroZeile := '';
|
||||
G^.Makro := false;
|
||||
G^.MakroFileEnd := false;
|
||||
G^.MakroZaehl := 0;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Makro_Erlernen (* SK : Sondertaste; VC : Char *);
|
||||
Begin
|
||||
if not(KeyCheck and (SK = _Alt3)) then
|
||||
begin
|
||||
if SK = _Andere then
|
||||
begin
|
||||
if not G^.MakroReturn then Writeln(G^.MakroFile);
|
||||
G^.MakroReturn := true;
|
||||
if VC in [^A..^Z] then
|
||||
begin
|
||||
Writeln(G^.MakroFile,S_ch + B1 + CTRL + chr(ord(VC)+64));
|
||||
G^.MakroZeile := '';
|
||||
end else G^.MakroZeile := G^.MakroZeile + VC;
|
||||
end else
|
||||
begin
|
||||
if not G^.MakroReturn then Writeln(G^.MakroFile);
|
||||
G^.MakroReturn := true;
|
||||
if G^.MakroZeile > '' then
|
||||
begin
|
||||
if not G^.MakroReturn then Writeln(G^.MakroFile);
|
||||
Writeln(G^.MakroFile,G^.MakroZeile);
|
||||
G^.MakroZeile := '';
|
||||
G^.MakroReturn := true;
|
||||
end;
|
||||
Writeln(G^.MakroFile,'* ',Key[SK].Ta);
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Makro_Open_LearnFile;
|
||||
var Hstr : String[80];
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
Flag : Boolean;
|
||||
i : Byte;
|
||||
Begin
|
||||
if not G^.MakroLearn then
|
||||
begin
|
||||
Flag := false;
|
||||
Hstr := Konfig.MakVerz + MakDatei + KeyExt;
|
||||
G^.Fstr[7] := InfoZeile(187);
|
||||
G^.Fstr[10] := B1 + InfoZeile(168);
|
||||
Fenster(15);
|
||||
GetString(Hstr,Attrib[3],60,2,14,KC,2,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
Assign(G^.MakroFile,Hstr);
|
||||
if ResetTxt(G^.MakroFile) = 0 then
|
||||
begin
|
||||
FiResult := CloseTxt(G^.MakroFile);
|
||||
for i := 9 to 15 do G^.Fstr[i] := '';
|
||||
G^.Fstr[11] := B1 + Hstr + DP + InfoZeile(156);
|
||||
G^.Fstr[13] := B1 + InfoZeile(188);
|
||||
Fenster(15);
|
||||
SetzeCursor(length(G^.Fstr[13]) + 1,13);
|
||||
Alarm;
|
||||
_ReadKey(KC,VC);
|
||||
Cursor_aus;
|
||||
VC := UpCase(VC);
|
||||
if (VC in YesMenge) or (KC = _Ret) then
|
||||
begin
|
||||
if RewriteTxt(G^.MakroFile) = 0 then Flag := true
|
||||
else Triller;
|
||||
end else if KC <> _Esc then
|
||||
begin
|
||||
if AppendTxt(G^.MakroFile) = 0 then Flag := true
|
||||
else Triller;
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
if RewriteTxt(G^.MakroFile) = 0 then Flag := true
|
||||
else Triller;
|
||||
end;
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
G^.MakroZeile := '';
|
||||
G^.MakroLearn := true;
|
||||
G^.MakroReturn := true;
|
||||
end;
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
G^.MakroLearn := false;
|
||||
if G^.MakroZeile > '' then Writeln(G^.MakroFile,G^.MakroZeile);
|
||||
FiResult := CloseTxt(G^.MakroFile);
|
||||
G^.MakroZeile := '';
|
||||
end;
|
||||
ClrFenster;
|
||||
SetzeFlags(show);
|
||||
Neu_Bild;
|
||||
End;
|
663
XPMH.PAS
Executable file
663
XPMH.PAS
Executable file
@ -0,0 +1,663 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P M H . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die MH-Liste ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure MH_Sort (* Art : Byte *);
|
||||
Var x,i,j : Integer;
|
||||
Change : Boolean;
|
||||
Hilf : MH_Typ;
|
||||
N : Word;
|
||||
flag : Boolean;
|
||||
Hstr,
|
||||
Xstr : String[14];
|
||||
|
||||
Begin
|
||||
N := maxMH;
|
||||
|
||||
if N > 1 then
|
||||
begin
|
||||
x := 1;
|
||||
While x <= N do x := x * 3 + 1;
|
||||
x := x div 3;
|
||||
While x > 0 do
|
||||
begin
|
||||
i := x;
|
||||
While i <= N do
|
||||
begin
|
||||
j := i - x;
|
||||
Change := true;
|
||||
|
||||
While (j > 0) and Change do
|
||||
begin
|
||||
case Art of
|
||||
1 : begin
|
||||
Hstr := copy(MHeard^[j+x].Zeit,7,2) + copy(MHeard^[j+x].Zeit,3,4) +
|
||||
copy(MHeard^[j+x].Zeit,1,2) + copy(MHeard^[j+x].Zeit,9,6);
|
||||
Xstr := copy(MHeard^[j].Zeit,7,2) + copy(MHeard^[j].Zeit,3,4) +
|
||||
copy(MHeard^[j].Zeit,1,2) + copy(MHeard^[j].Zeit,9,6);
|
||||
flag := Hstr > Xstr;
|
||||
end;
|
||||
2 : flag := (MHeard^[j+x].Rej > MHeard^[j].Rej);
|
||||
3 : flag := (MHeard^[j+x].UIs > MHeard^[j].UIs);
|
||||
4 : flag := (MHeard^[j+x].Call > MHeard^[j].Call);
|
||||
5 : flag := (MHeard^[j+x].Link > MHeard^[j].Link);
|
||||
6 : flag := (MHeard^[j+x].QRG > MHeard^[j].QRG);
|
||||
else flag := false;
|
||||
end;
|
||||
|
||||
if flag then
|
||||
begin
|
||||
move(MHeard^[j+x],Hilf,SizeOf(MH_Typ));
|
||||
move(MHeard^[j],MHeard^[j+x],SizeOf(MH_Typ));
|
||||
move(Hilf,MHeard^[j],SizeOf(MH_Typ));
|
||||
j := j - x;
|
||||
end else Change := false;
|
||||
end;
|
||||
i := i + 1;
|
||||
end;
|
||||
x := x div 3;
|
||||
end;
|
||||
end;
|
||||
|
||||
End;
|
||||
|
||||
|
||||
Function GetMhStr(Art : Byte; MPos : Word) : Str80;
|
||||
Var Hstr : String[80];
|
||||
Begin
|
||||
with MHeard^[MPos] do
|
||||
begin
|
||||
Hstr := '';
|
||||
if Art = 0 then
|
||||
begin
|
||||
if Call > '' then Hstr := B1 + copy(Zeit,1,5) + '-' + copy(Zeit,10,5) + B1 +
|
||||
SFillStr(3,B1,int_str(Rej)) + B1 +
|
||||
SFillStr(3,B1,int_str(UIs)) + B2 +
|
||||
EFillStr(10,B1,Call) + B1 +
|
||||
Link;
|
||||
Hstr := EFillStr(80,B1,Hstr);
|
||||
end;
|
||||
|
||||
if Art = 1 then
|
||||
begin
|
||||
if Call > '' then Hstr := B1 + copy(Zeit,1,5) + '-'
|
||||
+ copy(Zeit,10,5) + B1 +
|
||||
EFillStr(10,B1,Call) + B1 +
|
||||
Link;
|
||||
end;
|
||||
|
||||
if Art = 2 then
|
||||
begin
|
||||
if Call > '' then Hstr := B1 + int_str(TNr) + SFillStr(9,B1,QRG) +
|
||||
B1 + copy(Zeit,1,5) + '-' +
|
||||
copy(Zeit,10,5) + B1 +
|
||||
EFillStr(10,B1,Call) + B1 +
|
||||
Link;
|
||||
end;
|
||||
|
||||
if Art = 3 then
|
||||
begin
|
||||
if Call > '' then Hstr := EFillStr(11,B1,Call);
|
||||
end;
|
||||
|
||||
GetMhStr := Hstr;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure MH_QRG_Init(Freq : Str8);
|
||||
Var FreqMerk : String[8];
|
||||
i : Byte;
|
||||
Begin
|
||||
FillChar(MHeard^,maxMH * SizeOf(MH_Typ),0);
|
||||
move(MH^,MHeard^,maxMH * SizeOf(MH_Typ));
|
||||
MH_Sort(6);
|
||||
|
||||
FillChar(FreqList^,SizeOf(FreqList^),0);
|
||||
FreqMerk := '';
|
||||
FreqPos := 0;
|
||||
FreqCount := 0;
|
||||
|
||||
for i := 1 to maxMH do
|
||||
begin
|
||||
if (FreqMerk <> MHeard^[i].QRG) and
|
||||
(MHeard^[i].QRG > '') and
|
||||
(FreqCount < maxQRG) then
|
||||
begin
|
||||
inc(FreqCount);
|
||||
FreqList^[FreqCount].QRG := MHeard^[i].QRG;
|
||||
FreqMerk := MHeard^[i].QRG;
|
||||
if Freq = MHeard^[i].QRG then FreqPos := FreqCount;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure MH_Init(Art,TNr : Byte; Freq : Str8);
|
||||
Var i : Byte;
|
||||
Flag : Boolean;
|
||||
Begin
|
||||
FillChar(MHeard^,maxMH * SizeOf(MH_Typ),0);
|
||||
move(MH^,MHeard^,maxMH * SizeOf(MH_Typ));
|
||||
|
||||
MH_Anz := 0;
|
||||
for i := 1 to maxMH do
|
||||
begin
|
||||
Flag := false;
|
||||
if (MHeard^[i].Call > '') then
|
||||
begin
|
||||
case Art of
|
||||
0 : if (TNr = MHeard^[i].TNr) then
|
||||
if ((Freq > '') and (Freq = MHeard^[i].QRG)) or
|
||||
(MHeard^[i].QRG = '') then Flag := true;
|
||||
|
||||
1 : Flag := true;
|
||||
|
||||
2 : if (TNr = MHeard^[i].TNr) then flag := true;
|
||||
end;
|
||||
|
||||
if Flag then inc(MH_Anz)
|
||||
else FillChar(MHeard^[i],SizeOf(MHeard^[i]),0);
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure MH_Show;
|
||||
Const Bofs = 3;
|
||||
|
||||
Var TNr,i,i1,i2,
|
||||
Bpos : Byte;
|
||||
Dpos : Integer;
|
||||
w : Word;
|
||||
yM,
|
||||
Zmax : Byte;
|
||||
Flag,
|
||||
CurMH,
|
||||
Fertig : Boolean;
|
||||
Hstr : String[60];
|
||||
Save_Name : String[60];
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
Such : String[9];
|
||||
SArt : Byte;
|
||||
MH_Save : Text;
|
||||
Result : Word;
|
||||
|
||||
Procedure InitVar;
|
||||
Begin
|
||||
yM := 1;
|
||||
Bpos := 1;
|
||||
Dpos := 1;
|
||||
MH_Sort(SArt);
|
||||
End;
|
||||
|
||||
Procedure MhPage(beg : Word);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
Teil_Bild_Loesch(4,maxZ-1,Attrib[2]);
|
||||
i1 := Zmax;
|
||||
if i1 > MH_Anz then i1 := MH_Anz;
|
||||
for i := 1 to i1 do
|
||||
WriteRam(1,i+Bofs,Attrib[2],0,EFillStr(80,B1,GetMhStr(0,beg-1+i)));
|
||||
WriteRam(30,1,Attrib[15],0,B1+ InfoZeile(328));
|
||||
End;
|
||||
|
||||
Begin
|
||||
NowFenster := false;
|
||||
Moni_Off(0);
|
||||
GetMem(MHeard,maxMH * SizeOf(MH_Typ));
|
||||
GetMem(FreqList,SizeOf(FreqList^));
|
||||
|
||||
if (show = 0) then TNr := Unproto
|
||||
else TNr := K[show]^.TncNummer;
|
||||
|
||||
if tnr=0 then tnr:=K[1]^.TNCNummer;
|
||||
|
||||
MH_QRG_Init(TNC[TNr]^.QRG_Akt);
|
||||
MH_Init(0,TNr,TNC[TNr]^.QRG_Akt);
|
||||
SArt := 1;
|
||||
MH_Sort(SArt);
|
||||
InitVar;
|
||||
|
||||
Such := '';
|
||||
Zmax := maxZ - (1 + Bofs);
|
||||
Fertig := false;
|
||||
CurMH := true;
|
||||
|
||||
WriteRam(1,1,Attrib[15],0,ConstStr(B1,80));
|
||||
WriteRam(1,2,Attrib[2],0,EFillStr(80,B1,B1 + InfoZeile(227)));
|
||||
WriteRam(1,3,Attrib[2],0,ConstStr('Ä',80));
|
||||
WriteRam(1,maxZ,Attrib[15],0,EFillStr(80,B1,InfoZeile(228)));
|
||||
MhPage(Dpos);
|
||||
WriteAttr(1,Bpos+Bofs,80,Attrib[4],0);
|
||||
|
||||
Repeat
|
||||
if CurMH then InitCursor(1,Bpos+Bofs)
|
||||
else InitCursor(1,1);
|
||||
|
||||
WriteRam(60,1,Attrib[15],0,'Nr:' + SFillStr(3,B1,int_str(Dpos)));
|
||||
WriteRam(2,1,Attrib[15],0,TncI + int_str(MHeard^[Dpos].TNr) + DP +
|
||||
EFillStr(10,B1,MHeard^[Dpos].QRG));
|
||||
WriteRam(71,1,Attrib[15],0,EFillStr(10,B1,Such));
|
||||
|
||||
_ReadKey(KC,VC);
|
||||
|
||||
if KC <> _Andere then Such := '';
|
||||
|
||||
case KC of
|
||||
_Esc, _Del
|
||||
: Fertig := true;
|
||||
|
||||
_Dn
|
||||
: if Dpos < MH_Anz then
|
||||
begin
|
||||
inc(Dpos);
|
||||
if Bpos < Zmax then inc(Bpos) else
|
||||
begin
|
||||
WriteAttr(1,Bofs+yM,80,Attrib[2],0);
|
||||
Scroll(Up,0,1+Bofs,Zmax+Bofs);
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,GetMhStr(0,Dpos));
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_Up
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
dec(Dpos);
|
||||
if Bpos > 1 then dec(Bpos) else
|
||||
begin
|
||||
WriteAttr(1,Bofs+yM,80,Attrib[2],0);
|
||||
Scroll(Dn,0,1+Bofs,Zmax+Bofs);
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,GetMhStr(0,Dpos));
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_PgDn
|
||||
: if Dpos < MH_Anz then
|
||||
begin
|
||||
if Dpos + Zmax - Bpos >= MH_Anz then
|
||||
begin
|
||||
Dpos := MH_Anz;
|
||||
Bpos := Zmax;
|
||||
if Bpos > MH_Anz then Bpos := MH_Anz;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos + Zmax - 1;
|
||||
if Dpos + Zmax - 1 > MH_Anz then Dpos := MH_Anz - Zmax + Bpos;
|
||||
MhPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_PgUp
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
if Dpos <= Bpos then
|
||||
begin
|
||||
Dpos := 1;
|
||||
Bpos := 1;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos - Zmax + 1;
|
||||
if Dpos - Zmax + 1 < 1 then Dpos := Bpos;
|
||||
MhPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
end else Alarm;
|
||||
|
||||
_CtrlPgUp
|
||||
: if Dpos > 1 then
|
||||
begin
|
||||
Dpos := 1;
|
||||
Bpos := 1;
|
||||
MhPage(1);
|
||||
end else Alarm;
|
||||
|
||||
_CtrlPgDn
|
||||
: if Dpos < MH_Anz then
|
||||
begin
|
||||
Dpos := MH_Anz;
|
||||
Bpos := Zmax;
|
||||
if Bpos > MH_Anz then Bpos := MH_Anz;
|
||||
MhPage(Dpos - Bpos + 1);
|
||||
end else Alarm;
|
||||
|
||||
_CtrlHome
|
||||
: begin
|
||||
Dpos := Dpos - Bpos + 1;
|
||||
Bpos := 1;
|
||||
end;
|
||||
|
||||
_CtrlEnd
|
||||
: if MH_Anz < Zmax then
|
||||
begin
|
||||
Dpos := MH_Anz;
|
||||
Bpos := MH_Anz;
|
||||
end else
|
||||
begin
|
||||
Dpos := Dpos + Zmax - Bpos;
|
||||
Bpos := Zmax;
|
||||
end;
|
||||
|
||||
_Right
|
||||
: if FreqPos > 0 then
|
||||
begin
|
||||
i := 0;
|
||||
i1 := FreqPos;
|
||||
Repeat
|
||||
If FreqPos < FreqCount then inc(FreqPos)
|
||||
else FreqPos := 1;
|
||||
MH_Init(0,TNr,FreqList^[FreqPos].QRG);
|
||||
inc(i);
|
||||
Until (MH_Anz > 0) or (i > FreqCount);
|
||||
if (i1 = FreqPos) or (MH_Anz = 0) then Alarm;
|
||||
InitVar;
|
||||
MhPage(Dpos);
|
||||
end else Alarm;
|
||||
|
||||
_Left
|
||||
: if FreqPos > 0 then
|
||||
begin
|
||||
i := 0;
|
||||
i1 := FreqPos;
|
||||
Repeat
|
||||
If FreqPos > 1 then dec(FreqPos)
|
||||
else FreqPos := FreqCount;
|
||||
MH_Init(0,TNr,FreqList^[FreqPos].QRG);
|
||||
inc(i);
|
||||
Until (MH_Anz > 0) or (i > FreqCount);
|
||||
if (i1 = FreqPos) or (MH_Anz = 0) then Alarm;
|
||||
InitVar;
|
||||
MhPage(Dpos);
|
||||
end else Alarm;
|
||||
|
||||
_CtrlRight
|
||||
: if MultiTNC then
|
||||
begin
|
||||
If TNr < Tnc_Anzahl then inc(TNr)
|
||||
else TNr := 1;
|
||||
MH_Init(2,TNr,'');
|
||||
InitVar;
|
||||
MhPage(Dpos);
|
||||
end else Alarm;
|
||||
|
||||
_CtrlLeft
|
||||
: if MultiTNC then
|
||||
begin
|
||||
If TNr > 1 then dec(TNr)
|
||||
else TNr := Tnc_Anzahl;
|
||||
MH_Init(2,TNr,'');
|
||||
InitVar;
|
||||
MhPage(Dpos);
|
||||
end else Alarm;
|
||||
|
||||
_ShDel
|
||||
: begin
|
||||
for i := 1 to MH_Anz do
|
||||
begin
|
||||
i1 := 0;
|
||||
Repeat
|
||||
inc(i1);
|
||||
if (MH^[i1].Call = MHeard^[i].Call) and
|
||||
(MH^[i1].TNr = MHeard^[i].TNr) and
|
||||
(MH^[i1].QRG = MHeard^[i].QRG) then
|
||||
begin
|
||||
move(MH^[i1+1],MH^[i1],(maxMH-i1) * SizeOf(MH_Typ));
|
||||
FillChar(MH^[maxMH],SizeOf(MH_Typ),0);
|
||||
dec(MH_Anz);
|
||||
end;
|
||||
Until (i1 >= maxMH);
|
||||
end;
|
||||
|
||||
Fertig := true;
|
||||
end;
|
||||
|
||||
_ShTab
|
||||
: CurMH := not CurMH;
|
||||
|
||||
_AltA
|
||||
: begin
|
||||
MH_Init(1,TNr,'');
|
||||
InitVar;
|
||||
MhPage(Dpos);
|
||||
end;
|
||||
|
||||
_AltH
|
||||
: XP_Help(G^.OHelp[1]);
|
||||
|
||||
_AltS
|
||||
: begin
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,EFillStr(80,B1,B1 + InfoZeile(142)));
|
||||
Save_Name := Konfig.SavVerz + 'MH.' + SFillStr(3,'0',int_str(TNr));
|
||||
GetString(Save_Name,Attrib[4],60,9,Bofs+Bpos,KC,0,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
Assign(MH_Save,Save_Name);
|
||||
Result := AppendTxt(MH_Save);
|
||||
if Result <> 0 then
|
||||
begin
|
||||
Result := RewriteTxt(MH_Save);
|
||||
if Result = 0 then
|
||||
begin
|
||||
Writeln(MH_Save,B1,InfoZeile(227));
|
||||
Writeln(MH_Save,ConstStr('-',70));
|
||||
end;
|
||||
end;
|
||||
if Result = 0 then
|
||||
begin
|
||||
for w := Dpos to MH_Anz do
|
||||
begin
|
||||
Hstr := GetMhStr(0,w);
|
||||
Writeln(MH_Save,Hstr);
|
||||
end;
|
||||
FiResult := CloseTxt(MH_Save);
|
||||
end else
|
||||
begin
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],1,
|
||||
EFillStr(80,B1,B1 + InfoZeile(75) + ': ' + Save_Name));
|
||||
Alarm;
|
||||
Verzoegern(ZWEI);
|
||||
end;
|
||||
end;
|
||||
WriteRam(1,Bofs+Bpos,Attrib[4],0,GetMhStr(0,Dpos));
|
||||
end;
|
||||
|
||||
_Alt0, _Alt1.._Alt5
|
||||
: begin
|
||||
case KC of
|
||||
_Alt0 : SArt := 6;
|
||||
_Alt1 : SArt := 1;
|
||||
_Alt2 : SArt := 2;
|
||||
_Alt3 : SArt := 3;
|
||||
_Alt4 : SArt := 4;
|
||||
_Alt5 : SArt := 5;
|
||||
end;
|
||||
MH_Sort(SArt);
|
||||
MhPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
|
||||
_Ret
|
||||
: begin
|
||||
Chr_Darstell(show,_Dn,#255);
|
||||
Hstr := MHeard^[Dpos].Call;
|
||||
KillEndBlanks(Hstr);
|
||||
Hstr := CvCh + 'C ' + Hstr + B1 + MHeard^[Dpos].Link;
|
||||
KillEndBlanks(Hstr);
|
||||
VorWrite[show]^[K[show]^.stC] := Hstr;
|
||||
Chr_Darstell(show,_Up,#255);
|
||||
SK_out := _Esc;
|
||||
ch_aus := true;
|
||||
fertig := true;
|
||||
end;
|
||||
|
||||
_Andere
|
||||
: begin
|
||||
Such := Such + UpCase(VC);
|
||||
w := 0;
|
||||
Flag := false;
|
||||
While (w < MH_Anz) and not Flag do
|
||||
begin
|
||||
inc(w);
|
||||
if pos(Such,MHeard^[w].Call) = 1 then
|
||||
begin
|
||||
Flag := true;
|
||||
Dpos := w;
|
||||
if (Dpos < Bpos) or (MH_Anz <= Zmax) then Bpos := Dpos;
|
||||
if ((MH_Anz - Dpos + Bpos) < Zmax) and
|
||||
(MH_Anz > Zmax) and (Dpos > Bpos)
|
||||
then Bpos := Zmax - (MH_Anz - Dpos);
|
||||
end;
|
||||
end;
|
||||
|
||||
if not Flag then
|
||||
begin
|
||||
Alarm;
|
||||
Such := '';
|
||||
end else MhPage(Dpos - Bpos + 1);
|
||||
end;
|
||||
|
||||
else Alarm;
|
||||
end;
|
||||
|
||||
WriteAttr(1,Bofs+yM,80,Attrib[2],0);
|
||||
WriteAttr(1,Bofs+Bpos,80,Attrib[4],0);
|
||||
yM := Bpos;
|
||||
Until Fertig;
|
||||
|
||||
FreeMem(FreqList,SizeOf(FreqList^));
|
||||
FreeMem(MHeard,maxMH * SizeOf(MH_Typ));
|
||||
Neu_Bild;
|
||||
Moni_On;
|
||||
End;
|
||||
|
||||
|
||||
Procedure RemoteMH (* Kanal,T : Byte; Zeile : Str9 *);
|
||||
Var i,i1,
|
||||
i2,i3,
|
||||
TNr : Byte;
|
||||
ch : Char;
|
||||
tnst : String[4];
|
||||
Hstr : String[80];
|
||||
TExist,
|
||||
flag,
|
||||
all,
|
||||
find,
|
||||
long : Boolean;
|
||||
Freq : String[8];
|
||||
|
||||
Begin
|
||||
GetMem(MHeard,maxMH * SizeOf(MH_Typ));
|
||||
GetMem(FreqList,SizeOf(FreqList^));
|
||||
|
||||
TNr := K[Kanal]^.TncNummer;
|
||||
all := false;
|
||||
long := false;
|
||||
find := false;
|
||||
TExist := true;
|
||||
if str_int(Zeile[1])>0 then zeile:=' '+Zeile;
|
||||
all:=true;
|
||||
for i:=1 to 8 do
|
||||
begin
|
||||
TNSt:= ' '+int_Str(i) + ' ';
|
||||
if pos(tnSt, Zeile)>0 then
|
||||
begin
|
||||
TNr:=i;
|
||||
all:=false;
|
||||
delete(Zeile, Pos(tnst,zeile),2);
|
||||
end;
|
||||
end;
|
||||
if Zeile[1]=' ' then delete(zeile,1,1);
|
||||
|
||||
While pos('/',Zeile) > 0 do
|
||||
begin
|
||||
i := pos('/',Zeile);
|
||||
if i > 0 then
|
||||
begin
|
||||
case Zeile[i+1] of
|
||||
'L': long := true;
|
||||
{'A': all := true;}
|
||||
{ '1'..Chr(maxTNC+48)
|
||||
: TNr := Byte(ord(Zeile[i+1])-48);}
|
||||
end;
|
||||
delete(Zeile,i,2);
|
||||
end;
|
||||
end;
|
||||
|
||||
if TNr in [1..TNC_Anzahl] then
|
||||
begin
|
||||
Freq := TNC[TNr]^.QRG_Akt;
|
||||
MH_QRG_Init(Freq);
|
||||
|
||||
Zeile := CutStr(Zeile);
|
||||
KillEndBlanks(Zeile);
|
||||
|
||||
if Zeile > '' then
|
||||
begin
|
||||
all := false;
|
||||
find := true;
|
||||
end;
|
||||
|
||||
S_PAC(Kanal,NU,false,M1);
|
||||
|
||||
if not (find or all) then
|
||||
begin
|
||||
MH_Init(0,TNr,Freq);
|
||||
MH_Sort(1);
|
||||
if long then Hstr := InfoZeile(183)
|
||||
else Hstr := InfoZeile(92);
|
||||
|
||||
Hstr := M1 + B1 + EFillStr(28,B1,Hstr) +
|
||||
ConstStr(B1,10) +
|
||||
TncI + int_str(TNr) + DP + Freq;
|
||||
|
||||
S_PAC(Kanal,NU,false,Hstr);
|
||||
S_PAC(Kanal,NU,false,+ M1 + ConstStr('-',70) + M1);
|
||||
|
||||
if MH_Anz > 0 then for i := 1 to MH_Anz do
|
||||
begin
|
||||
if long then Hstr := GetMhStr(1,i) + M1 else
|
||||
begin
|
||||
Hstr := GetMhStr(3,i);
|
||||
if (i mod 7 = 1) then Hstr := B1 + Hstr;
|
||||
if (i mod 7 = 0) or (i = MH_Anz) then
|
||||
begin
|
||||
KillEndBlanks(Hstr);
|
||||
Hstr := Hstr + M1;
|
||||
end;
|
||||
end;
|
||||
S_PAC(Kanal,NU,false,Hstr);
|
||||
end else S_PAC(Kanal,NU,false,B1+ InfoZeile(182) + M1);
|
||||
S_PAC(Kanal,NU,false,M1);
|
||||
end else
|
||||
|
||||
begin
|
||||
MH_Init(1,TNr,'');
|
||||
MH_Sort(6);
|
||||
|
||||
S_PAC(Kanal,NU,false,EFillStr(12,B1,B1+InfoZeile(93)) +
|
||||
InfoZeile(183) + ConstStr(B1,10) + M1);
|
||||
S_PAC(Kanal,NU,false,ConstStr('-',77) + M1);
|
||||
|
||||
i1 := 0;
|
||||
for i := 1 to MH_Anz do
|
||||
begin
|
||||
if (pos(Zeile,MHeard^[i].Call) = 1) or all then
|
||||
begin
|
||||
S_PAC(Kanal,NU,false,GetMhStr(2,i) + M1);
|
||||
inc(i1);
|
||||
end;
|
||||
end;
|
||||
if i1 = 0 then S_PAC(Kanal,NU,false,B1+InfoZeile(182) + M1);
|
||||
|
||||
end;
|
||||
end else S_PAC(Kanal,NU,false,Star + InfoZeile(124) + M1);
|
||||
|
||||
FreeMem(FreqList,SizeOf(FreqList^));
|
||||
FreeMem(MHeard,maxMH * SizeOf(MH_Typ));
|
||||
End;
|
362
XPMON.PAS
Executable file
362
XPMON.PAS
Executable file
@ -0,0 +1,362 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P M O N . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r das Monitoren auf einem QSO-Kanal ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Stat_MonitorCalls (* Kanal : Byte *);
|
||||
Var Ch : Char;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
with Mo do
|
||||
begin
|
||||
if MonActive then
|
||||
begin
|
||||
if MonBeide then Ch := #29 else Ch := #26;
|
||||
StatusOut(Kanal,2,2,Attrib[25],EFillStr(19,B1,CutStr(MonStr[1]) +
|
||||
Ch + RestStr(RestStr(MonStr[1]))),1);
|
||||
end else StatusOut(Kanal,14,1,Attrib[9],ConstStr(B1,19),1);
|
||||
end;
|
||||
StatusOut(Kanal,4,1,Attrib[9],EFillStr(9,B1,OwnCall),1);
|
||||
Status2;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Calls_Monitoren (* Kanal : Byte; Zeile : Str80 *);
|
||||
Const ArtMax = 11;
|
||||
|
||||
Var i,i1,
|
||||
X,Y,
|
||||
Art,
|
||||
aktiv : Byte;
|
||||
Flag,
|
||||
ZFlag,
|
||||
DisAbr,
|
||||
Beide,
|
||||
HCall,
|
||||
EHCall,
|
||||
Strict,
|
||||
Signal,
|
||||
IFr,UFr : Boolean;
|
||||
Hstr : String[19];
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
|
||||
Procedure InitKanal(Kanal : Byte);
|
||||
Begin
|
||||
with K[Kanal]^.Mo do
|
||||
begin
|
||||
DisAbr := MonDisAbr;
|
||||
Beide := MonBeide;
|
||||
Strict := MonStrict;
|
||||
HCall := MonHCall;
|
||||
EHCall := MonEHCall;
|
||||
Signal := MonSignal;
|
||||
IFr := MonIFr;
|
||||
UFr := MonUFr;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure Ins_Auswert(Istr : Str20);
|
||||
Var Flag : Boolean;
|
||||
Begin
|
||||
Flag := pos(B1,Zeile) = 0;
|
||||
DisAbr := not Flag;
|
||||
Beide := true;
|
||||
HCall := true;
|
||||
EHCall := true;
|
||||
Strict := not Flag;
|
||||
Signal := true;
|
||||
IFr := true;
|
||||
UFr := false;
|
||||
End;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
InitKanal(Kanal);
|
||||
KillEndBlanks(Zeile);
|
||||
ZFlag := Zeile > '';
|
||||
|
||||
if not Mo.MonActive then
|
||||
begin
|
||||
if (Zeile > '') then Ins_Auswert(Zeile);
|
||||
end else
|
||||
begin
|
||||
Zeile := CutStr(Mo.MonStr[1]) + B1 + CutStr(Mo.MonStr[2]);
|
||||
KillEndBlanks(Zeile);
|
||||
end;
|
||||
|
||||
for i := 9 to 15 do G^.Fstx[i] := 2;
|
||||
G^.Fstr[7] := InfoZeile(304);
|
||||
G^.Fstr[9] := InfoZeile(305);
|
||||
G^.Fstr[10] := InfoZeile(306);
|
||||
G^.Fstr[11] := InfoZeile(307);
|
||||
G^.Fstr[12] := InfoZeile(308) + B1 + Zeile;
|
||||
G^.Fstr[13] := InfoZeile(309);
|
||||
G^.Fstr[14] := InfoZeile(310);
|
||||
G^.Fstr[15] := InfoZeile(311);
|
||||
|
||||
Flag := false;
|
||||
|
||||
if ZFlag and not Mo.MonActive then Art := 8 else
|
||||
if not ZFlag and Mo.MonActive then Art := 10 else
|
||||
if not ZFlag then Art := 11
|
||||
else Art := 1;
|
||||
|
||||
Repeat
|
||||
for i := 9 to 15 do
|
||||
begin
|
||||
G^.Fstr[i][vM+1] := B1;
|
||||
G^.Fstr[i][hM+1] := B1;
|
||||
G^.Fstr[i][vM] := B1;
|
||||
G^.Fstr[i][hM] := B1;
|
||||
end;
|
||||
|
||||
if Art in [1..7] then
|
||||
begin
|
||||
X := vM;
|
||||
Y := Art + 8;
|
||||
end else
|
||||
begin
|
||||
X := hM;
|
||||
Y := Art + 1;
|
||||
end;
|
||||
|
||||
G^.Fstr[Y][X] := A_ch;
|
||||
if HardCur then SetzeCursor(X+1,Y);
|
||||
|
||||
if DisAbr then G^.Fstr[9][vM+1] := X_ch;
|
||||
if Beide then G^.Fstr[10][vM+1] := X_ch;
|
||||
if HCall then G^.Fstr[11][vM+1] := X_ch;
|
||||
if EHCall then G^.Fstr[12][vM+1] := X_ch;
|
||||
if Strict then G^.Fstr[13][vM+1] := X_ch;
|
||||
if IFr then G^.Fstr[14][vM+1] := X_ch;
|
||||
if Signal then G^.Fstr[15][vM+1] := X_ch;
|
||||
if Zeile > '' then G^.Fstr[12][hM+1] := X_ch;
|
||||
|
||||
aktiv := 0;
|
||||
if Zeile > '' then
|
||||
begin
|
||||
for i := 1 to maxLink do with K[i]^.Mo do
|
||||
begin
|
||||
if MonActive and (i <> Kanal) and
|
||||
((Zeile = (CutStr(MonStr[1]) + B1 + CutStr(MonStr[2]))) or
|
||||
(Zeile = (CutStr(MonStr[2]) + B1 + CutStr(MonStr[1])))) then
|
||||
aktiv := i;
|
||||
end;
|
||||
end;
|
||||
|
||||
if aktiv > 0 then
|
||||
begin
|
||||
delete(G^.Fstr[13],hM,2);
|
||||
insert(SFillStr(2,B1,int_str(aktiv)),G^.Fstr[13],hM);
|
||||
end;
|
||||
|
||||
Fenster(15);
|
||||
|
||||
_ReadKey(KC,VC);
|
||||
Case KC of
|
||||
_Esc : Flag := true;
|
||||
_Ret :;
|
||||
|
||||
_F1 : Art := 1;
|
||||
_F2 : Art := 2;
|
||||
_F3 : Art := 3;
|
||||
_F4 : Art := 4;
|
||||
_F5 : Art := 5;
|
||||
_F6 : Art := 6;
|
||||
_F7 : Art := 7;
|
||||
_Back: Art := 8;
|
||||
_End : Art := 9;
|
||||
_Del : Art := 10;
|
||||
_Ins : Art := 11;
|
||||
|
||||
_AltH : XP_Help(G^.OHelp[10]);
|
||||
|
||||
_Up : if Art > 1 then dec(Art)
|
||||
else Alarm;
|
||||
|
||||
_Dn : if Art < ArtMax then inc(Art)
|
||||
else Alarm;
|
||||
_Right : if Art < ArtMax then
|
||||
begin
|
||||
Art := Art + 7;
|
||||
if Art > ArtMax then Art := ArtMax;
|
||||
end else Alarm;
|
||||
|
||||
_Left : if Art > 1 then
|
||||
begin
|
||||
if Art <= 7 then Art := 1
|
||||
else Art := Art - 7;
|
||||
end else Alarm;
|
||||
|
||||
|
||||
_Andere : case VC of
|
||||
B1:;
|
||||
else Alarm;
|
||||
end;
|
||||
|
||||
else Alarm;
|
||||
End;
|
||||
|
||||
if (KC in [_F1.._F7,_Ret,_End,_Back,_Del,_Ins]) or
|
||||
((KC = _Andere) and (VC = B1)) then
|
||||
case Art of
|
||||
1 : DisAbr := not DisAbr;
|
||||
2 : Beide := not Beide;
|
||||
3 : HCall := not HCall;
|
||||
4 : begin
|
||||
EHCall := not EHCall;
|
||||
if EHCall then HCall := true;
|
||||
end;
|
||||
5 : Strict := not Strict;
|
||||
6 : begin
|
||||
IFr := not IFr;
|
||||
UFr := not IFr;
|
||||
if UFr then
|
||||
begin
|
||||
DisAbr := false;
|
||||
Strict := false;
|
||||
end;
|
||||
end;
|
||||
7 : Signal := not Signal;
|
||||
8 : begin
|
||||
if Zeile > '' then with Mo do
|
||||
begin
|
||||
Init_Call_Monitoren(Kanal,Zeile);
|
||||
MonDisAbr := DisAbr;
|
||||
MonBeide := Beide;
|
||||
MonHCall := HCall;
|
||||
MonEHCall := EHCall;
|
||||
MonStrict := Strict;
|
||||
MonSignal := Signal;
|
||||
MonIFr := IFr;
|
||||
MonUFr := UFr;
|
||||
Flag := true;
|
||||
end else Alarm;
|
||||
end;
|
||||
9 : begin
|
||||
if Mo.MonActive then for i := 1 to 2 do with Mo do
|
||||
begin
|
||||
MonFrameNr[i] := 0;
|
||||
MonFirst[i] := true;
|
||||
MonLast := '';
|
||||
for i1 := 0 to 7 do MonCtrl[i][i1] := 0;
|
||||
end else Alarm;
|
||||
end;
|
||||
10: begin
|
||||
Cancel_Call_Monitoren(Kanal);
|
||||
Flag := true;
|
||||
end;
|
||||
11: begin
|
||||
Hstr := Zeile;
|
||||
GetString(Hstr,Attrib[3],19,length(InfoZeile(308))+3,12,KC,0,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
Zeile := UpcaseStr(Hstr);
|
||||
KillEndBlanks(Zeile);
|
||||
G^.Fstr[12] := InfoZeile(308) + B1 + Zeile;
|
||||
if not ZFlag and not Mo.MonActive then Ins_Auswert(Zeile);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
Until Flag;
|
||||
|
||||
Stat_MonitorCalls(Kanal);
|
||||
end;
|
||||
ClrFenster;
|
||||
Neu_Bild;
|
||||
|
||||
End;
|
||||
|
||||
|
||||
Procedure Init_Call_monitoren (* Kanal : Byte; Zeile : Str80 *);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
with Mo do
|
||||
begin
|
||||
KillEndBlanks(Zeile);
|
||||
|
||||
MonStr[1] := CutStr(Zeile) + zu + RestStr(Zeile);
|
||||
KillEndBlanks(MonStr[1]);
|
||||
|
||||
MonStr[2] := RestStr(Zeile) + zu + CutStr(Zeile);
|
||||
KillEndBlanks(MonStr[2]);
|
||||
|
||||
for i := 1 to 2 do
|
||||
begin
|
||||
MonFrameNr[i] := 0;
|
||||
MonFirst[i] := true;
|
||||
for i1 := 0 to 7 do MonCtrl[i][i1] := 0;
|
||||
end;
|
||||
MonLast := '';
|
||||
MonActive := true;
|
||||
end;
|
||||
Mon_Anz := 0;
|
||||
for i := 1 to maxLink do if K[i]^.Mo.MonActive then inc(Mon_Anz);
|
||||
S_PAC(Kanal,CM,true,'I ' + PhantasieCall);
|
||||
Kanal_benutz := true;
|
||||
Stat_MonitorCalls(Kanal);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Cancel_Call_monitoren (* Kanal : Byte *);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
with Mo do
|
||||
begin
|
||||
MonActive := false;
|
||||
MonDisAbr := false;
|
||||
MonBeide := false;
|
||||
MonHCall := false;
|
||||
MonEHCall := false;
|
||||
MonStrict := false;
|
||||
MonSignal := false;
|
||||
for i := 1 to 2 do
|
||||
begin
|
||||
MonNow[i] := false;
|
||||
MonStr[i] := '';
|
||||
MonFrameNr[i] := 0;
|
||||
MonFirst[i] := false;
|
||||
for i1 := 0 to 7 do MonCtrl[i][i1] := 0;
|
||||
end;
|
||||
MonLast := '';
|
||||
end;
|
||||
if Mon_Anz > 0 then dec(Mon_Anz);
|
||||
S_PAC(Kanal,CM,true,'I '+ OwnCall);
|
||||
Kanal_benutz := false;
|
||||
TxComp := false;
|
||||
RxComp := false;
|
||||
SetzeFlags(Kanal);
|
||||
StatusOut(Kanal,2,2,Attrib[14],EFillStr(19,B1,' '),1);
|
||||
Stat_MonitorCalls(Kanal);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure FreeMonitorKanal (* Var KA : Byte; Zeile : Str80 *);
|
||||
Var Flag : Boolean;
|
||||
i : Byte;
|
||||
Begin
|
||||
Flag := false;
|
||||
i := 1;
|
||||
While (i <= maxLink) and not Flag do with K[i]^.Mo do
|
||||
begin
|
||||
if MonActive and (MonStr[1] = Zeile) then Flag := true
|
||||
else inc(i);
|
||||
end;
|
||||
if Flag then KA := i else KA := KanalFrei(0);
|
||||
End;
|
985
XPMRK.PAS
Executable file
985
XPMRK.PAS
Executable file
@ -0,0 +1,985 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P M R K . P A S ³
|
||||
³ ³
|
||||
³ Routinen zum Lesen und Schreiben des Merkerfiles MERKER.TOP ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Merker_Conn_Schreiben;
|
||||
var i,i1 : Byte;
|
||||
obf: Byte;
|
||||
CDat: File Of MemoCTyp;
|
||||
ConDat : ^MemoCTyp;
|
||||
|
||||
Begin
|
||||
ConDat:=NIL;
|
||||
GetMem(ConDat, SizeOf(MemoCTyp));
|
||||
Assign(CDat,Sys1Pfad + ConDatei);
|
||||
{$I-}
|
||||
Rewrite(CDat);
|
||||
obf:=ioresult;
|
||||
{$I+}
|
||||
if obf=0 then
|
||||
begin
|
||||
i:=1;
|
||||
while (i<=MaxLink) do
|
||||
begin
|
||||
if not K[i]^.connected then K[i]^.Call:='';
|
||||
ConDat^.Call:=K[i]^.Call;
|
||||
ConDat^.QSO_Date:=K[i]^.qso_date;
|
||||
ConDat^.Qso_begin:=k[i]^.QSO_Begin;
|
||||
condat^.ConText:=k[i]^.context;
|
||||
condat^.eingangskanal:=K[i]^.Einstiegskanal;
|
||||
condat^.ausgangskanal:=K[i]^.Ausstiegskanal;
|
||||
condat^.Gegenkanal:=K[i]^.Gegenkanal;
|
||||
ConDat^.HoldLauf:=K[i]^.HoldLauf;
|
||||
ConDat^.Hold:=K[i]^.Hold;
|
||||
ConDat^.HoldTime:=K[i]^.HoldTime;
|
||||
ConDat^.Holdstr:=K[i]^.Holdstr;
|
||||
condat^.userart:=k[i]^.UserArt;
|
||||
condat^.Sysart:=k[i]^.SysArt;
|
||||
condat^.SystemErkannt :=K[i]^.SystemErkannt;
|
||||
conDat^.OnAct:=K[i]^.OnAct;
|
||||
ConDat^.RemAll :=K[i]^.RemAll;
|
||||
ConDat^.SelfSysop:=K[i]^.SelfSysop;
|
||||
|
||||
condat^.cv1:=1; condat^.cv2:=81;
|
||||
write(cdat, condat^);
|
||||
inc(i);
|
||||
end;
|
||||
{$I-}
|
||||
Close(CDat);
|
||||
obf:=ioresult;
|
||||
{$I+}
|
||||
end;
|
||||
FreeMem(ConDat, SizeOf(MemoCTyp));
|
||||
End;
|
||||
|
||||
|
||||
Procedure Merker_Conn_Lesen;
|
||||
Var obf,i : Byte;
|
||||
cdat:file of MemoCTyp;
|
||||
ConDat : ^MemoCTyp;
|
||||
|
||||
|
||||
Begin
|
||||
ConDat:=NIL;
|
||||
GetMem(ConDat, SizeOf(MemoCTyp));
|
||||
Assign(CDat,Sys1Pfad + ConDatei);
|
||||
{$I-}
|
||||
Reset(Cdat);
|
||||
obf:=ioresult;
|
||||
if OBF = 0 then
|
||||
begin
|
||||
i:=0;
|
||||
while (i<MaxLink) and (not EOF(CDat)) do
|
||||
begin
|
||||
inc(i);
|
||||
read(CDat, ConDat^);
|
||||
if ConDat^.Call > '' then
|
||||
begin
|
||||
K[i]^.Einstiegskanal:=condat^.eingangskanal;
|
||||
K[i]^.Ausstiegskanal:=condat^.ausgangskanal;
|
||||
K[i]^.Gegenkanal:=condat^.Gegenkanal;
|
||||
K[i]^.Call := condat^.call;
|
||||
K[i]^.QSO_Date := ConDat^.Qso_Date;
|
||||
k[i]^.QSO_Begin := condat^.qso_begin;
|
||||
K[i]^.ConText := ConDat^.ConText;
|
||||
K[i]^.HoldLauf:= ConDat^.HoldLauf;
|
||||
K[i]^.Hold:= ConDat^.Hold;
|
||||
K[i]^.HoldTime:= ConDat^.HoldTime;
|
||||
K[i]^.Holdstr:= ConDat^.Holdstr;
|
||||
K[i]^.SysArt := condat^.sysart;
|
||||
K[i]^.UserArt := condat^.userart;
|
||||
K[i]^.SystemErkannt:=condat^.SystemErkannt;
|
||||
K[i]^.First_Frame:=false;
|
||||
K[i]^.RemAll:=ConDat^.RemAll ;
|
||||
K[i]^.SelfSysop:=ConDat^.SelfSysop;
|
||||
K[i]^.OnAct := condat^.OnAct;
|
||||
if K[i]^.Onact <> '' then _OnAct:=true;
|
||||
if K[i]^.SysArt in [0..maxSCon] then K[i]^.SCon[K[i]^.SysArt] := true
|
||||
else K[i]^.SysArt := 0;
|
||||
if (K[i]^.SysArt = 11) and HoldDXc then
|
||||
begin
|
||||
DZeile := HoldDXcStr;
|
||||
Link_erhalter(i,DZeile);
|
||||
SetzeFlags(i);
|
||||
end;
|
||||
if K[i]^.Sysart in [1,2,3,4,5,11,12,14] then K[i]^.SCon[0]:=false else K[i]^.scon[0]:=true;
|
||||
{if not(K[i]^.UserArt in [1..maxUser]) then K[i]^.UserArt := 1;}
|
||||
K[i]^.connected := true;
|
||||
K[i]^.TermTimeOut:=Konfig.TTimeout * 60;
|
||||
K[i]^.NodeTimeOut:=NTimeout * 60;
|
||||
end;
|
||||
end;
|
||||
close(Cdat);
|
||||
obf:=ioresult;
|
||||
end;
|
||||
{$I+}
|
||||
FreeMem(ConDat, SizeOf(MemoCTyp));
|
||||
End;
|
||||
|
||||
|
||||
|
||||
|
||||
{
|
||||
Procedure Merker_File_Schreiben;
|
||||
Var i,i1 : Integer;
|
||||
Kanal : Byte;
|
||||
Hstr : String[80];
|
||||
|
||||
Begin
|
||||
Assign(G^.TFile,Sys1Pfad + MerkDatei + Ext);
|
||||
if RewriteTxt(G^.TFile) = 0 then
|
||||
Begin
|
||||
Writeln(G^.TFile,LZ);
|
||||
for i := 1 to maxTNC do if TNC_used[i] then with TNC[i]^ do
|
||||
begin
|
||||
if BText = '' then BText := 'CQ';
|
||||
Writeln(G^.TFile,Rrtn,i,':BT=',BText);
|
||||
if BPfad = '' then BPfad := 'ALL';
|
||||
Writeln(G^.TFile,Rrtn,i,':BP=',BPfad);
|
||||
if Bake then Write(G^.TFile,Rrtn,i,Rpar,GL,'1,')
|
||||
else Write(G^.TFile,Rrtn,i,Rpar,GL,'0,');
|
||||
Write(G^.TFile,BTimer,Km);
|
||||
Write(G^.TFile,CText,Km);
|
||||
Write(G^.TFile,Info,Km);
|
||||
Write(G^.TFile,Aktuell,Km);
|
||||
Write(G^.TFile,QText,Km);
|
||||
Write(G^.TFile,Fix,Km);
|
||||
Writeln(G^.TFile,QRG_Akt);
|
||||
end else
|
||||
begin
|
||||
Writeln(G^.TFile,Rrtn,i,':BT=','CQ');
|
||||
Writeln(G^.TFile,Rrtn,i,':BP=','ALL');
|
||||
Writeln(G^.TFile,Rrtn,i,Rpar,GL,'0,20,1,1,1,1,1');
|
||||
end;
|
||||
|
||||
Writeln(G^.TFile,LZ);
|
||||
|
||||
for Kanal := 0 to maxLink do
|
||||
Begin
|
||||
Writeln(G^.TFile,LZ);
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if Kanal > 0 then
|
||||
begin
|
||||
if OwnCall = '*' then OwnCall := TNC[TncNummer]^.HostCall;
|
||||
Writeln(G^.TFile,Rrch,Kanal,':CALL=',OwnCall);
|
||||
if AutoZyConst > 0 then
|
||||
Writeln(G^.TFile,Rrch,Kanal,':AUTO=',AutoZyConst);
|
||||
end;
|
||||
|
||||
Writeln(G^.TFile,Rrch,Kanal,
|
||||
Rpar + GL,MaxFrame,Km,PacLen,Km,ObStat,Km,UnStat,Km,UmlautMerk);
|
||||
|
||||
if RX_Save then
|
||||
begin
|
||||
CloseRxFile(Kanal,1);
|
||||
Writeln(G^.TFile,Rrch,Kanal,':RXS=',FRxName);
|
||||
RX_Save := false;
|
||||
RX_Bin := 0;
|
||||
end;
|
||||
|
||||
if Save then
|
||||
begin
|
||||
FiResult := CloseBin(SFile);
|
||||
Writeln(G^.TFile,Rrch,Kanal,':SAV=',FName_aus_FVar(SFile));
|
||||
Save := false;
|
||||
end;
|
||||
|
||||
if SPlus and SplSave then
|
||||
begin
|
||||
Writeln(G^.TFile,Rrch,Kanal,':7PL=',FName_aus_FVar(SplFile),' ',
|
||||
Spl_gLaenge,' ',Spl_gCount,' ',Spl_tLaenge,' ',Spl_tCount);
|
||||
FiResult := CloseBin(SplFile);
|
||||
SplSave := false;
|
||||
end;
|
||||
|
||||
Write(G^.TFile,Rrch,Kanal,':FLAG=');
|
||||
|
||||
if Umlaut > 0 then Write(G^.TFile,'U',Umlaut);
|
||||
if Echo > 0 then Write(G^.TFile,'E',Echo);
|
||||
if not Gross then Write(G^.TFile,'Y');
|
||||
|
||||
if Kanal > 0 then
|
||||
begin
|
||||
if Auto then Write(G^.TFile,'F');
|
||||
if TopBox then Write(G^.TFile,'M');
|
||||
if Rx_Beep then Write(G^.TFile,'ì');
|
||||
if morsen then Write(G^.TFile,'C');
|
||||
if TxBeepAck then Write(G^.TFile,'Q');
|
||||
(* if Speek then Write(G^.TFile,'P'); *)
|
||||
if AutoBin then Write(G^.TFile,'$');
|
||||
if SPlus then Write(G^.TFile,'+');
|
||||
if TxComp then Write(G^.TFile,'ø');
|
||||
if RxComp then Write(G^.TFile,'÷');
|
||||
if NoCurJump then Write(G^.TFile,'ö');
|
||||
if Node then Write(G^.TFile,'N');
|
||||
AutoBinOn := AutoBin;
|
||||
end else
|
||||
begin
|
||||
if Klingel then Write(G^.TFile,'K');
|
||||
if CtrlBeep then Write(G^.TFile,'G');
|
||||
if Time_stamp then Write(G^.TFile,'T');
|
||||
if PacOut then Write(G^.TFile,'L');
|
||||
if ZeigeRET then Write(G^.TFile,'R');
|
||||
if ConMorsen then Write(G^.TFile,'O');
|
||||
if ReconMorsen then Write(G^.TFile,'D');
|
||||
(* if ConVoice then Write(G^.TFile,'A');
|
||||
if ReconVoice then Write(G^.TFile,'J'); *)
|
||||
if GlobalTrenn then Write(G^.TFile,'H');
|
||||
if BinOut then Write(G^.TFile,'i');
|
||||
if Ins then Write(G^.TFile,'Z');
|
||||
if NoBinMon then Write(G^.TFile,'!');
|
||||
if RX_TX_Win then Write(G^.TFile,'&');
|
||||
end;
|
||||
Writeln(G^.TFile);
|
||||
end;
|
||||
end;
|
||||
Writeln(G^.TFile,LZ);
|
||||
Writeln(G^.TFile,LZ);
|
||||
|
||||
Hstr := '';
|
||||
for i := 1 to 10 do Hstr := Hstr + int_str(G^.SETL[i]) + Km;
|
||||
Hstr := Hstr + int_str(SETNr);
|
||||
Writeln(G^.TFile,Rrgl,Rsetl,GL,Hstr);
|
||||
|
||||
if Idle_Pos then i := 1
|
||||
else i := 0;
|
||||
Hstr := int_str(i) + Km + int_str(Idle_Anz) + Km + int_str(Idle_Tout);
|
||||
Writeln(G^.TFile,Rrgl,Ridle,GL,Hstr);
|
||||
|
||||
Writeln(G^.TFile,Rrgl,Rmfreq,GL,G^.TonHoehe);
|
||||
if _VGA then i := 1
|
||||
else i := 0;
|
||||
Writeln(G^.TFile,Rrgl,Rega,GL,int_str(i));
|
||||
Writeln(G^.TFile,Rrgl,Rplen,GL,MPause);
|
||||
Writeln(G^.TFile,Rrgl,Rsynch,GL,Resync_Z);
|
||||
Writeln(G^.TFile,Rrgl,Rcnr,GL,CNr);
|
||||
(* Writeln(G^.TFile,Rrgl,Rvsp,GL,VSpeed); *)
|
||||
Writeln(G^.TFile,Rrgl,Rinfo,GL,G^.InfoStr);
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
end;
|
||||
End;
|
||||
}
|
||||
|
||||
Procedure Merker_File_Schreiben;
|
||||
Var i,i1 : Integer;
|
||||
OBF,
|
||||
Kanal : Byte;
|
||||
Hstr : String[80];
|
||||
Memo : ^MemoTyp;
|
||||
MDat : file of MemoTyp;
|
||||
|
||||
Begin
|
||||
{ GetMem(Memo,SizeOf(Memotyp));}
|
||||
Memo:=NIL;
|
||||
New(Memo);
|
||||
|
||||
FillChar(Memo^, SizeOf(Memotyp), 0);
|
||||
Assign(MDat,Sys1Pfad + MerkDatei + Ext);
|
||||
{$I-}
|
||||
Rewrite(MDat);
|
||||
OBF:=IOResult;
|
||||
{$I+}
|
||||
memo^.v1:=MerkV1; memo^.v2:=MerkV2; {//db1ras}
|
||||
if OBF = 0 then
|
||||
Begin
|
||||
for i := 1 to MaxTNC do with Memo^.TNC[i] do
|
||||
begin
|
||||
if TNC_Used[i] then
|
||||
begin
|
||||
if TNC[i]^.BText = '' then TNC[i]^.BText := 'CQ';
|
||||
if TNC[i]^.BPfad = '' then TNC[i]^.BPfad := 'ALL';
|
||||
Bake := TNC[i]^.Bake;
|
||||
BPfad := TNC[i]^.BPfad;
|
||||
BText := TNC[i]^.BTEXT;
|
||||
BTimer := TNC[i]^.btimer;
|
||||
BCall := TNC[i]^.bcall;
|
||||
CText := TNC[i]^.ctext;
|
||||
Info := TNC[i]^.info;
|
||||
Aktuell := TNC[i]^.aktuell;
|
||||
QText := TNC[i]^.qtext;
|
||||
Fix := TNC[i]^.fix;
|
||||
QRG_Akt := TNC[i]^.qrg_akt;
|
||||
if ctext<1 then ctext:=1;
|
||||
if info<1 then info:=1;
|
||||
if aktuell<1 then aktuell:=1;
|
||||
if qtext<1 then qtext:=1;
|
||||
if fix<1 then fix:=1;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
for Kanal := 0 to maxLink do
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if Kanal > 0 then
|
||||
begin
|
||||
if OwnCall = '*' then OwnCall := TNC[TncNummer]^.HostCall;
|
||||
IF Kanal> Maxlink then Owncall:='';
|
||||
Memo^.Kanal[Kanal].OwnCall := Owncall;
|
||||
Memo^.Kanal[Kanal].AutoZyConst := AutoZyConst;
|
||||
end;
|
||||
|
||||
Memo^.Kanal[Kanal].MaxFrame := MaxFrame;
|
||||
Memo^.Kanal[Kanal].PacLen := PacLen;
|
||||
Memo^.Kanal[Kanal].ObStat := ObStat;
|
||||
Memo^.Kanal[Kanal].UnStat := UnStat;
|
||||
Memo^.Kanal[Kanal].UmlautMerk:= UmlautMerk;
|
||||
{ if (connected) or Mo.MonActive then } {//db1ras}
|
||||
Memo^.Kanal[kanal].ignore := ignore;
|
||||
|
||||
Memo^.Kanal[Kanal].FRxName:='';
|
||||
if RX_Save then
|
||||
begin
|
||||
if not BackUpLauf then
|
||||
begin
|
||||
CloseRxFile(Kanal,1);
|
||||
RX_Save := false;
|
||||
RX_Bin := 0;
|
||||
end;
|
||||
Memo^.Kanal[Kanal].FRxName:=FRXName;
|
||||
|
||||
end;
|
||||
|
||||
Memo^.Kanal[Kanal].SaveFName:='';
|
||||
if Save then
|
||||
begin
|
||||
if not BackUpLauf then
|
||||
begin
|
||||
FiResult := CloseBin(SFile);
|
||||
Save := false;
|
||||
end;
|
||||
Memo^.Kanal[Kanal].SaveFName:=FName_aus_FVar(SFile);
|
||||
end;
|
||||
|
||||
Memo^.Kanal[Kanal].SPLFName :='';
|
||||
if SPlus and SplSave then
|
||||
begin
|
||||
Memo^.Kanal[Kanal].SPLFName := FName_aus_FVar(SplFile);
|
||||
Memo^.Kanal[Kanal].Spl_gLaenge := Spl_glaenge;
|
||||
Memo^.Kanal[Kanal].Spl_gCount := spl_gcount;
|
||||
Memo^.Kanal[Kanal].Spl_tLaenge := spl_tlaenge;
|
||||
Memo^.Kanal[Kanal].Spl_tCount := spl_Tcount;
|
||||
if not BackUpLauf then
|
||||
begin
|
||||
FiResult := CloseBin(SplFile);
|
||||
SplSave := false;
|
||||
end;
|
||||
end;
|
||||
|
||||
Memo^.Kanal[Kanal].Umlaut := Umlaut;
|
||||
Memo^.Kanal[Kanal].Echo := Echo;
|
||||
if SysTextEcho then Memo^.Kanal[kanal].Echo:=Memo^.Kanal[kanal].Echo+100;
|
||||
Memo^.Global.Gross := Gross;
|
||||
|
||||
Memo^.Kanal[Kanal].Auto:=Auto;
|
||||
Memo^.Global.TopBox := TopBox;
|
||||
Memo^.Kanal[Kanal].Rx_Beep := RX_Beep;
|
||||
Memo^.Global.morsen := morsen;
|
||||
Memo^.Kanal[Kanal].TxBeepAck := TXBeepAck;
|
||||
(* if Speek then Write(G^.TFile,'P'); *)
|
||||
Memo^.Kanal[Kanal].AutoBin := AutoBin;
|
||||
Memo^.Kanal[Kanal].SPlus := Splus;
|
||||
Memo^.Kanal[Kanal].TxComp := TXComp;
|
||||
Memo^.Kanal[Kanal].RxComp := RXComp;
|
||||
Memo^.Kanal[Kanal].CompC := CompC;
|
||||
Memo^.kanal[kanal].StopComp:=StopComp;
|
||||
memo^.kanal[kanal].StopCode := StopCode;
|
||||
memo^.kanal[kanal].SpComp := SpComp;
|
||||
Memo^.Kanal[kanal].KompressUpd := KompressUpd;
|
||||
Memo^.Kanal[Kanal].CompCUpdZahl := CompCUpdZahl;
|
||||
for i := 1 to 255 do
|
||||
Memo^.Kanal[Kanal].Kompression[i] := Kompression[i];
|
||||
Memo^.Kanal[Kanal].NoCurJump := NoCurJump;
|
||||
Memo^.Kanal[Kanal].Node := Node;
|
||||
AutoBinOn := AutoBin;
|
||||
|
||||
{//db1ras}
|
||||
Memo^.Kanal[Kanal].CSelf := CSelf ;
|
||||
Memo^.Kanal[Kanal].AutoZeile := AutoZeile ;
|
||||
Memo^.Kanal[Kanal].Auto1Zeile := Auto1Zeile ;
|
||||
Memo^.Kanal[Kanal].AutoTime := AutoTime ;
|
||||
Memo^.Kanal[Kanal].AutoZaehl := AutoZaehl ;
|
||||
Memo^.Kanal[Kanal].AutoJump := AutoJump ;
|
||||
Memo^.Kanal[Kanal].AutoZyConst := AutoZyConst ;
|
||||
Memo^.Kanal[Kanal].AutoZyCount := AutoZyCount ;
|
||||
Memo^.Kanal[Kanal].AutoWait := AutoWait ;
|
||||
Memo^.Kanal[Kanal].AutoToConst := AutoToConst ;
|
||||
Memo^.Kanal[Kanal].AutoToCount := AutoToCount ;
|
||||
Memo^.Kanal[Kanal].AutoToAnz := AutoToAnz ;
|
||||
Memo^.Kanal[Kanal].AutoToMax := AutoToMax ;
|
||||
Memo^.Kanal[Kanal].AutoToAnzJmp := AutoToAnzJmp ;
|
||||
Memo^.Kanal[Kanal].AutoChMerk := AutoChMerk ;
|
||||
Memo^.Kanal[Kanal].AutoArt := AutoArt ;
|
||||
Memo^.Kanal[Kanal].AutoCheckLn := AutoCheckLn ;
|
||||
Memo^.Kanal[Kanal].AutoJmpPtr := AutoJmpPtr ;
|
||||
For i:=1 To maxAutoJmpPtr Do
|
||||
Memo^.Kanal[Kanal].AutoJmpRet[i]:= AutoJmpRet[i];
|
||||
|
||||
Memo^.Global.Klingel := Klingel;
|
||||
Memo^.Global.CtrlBeep := CtrlBeep;
|
||||
Memo^.Global.Time_stamp := Time_Stamp;
|
||||
Memo^.Global.PacOut := PacOut;
|
||||
Memo^.Global.ZeigeRET := ZeigeRet;
|
||||
Memo^.Global.ConMorsen := ConMorsen;
|
||||
Memo^.Global.ReconMorsen := ReconMorsen;
|
||||
(* if ConVoice then Write(G^.TFile,'A');
|
||||
if ReconVoice then Write(G^.TFile,'J'); *)
|
||||
Memo^.Global.GlobalTrenn := GlobalTrenn;
|
||||
Memo^.Global.BinOut := BinOut;
|
||||
Memo^.Global.Ins := Ins;
|
||||
Memo^.Global.NoBinMon := NoBinMon;
|
||||
Memo^.Global.RX_TX_Win := RX_TX_Win;
|
||||
end;
|
||||
end;
|
||||
Hstr := '';
|
||||
for i := 1 to 10 do Memo^.Global.Setl[i]:=G^.SETL[i];
|
||||
Memo^.Global.SetNr:=SETNr;
|
||||
|
||||
Memo^.global.Speak:=speek;
|
||||
if vspeed<1 then vspeed:=40;
|
||||
Memo^.global.SpeakSpeed:=Vspeed;
|
||||
|
||||
|
||||
Memo^.Global.Idle_Pos := Idle_Pos;
|
||||
Memo^.Global.Idle_Anz := Idle_anz;
|
||||
Memo^.Global.Idle_Tout := Idle_Tout;
|
||||
|
||||
Memo^.Global.TonHoehe:=G^.TonHoehe;
|
||||
|
||||
Memo^.Global._VGA := _vga;
|
||||
Memo^.Global.MPause:=MPause;
|
||||
Memo^.Global.Resync_Z:=Resync_Z;
|
||||
Memo^.Global.CNr:=CNr;
|
||||
Memo^.Global.VIP:=VIPG;
|
||||
Memo^.Global.SoZeichen:=SoZeichen;
|
||||
Memo^.Global.StatusModus:=G^.StatusModus;
|
||||
Memo^.Global.ZeilenwTX := G^.ZeilenwTX;
|
||||
(* Writeln(G^.TFile,Rrgl,Rvsp,GL,VSpeed); *)
|
||||
Memo^.Global.InfoStr:=G^.InfoStr;
|
||||
write(mdat, Memo^);
|
||||
{$I-}
|
||||
Close(MDat);
|
||||
obf:=ioresult;
|
||||
{$I+}
|
||||
end;
|
||||
Dispose(Memo);
|
||||
{FreeMem(Memo,SizeOf(Memotyp));}
|
||||
End;
|
||||
|
||||
|
||||
Procedure Merker_File_Lesen; {//db1ras}
|
||||
|
||||
{$IFDEF ReadOldMemo} {//db1ras}
|
||||
Procedure Altes_Merker_File_Lesen;
|
||||
Var Result : Word;
|
||||
Hstr : String[10];
|
||||
i,i1,
|
||||
i2,C : Integer;
|
||||
Memo : ^OldMemoTyp;
|
||||
MDat : File of OldMemoTyp;
|
||||
OBF : Byte;
|
||||
|
||||
{for i := 1 to maxTNC do if TNC_used[i] then with TNC[i]^ do}
|
||||
|
||||
Begin
|
||||
Assign(Mdat,Sys1Pfad + MerkDatei + Ext);
|
||||
{$I-}
|
||||
Reset(MDat);
|
||||
obf:=ioresult;
|
||||
{$I+}
|
||||
if obf = 0 then begin
|
||||
Memo:=NIL;
|
||||
New(Memo);
|
||||
{ WriteTxt(XCP,SZ1,StartColor,MerkDatei + Ext);}
|
||||
{*** 3}
|
||||
gotoxy(1,20);
|
||||
writeln(' Ú ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ¿');
|
||||
writeln(' À ßßßßßßßßßßßßßßßßßßßßßßßßßß Ù');
|
||||
XCP := XCP + SZL;
|
||||
|
||||
read(MDat, Memo^);
|
||||
|
||||
for i := 1 to MaxTNC do if TNC_used[i] then
|
||||
begin
|
||||
with TNC[i]^ do
|
||||
begin
|
||||
Btext := Memo^.TNC[i].btext;
|
||||
BPfad := Memo^.TNC[i].bpfad;
|
||||
|
||||
Bake := Memo^.TNC[i].Bake;
|
||||
BTimer := Memo^.TNC[i].Btimer;
|
||||
if BTimer = 0 then BTimer := 20;
|
||||
BCall:=Memo^.TNC[i].BCall;
|
||||
CText := Memo^.TNC[i].ctext;
|
||||
Info := Memo^.TNC[i].info;
|
||||
Aktuell := Memo^.TNC[i].aktuell;
|
||||
QText := Memo^.TNC[i].qtext;
|
||||
Fix := Memo^.TNC[i].fix;
|
||||
QRG_Akt := Memo^.TNC[i].qrg_akt;
|
||||
if QRG_Akt = '' then QRG_Akt := PseudoQRG;
|
||||
end;
|
||||
end;
|
||||
c:=-1;
|
||||
while (C < MaxLink) do
|
||||
begin
|
||||
inc(c);
|
||||
K[c]^.OwnCall := '*';
|
||||
K[c]^.Umlaut := Memo^.Kanal[c].Umlaut;
|
||||
if c=0 then k[c]^.RxComp:= Memo^.Kanal[c].RXComp;
|
||||
if Memo^.Kanal[c].OwnCall<>'' then
|
||||
with K[C]^ do
|
||||
begin
|
||||
if C > 0 then
|
||||
begin
|
||||
OwnCall:=Memo^.Kanal[c].owncall;
|
||||
AutoZyConst := Memo^.Kanal[c].AutoZyConst;
|
||||
if AutoZyConst > 0 then CSelf := 2;
|
||||
end;
|
||||
|
||||
MaxFrame := Memo^.Kanal[c].MaxFrame;
|
||||
if not (MaxFrame in [1..7]) then MaxFrame := 1;
|
||||
PacLen := Memo^.Kanal[c].PacLen;
|
||||
if not (PacLen in [1..FF]) then PacLen := FF;
|
||||
ObStat := Memo^.Kanal[c].OBStat;
|
||||
UnStat := Memo^.Kanal[c].UnStat;
|
||||
UmlautMerk := Memo^.Kanal[c].UmlautMerk;
|
||||
if not (UmlautMerk in UmlMenge) then UmlautMerk := 0;
|
||||
|
||||
FRxName := Memo^.Kanal[c].FRxName;
|
||||
if FRXName <>'' then
|
||||
begin
|
||||
if OpenTextFile(C) then
|
||||
begin
|
||||
RX_Count := 0;
|
||||
RX_Laenge := 0;
|
||||
RX_Bin := 0;
|
||||
RX_Save := true;
|
||||
FTxName := G^.Drive;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
FRxName := Konfig.SavVerz + TxtName + SFillStr(3,'0',int_str(C));
|
||||
FTxName := Konfig.SavVerz;
|
||||
end;
|
||||
|
||||
SvName := Memo^.Kanal[c].SaveFName;
|
||||
if SvName<>'' then
|
||||
begin
|
||||
Assign(SFile,SvName);
|
||||
Result := ResetBin(SFile,T);
|
||||
if Result = 0 then Seek(SFile,FileSize(SFile))
|
||||
else Result := RewriteBin(SFile,T);
|
||||
if Result = 0 then Save := true;
|
||||
end else
|
||||
begin
|
||||
SvName := Konfig.SavVerz + SaveName + SFillStr(3,'0',int_str(C));
|
||||
end;
|
||||
|
||||
if Memo^.Kanal[c].SplFName > '' then
|
||||
begin
|
||||
Assign(SplFile,Memo^.Kanal[c].SPlFName);
|
||||
if ResetBin(SplFile,T) = 0 then
|
||||
begin
|
||||
Seek(SplFile,FileSize(SplFile));
|
||||
SPlus := true;
|
||||
SplSave := true;
|
||||
Spl_gLaenge := Memo^.Kanal[c].SPl_glaenge;
|
||||
Spl_gCount := Memo^.Kanal[c].spl_gcount;
|
||||
Spl_tLaenge := Memo^.Kanal[c].spl_tlaenge;
|
||||
Spl_tCount := Memo^.Kanal[c].Spl_TCount;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
echo := Memo^.Kanal[c].Echo;
|
||||
if echo>99 then
|
||||
begin
|
||||
Echo:=Echo-100;
|
||||
SysTextEcho:=true;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
if C > 0 then
|
||||
begin
|
||||
|
||||
Auto := Memo^.Kanal[c].Auto;
|
||||
RX_Beep := Memo^.Kanal[c].RX_Beep;
|
||||
|
||||
TxBeepAck := Memo^.Kanal[C].TxBeepAck;
|
||||
{ Speek := (pos('P',DZeile) > 0);}
|
||||
AutoBin := Memo^.Kanal[c].AutoBin;
|
||||
SPlus := Memo^.Kanal[c].SPlus;
|
||||
if K[c]^.connected then {unsinnig, da immer true //db1ras}
|
||||
begin
|
||||
TxComp := Memo^.Kanal[c].TXComp;
|
||||
RxComp := Memo^.Kanal[c].RXComp;
|
||||
StopComp := Memo^.Kanal[c].StopComp;
|
||||
StopCode := Memo^.Kanal[c].StopCode;
|
||||
SPComp := Memo^.Kanal[c].SPComp;
|
||||
CompC:=Memo^.Kanal[c].CompC;
|
||||
KompressUpd:=Memo^.Kanal[c].KompressUpd;
|
||||
CompCUpdZahl:=Memo^.Kanal[c].CompCUpdZahl;
|
||||
for i := 1 to 255 do
|
||||
Kompression[i]:=Memo^.Kanal[c].Kompression[i];
|
||||
end;
|
||||
NoCurJump := Memo^.Kanal[C].NoCurJump;
|
||||
Node := Memo^.Kanal[c].Node;
|
||||
{if (connected) or (Mo.MonActive) then }ignore := memo^.Kanal[c].ignore;
|
||||
end;
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
for i := 1 to 10 do G^.SETL[i] := Memo^.Global.Setl[i];
|
||||
SETNr := Memo^.Global.setnr;
|
||||
if not (SETNr in [1..10]) then SETNr := 1;
|
||||
Klingel := Memo^.Global.Klingel;
|
||||
CtrlBeep := Memo^.Global.CtrlBeep;
|
||||
Time_Stamp := Memo^.Global.Time_Stamp;
|
||||
PacOut := Memo^.Global.PacOut;
|
||||
ZeigeRET := Memo^.Global.ZeigeRet;
|
||||
ConMorsen := Memo^.Global.ConMorsen;
|
||||
ReconMorsen := Memo^.Global.ReconMorsen;
|
||||
{ ConVoice := (pos('A',DZeile) > 0);
|
||||
ReconVoice := (pos('J',DZeile) > 0);}
|
||||
GlobalTrenn := Memo^.Global.GlobalTrenn;
|
||||
BinOut := Memo^.Global.BinOut;
|
||||
Ins := Memo^.Global.ins;
|
||||
NoBinMon := Memo^.Global.NoBinMon;
|
||||
RX_TX_Win := Memo^.Global.RX_TX_win;
|
||||
morsen := Memo^.Global.morsen;
|
||||
TopBox := Memo^.Global.TopBox;
|
||||
Gross := Memo^.Global.Gross;
|
||||
Idle_Pos := Memo^.Global.idle_pos;
|
||||
Idle_Anz := Memo^.Global.idle_anz;
|
||||
Idle_Tout := Memo^.Global.Idle_Tout;
|
||||
G^.TonHoehe := Memo^.Global.TonHoehe;
|
||||
VIPG := Memo^.Global.VIP;
|
||||
SoZeichen := Memo^.Global.SoZeichen;
|
||||
_VGA := Memo^.Global._vga;
|
||||
MPause := Memo^.Global.MPause;
|
||||
Resync_Z := Memo^.Global.Resync_Z;
|
||||
CNr := Memo^.Global.Cnr;
|
||||
|
||||
VSpeed:=memo^.global.speakspeed;
|
||||
speek:=memo^.global.speak;
|
||||
|
||||
{ MerkRead(Rrgl + Rvsp);
|
||||
if DZeile > '' then VSpeed := Word(str_int(DZeile));}
|
||||
|
||||
G^.InfoStr := Memo^.Global.InfoStr;
|
||||
G^.StatusModus := Memo^.Global.StatusModus;
|
||||
G^.ZeilenwTX := Memo^.Global.ZeilenwTX;
|
||||
|
||||
{$I-}
|
||||
Close(MDat);
|
||||
obf:=Ioresult;
|
||||
{$I+}
|
||||
Dispose(Memo);
|
||||
end else (* If IOResult ... *)
|
||||
begin
|
||||
for i := 0 to maxLink do with K[i]^ do
|
||||
begin
|
||||
FRxName := G^.Drive + Txt + int_str(i) + Ext;
|
||||
FTxName := G^.Drive;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
{$ENDIF}
|
||||
|
||||
Procedure Neues_Merker_File_Lesen;
|
||||
Var Result : Word;
|
||||
Hstr : String[10];
|
||||
i,i1,
|
||||
i2,C : Integer;
|
||||
Memo : ^MemoTyp;
|
||||
MDat : File of MemoTyp;
|
||||
OBF : Byte;
|
||||
|
||||
{for i := 1 to maxTNC do if TNC_used[i] then with TNC[i]^ do}
|
||||
|
||||
Begin
|
||||
Assign(Mdat,Sys1Pfad + MerkDatei + Ext);
|
||||
{$I-}
|
||||
Reset(MDat);
|
||||
obf:=ioresult;
|
||||
{$I+}
|
||||
|
||||
if obf = 0 then
|
||||
begin
|
||||
Memo:=NIL;
|
||||
New(Memo);
|
||||
{ WriteTxt(XCP,SZ1,StartColor,MerkDatei + Ext);}
|
||||
{*** 3}
|
||||
gotoxy(1,20);
|
||||
writeln(' Ú ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ¿');
|
||||
writeln(' À ßßßßßßßßßßßßßßßßßßßßßßßßßß Ù');
|
||||
XCP := XCP + SZL;
|
||||
|
||||
read(MDat, Memo^);
|
||||
|
||||
for i := 1 to MaxTNC do if TNC_used[i] then
|
||||
begin
|
||||
with TNC[i]^ do
|
||||
begin
|
||||
Btext := Memo^.TNC[i].btext;
|
||||
BPfad := Memo^.TNC[i].bpfad;
|
||||
|
||||
Bake := Memo^.TNC[i].Bake;
|
||||
BTimer := Memo^.TNC[i].Btimer;
|
||||
if BTimer = 0 then BTimer := 20;
|
||||
BCall:=Memo^.TNC[i].BCall;
|
||||
CText := Memo^.TNC[i].ctext;
|
||||
Info := Memo^.TNC[i].info;
|
||||
Aktuell := Memo^.TNC[i].aktuell;
|
||||
QText := Memo^.TNC[i].qtext;
|
||||
Fix := Memo^.TNC[i].fix;
|
||||
QRG_Akt := Memo^.TNC[i].qrg_akt;
|
||||
if QRG_Akt = '' then QRG_Akt := PseudoQRG;
|
||||
end;
|
||||
end;
|
||||
c:=-1;
|
||||
while (C < MaxLink) do
|
||||
begin
|
||||
inc(c);
|
||||
K[c]^.OwnCall := '*';
|
||||
K[c]^.Umlaut := Memo^.Kanal[c].Umlaut;
|
||||
if c=0 then k[c]^.RxComp:= Memo^.Kanal[c].RXComp;
|
||||
if Memo^.Kanal[c].OwnCall<>'' then
|
||||
with K[C]^ do
|
||||
begin
|
||||
if C > 0 then
|
||||
begin
|
||||
OwnCall:=Memo^.Kanal[c].owncall;
|
||||
AutoZyConst := Memo^.Kanal[c].AutoZyConst;
|
||||
if AutoZyConst > 0 then CSelf := 2;
|
||||
end;
|
||||
|
||||
MaxFrame := Memo^.Kanal[c].MaxFrame;
|
||||
if not (MaxFrame in [1..7]) then MaxFrame := 1;
|
||||
PacLen := Memo^.Kanal[c].PacLen;
|
||||
if not (PacLen in [1..FF]) then PacLen := FF;
|
||||
ObStat := Memo^.Kanal[c].OBStat;
|
||||
UnStat := Memo^.Kanal[c].UnStat;
|
||||
UmlautMerk := Memo^.Kanal[c].UmlautMerk;
|
||||
if not (UmlautMerk in UmlMenge) then UmlautMerk := 0;
|
||||
|
||||
FRxName := Memo^.Kanal[c].FRxName;
|
||||
if FRXName <>'' then
|
||||
begin
|
||||
if OpenTextFile(C) then
|
||||
begin
|
||||
RX_Count := 0;
|
||||
RX_Laenge := 0;
|
||||
RX_Bin := 0;
|
||||
RX_Save := true;
|
||||
FTxName := G^.Drive;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
FRxName := Konfig.SavVerz + TxtName + SFillStr(3,'0',int_str(C));
|
||||
FTxName := Konfig.SavVerz;
|
||||
end;
|
||||
|
||||
SvName := Memo^.Kanal[c].SaveFName;
|
||||
if SvName<>'' then
|
||||
begin
|
||||
Assign(SFile,SvName);
|
||||
Result := ResetBin(SFile,T);
|
||||
if Result = 0 then Seek(SFile,FileSize(SFile))
|
||||
else Result := RewriteBin(SFile,T);
|
||||
if Result = 0 then Save := true;
|
||||
end else
|
||||
begin
|
||||
SvName := Konfig.SavVerz + SaveName + SFillStr(3,'0',int_str(C));
|
||||
end;
|
||||
|
||||
if Memo^.Kanal[c].SplFName > '' then
|
||||
begin
|
||||
Assign(SplFile,Memo^.Kanal[c].SPlFName);
|
||||
if ResetBin(SplFile,T) = 0 then
|
||||
begin
|
||||
Seek(SplFile,FileSize(SplFile));
|
||||
SPlus := true;
|
||||
SplSave := true;
|
||||
Spl_gLaenge := Memo^.Kanal[c].SPl_glaenge;
|
||||
Spl_gCount := Memo^.Kanal[c].spl_gcount;
|
||||
Spl_tLaenge := Memo^.Kanal[c].spl_tlaenge;
|
||||
Spl_tCount := Memo^.Kanal[c].Spl_TCount;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
echo := Memo^.Kanal[c].Echo;
|
||||
if echo>99 then
|
||||
begin
|
||||
Echo:=Echo-100;
|
||||
SysTextEcho:=true;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
if C > 0 then
|
||||
begin
|
||||
|
||||
Auto := Memo^.Kanal[c].Auto;
|
||||
RX_Beep := Memo^.Kanal[c].RX_Beep;
|
||||
|
||||
TxBeepAck := Memo^.Kanal[C].TxBeepAck;
|
||||
{ Speek := (pos('P',DZeile) > 0);}
|
||||
AutoBin := Memo^.Kanal[c].AutoBin;
|
||||
SPlus := Memo^.Kanal[c].SPlus;
|
||||
if K[c]^.connected then {unsinnig, da immer true //db1ras}
|
||||
begin
|
||||
TxComp := Memo^.Kanal[c].TXComp;
|
||||
RxComp := Memo^.Kanal[c].RXComp;
|
||||
StopComp := Memo^.Kanal[c].StopComp;
|
||||
StopCode := Memo^.Kanal[c].StopCode;
|
||||
SPComp := Memo^.Kanal[c].SPComp;
|
||||
CompC:=Memo^.Kanal[c].CompC;
|
||||
KompressUpd:=Memo^.Kanal[c].KompressUpd;
|
||||
CompCUpdZahl:=Memo^.Kanal[c].CompCUpdZahl;
|
||||
for i := 1 to 255 do
|
||||
Kompression[i]:=Memo^.Kanal[c].Kompression[i];
|
||||
end;
|
||||
NoCurJump := Memo^.Kanal[C].NoCurJump;
|
||||
Node := Memo^.Kanal[c].Node;
|
||||
{if (connected) or (Mo.MonActive) then }
|
||||
ignore := memo^.Kanal[c].ignore;
|
||||
end;
|
||||
|
||||
{//db1ras}
|
||||
CSelf := Memo^.Kanal[c].CSelf ;
|
||||
AutoZeile := Memo^.Kanal[c].AutoZeile ;
|
||||
Auto1Zeile := Memo^.Kanal[c].Auto1Zeile ;
|
||||
AutoTime := Memo^.Kanal[c].AutoTime ;
|
||||
AutoZaehl := Memo^.Kanal[c].AutoZaehl ;
|
||||
AutoJump := Memo^.Kanal[c].AutoJump ;
|
||||
AutoZyConst := Memo^.Kanal[c].AutoZyConst ;
|
||||
AutoZyCount := Memo^.Kanal[c].AutoZyCount ;
|
||||
AutoWait := Memo^.Kanal[c].AutoWait ;
|
||||
AutoToConst := Memo^.Kanal[c].AutoToConst ;
|
||||
AutoToCount := Memo^.Kanal[c].AutoToCount ;
|
||||
AutoToAnz := Memo^.Kanal[c].AutoToAnz ;
|
||||
AutoToMax := Memo^.Kanal[c].AutoToMax ;
|
||||
AutoToAnzJmp := Memo^.Kanal[c].AutoToAnzJmp ;
|
||||
AutoChMerk := Memo^.Kanal[c].AutoChMerk ;
|
||||
AutoArt := Memo^.Kanal[c].AutoArt ;
|
||||
AutoCheckLn := Memo^.Kanal[c].AutoCheckLn ;
|
||||
AutoJmpPtr := Memo^.Kanal[c].AutoJmpPtr ;
|
||||
For i:=1 To maxAutoJmpPtr Do
|
||||
AutoJmpRet[i]:= Memo^.Kanal[c].AutoJmpRet[i];
|
||||
end;
|
||||
end;
|
||||
|
||||
for i := 1 to 10 do G^.SETL[i] := Memo^.Global.Setl[i];
|
||||
SETNr := Memo^.Global.setnr;
|
||||
if not (SETNr in [1..10]) then SETNr := 1;
|
||||
Klingel := Memo^.Global.Klingel;
|
||||
CtrlBeep := Memo^.Global.CtrlBeep;
|
||||
Time_Stamp := Memo^.Global.Time_Stamp;
|
||||
PacOut := Memo^.Global.PacOut;
|
||||
ZeigeRET := Memo^.Global.ZeigeRet;
|
||||
ConMorsen := Memo^.Global.ConMorsen;
|
||||
ReconMorsen := Memo^.Global.ReconMorsen;
|
||||
{ ConVoice := (pos('A',DZeile) > 0);
|
||||
ReconVoice := (pos('J',DZeile) > 0);}
|
||||
GlobalTrenn := Memo^.Global.GlobalTrenn;
|
||||
BinOut := Memo^.Global.BinOut;
|
||||
Ins := Memo^.Global.ins;
|
||||
NoBinMon := Memo^.Global.NoBinMon;
|
||||
RX_TX_Win := Memo^.Global.RX_TX_win;
|
||||
morsen := Memo^.Global.morsen;
|
||||
TopBox := Memo^.Global.TopBox;
|
||||
Gross := Memo^.Global.Gross;
|
||||
Idle_Pos := Memo^.Global.idle_pos;
|
||||
Idle_Anz := Memo^.Global.idle_anz;
|
||||
Idle_Tout := Memo^.Global.Idle_Tout;
|
||||
G^.TonHoehe := Memo^.Global.TonHoehe;
|
||||
VIPG := Memo^.Global.VIP;
|
||||
SoZeichen := Memo^.Global.SoZeichen;
|
||||
_VGA := Memo^.Global._vga;
|
||||
MPause := Memo^.Global.MPause;
|
||||
Resync_Z := Memo^.Global.Resync_Z;
|
||||
CNr := Memo^.Global.Cnr;
|
||||
|
||||
VSpeed:=memo^.global.speakspeed;
|
||||
speek:=memo^.global.speak;
|
||||
|
||||
{ MerkRead(Rrgl + Rvsp);
|
||||
if DZeile > '' then VSpeed := Word(str_int(DZeile));}
|
||||
|
||||
G^.InfoStr := Memo^.Global.InfoStr;
|
||||
G^.StatusModus := Memo^.Global.StatusModus;
|
||||
G^.ZeilenwTX := Memo^.Global.ZeilenwTX;
|
||||
|
||||
{$I-}
|
||||
Close(MDat);
|
||||
obf:=Ioresult;
|
||||
{$I+}
|
||||
Dispose(Memo);
|
||||
end else (* If IOResult ... *)
|
||||
begin
|
||||
for i := 0 to maxLink do with K[i]^ do
|
||||
begin
|
||||
FRxName := G^.Drive + Txt + int_str(i) + Ext;
|
||||
FTxName := G^.Drive;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
{$IFDEF ReadOldMemo} {//db1ras}
|
||||
Var MVer : File of Char;
|
||||
v1,v2 : Char;
|
||||
sv1,sv2 : String[2];
|
||||
Memo : String;
|
||||
obf : Byte;
|
||||
{$ENDIF}
|
||||
|
||||
Begin (* Merker_File_Lesen *)
|
||||
|
||||
{$IFDEF ReadOldMemo} {//db1ras}
|
||||
Assign(MVer,Sys1Pfad + MerkDatei + Ext);
|
||||
{$I-}
|
||||
Reset(MVer);
|
||||
obf:=ioresult;
|
||||
{$I+}
|
||||
If obf = 0 Then Begin
|
||||
Read(MVer, v1,v2);
|
||||
{$I-}
|
||||
Close(MVer);
|
||||
obf:=Ioresult;
|
||||
{$I+}
|
||||
If (v1<>Chr(MerkV1)) Or (v2<>Chr(MerkV2)) Then Begin
|
||||
If (v1=Chr(OldMerkV1)) And (v2=Chr(OldMerkV2)) Then
|
||||
Altes_Merker_File_Lesen;
|
||||
Str(Ord(v1),sv1);
|
||||
Str(Ord(v2),sv2);
|
||||
Memo:=Sys1Pfad+MerkDatei+Ext+' '+Sys1Pfad+MerkDatei+'.'+sv1+sv2;
|
||||
FileKopieren(Memo);
|
||||
{ Rename(MVer,Sys1Pfad+MerkDatei+'.'+sv1+sv2); }
|
||||
End Else
|
||||
{$ENDIF}
|
||||
|
||||
Neues_Merker_File_Lesen;
|
||||
|
||||
{$IFDEF ReadOldMemo} {//db1ras}
|
||||
End Else
|
||||
Neues_Merker_File_Lesen;
|
||||
{$ENDIF}
|
||||
|
||||
End;
|
482
XPNETROM.PAS
Executable file
482
XPNETROM.PAS
Executable file
@ -0,0 +1,482 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P N E T R O M . P A S ³
|
||||
³ ³
|
||||
³ Netrom-Datenbank-Verwaltung und Online-Ansicht ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
Function NodesAnzahl;
|
||||
var BFNa:string[12];
|
||||
N:integer;
|
||||
Bcdt:file of Broadcast;
|
||||
ioo:word;
|
||||
|
||||
begin
|
||||
{$I-}
|
||||
if NAfu then bfna:=BCastHAM else bfna:=BCastCB;
|
||||
assign(bcdt, sys1pfad+BFNa);
|
||||
reset(bcdt);
|
||||
if ioresult=0 then N:=FileSize(bcdt) else N:=0;
|
||||
ioo:=ioresult;
|
||||
close(bcdt);
|
||||
ioo:=ioresult;
|
||||
{$I+}
|
||||
Nodesanzahl:=N;
|
||||
end;
|
||||
|
||||
Function BCastBackupRename (AltNam : String) :boolean;
|
||||
var ior : word;
|
||||
bkflg:boolean;
|
||||
BKD_ : file;
|
||||
begin
|
||||
{$I-}
|
||||
bkflg:=false;
|
||||
assign (BKD_, sys1pfad+BcastBAK);
|
||||
erase(BKD_);
|
||||
ior:=ioresult;
|
||||
close(BKD_);
|
||||
ior:=ioresult;
|
||||
assign (BKD_, AltNam);
|
||||
rename (BKd_, sys1pfad+BCastBAK);
|
||||
ior:=ioresult;
|
||||
if ior<1 then bkflg:=true;
|
||||
BCastBackupRename := bkflg;
|
||||
close(bKD_);
|
||||
ior:=ioresult;
|
||||
{$I+}
|
||||
end;
|
||||
|
||||
|
||||
Procedure BCastKillen;
|
||||
var ior : word;
|
||||
bkflg:boolean;
|
||||
BKD_ : file;
|
||||
|
||||
begin
|
||||
{$I-}
|
||||
bkflg:=false;
|
||||
assign (BKD_, sys1pfad+BcastCB);
|
||||
erase(BKD_);
|
||||
ior:=ioresult;
|
||||
close(BKD_);
|
||||
ior:=ioresult;
|
||||
|
||||
assign (BKD_, sys1pfad+BcastHAM);
|
||||
erase(BKD_);
|
||||
ior:=ioresult;
|
||||
close(BKD_);
|
||||
ior:=ioresult;
|
||||
{$I+}
|
||||
end;
|
||||
|
||||
|
||||
|
||||
Procedure NodesLifetime;
|
||||
var bfn : string[12];
|
||||
i, kill : integer;
|
||||
durch : byte;
|
||||
bdbk,
|
||||
bd : file of broadcast;
|
||||
bdd : broadcast;
|
||||
AktDT : longint;
|
||||
min1, min2:longint;
|
||||
gekillt : boolean;
|
||||
ioo : word;
|
||||
|
||||
begin
|
||||
aktDT:=LastLTCheck;
|
||||
{aktdt:=589865783+14400;}
|
||||
|
||||
{(Dtst-bcast.DatTime) div 60)*2));}
|
||||
ioo:=NodesAnzahl(false);
|
||||
{$I-}
|
||||
for durch:=1 to 2 do
|
||||
begin
|
||||
gekillt:=false;
|
||||
if durch=1 then bfn:=BCastHAM else bfn:=BCastCB;
|
||||
if BCastBackupRename (Sys1Pfad+bfn) then
|
||||
begin
|
||||
assign(bd, sys1pfad+bfn);
|
||||
rewrite(bd);
|
||||
ioo:=ioresult;
|
||||
assign(BDBK, Sys1Pfad+BCastBAK); reset(BDBK);
|
||||
if ioresult=0 then
|
||||
begin
|
||||
kill:=0; i:=0;
|
||||
while not eof(bdbk) do
|
||||
begin
|
||||
read(bdbk, bdd);
|
||||
ioo:=ioresult;
|
||||
{(Dtst-bcast.DatTime) div 60)*2));}
|
||||
min1:=0;
|
||||
min1:=(aktdt-bdd.dattime) *2;
|
||||
if min1>=Konfig.Lifetime then gekillt:=true;;
|
||||
if (not gekillt) then write(bd, bdd);
|
||||
gekillt:=false;
|
||||
ioo:=ioresult;
|
||||
end;
|
||||
end;
|
||||
close(bd);
|
||||
ioo:=ioresult;
|
||||
close(BDBK);
|
||||
ioo:=ioresult;
|
||||
end; {if BackupRename}
|
||||
end; {for}
|
||||
ioo:=ioresult;
|
||||
ioo:=NodesAnzahl(false);
|
||||
{$I+}
|
||||
end;
|
||||
|
||||
Procedure NodesSortieren;
|
||||
Var du, x,i,j : longInt;
|
||||
N : longint;
|
||||
Change : Boolean;
|
||||
bfn:string[12];
|
||||
bcda : file of Broadcast;
|
||||
bcda1, bcda2, bcda3 : Broadcast;
|
||||
obf:boolean;
|
||||
ioo:word;
|
||||
|
||||
Begin
|
||||
{if inUDB then WriteRam(1,3,Attrib[5],1,EFillStr(80,B1,B1+InfoZeile(402)));}
|
||||
|
||||
{$I-}
|
||||
for DU:=1 to 2 do
|
||||
begin
|
||||
if Du=1 then
|
||||
begin
|
||||
bfn:=BCastHAM;
|
||||
N:=NodesAnzahl(true);
|
||||
end
|
||||
else
|
||||
begin
|
||||
bfn:=BCastCB;
|
||||
N:=NodesAnzahl(false);
|
||||
end;
|
||||
assign(bcda, sys1pfad+bfn);reset(bcda);
|
||||
ioo:=ioresult;
|
||||
|
||||
if N>0 then
|
||||
begin
|
||||
if N > 1 then
|
||||
begin
|
||||
x := 1;
|
||||
While x <= N do x := x * 3 + 1;
|
||||
x := x div 3;
|
||||
While x > 0 do
|
||||
begin
|
||||
i := x;
|
||||
While i <= N do
|
||||
begin
|
||||
j := i - x;
|
||||
Change := true;
|
||||
While (j > 0) and Change do
|
||||
begin
|
||||
Seek(bcda, j-1); read(bcda, bcda1);
|
||||
Seek(bcda, j+x-1); read(bcda, bcda2);
|
||||
if bcda2.DatTime > bcda1.DatTime then
|
||||
begin
|
||||
bcda3 := bcda2;
|
||||
bcda2 := bcda1;
|
||||
bcda1 := bcda3;
|
||||
Seek(bcda, j-1); write(bcda, bcda1);
|
||||
Seek(bcda, j+x-1); write(bcda, bcda2);
|
||||
j := j - x;
|
||||
end else Change := false;
|
||||
end;
|
||||
i := i + 1;
|
||||
end;
|
||||
x := x div 3;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
end; {if N}
|
||||
obf:=ioresult<1;
|
||||
close(bcda);
|
||||
obf:=ioresult<0;
|
||||
{$I+}
|
||||
end;{for du}
|
||||
End;
|
||||
|
||||
|
||||
Procedure NodeListen (* (Naf : Boolean) *) ;
|
||||
var BCast : Broadcast;
|
||||
BCDat : file of broadcast;
|
||||
HamZ,
|
||||
CBZ,
|
||||
bfn : string[12];
|
||||
dummy : String[80];
|
||||
DatPos : Longint;
|
||||
BPos,
|
||||
i,
|
||||
y : Byte;
|
||||
ZMax : byte;
|
||||
dtst : longint;
|
||||
MaxNodes: integer;
|
||||
ioo : word;
|
||||
Raus,
|
||||
Change : boolean;
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
|
||||
Procedure NodeLesen;
|
||||
begin
|
||||
{ dtst:=packdt;}
|
||||
{$I-}
|
||||
Seek(BCDat, DatPos); read(BCdat,BCast);
|
||||
ioo:=ioresult;
|
||||
if ioo<>0 then FillChar(BCast,SizeOf(Bcast), 0);
|
||||
{$I+}
|
||||
dummy:=b1+efillstr(22,B1,BCast.NodeCall+':'+BCast.NodeAlias);
|
||||
dummy:=dummy+efillstr(22,B1,BCast.SourceCall+':'+Bcast.SourceAlias);
|
||||
dummy:=dummy+SfillStr(5,B1,int_Str(Bcast.quality))+b2+b1;
|
||||
dummy:=dummy+b2+int_Str(Bcast.Port); {+B2+int_str((Konfig.Lifetime div 60));
|
||||
dummy:=dummy+sfillstr(6,b1,int_Str(((Dtst-bcast.DatTime) div 60)*2)); }
|
||||
if ioo<>0 then dummy:='';
|
||||
end;
|
||||
|
||||
Procedure NodeDateiSchalten;
|
||||
begin
|
||||
{$I-}
|
||||
if NAf then bfn:=BCastHAM
|
||||
else bfn:=BCastCB;
|
||||
MaxNodes:=NodesAnzahl(Naf);
|
||||
assign(BCDat, sys1pfad+bfn);reset(BCDat);
|
||||
ioo:=ioresult;
|
||||
{$I+}
|
||||
end;
|
||||
|
||||
begin
|
||||
InNodeListe:=true;
|
||||
NodesSortieren;
|
||||
HamZ:=ParmStr(1,b1,InfoZeile(431));
|
||||
CBZ :=ParmStr(2,b1,InfoZeile(431));
|
||||
Raus:=False;
|
||||
Moni_Off(0);
|
||||
DirScroll := true;
|
||||
NowFenster := false;
|
||||
NodeDateiSchalten;
|
||||
if MaxNodes=0 then
|
||||
begin
|
||||
Naf:=Not Naf;
|
||||
{$I-}
|
||||
Close(Bcdat);
|
||||
datpos:=ioresult;
|
||||
{$I+}
|
||||
NodeDateiSchalten;
|
||||
end;
|
||||
{ NodeDateiSchalten;}
|
||||
ZMax:=MaxZ-4;
|
||||
DatPos:=0;
|
||||
WriteRam(1,1,Attrib[5],1,EFillStr(64,B1,B1+InfoZeile(432)));
|
||||
|
||||
WriteRam(1,2,Attrib[5],1,EFillStr(64,B1,B1+InfoZeile(429)));
|
||||
WriteRam(1,MaxZ,Attrib[5],1,EFillStr(80,B1,B1+'Bl„ttern mit PgUp/PgDn - AFU/CB umschalten mit Cursor rechts/links'));
|
||||
Change:=true;
|
||||
repeat
|
||||
if Change then
|
||||
begin
|
||||
if Naf then WriteRam(65,1,Attrib[5],1,SFillStr(16,B1,HamZ+b1))
|
||||
else WriteRam(65,1,Attrib[5],1,sFillStr(16,B1,CBZ+b1));
|
||||
WriteRam(65,2,Attrib[5],1,sFillStr(16,B1,'('+int_str(maxNodes)+')'+B1));
|
||||
i:=3;
|
||||
BPos:=DatPos;
|
||||
For DatPos:=Bpos to Bpos+ZMax do
|
||||
begin
|
||||
NodeLesen;
|
||||
WriteRam(1,i,Attrib[2],1,EFillStr(80,b1,Dummy));
|
||||
inc(i);
|
||||
end;
|
||||
Change:=false;
|
||||
datpos:=Bpos;
|
||||
end;
|
||||
_ReadKey(KC,VC);
|
||||
Case KC of
|
||||
_ESC : raus:=true;
|
||||
_AltH: XP_Help(G^.OHelp[94]);
|
||||
_Home: begin
|
||||
DatPos:=0;
|
||||
Change:=true;
|
||||
end;
|
||||
_PGDn: begin
|
||||
if (DatPos+zmax+1)<MaxNodes then
|
||||
begin
|
||||
inc(DatPos,zmax+1);
|
||||
Change:=true;
|
||||
end;
|
||||
end;
|
||||
_PGUp: begin
|
||||
if ((DatPos+zmax+1)>zmax) and ((DatPos-(zmax+1))>=0) then
|
||||
begin
|
||||
Dec(DatPos,zmax+1);
|
||||
Change:=true;
|
||||
end;
|
||||
end;
|
||||
_Right, _Left:
|
||||
begin
|
||||
Naf := Not Naf;
|
||||
DatPos:=0;
|
||||
Change:=true;
|
||||
{$I-}
|
||||
Close(BCDat);
|
||||
ioo:=ioresult;
|
||||
{$I+}
|
||||
NodeDateiSchalten;
|
||||
end;
|
||||
|
||||
end;
|
||||
until Raus;
|
||||
{$I-}
|
||||
Close(BCDat);
|
||||
ioo:=ioresult;
|
||||
{$I+}
|
||||
DirScroll := false;
|
||||
Moni_On;
|
||||
inNodeListe:=false;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
Procedure REMNodesListen (*Kanal:Byte;CZeile:String*);
|
||||
Var i,i1,i2,
|
||||
ix : Integer;
|
||||
dB,Tn,C,
|
||||
Anz : Byte;
|
||||
Bstr,
|
||||
Dummy : String;
|
||||
P : String[4];
|
||||
Komm : String[80];
|
||||
Path : String[80];
|
||||
Rufz : String[6];
|
||||
RufzStr : String[9];
|
||||
Hstr : String[9];
|
||||
srec : SearchRec;
|
||||
flagq,
|
||||
Flag : Boolean;
|
||||
Parm : Array[1..3] of String[60];
|
||||
Udb : User_typ2;
|
||||
L_I : Longint;
|
||||
ENTFG,
|
||||
RICHTG : REAL;
|
||||
STATUS : Boolean;
|
||||
OESLAE,NOEBRE:real;
|
||||
BCDat : file of Broadcast;
|
||||
BCDatNam : string[12];
|
||||
BCast : Broadcast;
|
||||
|
||||
begin
|
||||
With K[Kanal]^ do
|
||||
begin
|
||||
|
||||
if Konfig.MaxNodes>0 then
|
||||
begin
|
||||
i2:=str_int(RestStr(upcaseStr(CZeile)));
|
||||
if i2=0 then i2:=50;
|
||||
NodesSortieren;
|
||||
if TNC[TncNummer]^.AfuPort then BCDatNam:=BCastHAM else BCDatnam:=BCastCB;
|
||||
i:=NodesAnzahl(TNC[TncNummer]^.AfuPort);
|
||||
assign (BCDat, sys1pfad+BCDatNam);
|
||||
{$I-}
|
||||
i1:=0;
|
||||
reset(BCDat);
|
||||
if (i<=0) or (ioresult<>0) then S_Pac(kanal, nu, false, InfoZeile(430)+M1)
|
||||
else
|
||||
begin
|
||||
S_Pac(kanal, nu, false, m1+InfoZeile(434)+M2);
|
||||
while (not eof(BCDat)) and (i1<i2) do
|
||||
begin
|
||||
read(BCdat,BCast);
|
||||
{l„nge: max 19 je node}
|
||||
dummy:=efillstr(19,B1,BCast.NodeCall+':'+BCast.NodeAlias);
|
||||
inc(i1);
|
||||
if (i1 mod 4)=0 then S_Pac(kanal,Nu, false, dummy+m1)
|
||||
else S_Pac(kanal,Nu, false, dummy);
|
||||
end;
|
||||
end;
|
||||
if not ((i1 mod 4)=0) then s_pac(kanal, nu, false, m1);
|
||||
close(BCDat);
|
||||
i:=ioresult;
|
||||
{$I+}
|
||||
end else S_Pac(kanal, nu, false, InfoZeile(430)+M1)
|
||||
|
||||
end;{with kanal}
|
||||
|
||||
|
||||
end;
|
||||
|
||||
|
||||
Procedure REMRoutesListen (*Kanal:Byte; CZeile:String*);
|
||||
Var i,i1,i2,
|
||||
ix : Integer;
|
||||
dB,Tn,C,
|
||||
Anz : Byte;
|
||||
Bstr,
|
||||
Dummy : String;
|
||||
P : String[4];
|
||||
Komm : String[80];
|
||||
Path : String[80];
|
||||
Rufz : String[6];
|
||||
RufzStr : String[9];
|
||||
Hstr : String[9];
|
||||
srec : SearchRec;
|
||||
flagq,
|
||||
Flag : Boolean;
|
||||
Parm : Array[1..3] of String[60];
|
||||
Udb : User_typ2;
|
||||
L_I : Longint;
|
||||
ENTFG,
|
||||
RICHTG : REAL;
|
||||
STATUS : Boolean;
|
||||
OESLAE,NOEBRE:real;
|
||||
BCDat : file of Broadcast;
|
||||
BCDatNam : string[12];
|
||||
BCast : Broadcast;
|
||||
|
||||
begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
|
||||
if Konfig.MaxNodes>0 then
|
||||
begin
|
||||
hstr:=RestStr(upcaseStr(CZeile));
|
||||
if hstr<>'' then
|
||||
begin
|
||||
if TNC[TncNummer]^.AfuPort then BCDatNam:=BCastHAM else BCDatnam:=BCastCB;
|
||||
assign (BCDat, sys1pfad+BCDatNam);
|
||||
{$I-}
|
||||
i1:=0;
|
||||
reset(BCDat);
|
||||
if (ioresult<>0) then S_Pac(kanal, nu, false, InfoZeile(430)+M1)
|
||||
else
|
||||
begin
|
||||
flag:=false;
|
||||
while (not eof(BCDat)) do
|
||||
begin
|
||||
read(BCdat,BCast);
|
||||
if (pos(hstr,bcast.NodeCall)=1) or (pos(hstr, bcast.nodealias)=1) then
|
||||
begin
|
||||
if not flag then S_Pac(kanal, nu, false, m1+InfoZeile(435)+m2+InfoZeile(429)+M2);
|
||||
flag:=true;
|
||||
dummy:=efillstr(22,B1,BCast.NodeCall+':'+BCast.NodeAlias);
|
||||
dummy:=dummy+efillstr(22,B1,BCast.SourceCall+':'+Bcast.SourceAlias);
|
||||
dummy:=dummy+SfillStr(5,B1,int_Str(Bcast.quality))+b2+b1;
|
||||
dummy:=dummy+b2+int_Str(Bcast.Port){+B2+int_str(Bcast.DatTime)};
|
||||
inc(i1);
|
||||
if (i1 mod 4)=0 then S_Pac(kanal,Nu, true, dummy+m1)
|
||||
else S_Pac(kanal,Nu, false, dummy+m1);
|
||||
end;
|
||||
end; {while not eof}
|
||||
if not flag then S_Pac(kanal, nu, false, m1+InfoZeile(436)+M1);
|
||||
end;
|
||||
close(BCDat);
|
||||
i:=ioresult;
|
||||
{$I+}
|
||||
end else parmwrong:=true; {if hstr<>'' ...}
|
||||
end else S_Pac(kanal, nu, false, InfoZeile(430)+M1)
|
||||
|
||||
end; {with kanal}
|
||||
end;
|
137
XPOVR.PAS
Executable file
137
XPOVR.PAS
Executable file
@ -0,0 +1,137 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P O V R . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der aus dem Overlayteil nachgeladen wird ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
UNIT XPOVR;
|
||||
{$F+,O+}
|
||||
{-$DEFINE Sound}
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
|
||||
XPEMS,
|
||||
XPXMS,
|
||||
XPDEFS;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPINI.PAS *)
|
||||
Procedure Var_Init(Kanal : Byte);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPLIB1.PAS *)
|
||||
Function CheckXP161 (kanal:Byte) :Boolean;
|
||||
Function PackDT : longint;
|
||||
PROCEDURE Editor;
|
||||
Procedure Link_erhalter(Kanal : Byte; var Zeile : Str80);
|
||||
Procedure RC_update(Kanal : Byte; var Zeile : str80);
|
||||
Procedure File_Umbenennen(alt,neu : Str80; var Ueber,Art : Integer);
|
||||
Function SetzeSysArt (Kanal : Byte) : Boolean; {//db1ras}
|
||||
|
||||
{$IFNDEF no_Bake} {//db1ras}
|
||||
Procedure BakenMenu;
|
||||
{$ENDIF}
|
||||
|
||||
Procedure Tschuess(Kanal : Byte);
|
||||
Procedure TschuessFenster;
|
||||
Procedure TestCheck(Kanal : Byte; Zeile : Str80);
|
||||
Procedure UserInStatus (Kanal : Byte);
|
||||
Procedure Connect(Kanal : Byte; Zeile : Str80);
|
||||
Procedure S_Aus(Kanal,Art : Byte; Zeile : String);
|
||||
Procedure RC_Alle(Kanal,Art : Byte);
|
||||
Procedure TNC_Parm(Kanal,Art : Byte);
|
||||
Procedure GetVideoMode;
|
||||
Procedure Umlautstatus_Aendern(Kanal : Byte);
|
||||
Procedure Echo_Menue(Kanal : Byte);
|
||||
Function LPT_Error(Nr : Byte) : Boolean;
|
||||
Procedure Write_Lpt(Kanal : Byte; Zeile : Str20);
|
||||
Procedure Write_Drucker(Kanal : Byte; Zeile : String);
|
||||
Procedure LptEscSeq(Kanal : Byte; Zeile : Str80);
|
||||
Procedure Lpt_On_Off(Kanal : Byte);
|
||||
Procedure Vorschreib_Uebergabe;
|
||||
Procedure Vorschreib_Such(Kanal : Byte);
|
||||
Procedure Belog_Eintrag(Kanal : Byte);
|
||||
Procedure BoxListe (Kanal : Byte);
|
||||
Procedure L_ON(Kanal : Byte; Zeile : Str128; Connect_out,ReKon : Boolean);
|
||||
Procedure L_Off(Kanal : Byte);
|
||||
Procedure LogBuchEintrag(Kanal,Art : Byte);
|
||||
Procedure Line_ON(Kanal : Byte);
|
||||
Procedure FreiKanalSuch(Kanal : Byte; Zeile : Str80);
|
||||
Procedure Remote_Connect_Aufbauen(Kanal : Byte; Zeile : Str80);
|
||||
Procedure RemConInit(Kanal : Byte);
|
||||
Procedure Unproto_darstellen;
|
||||
Procedure Terminal_Kanal(Kanal : Byte; Anz : ShortInt);
|
||||
Procedure Trennzeilen(Kanal : Byte; KC : SonderTaste);
|
||||
Procedure Fenster_Berechnen;
|
||||
Procedure Change_WIN;
|
||||
Procedure ClearVorBuffer(Kanal : Byte);
|
||||
Procedure ClearScrBuffer(Kanal : Byte);
|
||||
Function GetWeekDay (Dstr : Str8) : Str2;
|
||||
Procedure Text_Einstellung(Kanal : Byte);
|
||||
Procedure Compress_Ein_Aus(Kanal : Byte);
|
||||
Procedure CompressMenu(Kanal : Byte);
|
||||
Procedure Morse_Menue(Kanal : Byte);
|
||||
Procedure Voice_Menue(Kanal : Byte);
|
||||
Procedure QRG_Einstellen(Kanal : Byte; Zeile : Str8);
|
||||
Procedure Verschiedene_Einstellungen(Kanal : Byte);
|
||||
Procedure Alt_Disc(Kanal : Byte);
|
||||
Procedure Auswert_Kopieren(Kanal : Byte; Zeile : Str80);
|
||||
Procedure Idle_Einstellen(Kanal : Byte; Zeile : Str20);
|
||||
Procedure Remote_Emulieren(Kanal : Byte; Zeile : Str80);
|
||||
Procedure GetString(var S : Str80;
|
||||
Attr,
|
||||
L,X,Y : Byte;
|
||||
var TC : Sondertaste;
|
||||
Art : Byte;
|
||||
var Ins : Boolean);
|
||||
|
||||
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPMH.PAS *)
|
||||
Procedure MH_Sort(Art : Byte);
|
||||
Procedure MH_Show;
|
||||
Procedure RemoteMH(Kanal,T : Byte; Zeile : Str9);
|
||||
Function CBCallCheck (CBCall : Str9) : Boolean;
|
||||
|
||||
{$IFDEF Sound} {//db1ras}
|
||||
(* Function der XPMIDI *)
|
||||
Function PlayMidi (MidiFilename : String) : Boolean;
|
||||
{$ENDIF}
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT,
|
||||
XPACT1,
|
||||
|
||||
XPOVR1,
|
||||
XPOVR2,
|
||||
XPOVR3,
|
||||
XPOVR4,
|
||||
xpovr5
|
||||
|
||||
{$IFDEF Sound} {//db1ras}
|
||||
,midifm,
|
||||
midifile,
|
||||
ibk
|
||||
{$ENDIF}
|
||||
;
|
||||
|
||||
|
||||
|
||||
{$I XPINI}
|
||||
{$I XPLIB1}
|
||||
{$I XPMH}
|
||||
|
||||
{$IFDEF Sound} {//db1ras}
|
||||
{$I MID2}
|
||||
{$ENDIF}
|
||||
|
||||
End.
|
120
XPOVR1.PAS
Executable file
120
XPOVR1.PAS
Executable file
@ -0,0 +1,120 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P O V R 1 . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der aus dem Overlayteil nachgeladen wird ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
UNIT XPOVR1;
|
||||
{$F+,O+}
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
|
||||
XPEMS,
|
||||
XPXMS,
|
||||
XPDEFS;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPFILE.PAS *)
|
||||
Function Compute_CRC(CRC : Integer; Zeile : String) : Integer;
|
||||
Procedure FileInfo(Kanal,Art : Byte; Groesse,Count,tGroesse,tCount : LongInt);
|
||||
Function Zeit_to_Sek(Zeile : Str8) : LongInt;
|
||||
Function Time_Differenz(Start,Stop : Str8) : Str8;
|
||||
Function FileBaud(ZeitStr,AnzStr : Str9) : Str9;
|
||||
Procedure Kill_Save_File(Kanal : Byte);
|
||||
Procedure Close_SaveFiles;
|
||||
Procedure Open_SaveFiles;
|
||||
Procedure Neu_Name(Kanal,Art : Byte; Call : str9; Name : str28);
|
||||
Function GetName(Kanal : Byte; Call : Str9; var FlagByte : Byte; Con:Boolean) : Str40;
|
||||
Function Platzhalter(Kanal : Byte; Zeile : String) : String;
|
||||
Function MakeBinStr(Kanal : Byte; Zeile : Str80) : Str80;
|
||||
Function FName_aus_FVar(var f : File) : Str80;
|
||||
Function SaveNameCheck(Art : Byte; Zeile : Str80) : Boolean;
|
||||
Function MakePathName(Kanal : Byte; Var DFlag : Boolean; Zeile : Str80) : Str80;
|
||||
Function FNameOK(Zeile : Str80) : Boolean;
|
||||
Function PfadOk(Art : Byte; Zeile : Str80) : Boolean;
|
||||
Function MkSub(Pfad : Str80) : Boolean;
|
||||
Procedure KillFile(Zeile : Str80);
|
||||
Procedure Ini_RemPath;
|
||||
Procedure File_Bearbeiten(Kanal : Byte; Zeile : Str80);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPFRX.PAS *)
|
||||
Procedure FileRxMenu(Kanal : Byte);
|
||||
Procedure Datei_Empfangen(Kanal : Byte; Art : Byte);
|
||||
Function OpenTextFile(Kanal : Byte) : Boolean;
|
||||
Procedure OpenBinFile(Kanal : Byte; Zeile : Str80);
|
||||
Procedure Write_RxFile(Kanal : Byte; Zeile : String);
|
||||
Procedure CloseRxFile(Kanal,Art : Byte);
|
||||
Procedure SaveFile(Kanal : Byte);
|
||||
Procedure Write_SFile(Kanal : Byte; Zeile : String);
|
||||
Function SvFRxCheck(Kanal : Byte; Zeile : Str60; Name : Str12) : Str60;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPFTX.PAS *)
|
||||
Procedure FileTxMenu(Kanal : Byte);
|
||||
Procedure Datei_Senden(Kanal : Byte; Art : Byte);
|
||||
Procedure FileSendVon(Kanal : Byte; Zeile : Str40);
|
||||
Procedure Send_File(Kanal : Byte; OFlag : Boolean);
|
||||
Procedure SF_Text(Kanal : Byte; Zeile : Str80);
|
||||
Procedure TXT_Senden(Kanal,Art,FNr : Byte);
|
||||
Procedure RequestName(Kanal:Byte);
|
||||
Procedure BIN_TX_File_Sofort(Kanal : Byte; Zeile : Str80);
|
||||
Procedure TXT_TX_File_Sofort(Kanal : Byte; Zeile : Str80);
|
||||
Procedure FertigSenden(Kanal : Byte);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XP7PL.PAS *)
|
||||
Procedure Open_Close_7Plus(Kanal : Byte; Zeile : Str80);
|
||||
Procedure Close_7Plus(Kanal : Byte);
|
||||
Procedure Write_SplFile(Kanal : Byte; Zeile : String);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPBUF.PAS *)
|
||||
Procedure OpenBufferFile(Kanal : Byte);
|
||||
Procedure WriteBuffer(Kanal : Byte; Zeile : String);
|
||||
Procedure SendBuffer(Kanal : Byte);
|
||||
Procedure EraseBufferFile(Kanal : Byte);
|
||||
Procedure SendTestBuffer(Kanal : Byte);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPDIR.PAS *)
|
||||
Procedure GetDirFiles(Zeile : Str80; ax, Art : Byte);
|
||||
Procedure DirZeig(Var Zeile : Str80; var Ch : char; QRet : Boolean);
|
||||
Procedure RemoteDir(Kanal : Byte; Zeile : Str80);
|
||||
Procedure DelAll(Pfad : Str80; Yp : Byte);
|
||||
Function Get7PlFNr(Zeile : Str80) : Str20;
|
||||
|
||||
(* Proceduren und Funktionen der XPCOPY.PAS *)
|
||||
Procedure FileKopieren(Var Zeile : String);
|
||||
Procedure Delete_Datei(Var Zeile : Str80);
|
||||
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT,
|
||||
XPACT1,
|
||||
|
||||
XPOVR,
|
||||
XPOVR2,
|
||||
XPOVR3,
|
||||
XPOVR4,
|
||||
xpovr5,
|
||||
xpovr6;
|
||||
|
||||
|
||||
{$I XPFILE}
|
||||
{$I XPFRX}
|
||||
{$I XPFTX}
|
||||
{$I XP7PL}
|
||||
{$I XPBUF}
|
||||
{$I XPDIR}
|
||||
{$I XPCOPY}
|
||||
|
||||
End.
|
99
XPOVR2.PAS
Executable file
99
XPOVR2.PAS
Executable file
@ -0,0 +1,99 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P O V R 2 . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der aus dem Overlayteil nachgeladen wird ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
UNIT XPOVR2;
|
||||
{$F+,O+}
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
|
||||
XPEMS,
|
||||
XPXMS,
|
||||
XPDEFS;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPLOAD.PAS *)
|
||||
Procedure Emblem_Zeigen;
|
||||
Procedure Ini_Start_Tnc;
|
||||
Procedure Switch_Hostmode(V24Nr,TNC_Nr : Byte);
|
||||
Procedure TNC_High_Channel_Init;
|
||||
Procedure DRSI_Hostmode(TNC_Nr,Art : Byte);
|
||||
Procedure Configlesen;
|
||||
Procedure Infos_Lesen;
|
||||
Procedure Strings_Lesen;
|
||||
Procedure AttributFile_Lesen;
|
||||
Procedure ESC_Lesen;
|
||||
Procedure QRG_Lesen;
|
||||
Procedure REM_Lesen;
|
||||
Procedure PWD_Lesen;
|
||||
Procedure HELP_Lesen;
|
||||
Procedure TncIni(Art : Byte);
|
||||
Procedure Abschluss_XP;
|
||||
Procedure Sicherung_Speichern;
|
||||
Procedure Abbruch_XP(Nr : Byte; Zeile : str80);
|
||||
Procedure ScrFile_erzeugen;
|
||||
{Procedure LineRead(Fstr : Str10);}
|
||||
Function HeapFrei(Bedarf : LongInt) : Boolean;
|
||||
Procedure Config_Verz_Lesen;
|
||||
Procedure Config_Allg_Lesen;
|
||||
Procedure Config_TNC_Lesen;
|
||||
Procedure Config_PRN_Lesen;
|
||||
Procedure Config_RAM_Lesen;
|
||||
Procedure Config_BLIND_Lesen;
|
||||
Procedure Config_SOUND_Lesen;
|
||||
Procedure Puffer_schreiben;
|
||||
Procedure Puffer_lesen;
|
||||
Procedure VorCurEnd;
|
||||
Procedure Interface_Exist;
|
||||
Procedure GenCrcTab;
|
||||
Procedure GenPrivPWD;
|
||||
Procedure UebergabeAuswert;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPDOS.PAS *)
|
||||
Procedure DosAufruf(Var Zeile : Str128; Art : Byte);
|
||||
Procedure ExecDOS(Zeile : Str128);
|
||||
Procedure DosBildSave(Zeilen : Byte);
|
||||
Procedure StoreHeap;
|
||||
Procedure LoadHeap;
|
||||
Function Zeilen_ermitteln : Byte;
|
||||
Procedure Switch_VGA_Mono;
|
||||
Procedure Ini_TNC_Text(Art : Byte);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPHELP.PAS *)
|
||||
Procedure Hlp_Laden(Istr : Str6);
|
||||
Procedure XP_Help(IDstr : Str6);
|
||||
Procedure REM_Help(Kanal : Byte; HNr : Byte);
|
||||
Procedure Send_Hilfe(Kanal : Byte; IDstr : Str6);
|
||||
Procedure Help_Compile;
|
||||
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT,
|
||||
XPACT1,
|
||||
|
||||
XPOVR,
|
||||
XPOVR1,
|
||||
XPOVR3,
|
||||
XPOVR4,
|
||||
xpovr5,
|
||||
xpovr6;
|
||||
|
||||
|
||||
{$I XPLOAD}
|
||||
{$I XPDOS}
|
||||
{$I XPHELP}
|
||||
|
||||
|
||||
End.
|
127
XPOVR3.PAS
Executable file
127
XPOVR3.PAS
Executable file
@ -0,0 +1,127 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P O V R 3 . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der aus dem Overlayteil nachgeladen wird ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
UNIT XPOVR3;
|
||||
{$F+,O+}
|
||||
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
OVERLAY,
|
||||
|
||||
XPEMS,
|
||||
XPXMS,
|
||||
XPDEFS;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPLINK.PAS *)
|
||||
Procedure Lnk_Sort(Art : Byte);
|
||||
Procedure Lnk_Init(TNr : Byte; Freq : Str8);
|
||||
Procedure ALT_C_Connect(Kanal : Byte);
|
||||
Function GetConPfad(Rufz : Str9) : String;
|
||||
Function GetConStr(var Zeile : String) : Str80;
|
||||
Function LinkExists(Name : Str9; var Gate : Byte) : Boolean;
|
||||
Procedure LinkMod(var Zeile : Str80);
|
||||
Procedure RemoteLnk(Kanal,T : Byte; Zeile : Str9);
|
||||
Procedure SaveLinks(Kanal,TNr : Byte; Freq : Str8);
|
||||
Procedure LinkLearn(Kanal : Byte; Zeile : Str80);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPCRC.PAS *)
|
||||
Procedure CRC_Datei(var Zeile : Str80);
|
||||
Procedure GetNetRom;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPCOL.PAS *)
|
||||
Procedure Color_Einstellung;
|
||||
|
||||
(* Proceduren und Funtionen der XPMON.PAS *)
|
||||
Procedure Stat_MonitorCalls(Kanal : Byte);
|
||||
Procedure Calls_Monitoren(Kanal : Byte; Zeile : Str80);
|
||||
Procedure Init_Call_monitoren(Kanal : Byte; Zeile : Str80);
|
||||
Procedure Cancel_Call_monitoren(Kanal : Byte);
|
||||
Procedure FreeMonitorKanal(Var KA : Byte ; Zeile : Str80);
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPMRK.PAS *)
|
||||
Procedure Merker_Conn_Schreiben;
|
||||
Procedure Merker_Conn_Lesen;
|
||||
Procedure Merker_File_Schreiben;
|
||||
Procedure Merker_File_Lesen;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPMAKRO.PAS *)
|
||||
Procedure Makrozeile_holen;
|
||||
Procedure Makro_Aktivieren(Zeile : Str60);
|
||||
Procedure MakroInit;
|
||||
Procedure Makro_Erlernen(SK : Sondertaste; VC : Char);
|
||||
Procedure Makro_Open_LearnFile;
|
||||
|
||||
(* Proceduren und Funtionen der XPAUTO.PAS *)
|
||||
Procedure Auto_Aktivieren(Kanal : Byte; Zeile : Str60);
|
||||
Procedure Auto_Init(Kanal : Byte);
|
||||
Procedure Autozeile_Holen(Kanal : Byte);
|
||||
Function AutoJmpZnNr(Kanal : Byte; Zeile : Str40) : Word;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPPASS.PAS *)
|
||||
Procedure Sysop_Einloggen(Kanal : Byte; Zeile : Str80);
|
||||
Procedure Password_Auswert(Kanal : Byte; Zeile : String);
|
||||
Procedure DieBox_PW_Scan(Kanal : Byte; Zeile : String);
|
||||
Procedure Scan_PW_Array(Kanal : Byte);
|
||||
Procedure BayBox_US_Scan(Kanal : Byte; Zeile : String);
|
||||
Function GetPwParm (Nr : Byte; Zeile : Str80) : Str20;
|
||||
Function Found_Pw_Call(Zeile : Str80; Cstr : Str9; AlStr:str9; AStr : Str6) : Boolean;
|
||||
Function PseudoPriv(Laenge : Byte; Pstr : Str20; Dstr : Str80) : Str80;
|
||||
Function Check_Parm(Zeile : String) : String;
|
||||
Procedure RMNC_Auswert(Kanal : Byte; Zeile : Str80);
|
||||
Procedure TheNet_SYS_Auswert(Kanal : Byte ; Zeile : String);
|
||||
Procedure EZBOX_Auswert(Kanal : Byte; Zeile : Str80);
|
||||
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPCONV.PAS *)
|
||||
Procedure Conv_Tx_All (Kanal : Byte);
|
||||
Procedure ConversTX (Kanal : Byte; All,Head : Boolean; Zeile : String);
|
||||
Procedure ConversUser (Kanal : Byte);
|
||||
Procedure ConversRemote (Kanal : Byte; Zeile : String);
|
||||
Function ConversIni (Kanal : Byte; INI : Boolean) : Boolean;
|
||||
Procedure ConversAuswert (Kanal,Nr : Byte);
|
||||
Function ConversCall(Kanal : Byte) : Str20;
|
||||
Procedure ConversQuit(Kanal : Byte);
|
||||
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT,
|
||||
XPACT1,
|
||||
|
||||
XPOVR,
|
||||
XPOVR1,
|
||||
XPOVR2,
|
||||
XPOVR4,
|
||||
XPOVR5,
|
||||
xpovr6;
|
||||
|
||||
|
||||
{$I XPLINK}
|
||||
{$I XPCRC}
|
||||
{$I XPCOL}
|
||||
{$I XPMON}
|
||||
{$I XPMRK}
|
||||
{$I XPMAKRO}
|
||||
{$I XPAUTO}
|
||||
{$I XPPASS}
|
||||
{$I XPCONV}
|
||||
|
||||
|
||||
End.
|
71
XPOVR4.PAS
Executable file
71
XPOVR4.PAS
Executable file
@ -0,0 +1,71 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P O V R 4 . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der aus dem Overlayteil nachgeladen wird ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
UNIT XPOVR4;
|
||||
{$F+,O+}
|
||||
{-$DEFINE Sound}
|
||||
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
OVERLAY,
|
||||
|
||||
XPEMS,
|
||||
XPXMS,
|
||||
XPDEFS;
|
||||
|
||||
|
||||
(* Proceduren und Funtionen der XPREM.PAS *)
|
||||
Procedure Remote(Kanal : Byte; Art : Integer; CZeile : Str80);
|
||||
Procedure Send_Prompt(Kanal : Byte; Art : Integer);
|
||||
Procedure Ch_Dir(Kanal : Byte; Var Zeile : Str80);
|
||||
Function REM_Auswert(Kanal, Art : Byte; Komm : Str80) : Byte;
|
||||
Procedure TNC_Auswert(Kanal : Byte; Var TncKom, Doc : Str20);
|
||||
Procedure Mk_Dir(Kanal : Byte; var Zeile : Str80);
|
||||
Procedure Rm_Dir(Kanal : Byte; var Zeile : Str80);
|
||||
Function Call_Exist(Kanal,Art : Byte; Zeile : Str9) : Boolean;
|
||||
Procedure SendToChannel(Kanal,Art,von,bis : Byte; Zeile : Str80);
|
||||
Procedure Quit(Kanal : Byte);
|
||||
Function QSO_Time(Kanal : Byte) : Str20;
|
||||
Function Rom_Ready : Boolean;
|
||||
Procedure REM_HelpLong(Kanal : Byte; IDstr : Str6);
|
||||
Procedure ComputeRTF(Kanal : Byte; Zeile : Str80);
|
||||
|
||||
(* Proceduren und Funtionen der XPSCROL.PAS *)
|
||||
Procedure Notiz_Zeigen(Kanal : Byte);
|
||||
Procedure FileScroll(Kanal : Byte);
|
||||
Procedure CheckSort(Kanal,Spalte,AnzSp : Byte; Dpos : LongInt; SC : Char);
|
||||
Procedure OpenDBox(Kanal : Byte);
|
||||
Procedure CloseDBox(Kanal : Byte);
|
||||
|
||||
Procedure Sprechen (Zeile : Str80) ;
|
||||
|
||||
Procedure SprachMenu;
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT,
|
||||
XPACT1,
|
||||
|
||||
XPOVR,
|
||||
XPOVR1,
|
||||
XPOVR2,
|
||||
XPOVR3,
|
||||
xpovr5,
|
||||
xpovr6;
|
||||
|
||||
|
||||
{$I XPREM}
|
||||
{$I XPSCROL}
|
||||
{$I xpspeak}
|
||||
|
||||
End.
|
118
XPOVR5.PAS
Executable file
118
XPOVR5.PAS
Executable file
@ -0,0 +1,118 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P O V R 5 . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der aus dem Overlayteil nachgeladen wird ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
UNIT XPOVR5;
|
||||
{$F+,O+}
|
||||
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
OVERLAY,
|
||||
|
||||
XPEMS,
|
||||
XPXMS,
|
||||
XPDEFS;
|
||||
|
||||
|
||||
(* Proceduren und Funktionen der XPUSER.PAS *)
|
||||
Procedure UserZeigen (Kanal : Byte; VAR Call2:Str9);
|
||||
Procedure GetUser(var udi:longint);
|
||||
Procedure PutUser(Neu: User_typ2; Var Resultat : Byte; Typ : Byte; VAR _DPos:longint; Shard:Boolean);
|
||||
Function UserSuchroutine (CallS : Str10; var USu:longint; Sali, shart:boolean) : Boolean;
|
||||
Function UserSuchen (VAR USuch:Longint; SCall:string; SAlias:boolean) : Boolean;
|
||||
Procedure DatensatzHolen(DatP:Longint; Var UDs: User_typ2);
|
||||
Procedure NeuNameSave(User2: User_typ2; Var Result : Byte);
|
||||
Procedure UserAnwesend;
|
||||
|
||||
(* XPUSEDIT.Pas *)
|
||||
Procedure UserEditieren(User_:User_Typ2; Kanal :Byte; Neu:boolean; ZMax:Byte; VAR NeuPos : LongInt);
|
||||
Function UserShow (Kanal:Byte;Suche:Str9) : Boolean;
|
||||
|
||||
(* XPMAIL.PAS *)
|
||||
Procedure StartMailPolling(Kanal : byte; RXCall:str9);
|
||||
Procedure Link_Holen (Var Port : Byte; Var CString : Str80);
|
||||
Procedure MailVersucheRauf (DPos:LongInt);
|
||||
Function MailsVorhanden : Boolean;
|
||||
Procedure MailKillen (Box, RX:Str10; DPos : longint);
|
||||
Procedure MailSpeichern (Mail : Mail_Typ);
|
||||
Procedure MailsZeigen (Kanal : Byte);
|
||||
Procedure MailPollGo (Kanal:Byte; NFwd:boolean);
|
||||
Procedure MailSchliessen (Kanal:byte);
|
||||
procedure CancelMailPoll (Kanal:Byte);
|
||||
procedure LinksVorbereiten(Port:byte;QRG:Str10);
|
||||
procedure LinksKillen;
|
||||
|
||||
|
||||
{XPXBIN}
|
||||
Function XBinStr (Kanal : Byte; Zeile : String; TXPos:longint) : String;
|
||||
Procedure XBinCheck (kanal : Byte; XBinZ:string; DtPos:longint; XZeile:string);
|
||||
procedure XBinWrite (kanal:Byte; Zeile:string);
|
||||
Procedure XBinSend (Kanal : Byte; OFlag : Boolean);
|
||||
Procedure OpenXBinProt (Kanal:byte);
|
||||
Procedure CloseXBinProt (Kanal:byte);
|
||||
|
||||
{XPQTH}
|
||||
|
||||
PROCEDURE QTH_Pruefen (QTH : STRING;
|
||||
VAR
|
||||
OESLAE,
|
||||
NOEBRE : REAL;
|
||||
VAR
|
||||
STATUS : BOOLEAN);
|
||||
PROCEDURE QTH_ENTFG_RICHTG (QTH1 : STRING;
|
||||
QTH2 : STRING;
|
||||
VAR
|
||||
ENTFG,
|
||||
RICHTG : REAL;
|
||||
VAR
|
||||
STATUS : BOOLEAN);
|
||||
FUNCTION WINKEL_IN_ALT(OESLAE,NOEBRE :REAL):STRING;
|
||||
FUNCTION WINKEL_IN_NEU(OESLAE,NOEBRE :REAL):STRING;
|
||||
FUNCTION WINKEL_IN_GMS (OESLAE,NOEBRE:REAL):STRING;
|
||||
Procedure Compute_QTH (Var Zeile : Str80 );
|
||||
|
||||
{$IFNDEF no_Netrom} {//db1ras}
|
||||
{Funktionen und Prozeduren in XPNETROM.PAS}
|
||||
Procedure NodesSortieren;
|
||||
Procedure NodesLifetime;
|
||||
Function NodesAnzahl(Nafu:Boolean) : integer;
|
||||
Procedure NodeListen(Naf : Boolean);
|
||||
Procedure BCastKillen;
|
||||
Procedure REMNodesListen (Kanal:Byte;CZeile:String);
|
||||
Procedure REMRoutesListen (Kanal:Byte; CZeile:String);
|
||||
{$ENDIF}
|
||||
|
||||
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT,
|
||||
XPACT1,
|
||||
|
||||
XPOVR,
|
||||
XPOVR1,
|
||||
XPOVR2,
|
||||
XPOVR3,
|
||||
xpovr4,
|
||||
xpovr6;
|
||||
|
||||
|
||||
{$I XPUSER}
|
||||
{$I XPUSEDIT}
|
||||
{$I XPMAIL}
|
||||
{$I XPQTH}
|
||||
{$I XPXBIN}
|
||||
|
||||
{$IFNDEF no_Netrom} {//db1ras}
|
||||
{$I XPNETROM}
|
||||
{$ENDIF}
|
||||
End.
|
65
XPOVR6.PAS
Executable file
65
XPOVR6.PAS
Executable file
@ -0,0 +1,65 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ UNIT: X P O V R 6 . P A S ³
|
||||
³ ³
|
||||
³ Programmcode, der aus dem Overlayteil nachgeladen wird ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
UNIT XPOVR6;
|
||||
{$F+,O+}
|
||||
{-$DEFINE Sound}
|
||||
{-$DEFINE code}
|
||||
|
||||
Interface
|
||||
|
||||
Uses CRT,
|
||||
DOS,
|
||||
OVERLAY,
|
||||
|
||||
XPEMS,
|
||||
XPXMS,
|
||||
XPDEFS;
|
||||
|
||||
|
||||
|
||||
|
||||
Function STOPCompress (Kanal : Byte; Zeile : String; Code : Byte) : String;
|
||||
Function STOPDeCompress (Kanal : Byte; Zeile2 : String; Code : Byte) : String;
|
||||
Function PackIt (Zeile : String) : String;
|
||||
Function UnPackIt (Zeile : String) : String;
|
||||
Function CodeIt (Kanal : Byte; Zeile : String; Code : Byte) : String;
|
||||
Function DeCodeIt (Kanal : Byte; Zeile : String; Code : Byte) : String;
|
||||
Function CodeStr (Kanal : Byte; Zeile : String) : String;
|
||||
Function DeCode (Kanal : Byte; Zeile : String) : String;
|
||||
Function GetCode (Call : Str9) : Word;
|
||||
Function PMak (Nr : Byte) : String;
|
||||
Function DetectStopCode (LastBt, Cd1, Cd2 : Byte) : Boolean;
|
||||
|
||||
{XPWAV}
|
||||
Procedure FindBlaster;
|
||||
procedure PlayWave (FileName : String);
|
||||
procedure StopWave;
|
||||
procedure ExitWavePlayer;
|
||||
|
||||
Implementation
|
||||
|
||||
Uses XPACT,
|
||||
XPACT1,
|
||||
|
||||
XPOVR,
|
||||
XPOVR1,
|
||||
XPOVR2,
|
||||
XPOVR3,
|
||||
xpovr4,
|
||||
xpovr5;
|
||||
|
||||
|
||||
{$I XPSTOP}
|
||||
|
||||
{$I XPWAV}
|
||||
|
||||
End.
|
113
XPPACK.PAS
Executable file
113
XPPACK.PAS
Executable file
@ -0,0 +1,113 @@
|
||||
{$A+,B-,D+,E+,F-,I-,L+,N+,O-,R-,S-,V-}
|
||||
{$M 16384,0,655360}
|
||||
program LZH_Test;
|
||||
uses
|
||||
dos,crt,LZH;
|
||||
CONST
|
||||
{ MaxInstall = 20;
|
||||
PackDats : array [1..maxInstall] of String[12] =
|
||||
('160_170.TXT', 'LOGO.XP', 'MSGS.XP', 'CMD.XP',
|
||||
'REMOTES.XP',
|
||||
'ONLHELP.XP', 'XPSETHLP.XP', 'UPDATE.EXE',
|
||||
'LINKS.XP', 'LOG.XP' , 'USER.XP',
|
||||
'PASSWORD.XP', 'TEXT.XP' , 'TNC.XP',
|
||||
'CALLS.XP', 'COLOR.XP' , 'COOKIE.XP',
|
||||
'QRG.XP', 'XPACKSET.EXE', 'XPACKET.EXE');
|
||||
}
|
||||
|
||||
MaxInstall = 65;
|
||||
PackDats : array [1..maxInstall] of String[12] =
|
||||
('V181.txt', 'MSGS.xp', 'XPACKSET.exe', 'UPDATE.exe',
|
||||
'XPACKET.exe', 'ONLHELP.xp', 'XPSETHLP.xp', 'LOGO.xp', 'XP.ico',
|
||||
'CMD.xp',
|
||||
|
||||
'A.SPK','B.SPK','C.SPK','D.SPK','E.SPK','F.SPK','G.SPK','H.SPK','I.SPK','J.SPK',
|
||||
'K.SPK','L.SPK','M.SPK','N.SPK','O.SPK',
|
||||
'P.SPK','Q.SPK','R.SPK','S.SPK','T.SPK','U.SPK','V.SPK','W.SPK','X.SPK','Y.SPK',
|
||||
'Z.SPK','0.SPK','1.SPK','2.SPK','3.SPK','4.SPK',
|
||||
'5.SPK','6.SPK','7.SPK','8.SPK','9.SPK','10.SPK',
|
||||
'11.SPK','12.SPK','13.SPK','14.SPK','15.SPK','_.SPK','!.SPK',
|
||||
|
||||
'REMOTES.xp',
|
||||
|
||||
'LINKS.xp', 'LOG.xp' ,
|
||||
'PASSWORD.xp', 'TEXT.xp' , 'TNC.xp',
|
||||
'CALLS.xp', 'COLOR.xp' , 'COOKIE.xp',
|
||||
'QRG.xp',
|
||||
|
||||
'USER.xp');
|
||||
|
||||
|
||||
procedure OpenInput (fn: String);
|
||||
begin
|
||||
assign(infile,fn); reset(infile,1);
|
||||
if IoResult>0 then Error('! Can''t open input file');
|
||||
inbuf:= @ibuf;
|
||||
ReadToBuffer:= ReadNextBlock;
|
||||
ReadToBuffer;
|
||||
end;
|
||||
|
||||
|
||||
begin {main}
|
||||
comp:=false; decomp:=false;
|
||||
{ if ParamCount<>1 then begin
|
||||
writeln('Usage: lz e(compression)|d(uncompression) infile');
|
||||
HALT(1)
|
||||
end;}
|
||||
|
||||
PackDat:=ParamStr(3);
|
||||
SourceDat:=ParamStr(2);
|
||||
|
||||
s:= ParamStr(1);
|
||||
case s[1] of
|
||||
'e','E':begin
|
||||
{sourceDat:=DirInfo.Name;}
|
||||
OpenOutput('XPPACK.XPP'); {PackDat}
|
||||
for i:=1 to MaxInstall do
|
||||
begin
|
||||
SourceDat:=PackDats[i];
|
||||
{SourceDat:='ONLHELP.XP';}
|
||||
Write(EFillStr(12,' ',Sourcedat)+':');
|
||||
PackDat:=SourceDat;
|
||||
delete(PackDat,pos('.',packdat),length(PackDat)-pos('.',packdat)+1);
|
||||
PackDat:=packdat+'.'+Exten;
|
||||
writeln(PackDAt);
|
||||
OpenInput(SourceDat);
|
||||
|
||||
comp:=true;
|
||||
Encode(filesize(infile),SourceDat);
|
||||
close(infile); if IoResult>0 then Error('! Error closing input file');
|
||||
if outptr>0 then WriteNextBlock;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
close(outfile); if IoResult>0 then Error('! Error closing output file');
|
||||
|
||||
end;
|
||||
'd','D': begin
|
||||
FindFirst(ParamStr(2), Archive, DirInfo);
|
||||
while DosError = 0 do
|
||||
begin
|
||||
ZielDat:='';
|
||||
sourceDat:=DirInfo.Name;
|
||||
{ if Sourcedat[length(sourceDat)]='#' then
|
||||
begin}
|
||||
OpenInput(SourceDat);
|
||||
{OpenOutput(PackDat);}
|
||||
decomp:=true;
|
||||
Decode;
|
||||
close(infile); if IoResult>0 then Error('! Error closing input file');
|
||||
if outptr>0 then WriteNextBlock;
|
||||
close(outfile); if IoResult>0 then Error('! Error closing output file');
|
||||
{ end; }
|
||||
FindNext(DirInfo);
|
||||
end;
|
||||
end;
|
||||
else
|
||||
Error('! Use [D] for Decompression or [E] for Compression')
|
||||
end;
|
||||
{ close(infile); if IoResult>0 then Error('! Error closing input file');
|
||||
if outptr>0 then WriteNextBlock;
|
||||
close(outfile); if IoResult>0 then Error('! Error closing output file');}
|
||||
end.
|
551
XPPASS.PAS
Executable file
551
XPPASS.PAS
Executable file
@ -0,0 +1,551 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P P A S S . P A S ³
|
||||
³ ³
|
||||
³ Enth„lt notwendige Routinen zum Einloggen als SYSOP in den ³
|
||||
³ verschiedenen Systemen. ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure Sysop_Einloggen (* Kanal : Byte; Zeile : Str80 *);
|
||||
Var i,i1 : Byte;
|
||||
Flag : Boolean;
|
||||
Hstr : String[80];
|
||||
Astr : String[5];
|
||||
KC : Sondertaste;
|
||||
VC : char;
|
||||
SysArt_B : Byte; {//db1ras}
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if SysopParm then
|
||||
begin
|
||||
SysopParm := false;
|
||||
InfoOut(Kanal,0,1,InfoZeile(3));
|
||||
end else
|
||||
begin
|
||||
Flag := false;
|
||||
Zeile := RestStr(UpCaseStr(Zeile));
|
||||
KillEndBlanks(Zeile);
|
||||
Astr := Zeile;
|
||||
{DigiCom Parm 19}
|
||||
For SysArt_B:=1 To maxSCon Do {//db1ras}
|
||||
If ((Astr=SNam[SysArt_B]) Or ((Astr='') And (SysArt=SysArt_B)))
|
||||
And (SysArt_B in [1,2,3,5..11,13,14,15,17,18]) Then Begin
|
||||
Astr := SNam[SysArt_B];
|
||||
Flag := true;
|
||||
if SysArt_B<>18 then begin
|
||||
if SysArt_B=8 then
|
||||
begin
|
||||
for i:=7 to 15 do G^.FStr[i]:='';
|
||||
for i:=7 to 15 do G^.FStx[i]:=22;
|
||||
G^.Fstr[7] := InfoZeile(412);
|
||||
G^.Fstr[10] := InfoZeile(413);
|
||||
G^.Fstr[12] := InfoZeile(414);
|
||||
Fenster(15);
|
||||
_ReadKey(KC,VC);
|
||||
clrFenster;
|
||||
end;
|
||||
if (Upcase(VC)='M') and (SysArt_B=8) then
|
||||
SysopStr := ParmStr(18,B1,InfoZeile(217))
|
||||
else
|
||||
begin
|
||||
Case SysArt_B of
|
||||
1..18:SysopStr := ParmStr(SysArt_B,B1,InfoZeile(217));
|
||||
19 :SysopStr := ParmStr(17,B1,InfoZeile(217));
|
||||
20 :SysopStr := ParmStr(SysArt_B-1,B1,InfoZeile(217));
|
||||
end;
|
||||
end;
|
||||
|
||||
if (xpnodec) or (SysArt_B=19) then delete(SysOpStr,1,2);
|
||||
end else SysOpStr := 'PRIV';
|
||||
end else if SCon[0] then
|
||||
begin
|
||||
for i := 1 to maxUser do
|
||||
if (not Flag and (Astr = UNam[i]))
|
||||
Or ((Astr = '') And (System = UNam[i])) Then Begin {//db1ras}
|
||||
Astr := UNam[i]; {//db1ras}
|
||||
Flag := true;
|
||||
UserArt := i;
|
||||
SysopStr := ParmStr(UserArt,B1,InfoZeile(218));
|
||||
end;
|
||||
end;
|
||||
if not Flag then InfoOut(Kanal,1,1,InfoZeile(171));
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
Flag := false;
|
||||
KillEndBlanks(Astr);
|
||||
SysopArt := LRK + Astr + RRK;
|
||||
Assign(G^.TFile,Sys1Pfad + PwDatei);
|
||||
FiResult := ResetTxt(G^.TFile);
|
||||
While not Eof(G^.TFile) and not Flag do
|
||||
begin
|
||||
Readln(G^.TFile,Hstr);
|
||||
if Found_Pw_Call(Hstr,Call,Alias,SysopArt) then
|
||||
begin
|
||||
Flag := true;
|
||||
PassRetry := Byte(str_int(GetPwParm(1,Hstr)));
|
||||
end;
|
||||
end;
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
if not Flag then
|
||||
InfoOut(Kanal,1,1,InfoZeile(17) + B1 + SysopArt + B1 + Call);
|
||||
end;
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
Randomize;
|
||||
PassRight := 1;
|
||||
inc(PassRetry);
|
||||
if PassRetry > 1 then
|
||||
begin
|
||||
PassRight := Random(PassRetry+1);
|
||||
if PassRight = 0 then PassRight := 1;
|
||||
end;
|
||||
|
||||
case SysArt_B of
|
||||
1 : begin (* DBOX *)
|
||||
if not DBoxScaned then Scan_PW_Array(Kanal);
|
||||
SysopStr := SysopStr + B1 + DieBoxPW;
|
||||
end;
|
||||
|
||||
else SysopParm := true;
|
||||
end;
|
||||
if not User_autopw then
|
||||
begin
|
||||
InfoOut(Kanal,0,1,SysopStr);
|
||||
S_PAC(Kanal,NU,true,SysopStr + M1);
|
||||
end else User_autopw:=false;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Password_Auswert (* Kanal : Byte; Zeile : String *);
|
||||
Begin
|
||||
|
||||
with K[Kanal]^ do if SysArt in [0,2,3,5..11,13,14,15,17,18] then
|
||||
begin
|
||||
case SysArt of
|
||||
0 : case UserArt of
|
||||
1 : TheNet_SYS_Auswert(Kanal,Zeile); (* TOP *)
|
||||
2 : RMNC_Auswert(Kanal,Zeile); (* SP *)
|
||||
3 : TheNet_SYS_Auswert(Kanal,Zeile); (* XP *)
|
||||
end;
|
||||
5 : EZBOX_Auswert(Kanal,Zeile); (* EBOX *)
|
||||
7 : RMNC_Auswert(Kanal,Zeile); (* RMNC *)
|
||||
2, (* BBOX *)
|
||||
3, (* FBOX - FBB *)
|
||||
6, (* BDXL *)
|
||||
8, (* TNN *)
|
||||
9, (* NETR *)
|
||||
10, (* BN *)
|
||||
11, (* DXC *)
|
||||
13, (* FALC *)
|
||||
15, (* BPQ *)
|
||||
14 : TheNet_SYS_Auswert(Kanal,Zeile); (* TNC3 *)
|
||||
17, (* XP *)
|
||||
18, (* XN *)
|
||||
19, (* XPN *)
|
||||
20 : TheNet_SYS_Auswert(Kanal,Zeile); (* DIGIC*)
|
||||
end;
|
||||
end;
|
||||
SetzeFlags(Kanal);
|
||||
End;
|
||||
|
||||
|
||||
Procedure DieBox_PW_Scan (* Kanal : Byte; Zeile : String; *);
|
||||
var Flag : Boolean;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
Flag := false;
|
||||
if length(Zeile) > 14 then
|
||||
Repeat
|
||||
if (Zeile[3] = Pkt ) then
|
||||
if (Zeile[6] = Pkt ) then
|
||||
if (Zeile[9] = B1) then
|
||||
if (Zeile[12] = DP) then Flag := true;
|
||||
if not Flag then delete(Zeile,1,1);
|
||||
Until Flag or (length(Zeile) < 14);
|
||||
if Flag then DieBoxPW := copy(Zeile,1,2) +
|
||||
copy(Zeile,10,2) +
|
||||
copy(Zeile,13,2);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Scan_PW_Array (* Kanal : Byte *);
|
||||
var Pw : ^PWArrayPtr;
|
||||
Hstr : String[80];
|
||||
flag : Boolean;
|
||||
i : Byte;
|
||||
Std,
|
||||
Min,
|
||||
Tag : Byte;
|
||||
|
||||
Begin
|
||||
GetMem(Pw,SizeOf(Pw^));
|
||||
FillChar(Pw^,SizeOf(Pw^),0);
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
DBoxScaned := false;
|
||||
Assign(G^.TFile,Sys1Pfad + PwDatei);
|
||||
FiResult := ResetTxt(G^.TFile);
|
||||
Repeat
|
||||
Readln(G^.TFile,Hstr);
|
||||
flag := Found_Pw_Call(Hstr,Call,Alias,LRK + SNam[1] + RRK);
|
||||
Until flag or Eof(G^.TFile);
|
||||
if flag then
|
||||
begin
|
||||
for i := 0 to 59 do Readln(G^.TFile,Pw^[i]);
|
||||
Tag := str_int(copy(DieBoxPW,1,2));
|
||||
Std := str_int(copy(DieBoxPW,3,2));
|
||||
Min := str_int(copy(DieBoxPW,5,2));
|
||||
i := Min + Tag;
|
||||
if i > 59 then i := i - 60;
|
||||
DieBoxPW := copy(Pw^[i],Std+1,4);
|
||||
DBoxScaned := true;
|
||||
end;
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
end;
|
||||
FreeMem(Pw,SizeOf(Pw^));
|
||||
End;
|
||||
|
||||
|
||||
Procedure BayBox_US_Scan (* Kanal : Byte; Zeile : String *);
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
PassRetry := 1;
|
||||
PassRight := 1;
|
||||
SysopArt := BBUS;
|
||||
TheNet_SYS_Auswert(Kanal,Zeile);
|
||||
end;
|
||||
End;
|
||||
|
||||
Function PseudoPriv (* Laenge : Byte; Pstr : Str20; Dstr : Str80) : Str80 *);
|
||||
Var i : Byte;
|
||||
w : Word;
|
||||
Feld : Array [1..6] of Byte;
|
||||
Hstr : String[80];
|
||||
Flag : Boolean;
|
||||
Begin
|
||||
Randomize;
|
||||
w := 0;
|
||||
|
||||
Hstr := CutStr(Dstr);
|
||||
delete(Hstr,1,1);
|
||||
delete(Hstr,length(Hstr),1);
|
||||
Flag := Hstr = SNam[2];
|
||||
|
||||
Dstr := ParmStr(2,B1,Dstr);
|
||||
delete(Dstr,1,1);
|
||||
delete(Dstr,length(Dstr),1);
|
||||
|
||||
for i := 1 to 6 do Feld[i] := 0;
|
||||
for i := 1 to 3 do
|
||||
begin
|
||||
Hstr := ParmStr(2+i,Km,Dstr);
|
||||
if (length(Hstr) = 4) and (Hstr[4] >= Hstr[1]) then
|
||||
begin
|
||||
Feld[2*i-1] := ord(Hstr[1]);
|
||||
Feld[2*i] := ord(Hstr[4]);
|
||||
w := w + Feld[2*i-1] + Feld[2*i];
|
||||
end;
|
||||
end;
|
||||
|
||||
Hstr := '';
|
||||
if w = 0 then
|
||||
begin
|
||||
Feld[1] := 48;
|
||||
Feld[2] := 122;
|
||||
end;
|
||||
|
||||
Repeat
|
||||
i := Random(254);
|
||||
if Flag and (i in [35,44,59]) then i := 0;
|
||||
if (i > 0) and
|
||||
(i in [Feld[1]..Feld[2],Feld[3]..Feld[4],Feld[5]..Feld[6]]) then
|
||||
Hstr := Hstr + Chr(i);
|
||||
Until length(Hstr) >= Laenge;
|
||||
|
||||
if Pstr > '' then
|
||||
begin
|
||||
i := Random(Byte(Laenge-length(Pstr)));
|
||||
if i = 0 then i := 1;
|
||||
delete(Hstr,i,length(Pstr));
|
||||
insert(Pstr,Hstr,i);
|
||||
end;
|
||||
PseudoPriv := Hstr;
|
||||
End;
|
||||
|
||||
|
||||
Function GetPwParm (* Nr : Byte; Zeile : Str80) : Str20 *);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
Zeile := ParmStr(2,B1,Zeile);
|
||||
i := pos(LRK,Zeile);
|
||||
i1 := pos(RRK,Zeile);
|
||||
if (i = 1) and (i1 > 2) then
|
||||
begin
|
||||
delete(Zeile,1,1);
|
||||
delete(Zeile,length(Zeile),1);
|
||||
GetPwParm := ParmStr(Nr,Km,Zeile);
|
||||
end else GetPwParm := '';
|
||||
End;
|
||||
|
||||
Function Found_Pw_Call (* Zeile : Str80; Cstr : Str9; Alstr:Str9; AStr : Str6) : Boolean *);
|
||||
Var i : Byte;
|
||||
Flag : Boolean;
|
||||
Begin
|
||||
KillEndBlanks(AStr);
|
||||
Flag := pos(AStr,Zeile) = 1;
|
||||
|
||||
if Flag then
|
||||
Repeat
|
||||
Zeile := RestStr(Zeile);
|
||||
Flag := Cstr = CutStr(Zeile);
|
||||
if (not flag) and (length(alstr)>0) then Flag:=AlStr=CutStr(Zeile);
|
||||
Until Flag or (length(Zeile) = 0);
|
||||
|
||||
Found_Pw_Call := Flag;
|
||||
End;
|
||||
|
||||
|
||||
Function Check_Parm (* Zeile : String) : String *);
|
||||
Var i,i1 : Byte;
|
||||
Bstr : String;
|
||||
Begin
|
||||
i := pos('> ',Zeile);
|
||||
if i > 0 then delete(Zeile,1,i-1);
|
||||
|
||||
Bstr := '';
|
||||
i := 0;
|
||||
i1 := length(Zeile);
|
||||
While i < i1 do
|
||||
begin
|
||||
inc(i);
|
||||
if Zeile[i] in ['0'..'9',B1] then Bstr := Bstr + Zeile[i]
|
||||
else Bstr := Bstr + B1;
|
||||
end;
|
||||
KillStartBlanks(Bstr);
|
||||
KillEndBlanks(Bstr);
|
||||
Check_Parm := Bstr;
|
||||
End;
|
||||
|
||||
|
||||
Procedure RMNC_Auswert (* Kanal : Byte; Zeile : Str80 *);
|
||||
var i,iz : Integer;
|
||||
PrivStr : String[80];
|
||||
Bstr : String[20];
|
||||
Found : Boolean;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
While pos(B1,Zeile) > 0 do Zeile := RestStr(Zeile);
|
||||
While pos(M1,Zeile) > 0 do Zeile[pos(M1,Zeile)] := B1;
|
||||
While pos(^J,Zeile) > 0 do Zeile[pos(^J,Zeile)] := B1;
|
||||
While pos(RSK,Zeile) > 0 do Zeile[pos(RSK,Zeile)] := B1;
|
||||
|
||||
KillStartBlanks(Zeile);
|
||||
KillEndBlanks(Zeile);
|
||||
|
||||
if str_int(Zeile) > 0 then
|
||||
begin
|
||||
if PassRetry <> PassRight then
|
||||
begin
|
||||
Repeat
|
||||
iz := Random(255);
|
||||
Until iz in [21..255];
|
||||
InfoOut(Kanal,0,1,ParmStr(2,B1,InfoZeile(241)) + B2 + Zeile + PfStr + int_str(iz));
|
||||
S_PAC(Kanal,NU,true,int_str(iz) + M1);
|
||||
end else
|
||||
begin
|
||||
PrivStr := Zeile;
|
||||
Bstr := '';
|
||||
for i := 1 to length(PrivStr) do if PrivStr[i] in ['0'..'9'] then
|
||||
Bstr := Bstr + PrivStr[i];
|
||||
While length(Bstr) < 5 do Bstr := '0' + Bstr;
|
||||
|
||||
Assign(G^.TFile,Sys1Pfad + PwDatei);
|
||||
FiResult := ResetTxt(G^.TFile);
|
||||
Found := false;
|
||||
Repeat
|
||||
Readln(G^.TFile,PrivStr);
|
||||
if Found_Pw_Call(PrivStr,Call,Alias,SysopArt) then Found := true;
|
||||
Until Found or Eof(G^.TFile);
|
||||
|
||||
if Found then
|
||||
begin
|
||||
iz := 0;
|
||||
Readln(G^.TFile,PrivStr);
|
||||
for i := 1 to length(Bstr) do
|
||||
iz := iz + (str_int(Bstr[i]) * str_int(PrivStr[i]));
|
||||
InfoOut(Kanal,0,1,ParmStr(1,B1,InfoZeile(241)) + B2 + Zeile + PfStr + int_str(iz));
|
||||
S_PAC(Kanal,NU,true,int_str(iz) + M1);
|
||||
end else
|
||||
begin
|
||||
SysopParm := false;
|
||||
InfoOut(Kanal,1,1,InfoZeile(171));
|
||||
end;
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
end;
|
||||
|
||||
if PassRetry > 1 then S_PAC(Kanal,NU,true,SysopStr + M1);
|
||||
dec(PassRetry);
|
||||
if PassRetry < 1 then SysopParm := false;
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure TheNet_SYS_Auswert (* (Kanal : Byte; Zeile : String) *);
|
||||
var i,i1,r,
|
||||
AnzParam : Byte;
|
||||
PsConst,
|
||||
PwConst : Byte;
|
||||
Dstr,
|
||||
Rstr,
|
||||
Pstr,
|
||||
Hstr : String;
|
||||
Found : Boolean;
|
||||
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
|
||||
{** FBB-Erg„nzung: Call bis einschlieálich '> ' absensen **}
|
||||
if (SysArt=3) then
|
||||
begin
|
||||
if Pos('> ', Zeile)>0 then Delete(Zeile,1,Pos('> ',Zeile)+2);
|
||||
i:=Pos('[',Zeile);
|
||||
if i>0 then
|
||||
begin
|
||||
i1:=Pos(']',Zeile);
|
||||
if (i1>i+10) and (i1<i+14) and (i1>i) then delete(zeile, i, i1-i+1);
|
||||
end;
|
||||
end;
|
||||
if (SysArt=8) or ((SysArt=0) and (UserArt=1)) then
|
||||
begin
|
||||
if Pos('} ', Zeile)>0 then Delete(Zeile,1,Pos('} ',Zeile)+2);
|
||||
end;
|
||||
if Zeile[length(Zeile)]=#13 then PwMerk:='';
|
||||
Zeile:=PwMerk+Zeile;
|
||||
Zeile := Check_Parm(Zeile);
|
||||
Pstr := ParmStr(1,B1,Zeile);
|
||||
AnzParam := ParmAnz;
|
||||
Pstr := '';
|
||||
|
||||
Assign(G^.TFile,Sys1Pfad + PwDatei);
|
||||
FiResult := ResetTxt(G^.TFile);
|
||||
Repeat
|
||||
Readln(G^.TFile,Hstr);
|
||||
Found := Found_Pw_Call(Hstr,Call,Alias,SysopArt);
|
||||
Until Found or Eof(G^.TFile);
|
||||
|
||||
if Found then
|
||||
begin
|
||||
Dstr := Hstr;
|
||||
if SysArt = 11 then PwConst := 4
|
||||
else PwConst := 5;
|
||||
if AnzParam = PwConst then
|
||||
begin
|
||||
PWMerk:='';
|
||||
PsConst := Byte(str_int(GetPwParm(2,Dstr)));
|
||||
if PassRetry <> PassRight then
|
||||
begin
|
||||
Pstr := PseudoPriv(PsConst,'',Dstr);
|
||||
InfoOut(Kanal,0,1,ParmStr(2,B1,InfoZeile(241)) + B2 +
|
||||
Zeile + PfStr + copy(Pstr,1,PwConst));
|
||||
S_PAC(Kanal,NU,true,Pstr + M1);
|
||||
end else
|
||||
begin
|
||||
Pstr := '';
|
||||
Readln(G^.TFile,Hstr);
|
||||
for i := 1 to PwConst do
|
||||
begin
|
||||
i1 := Byte(str_int(ParmStr(i,B1,Zeile)));
|
||||
Pstr := Pstr + copy(Hstr,i1,1);
|
||||
end;
|
||||
Rstr := Pstr;
|
||||
if PsConst > PwConst then Pstr := PseudoPriv(PsConst,Pstr,Dstr);
|
||||
InfoOut(Kanal,0,1,
|
||||
ParmStr(1,B1,InfoZeile(241)) + B2 + Zeile + PfStr + Rstr);
|
||||
S_PAC(Kanal,NU,true,Pstr + M1);
|
||||
MailPWWait:=false;
|
||||
MailPrompt:='';
|
||||
end;
|
||||
|
||||
if PassRetry > 1 then S_PAC(Kanal,NU,true,SysopStr + M1);
|
||||
dec(PassRetry);
|
||||
if PassRetry < 1 then SysopParm := false;
|
||||
end else {AnzParm = PwConst}
|
||||
begin
|
||||
if Zeile[length(zeile)]<>#13 then PWMerk:=Zeile else PWMerk:='';
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
SysopParm := false;
|
||||
if First_Frame then InfoOut(Kanal,1,1,InfoZeile(171));
|
||||
end;
|
||||
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure EZBOX_Auswert (* Kanal : Byte; Zeile : Str80 *);
|
||||
var b,i,i1 : Byte;
|
||||
Pstr : String[4];
|
||||
Rstr : String[20];
|
||||
Hstr : String[80];
|
||||
Found : Boolean;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
if (copy(Zeile,1,1) = LRK) and (copy(Zeile,length(Zeile),1) = RSK) then
|
||||
begin
|
||||
delete(Zeile,1,1);
|
||||
delete(Zeile,length(Zeile),1);
|
||||
KillEndBlanks(Zeile);
|
||||
delete(Zeile,length(Zeile),1);
|
||||
While pos('.',Zeile) > 0 do Zeile[pos('.',Zeile)] := B1;
|
||||
Rstr := Zeile;
|
||||
|
||||
Assign(G^.TFile,Sys1Pfad + PwDatei);
|
||||
FiResult := ResetTxt(G^.TFile);
|
||||
Repeat
|
||||
Readln(G^.TFile,Hstr);
|
||||
Found := Found_Pw_Call(Hstr,Call,Alias,SysopArt);
|
||||
Until Found or Eof(G^.TFile);
|
||||
|
||||
if Found then
|
||||
begin
|
||||
Pstr := '';
|
||||
Readln(G^.TFile,Hstr);
|
||||
b := Ord(Hstr[Byte(str_int(CutStr(Zeile)))]);
|
||||
Zeile := RestStr(Zeile);
|
||||
for i := 1 to 4 do
|
||||
begin
|
||||
i1 := Byte(b + Byte(str_int(CutStr(Zeile))));
|
||||
i1 := i1 mod 80;
|
||||
if i1 = 0 then i1 := 80;
|
||||
Pstr := Pstr + Hstr[i1];
|
||||
Zeile := RestStr(Zeile);
|
||||
end;
|
||||
InfoOut(Kanal,0,1,ParmStr(1,B1,InfoZeile(241)) + B2 + Rstr + PfStr + Pstr);
|
||||
S_PAC(Kanal,NU,true,Pstr + M1);
|
||||
end else InfoOut(Kanal,1,1,InfoZeile(171));
|
||||
SysopParm := false;
|
||||
FiResult := CloseTxt(G^.TFile);
|
||||
end;
|
||||
end;
|
||||
End;
|
974
XPQTH.PAS
Executable file
974
XPQTH.PAS
Executable file
@ -0,0 +1,974 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P Q T H . P A S ³
|
||||
³ ³
|
||||
³ QTH-Kennerberechnung nach Routinen von DL5FBD (QTHBER V2.2) ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
(***********************************************************)
|
||||
(* Funktionsprozeduren und Funktionen zur QTH-Kennerbe- *)
|
||||
(* rechnung in Turbo-Pascal *)
|
||||
(* UNIT QTHBER V2.2 von G. M. Ritter DL5FBD Juni 1993 *)
|
||||
(***********************************************************)
|
||||
|
||||
|
||||
(***********************************************************)
|
||||
(* Procedure Entfernung_Richtung *)
|
||||
(* Die Prozedur dient zur Berechnung von Entfernung und *)
|
||||
(* Richtung bei gegebenen geografischen Koordinaten im *)
|
||||
(* Gradmass. *)
|
||||
(* Ergebnis sind Entfernung in Kilometern und Richtung in *)
|
||||
(* Grad von QTH1 nach QTH2. *)
|
||||
(* O1,N1 Oestliche Laenge,Noerdliche Breite von QTH1 *)
|
||||
(* O2,N2 Oestliche Laenge,Noerdliche Breite von QTH2 *)
|
||||
(***********************************************************)
|
||||
|
||||
PROCEDURE Entfernung_Richtung (O1,N1,O2,N2 :REAL;
|
||||
VAR Entfernung,Richtung :REAL);
|
||||
|
||||
CONST PI=3.1415926; (*Kreiskonstante PI *)
|
||||
VAR EW,RV :REAL; (*EW Entfernungswinkel *)
|
||||
(*RV vorlaeufige Richtg*)
|
||||
|
||||
|
||||
(* Funktion GSIN *)
|
||||
(* Berechnung des Sinus zu einem gegebenen Gradwinkel *)
|
||||
|
||||
FUNCTION GSIN(WINKEL :REAL):REAL;
|
||||
BEGIN
|
||||
GSIN:=SIN(Winkel*PI/180);
|
||||
END;
|
||||
|
||||
|
||||
(* Funktion GCOS *)
|
||||
(* Berechnung des Cosinus zu einem gegebenen Gradwinkel *)
|
||||
|
||||
FUNCTION GCOS(WINKEL :REAL):REAL;
|
||||
BEGIN
|
||||
GCOS:=COS(Winkel*PI/180);
|
||||
END;
|
||||
|
||||
|
||||
(* Funktion ARCGCOS *)
|
||||
(* Berechnung des Gradwinkels zum gegebenen Cosinuswert *)
|
||||
|
||||
FUNCTION ARCGCOS(COSINUS :REAL) :REAL;
|
||||
VAR ARCBOG :REAL; (*Hilfsvariable vor Gradumrechnung*)
|
||||
BEGIN
|
||||
IF COSINUS>= 1 THEN ARCGCOS:= 0 (*Sonderfall 0 Grad*)
|
||||
ELSE IF COSINUS<=-1 THEN ARCGCOS:=180 (*Sonderfall 180 Grad*)
|
||||
ELSE BEGIN
|
||||
ARCBOG:=PI/2-ARCTAN(COSINUS/(SQRT(1-SQR(COSINUS))));
|
||||
(*Umrechnung vom Bogenmaá in Grad*)
|
||||
ARCGCOS:=ARCBOG*180/PI;
|
||||
END;
|
||||
END;
|
||||
|
||||
|
||||
(* Beginn der eigentlichen Entfernungs-Richtungsberechnung *)
|
||||
|
||||
BEGIN
|
||||
|
||||
(* Entfernungsberechnung *)
|
||||
|
||||
EW:=arcgcos(gsin(n1)*gsin(n2)+gcos(n1)*gcos(n2)*gcos(o2-o1));
|
||||
Entfernung:=40009/360*EW;
|
||||
|
||||
(* Richtungsberechnung *)
|
||||
|
||||
RV:=arcgcos((gsin(n2)-gsin(n1)*gcos(ew))/(gcos(n1)*gsin(ew)));
|
||||
If gsin(o2-o1)>=0 then Richtung:=RV;
|
||||
IF gsin(o2-o1)< 0 then Richtung:=360-RV;
|
||||
|
||||
END;
|
||||
|
||||
(*********** Ende PROCEDURE Entfernung_Richtung ************)
|
||||
|
||||
|
||||
(***********************************************************)
|
||||
(* FUNCTION NEU_Pruefen *)
|
||||
(* Diese FUNCTION dient zur Pruefung ob der uebergebene *)
|
||||
(* QTH-Kenner ein korrektes Format hat. *)
|
||||
(* Funktionsergebnis TRUE=OK FALSE=ungueltiger Kenner *)
|
||||
(* QTHKENN zu pruefender neuer QTH-Kenner als String *)
|
||||
(* VERGLEICH[I] Mengenfeld zur Gueltigkeitspruefung *)
|
||||
(* I Index fuer ARRAY-Operationen *)
|
||||
(***********************************************************)
|
||||
|
||||
FUNCTION NEU_Pruefen (QTHKENN :STRING):BOOLEAN;
|
||||
|
||||
TYPE MENGE = SET OF CHAR;
|
||||
|
||||
CONST VERGLEICH :array [1..6] of MENGE (* Definitionsmenge des.. *)
|
||||
|
||||
= (['A'..'R','a'..'r'], (* 1. Zeichen *)
|
||||
['A'..'R','a'..'r'], (* 2. Zeichen *)
|
||||
['0'..'9'], (* 3. Zeichen *)
|
||||
['0'..'9'], (* 4. Zeichen *)
|
||||
['A'..'X','a'..'x'], (* 5. Zeichen *)
|
||||
['A'..'X','a'..'x']); (* 6. Zeichen *)
|
||||
|
||||
VAR I :byte;
|
||||
|
||||
BEGIN
|
||||
|
||||
IF LENGTH(QTHKENN)=6 THEN
|
||||
|
||||
BEGIN
|
||||
NEU_Pruefen:=TRUE;
|
||||
For I:=1 to 6 do
|
||||
BEGIN
|
||||
IF NOT(QTHKENN[I] IN VERGLEICH[I]) then NEU_Pruefen:=FALSE;
|
||||
END;
|
||||
END
|
||||
|
||||
ELSE NEU_Pruefen:=false;
|
||||
|
||||
END;
|
||||
|
||||
|
||||
(***********************************************************)
|
||||
(* FUNCTION ALT_Pruefen *)
|
||||
(* Diese FUNCTION dient zur Pruefung ob der uebergebene *)
|
||||
(* QTH-Kenner ein korrektes Format hat. *)
|
||||
(* Funktionsergebnis TRUE=OK FALSE=ungueltiger Kenner *)
|
||||
(* QTHKENN zu pruefender neuer QTH-Kenner als String *)
|
||||
(* VERGLEICH[I] Mengenfeld zur Gueltigkeitspruefung *)
|
||||
(* I Index fuer ARRAY-Operationen *)
|
||||
(* MINFO Mittelfeldziffer f<>r Bereichspruefung der *)
|
||||
(* Mittelfelder 10-70 wegen unstetiger Kodierung *)
|
||||
(***********************************************************)
|
||||
|
||||
FUNCTION ALT_Pruefen (QTHKENN :STRING):BOOLEAN;
|
||||
|
||||
TYPE MENGE = SET OF CHAR;
|
||||
|
||||
CONST VERGLEICH :array [1..7] of MENGE (* Definitionsmenge des..*)
|
||||
|
||||
= (['A'..'Z','a'..'z'], (* 1. Zeichen *)
|
||||
['A'..'Z','a'..'z'], (* 2. Zeichen *)
|
||||
['0'..'8'], (* 3. Zeichen *)
|
||||
['0'..'9'], (* 4. Zeichen *)
|
||||
['A'..'H','a'..'h','J','j'], (* 5. Zeichen *)
|
||||
['/'], (* 6. Zeichen *)
|
||||
['1'..'4']); (* 7. Zeichen *)
|
||||
|
||||
VAR I :byte;
|
||||
MFINFO :string[2];
|
||||
|
||||
BEGIN
|
||||
|
||||
IF (LENGTH(QTHKENN)=5) OR (LENGTH(QTHKENN)=7) THEN
|
||||
|
||||
BEGIN
|
||||
ALT_Pruefen:=TRUE;
|
||||
|
||||
(*Jedes Kodezeichen des QTH-Kenners auf Gueltigkeit ueberpruefen*)
|
||||
|
||||
For I:=1 to LENGTH(QTHKENN) do
|
||||
BEGIN
|
||||
IF NOT(QTHKENN[I] IN VERGLEICH[I]) THEN ALT_Pruefen:=FALSE;
|
||||
END;
|
||||
|
||||
(* sowie unerlaubte Mittelfeldkodierungen ausschliessen *)
|
||||
|
||||
MFINFO:=Copy(QTHKENN,3,2);
|
||||
IF (MFINFO='00') OR (MFINFO>'80') THEN ALT_Pruefen:=false;
|
||||
END
|
||||
|
||||
ELSE ALT_Pruefen:=false;
|
||||
|
||||
END;
|
||||
|
||||
(***********************************************************)
|
||||
(* PROCEDURE NEU_IN_WINKEL *)
|
||||
(* Diese Procedure dient zum Umwandeln eines neuen QTH- *)
|
||||
(* kenners in geografische Laenge und Breite *)
|
||||
(* I Indexvariable fuer Feldzuweisung *)
|
||||
(* OESLAE Oestliche Laenge als Gleitkommawinkel *)
|
||||
(* NOEBRE Noerdliche Breite als Gleitkommawinkel *)
|
||||
(* QTHKENN QTH-Kenner als STRING *)
|
||||
(* WIINFO[6] Feld der QTH-Kennerindexziffern *)
|
||||
(* ASCKOR[6] Hilfsfeld zur ASCII-Indexziffernumrechnung *)
|
||||
(* Maske [6] Hilfsfeld zur Grossschrifteinstellung *)
|
||||
(***********************************************************)
|
||||
|
||||
PROCEDURE NEU_IN_WINKEL (QTHKENN :STRING; VAR OESLAE,NOEBRE :REAL);
|
||||
|
||||
CONST ASCKOR :array [1..6] of byte = (065,065,048,048,065,065);
|
||||
MASKE :array [1..6] of byte = (223,223,255,255,223,223);
|
||||
|
||||
VAR I :byte;
|
||||
WIINFO :array [1..6] of byte;
|
||||
|
||||
BEGIN
|
||||
|
||||
(* Ermittlung der Indexziffern aus dem QTH-Kenner *)
|
||||
|
||||
For I:=1 to 6 do
|
||||
BEGIN
|
||||
WIINFO[I]:=(ORD(qthkenn[I]) AND MASKE[I])-ASCKOR[I];
|
||||
END;
|
||||
|
||||
(* Berechnung der geografischen Koordinate aus den Indexziffern *)
|
||||
|
||||
OESLAE:=-180+WIINFO[1]*20+WIINFO[3]*2+WIINFO[5]/12+1/24;
|
||||
NOEBRE:= -90+WIINFO[2]*10+WIINFO[4]*1+WIINFO[6]/24+1/48;
|
||||
|
||||
END;
|
||||
|
||||
(************* Ende PROCEDURE NEU_IN_WINKEL ****************)
|
||||
|
||||
|
||||
(***********************************************************)
|
||||
(* PROCEDURE ALT_IN_WINKEL *)
|
||||
(* Diese Procedure dient zum Umwandeln eines alten QTH- *)
|
||||
(* kenners in geografische Laenge und Breite *)
|
||||
(* I Indexvariable fuer Feldzuweisung *)
|
||||
(* OESLAE Oestliche Laenge als Gleitkommawinkel *)
|
||||
(* NOEBRE Noerdliche Breite als Gleitkommawinkel *)
|
||||
(* QTHKENN QTH-Kenner als STRING *)
|
||||
(* WIINFO[5] Feld der QTH-Kennerindexziffern *)
|
||||
(* ASCKOR[5] Hilfsfeld zur ASCII-Indexziffernumrechnung *)
|
||||
(* Maske [5] Hilfsfeld zur Grossschrifteinstellung *)
|
||||
(* KLOST [10] Hilfsfeld zur Kleinfeldlaengenzuweisung *)
|
||||
(* KLNORD [10] Hilfsfeld zur Kleinfeldbreitenzuweisung *)
|
||||
(* A INDEX fuer Quadrantenursprungszuweisung 1-4 *)
|
||||
(* ALTURN [4] Feld fuer die 4 noerdlichen Ursprungsbreiten *)
|
||||
(* ALTURO [4] Feld fuer die 4 oestlichen Ursprungslaengen *)
|
||||
(***********************************************************)
|
||||
|
||||
PROCEDURE ALT_IN_WINKEL (QTHKENN :STRING; VAR OESLAE,NOEBRE :REAL);
|
||||
|
||||
CONST ASCKOR :array [1..5] of byte = (065,065,048,048,064);
|
||||
MASKE :array [1..5] of byte = (223,223,255,255,223);
|
||||
KLNORD :array [1..10] of ShortInt = (-1,-1,-3,-5,-5,-5,-3,-1,0,-3);
|
||||
KLOST :array [1..10] of ShortInt = ( 3, 5, 5, 5, 3, 1, 1, 1,0, 3);
|
||||
ALTURO :array [1..4] of ShortInt = (-52, 0,-52, 0);
|
||||
ALTURN :array [1..4] of ShortInt = ( 40, 40, 14, 14);
|
||||
|
||||
VAR I :byte;
|
||||
A :byte;
|
||||
H :Integer; (* Dummivariable fuer VAL-Procedure*)
|
||||
WIINFO :array [1..5] of byte;
|
||||
|
||||
BEGIN
|
||||
|
||||
(* Ermittlung des Feldursprungs aus der Quadrantenkennziffer *)
|
||||
|
||||
IF LENGTH(QTHKENN)=7 THEN VAL(QTHKENN[7],A,H)
|
||||
ELSE A:=2;
|
||||
|
||||
(* Ermittlung der Indexziffern aus dem QTH-Kenner *)
|
||||
|
||||
For I:=1 to 5 do
|
||||
BEGIN
|
||||
WIINFO[I]:=(ORD(qthkenn[I]) AND MASKE[I])-ASCKOR[I];
|
||||
END;
|
||||
|
||||
(* Berechnung der geografischen Koordinate aus den Indexziffern *)
|
||||
|
||||
OESLAE:=ALTURO[A]+WIINFO[1]*2 +(WIINFO[4]-1)*0.2 +KLOST [WIINFO[5]]/30;
|
||||
NOEBRE:=ALTURN[A]+(WIINFO[2]+1)*1+WIINFO[3]*(-0.125)+KLNORD[WIINFO[5]]/48;
|
||||
|
||||
(* Korrektur des systematischen Fehlers bei den oestlichsten Mittelfeldern *)
|
||||
|
||||
IF WIINFO[4] = 0 THEN
|
||||
BEGIN
|
||||
OESLAE:=OESLAE+2;
|
||||
NOEBRE:=NOEBRE+0.125;
|
||||
END;
|
||||
END;
|
||||
|
||||
(************* Ende PROCEDURE ALT_IN_WINKEL ****************)
|
||||
|
||||
|
||||
(***********************************************************)
|
||||
(* PROCEDURE GRAD_UMW *)
|
||||
(* Diese Procedure wandelt eine als String uebergebene *)
|
||||
(* geografische Koordinate im Format +GGG:MM:SS/-GG:MM:SS *)
|
||||
(* mit Unterlaengen +GG:MM und -GG in die entsprechenden *)
|
||||
(* Gleitkommawinkel um. (Oestl. Laenge/Noerd. Breite) *)
|
||||
(* Uebergeben wird der Koordinatenstr. und zurueck werden *)
|
||||
(* die Gleitkommawinkel und eine Statusvariable uebergeben *)
|
||||
(* Ist diese False so ist ein Formatfehler entdeckt worden *)
|
||||
(* und die uebergebenen Winkelparameter undefiniert. *)
|
||||
(* QTHKENN Koordinatenstring *)
|
||||
(* OESLAE Oestliche Laenge als REAL-Zahl *)
|
||||
(* NOEBRE Noerdliche Breite als REAL-Zahl *)
|
||||
(* STATUS TRUE Umwandlung erfolgreich vorgenommen *)
|
||||
(* FALSE Formatfehler entdeckt oder Bereichs- *)
|
||||
(* fehler der Koordinatenwinkel *)
|
||||
(* MENGE Definition des Stringmengentyps *)
|
||||
(* REFERENZ Gueltige Elementemenge von QTHKENN *)
|
||||
(* RASTER Feld der gueltigen Formatraster von QTHKENN *)
|
||||
(* I Index fuer Feldzugriffe *)
|
||||
(* P Position des Trennzeichens '/' in QTHKENN *)
|
||||
(* und Kontrollvariable fuer VAL-Funktion *)
|
||||
(* OES,NOE String der oestlichen Laenge,noerdl. Breite *)
|
||||
(* zur Umwandlung in den Gleitkommawinkel *)
|
||||
(* VERGLEICH Strukturabbild von QTHKENN zur Format- *)
|
||||
(* pruefung des Koordinatenstrings *)
|
||||
(* LAENGE Laenge von QTHKENN fuer Abfrageschleifen *)
|
||||
(***********************************************************)
|
||||
|
||||
PROCEDURE GRAD_UMW (QTHKENN :STRING;
|
||||
VAR OESLAE,NOEBRE :REAL;
|
||||
VAR STATUS :BOOLEAN);
|
||||
|
||||
(***********************************************************)
|
||||
(* FUNCTION GMS_UMW *)
|
||||
(* Die Funktion dient zur Umwandlung des Laengen und *)
|
||||
(* Breitengradstring in den entsprechenden Gleitkommawinkel*)
|
||||
(* GMS Stringteil mit Winkelinformation +GG:MM:SS *)
|
||||
(* UMWAND Gleitkommawinkel *)
|
||||
(* REST Teilstring fuer Entnahme der GG,MM,SS-Info *)
|
||||
(* POSI Position des Trennzeichens ':' in REST *)
|
||||
(* VORZEI Vorzeichenfaktor des Winkels +1 oder -1 *)
|
||||
(* I Potenz des Minuten und Sekundenfaktors zur *)
|
||||
(* BASIS 60 fuer Gleitkommawinkelberechnung *)
|
||||
(* D Fehlerposition fuer VAL-Procedure *)
|
||||
(* Teil Enthaelt Ziffernfaktor fuer Grad,Min.,Sekunden *)
|
||||
(* Summe Teil- und Endsumme des Gleitkommawinkels *)
|
||||
(***********************************************************)
|
||||
|
||||
FUNCTION GMS_UMW (GMS :String):REAL;
|
||||
|
||||
VAR REST : STRING;
|
||||
POSI : BYTE;
|
||||
VORZEI : ShortInt;
|
||||
I : BYTE;
|
||||
D : INTEGER;
|
||||
Teil : REAL;
|
||||
SUMME : REAL;
|
||||
|
||||
BEGIN
|
||||
I:=0;
|
||||
SUMME:=0;
|
||||
REST:=GMS;
|
||||
IF GMS[1]='-' THEN VORZEI:=-1 (*Vorzeichen ent- *)
|
||||
ELSE VORZEI:=1; (*nehmen *)
|
||||
|
||||
REPEAT
|
||||
|
||||
(* Winkelinformation in Grad,Min. oder Sekunden entnehmen*)
|
||||
|
||||
VAL(REST,TEIL,D);
|
||||
IF D<>0 THEN VAL((COPY(REST,1,D-1)),TEIL,D);
|
||||
|
||||
(* Winkelinformation gemaess Wertigkeitsfaktor aufsummieren *)
|
||||
(* Wertigkeitsfaktor Grad=1 ,Min.=1/60hoch1 ,Sek.=1/60hoch2 *)
|
||||
|
||||
IF I=0 THEN SUMME:=TEIL
|
||||
ELSE SUMME:=SUMME+VORZEI*TEIL/(EXP(LN(60)*I));
|
||||
I:=I+1;
|
||||
|
||||
(* Pruefen ob noch eine Information in REST ist *)
|
||||
(* wenn ja dann REST um bearbeiteten TEIL kuerzen *)
|
||||
|
||||
POSI:=POS(':',REST);
|
||||
REST:=Copy(REST,POSI+1,(LENGTH(REST)-POSI));
|
||||
|
||||
UNTIL POSI=0; (* Wenn keine Info in REST mehr dann Ende *)
|
||||
|
||||
GMS_UMW := SUMME
|
||||
END;
|
||||
|
||||
(**********************************************************)
|
||||
(* Hier beginnt GRAD_UMW() *)
|
||||
(**********************************************************)
|
||||
|
||||
TYPE MENGE = SET OF CHAR;
|
||||
|
||||
CONST REFERENZ :MENGE = ['0'..'9','+','-','/',':','.']; (* Definitionsmenge *)
|
||||
|
||||
RASTER :array[1..10] of string
|
||||
|
||||
= ('VZ:Z:Z/VZ:Z:Z' , 'VZ:Z:Z/VZ:Z' , 'VZ:Z:Z/VZ' ,
|
||||
'VZ:Z/VZ:Z:Z' , 'VZ:Z/VZ:Z' , 'VZ:Z/VZ' ,
|
||||
'VZ/VZ:Z:Z' , 'VZ/VZ:Z' , 'VZ/VZ' ,
|
||||
'VZ.Z/VZ.Z');
|
||||
|
||||
VAR I :Byte;
|
||||
P :Integer;
|
||||
OES,NOE,
|
||||
VERGLEICH :STRING;
|
||||
LAENGE :BYTE;
|
||||
|
||||
BEGIN
|
||||
|
||||
(* 1. Stringformat und Zeichengueltigkeit ueberpruefen *)
|
||||
(* 2. Wenn gueltig in Gleitkommawinkel umwandeln und *)
|
||||
(* danach Gueltigkeitspruefung der Winkel vornehmen *)
|
||||
(* 3. Wenn auch das in Ordnung Winkel und STATUS=TRUE *)
|
||||
|
||||
LAENGE:=LENGTH(QTHKENN);
|
||||
IF LAENGE<=20 THEN
|
||||
BEGIN
|
||||
|
||||
(* Ueberpruefung von Format und Inhalt der Stringinformation *)
|
||||
|
||||
VERGLEICH:='';
|
||||
For I:=1 to LAENGE do
|
||||
BEGIN
|
||||
IF NOT(QTHKENN[I] IN REFERENZ) THEN VERGLEICH:=VERGLEICH+'?'
|
||||
|
||||
ELSE
|
||||
|
||||
BEGIN
|
||||
IF QTHKENN[I] IN ['+','-'] THEN VERGLEICH:=VERGLEICH+'V';
|
||||
IF QTHKENN[I] ='/' THEN VERGLEICH:=VERGLEICH+'/';
|
||||
IF QTHKENN[I] =':' THEN VERGLEICH:=VERGLEICH+':';
|
||||
IF QTHKENN[I] ='.' THEN VERGLEICH:=VERGLEICH+'.';
|
||||
IF QTHKENN[I] IN ['0'..'9'] THEN
|
||||
BEGIN
|
||||
P:=LENGTH(VERGLEICH);
|
||||
IF VERGLEICH[P]<>'Z' THEN VERGLEICH:=VERGLEICH+'Z';
|
||||
END;
|
||||
END;
|
||||
|
||||
END;
|
||||
|
||||
(* Vorzeichenkennungen fuer Schreibfaule nachtragen *)
|
||||
|
||||
IF VERGLEICH[1]='Z' THEN Insert('V',VERGLEICH,1);
|
||||
P:=Pos('/',VERGLEICH)+1;
|
||||
IF VERGLEICH[P]='Z' THEN Insert('V',VERGLEICH,P);
|
||||
|
||||
(* Abfrage ob Vergleichsraster einem der gueltigen *)
|
||||
(* Raster entspricht *)
|
||||
|
||||
STATUS:=False;
|
||||
FOR I:=1 to 10 do
|
||||
STATUS:=STATUS OR (VERGLEICH = RASTER[I]);
|
||||
|
||||
END
|
||||
|
||||
ELSE STATUS := FALSE;
|
||||
|
||||
(* 3. Zeichenkette in Koordinaten umwandeln wenn in Ordnung *)
|
||||
|
||||
IF STATUS THEN
|
||||
BEGIN
|
||||
P:=POS('/',QTHKENN);
|
||||
OES:=Copy(QTHKENN,1,P-1);
|
||||
NOE:=Copy(QTHKENN,P+1,(LAENGE-P));
|
||||
IF POS('.',OES) > 0 THEN VAL(OES,OESLAE,P)
|
||||
ELSE OESLAE := GMS_UMW(OES);
|
||||
IF POS('.',NOE) > 0 THEN VAL(NOE,NOEBRE,P)
|
||||
ELSE NOEBRE := GMS_UMW(NOE);
|
||||
IF ABS(NOEBRE) > 90 THEN STATUS := False;
|
||||
IF ABS(OESLAE) > 180 THEN STATUS := False;
|
||||
END;
|
||||
|
||||
END;
|
||||
|
||||
|
||||
(**********************************************************)
|
||||
(* Procedure QTH_ENTFG_RICHTG *)
|
||||
(* Diese Procedure berechnet bei Uebergabe von zwei QTH- *)
|
||||
(* Kennern Entfernung und Richtung zwischen den QTHs. *)
|
||||
(* Gueltige QTH-Kenner bzw. Koordinaten sind: *)
|
||||
(* 1. Der neue QTH-Kenner z.B. JO40HC *)
|
||||
(* 2. Der alte QTH-Kenner mit Regionskennziffer 1-4 *)
|
||||
(* z.B. EK74H/3 *)
|
||||
(* 3. Eine geografische Koordinate (Laenge/Breite) *)
|
||||
(* im Format +GGG:MM:SS/-GG:MM:SS GG=Grad,MM=Minuten *)
|
||||
(* und SS=Sekunden *)
|
||||
(* Minuten und Sekunden koennen weggelassen werden *)
|
||||
(* Die Procedure ordnet automatisch die eingegebenen QTH- *)
|
||||
(* kenner richtig zu und veranlasst bei korrektem Format *)
|
||||
(* die Berechnung von Entfernung und Richtung *)
|
||||
(* QTH1,QTH2 QTH-Kenner QTH1=Bezug fuer Richtung *)
|
||||
(* ENTFG Entfernung zwischen den QTHs *)
|
||||
(* RICHTG Richtung von QTH1 nach QTH2 *)
|
||||
(* STATUS BOOLEAN FALSE=QTH-Kennerformatfehler bei *)
|
||||
(* Auswertung entdeckt *)
|
||||
(* QTH[2] Stringfelder fuer QTH1,QTH2 *)
|
||||
(* WINKEL[K] Realfelder fuer OESLAE,NOEBRE1 und ..2 *)
|
||||
(* I Feldindex fuer QTH[I] *)
|
||||
(* K Feldindex fuer WINKEL[K] *)
|
||||
(* LAENGE Laenge des aktuellen QTH-Kennerstrings *)
|
||||
(**********************************************************)
|
||||
|
||||
|
||||
PROCEDURE QTH_ENTFG_RICHTG (QTH1 : STRING;
|
||||
QTH2 : STRING;
|
||||
VAR
|
||||
ENTFG,
|
||||
RICHTG : REAL;
|
||||
VAR
|
||||
STATUS : BOOLEAN);
|
||||
|
||||
VAR QTH : array[1..2] of STRING;
|
||||
Winkel : array[1..4] OF REAL;
|
||||
I : byte;
|
||||
K : ShortInt;
|
||||
LAENGE : Byte;
|
||||
|
||||
BEGIN
|
||||
QTH[1]:=QTH1;
|
||||
QTH[2]:=QTH2;
|
||||
K:=-1;
|
||||
STATUS:=TRUE;
|
||||
|
||||
FOR i:=1 TO 2 DO
|
||||
IF STATUS=TRUE THEN
|
||||
BEGIN
|
||||
LAENGE:=Length(QTH[I]);
|
||||
K:=K+2;
|
||||
|
||||
(* QTH-Kenner ist geografische Koordinate? *)
|
||||
|
||||
IF QTH[I][1] IN ['+','-','0'..'9'] THEN
|
||||
BEGIN
|
||||
GRAD_UMW (QTH[I],WINKEL[K],WINKEL[K+1],STATUS);
|
||||
END
|
||||
|
||||
(* Alter QTH-Kenner mit Feldkennung? *)
|
||||
|
||||
ELSE IF LAENGE IN [5,7] THEN
|
||||
BEGIN
|
||||
IF ALT_PRUEFEN(QTH[I])=TRUE THEN
|
||||
BEGIN
|
||||
ALT_IN_WINKEL(QTH[I],WINKEL[K],WINKEL[K+1]);
|
||||
END
|
||||
ELSE STATUS:=False;
|
||||
END
|
||||
|
||||
(* Neuer QTH-Kenner *)
|
||||
|
||||
ELSE IF LAENGE=6 THEN
|
||||
BEGIN
|
||||
IF NEU_PRUEFEN(QTH[I])=TRUE THEN
|
||||
BEGIN
|
||||
NEU_IN_WINKEL(QTH[I],WINKEL[K],WINKEL[K+1]);
|
||||
END
|
||||
ELSE STATUS:=False;
|
||||
END
|
||||
|
||||
(* Format nicht zuzuordnen *)
|
||||
|
||||
ELSE STATUS:=False;
|
||||
|
||||
END;
|
||||
|
||||
(* Berechnung wenn kein Formatfehler *)
|
||||
|
||||
IF STATUS=TRUE THEN
|
||||
BEGIN
|
||||
ENTFERNUNG_RICHTUNG(WINKEL[1],WINKEL[2],WINKEL[3],WINKEL[4],
|
||||
ENTFG,RICHTG);
|
||||
END;
|
||||
|
||||
END;
|
||||
|
||||
(************ Ende PROCEDURE QTH_ENTFG_RICHTG *************)
|
||||
|
||||
|
||||
(**********************************************************)
|
||||
(* Procedure QTH_Pruefen *)
|
||||
(* Diese Procedure berechnet bei Uebergabe eines QTH- *)
|
||||
(* Kennern die geografische Koordinate des QTH-Kenners *)
|
||||
(* als Gleitkommawinkel *)
|
||||
(* Gueltige QTH-Kenner bzw. Koordinaten sind: *)
|
||||
(* 1. Der neue QTH-Kenner z.B. JO40HC *)
|
||||
(* 2. Der alte QTH-Kenner mit Regionskennziffer 1-4 *)
|
||||
(* z.B. EK74H/3 *)
|
||||
(* 3. Eine geografische Koordinate (Laenge/Breite) *)
|
||||
(* im Format +GGG:MM:SS/-GG:MM:SS GG=Grad,MM=Minuten *)
|
||||
(* und SS=Sekunden *)
|
||||
(* Minuten und Sekunden koennen weggelassen werden *)
|
||||
(* Die Procedure ordnet automatisch die eingegebenen QTH- *)
|
||||
(* kenner richtig und ueberprueft veranlasst deren Prue- *)
|
||||
(* fung und Umrechnung *)
|
||||
(* QTH QTH-Kenner *)
|
||||
(* STATUS BOOLEAN FALSE=QTH-Kennerformatfehler bei *)
|
||||
(* Auswertung entdeckt *)
|
||||
(* LAENGE Laenge des aktuellen QTH-Kennerstrings *)
|
||||
(* OESLAE Oestliche Laenge als Gleitkommazahl *)
|
||||
(* NOEBRE Noerdliche Breite als Gleitkommazahl *)
|
||||
(**********************************************************)
|
||||
|
||||
|
||||
PROCEDURE QTH_Pruefen(QTH : STRING;
|
||||
VAR
|
||||
OESLAE,
|
||||
NOEBRE : REAL;
|
||||
VAR
|
||||
STATUS : BOOLEAN);
|
||||
|
||||
VAR I : byte;
|
||||
K : ShortInt;
|
||||
LAENGE : Byte;
|
||||
|
||||
BEGIN
|
||||
STATUS:=TRUE;
|
||||
Laenge:=Length(QTH);
|
||||
|
||||
(* QTH-Kenner ist geografische Koordinate? *)
|
||||
|
||||
IF QTH[1] IN ['+','-','0'..'9'] THEN GRAD_UMW (QTH,OESLAE,NOEBRE,STATUS)
|
||||
|
||||
(* Alter QTH-Kenner mit Feldkennung? *)
|
||||
|
||||
ELSE IF LAENGE IN [5,7] THEN
|
||||
BEGIN
|
||||
IF ALT_PRUEFEN(QTH)=TRUE THEN ALT_IN_WINKEL(QTH,OESLAE,NOEBRE)
|
||||
ELSE STATUS:=False;
|
||||
END
|
||||
|
||||
(* Neuer QTH-Kenner *)
|
||||
|
||||
ELSE IF LAENGE=6 THEN
|
||||
BEGIN
|
||||
IF NEU_PRUEFEN(QTH)=TRUE THEN NEU_IN_WINKEL(QTH,OESLAE,NOEBRE)
|
||||
ELSE STATUS:=False;
|
||||
END
|
||||
|
||||
(* Format nicht einzuordnen *)
|
||||
|
||||
ELSE STATUS:=False;
|
||||
|
||||
END;
|
||||
|
||||
(*************** Ende PROCEDURE QTH_Pruefen ***************)
|
||||
|
||||
|
||||
(**********************************************************)
|
||||
(* FUNCTION WINKEL_IN_NEU *)
|
||||
(* Diese FUNCTION ermittelt zu einer eingegebenen geo- *)
|
||||
(* grafischen Koordinate den zugehoerigen neuen QTH-Kenner*)
|
||||
(* und gibt diesen als String zurueck *)
|
||||
(* OESLAE oestliche Laenge *)
|
||||
(* NOEBRE noerdliche Breite *)
|
||||
(* URS[I,K] Ursprungsoffset fuer Gross/Mittelfelder *)
|
||||
(* BWF[I,K] Bewertungsfaktoren fuer Gross/Mittelfelder*)
|
||||
(* ASCKOR[I,K] ASCIIOFFSET zur QTH-Kennerstringberechnung*)
|
||||
(* BWFK[I] Bewertungsfaktoren fuer Kleinfelder *)
|
||||
(* ZUORD[I,K] Zuordnungsindex zwischen 2D-Feld und Zei- *)
|
||||
(* chenposition im QTH-Kenner *)
|
||||
(* I,K Indezes fuer Feldoperationen *)
|
||||
(* I=1 Oestliche Laenge *)
|
||||
(* I=2 Noerdliche Breite *)
|
||||
(* K=1 Grossfeldbearbeitung *)
|
||||
(* K=2 Mittelfeldbearbeitung *)
|
||||
(* K=3 Kleinfeldbearbeitung *)
|
||||
(**********************************************************)
|
||||
|
||||
FUNCTION WINKEL_IN_NEU(OESLAE,NOEBRE :REAL):STRING;
|
||||
|
||||
CONST BWF :array[1..2,1..2] of BYTE = ((20,2) ,(10,1));
|
||||
ASCKOR :array[1..2,1..3] of BYTE = ((65,48,65),(65,48,65));
|
||||
BWFK :array[1..2] of BYTE = (12,24);
|
||||
ZUORD :array[1..2,1..3] of BYTE = ((1,3,5),(2,4,6));
|
||||
|
||||
|
||||
VAR WIINFO : BYTE;
|
||||
REST :array[1..2] of REAL;
|
||||
X : BYTE;
|
||||
I : BYTE;
|
||||
K : BYTE;
|
||||
QTH : STRING;
|
||||
|
||||
BEGIN
|
||||
REST[1] :=OESLAE+180;
|
||||
REST[2] :=NOEBRE+90;
|
||||
QTH:='';
|
||||
FOR I:=1 to 2 DO
|
||||
FOR K:=1 to 3 DO
|
||||
BEGIN
|
||||
IF K<>3 THEN
|
||||
BEGIN
|
||||
REST[I]:=REST[I]/BWF[I,K];
|
||||
WIINFO:=TRUNC(REST[I]);
|
||||
REST[I]:=(REST[I]-WIINFO)*BWF[I,K];
|
||||
END
|
||||
ELSE WIINFO:=TRUNC(REST[I]*BWFK[I]);
|
||||
Insert((CHR(WIINFO+ASCKOR[I,K])),QTH,ZUORD[I,K]);
|
||||
END;
|
||||
WINKEL_IN_NEU:=QTH;
|
||||
END;
|
||||
|
||||
|
||||
(**********************************************************)
|
||||
(* FUNCTION WINKEL_IN_ALT *)
|
||||
(* Diese FUNCTION ermittelt zu einer eingegebenen geo- *)
|
||||
(* grafischen Koordinate den zugehoerigen alten QTH-Kenner*)
|
||||
(* und gibt diesen als String zurueck *)
|
||||
(* OESLAE Oestliche Laenge *)
|
||||
(* NOEBRE Noerdliche Breite *)
|
||||
(* ASCKOR[I,K] ASCIIOFFSET zur QTH-Kennerstringberechnung*)
|
||||
(* KLNORD[I] Bewertungsfaktor fuer Kleinfeldbreite *)
|
||||
(* KLOST[I] Bewertungsfaktor fuer Kleinfeldlaenge *)
|
||||
(* ZUORD[I,K] Zuordnungsindex zwischen 2D-Feld und Zei- *)
|
||||
(* chenposition im QTH-Kenner *)
|
||||
(* F1-F3[I,K] Bewertungsfaktoren in normierter Funktion *)
|
||||
(* V1-V2[I,K] Vorzeichenfaktoren in normierter Funktion *)
|
||||
(* O1-O2[I,K] Rechensummanden in normierter Funktion *)
|
||||
(* Normierte Funktion ist die Berechnungs- *)
|
||||
(* gleichung fuer die gemeinsamme Berechnung *)
|
||||
(* der QTH-Kenner-Indexanteile in einer 2D- *)
|
||||
(* Feldanordnung fuer Gross- und Mittelfeld *)
|
||||
(* des alten QTH-Kenner analog der Berechnung*)
|
||||
(* beim neuen QTH-Kenner *)
|
||||
(* I,K Indezes fuer Feldoperationen *)
|
||||
(* I=1 Oestliche Laenge *)
|
||||
(* I=2 Noerdliche Breite *)
|
||||
(* K=1 Grossfeldbearbeitung *)
|
||||
(* K=2 Mittelfeldbearbeitung *)
|
||||
(* K=3 Kleinfeldbearbeitung *)
|
||||
(**********************************************************)
|
||||
|
||||
|
||||
FUNCTION WINKEL_IN_ALT(OESLAE,NOEBRE :REAL):STRING;
|
||||
|
||||
CONST ALTURO :array[1..4] of ShortInt = (-52, 0,-52, 0);
|
||||
ALTURN :array[1..4] of ShortInt = ( 40, 40, 14, 14);
|
||||
KLNORD :array[1..10] of ShortInt = (1,1,3,5,5,5,3,1,7,3);
|
||||
KLOST :array[1..10] of ShortInt = (3,5,5,5,3,1,1,1,7,3);
|
||||
ASCKOR :array[1..2,1..2] of BYTE = ((65,48),(65,48));
|
||||
F1 :array[1..2,1..2] of REAL = ((0.5,5),(1, 8));
|
||||
F2 :array[1..2,1..2] of BYTE = ((2,30 ),(1,48));
|
||||
F3 :array[1..2,1..2] of BYTE = ((1, 5 ),(1, 8));
|
||||
V1 :array[1..2,1..2] of ShortInt = ((1, 1 ),(-1,1));
|
||||
V2 :array[1..2,1..2] of ShortInt = ((-1,-1),(1,-1));
|
||||
O1 :array[1..2,1..2] of ShortInt = (( 0,-1),(1, 0));
|
||||
O2 :array[1..2,1..2] of ShortInt = (( 0, 1),(0, 0));
|
||||
ZUORD :array[1..2,1..2] of byte = (( 1, 4),(2, 3));
|
||||
|
||||
VAR WIINFO :array[1..2,1..2] of BYTE;
|
||||
REST :array[1..2,1..3] of REAL;
|
||||
ALTFELD : BYTE;
|
||||
I : BYTE;
|
||||
K : BYTE;
|
||||
QTH : STRING;
|
||||
HILF : CHAR;
|
||||
STATUS : BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
|
||||
(* Gueltigkeitsbereich ueberpruefen *)
|
||||
|
||||
STATUS:=TRUE;
|
||||
IF (OESLAE <-52) OR (OESLAE >=52) THEN STATUS:=FALSE;
|
||||
IF (NOEBRE < 14) OR (NOEBRE > 66) THEN STATUS:=FALSE;
|
||||
|
||||
IF STATUS=TRUE THEN
|
||||
|
||||
BEGIN
|
||||
|
||||
(* Alt-QTH-Kennerfeld zuweisen *)
|
||||
|
||||
IF (OESLAE>=-52) AND (OESLAE< 0) AND (NOEBRE> 40) THEN ALTFELD:=1;
|
||||
IF (OESLAE>= 0) AND (OESLAE<52) AND (NOEBRE> 40) THEN ALTFELD:=2;
|
||||
IF (OESLAE>=-52) AND (OESLAE< 0) AND (NOEBRE<=40) THEN ALTFELD:=3;
|
||||
IF (OESLAE>= 0) AND (OESLAE<52) AND (NOEBRE<=40) THEN ALTFELD:=4;
|
||||
|
||||
(* QTH-Kenner-STRING zusammenrechnen und setzen *)
|
||||
|
||||
QTH:=' / ';
|
||||
(* Gross- und Mittelfeldanteile berechnen *)
|
||||
REST[1,1]:=OESLAE-ALTURO[ALTFELD];
|
||||
REST[2,1]:=NOEBRE-ALTURN[ALTFELD];
|
||||
|
||||
FOR I:=1 TO 2 DO
|
||||
FOR K:=1 TO 2 DO
|
||||
BEGIN
|
||||
REST[I,K]:=REST[I,K]*F1[I,K];
|
||||
WIINFO[I,K]:=TRUNC(REST[I,K])+O2[I,K];
|
||||
REST[I,K+1]:=(V1[I,K]*REST[I,K]+V2[I,K]*(WIINFO[I,K]+O1[I,K]))
|
||||
*F2[I,K]/F3[I,K];
|
||||
END;
|
||||
|
||||
(* Korrektur bei oestlichstem Mittelfeld ausfuehren *)
|
||||
IF WIINFO[1,2]=10 THEN BEGIN
|
||||
WIINFO[1,2]:=0;
|
||||
WIINFO[2,2]:=WIINFO[2,2]+1;
|
||||
END;
|
||||
|
||||
(* Kleinfeld zuweisen *)
|
||||
FOR I:=1 to 10 DO
|
||||
IF (ABS(REST[2,3]-KLNORD[I])<=1)
|
||||
AND
|
||||
(ABS(REST[1,3]-KLOST[I])<=1) THEN
|
||||
BEGIN
|
||||
QTH[5]:=CHR(I+64);
|
||||
END;
|
||||
|
||||
(* QTH-Kennerstring [1..4,7] zusammenbauen *)
|
||||
|
||||
QTH[7]:=CHR(ALTFELD+48);
|
||||
FOR I:=1 TO 2 DO
|
||||
FOR K:=1 TO 2 DO
|
||||
BEGIN
|
||||
QTH[ZUORD[I,K]]:=CHR(ASCKOR[I,K]+WIINFO[I,K]);
|
||||
END;
|
||||
WINKEL_IN_ALT:=QTH;
|
||||
|
||||
END
|
||||
|
||||
ELSE WINKEL_IN_ALT:='-------';
|
||||
END;
|
||||
|
||||
|
||||
(**********************************************************)
|
||||
(* FUNCTION WINKEL_IN_GMS *)
|
||||
(* Diese FUNCTION berechnet aus den Gleitkommawinkelkoor- *)
|
||||
(* dinaten einen STRING im Format GRAD:MINUTEN:SEKUNDEN *)
|
||||
(* und gibt als Ergebnis den Formatstring GG:MM:SS zurueck*)
|
||||
(* OESLAE Oestliche Laenge *)
|
||||
(* NOEBRE Noerdliche Breite *)
|
||||
(* RUND[I] Rundungsparameter Sekunde wird aufgerundet *)
|
||||
(* K,I Indexzaehler fuer Arrayoperationen *)
|
||||
(* REST[K] Feld der Restwerte der Winkel *)
|
||||
(* HILF[K,I] Feld der Koordinatenparameter *)
|
||||
(* I=1 Grad I=2 Minuten I=3 Sekunden *)
|
||||
(* K=1 Oestliche Laenge K=2 Noerdliche Breite *)
|
||||
(* TEIL Hilfsstring zur Stringermittlung *)
|
||||
(* QTH Ermittelter String *)
|
||||
(* VZ[K] Vorzeichen des Winkels als Summationsfaktor *)
|
||||
(* und fuer Abfragen (+1 oder -1) *)
|
||||
(**********************************************************)
|
||||
|
||||
Function WINKEL_IN_GMS(OESLAE,NOEBRE:REAL):STRING;
|
||||
|
||||
CONST RUND :array[1..3] of REAL = (0,0,0.5);
|
||||
|
||||
VAR K : BYTE;
|
||||
I : BYTE;
|
||||
REST :array[1..2] of REAL;
|
||||
HILF :array[1..2,1..3] of INTEGER;
|
||||
TEIL : STRING[3];
|
||||
QTH : STRING;
|
||||
VZ :array[1..2] of ShortInt;
|
||||
|
||||
BEGIN
|
||||
QTH:='';
|
||||
REST[1]:=OESLAE;
|
||||
REST[2]:=NOEBRE;
|
||||
|
||||
(* Grad,Minuten und Sekunden ermitteln *)
|
||||
FOR K:=1 TO 2 DO
|
||||
BEGIN
|
||||
IF REST[K]<0 THEN VZ[K]:=-1
|
||||
ELSE VZ[K]:=1;
|
||||
FOR I:=1 TO 3 DO
|
||||
BEGIN
|
||||
HILF[K,I]:=TRUNC(REST[K]+RUND[I]*VZ[K]);
|
||||
REST[K]:=FRAC(REST[K])*60;
|
||||
END;
|
||||
END;
|
||||
|
||||
(* Koordinate bei Sekundenrundungsfehler "GG:MM:60" korrigieren *)
|
||||
FOR K:=1 TO 2 DO
|
||||
BEGIN
|
||||
FOR I:=3 DOWNTO 2 DO
|
||||
BEGIN
|
||||
IF HILF[K,I]=(VZ[K]*60) THEN
|
||||
BEGIN
|
||||
HILF[K,I]:=0;
|
||||
HILF[K,I-1]:=HILF[K,I-1]+VZ[K];
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
|
||||
(* Koordinatenstring zusammensetzen *)
|
||||
FOR K:=1 TO 2 DO
|
||||
BEGIN
|
||||
FOR I:=1 TO 3 DO
|
||||
BEGIN
|
||||
IF (VZ[K]<0) AND (I=1) THEN QTH:=QTH+'-';
|
||||
STR(ABS(HILF[K,I]),TEIL);
|
||||
QTH:=QTH+TEIL;
|
||||
IF I<3 THEN QTH:=QTH+':';
|
||||
END;
|
||||
IF K=1 THEN QTH:=QTH+'/';
|
||||
END;
|
||||
WINKEL_IN_GMS:=QTH;
|
||||
END;
|
||||
|
||||
|
||||
Procedure Compute_QTH (* Var Zeile : Str80 *);
|
||||
Const DXC = 'DXC.DAT';
|
||||
|
||||
Var f : Text;
|
||||
Flag : Boolean;
|
||||
i,l,
|
||||
AnzP : Byte;
|
||||
Diff : ShortInt;
|
||||
Entf,
|
||||
Azim : Real;
|
||||
|
||||
Dstr : String[3];
|
||||
Sstr : String[6];
|
||||
Tstr : String[8];
|
||||
Fstr : String[13];
|
||||
QTH : String[20];
|
||||
Nstr : String[40];
|
||||
Lstr,
|
||||
Rstr,
|
||||
Hstr : String;
|
||||
Begin
|
||||
Hstr := ParmStr(3,B1,Zeile);
|
||||
if Hstr[length(Hstr)] = DP then
|
||||
begin
|
||||
Flag := false;
|
||||
Assign(f,SysPfad + DXC);
|
||||
if ResetTxt(f) = 0 then
|
||||
begin
|
||||
Readln(f,Hstr);
|
||||
QTH := ParmStr(4,B1,Hstr);
|
||||
Fstr := ParmStr(5,B1,Zeile);
|
||||
l := 0;
|
||||
While not Eof(f) do
|
||||
begin
|
||||
Readln(f,Hstr);
|
||||
Lstr := ParmStr(1,DP,Hstr);
|
||||
Sstr := ParmStr(1,Km,Lstr);
|
||||
ParmAnz := AnzP;
|
||||
i := 0;
|
||||
Repeat
|
||||
inc(i);
|
||||
Sstr := ParmStr(i,Km,Lstr);
|
||||
if (pos(Sstr,Fstr) = 1) and (ord(Sstr[0]) > l) then
|
||||
begin
|
||||
Flag := true;
|
||||
l := ord(Sstr[0]);
|
||||
Rstr := Hstr;
|
||||
end;
|
||||
Until i >= AnzP;
|
||||
end;
|
||||
FiResult := CloseTxt(f);
|
||||
|
||||
if Flag then
|
||||
begin
|
||||
Lstr := ParmStr(1,DP,Rstr);
|
||||
Zeile := EFillStr(27,B1,ParmStr(2,DP,Rstr));
|
||||
Zeile := Zeile + 'Zone' + DP + SFillStr(3,B1,ParmStr(3,DP,Rstr)) + B2 + 'Dist' + DP;
|
||||
Lstr := ParmStr(4,DP,Rstr);
|
||||
Dstr := ParmStr(3,';',Lstr);
|
||||
i := pos(Pkt,Dstr);
|
||||
if i > 0 then Dstr := copy(Dstr,1,i-1);
|
||||
Diff := ShortInt(str_int(Dstr));
|
||||
Tstr := Uhrzeit;
|
||||
Tstr := UtcZeit;
|
||||
i := str_int(copy(Tstr,1,2));
|
||||
i := i + 24 + Diff;
|
||||
While i > 23 do i := i - 24;
|
||||
Tstr := SFillStr(2,'0',int_str(i)) + DP + copy(Tstr,4,2);
|
||||
QTH_ENTFG_RICHTG(QTH,ParmStr(2,';',Lstr) + '/' +
|
||||
ParmStr(1,';',Lstr),Entf,Azim,Flag);
|
||||
if Flag then
|
||||
begin
|
||||
Zeile := Zeile + SFillStr(6,B1,int_str(Round(Entf))) + B1 + 'km' + B3 + 'Beam' + DP +
|
||||
SFillStr(4,B1,int_str(Round(Azim))) + 'ø' +
|
||||
B3 + '(' + Tstr + ')';
|
||||
end;
|
||||
end else Zeile := '';
|
||||
end else WishDXC := false;
|
||||
end else Zeile := '';
|
||||
End;
|
2042
XPSCROL.PAS
Executable file
2042
XPSCROL.PAS
Executable file
File diff suppressed because it is too large
Load Diff
213
XPSETTAS.PAS
Executable file
213
XPSETTAS.PAS
Executable file
@ -0,0 +1,213 @@
|
||||
UNIT XPSetTas;
|
||||
|
||||
{ Unit zur Tastenauswertung }
|
||||
|
||||
|
||||
INTERFACE
|
||||
USES dos, CRT;
|
||||
|
||||
VAR Aktion,
|
||||
AktionSeitLetztem : BOOLEAN;
|
||||
klicks2 : INTEGER;
|
||||
|
||||
|
||||
CONST
|
||||
F1 = #180;
|
||||
PgUp = #193;
|
||||
F2 = #181;
|
||||
PgDn = #194;
|
||||
F3 = #182;
|
||||
Pos1 = #195;
|
||||
F4 = #183;
|
||||
Ende = #196;
|
||||
F5 = #184;
|
||||
Einf = #197;
|
||||
F6 = #185;
|
||||
Entf = #198;
|
||||
F7 = #186;
|
||||
CsUp = #199;
|
||||
F8 = #187;
|
||||
CsDn = #200;
|
||||
F9 = #189;
|
||||
CsRt = #201;
|
||||
f10 = #190;
|
||||
CsLt = #202;
|
||||
F11 = #191;
|
||||
Esc = #27;
|
||||
F12 = #192;
|
||||
CR = #13;
|
||||
BS = #8;
|
||||
CtrlY = #206;
|
||||
TAB = #9;
|
||||
SHIFT_TAB = #208;
|
||||
CTRL_PgUp = #209;
|
||||
CTRL_PgDn = #210;
|
||||
CTRL_CsRt = #211;
|
||||
CTRL_CsLt = #212;
|
||||
CTRL_POS1 = #213;
|
||||
CTRL_Ende = #214;
|
||||
CTRL_ENTF = #12; {********* ACHTUNG! IST CTRL-L!!! ****}
|
||||
|
||||
SHIFT_F5 = #216;
|
||||
SHIFT_F6 = #217;
|
||||
SHIFT_F7 = #218;
|
||||
SHIFT_F8 = #219;
|
||||
SHIFT_F9 = #220;
|
||||
SHIFT_F10 = #221;
|
||||
CTRL_F5 = #222;
|
||||
CTRL_F6 = #223;
|
||||
CTRL_F7 = #176;
|
||||
CTRL_F8 = #177;
|
||||
CTRL_F9 = #178;
|
||||
CTRL_F10 = #179;
|
||||
|
||||
ALT_F5 = #28;
|
||||
alt_F6 = #29;
|
||||
ALT_F7 = #203;
|
||||
alt_F8 = #204;
|
||||
ALT_F9 = #207;
|
||||
alt_F10 = #205;
|
||||
|
||||
CTRL_T = #20;
|
||||
CTRL_K = #11;
|
||||
CTRL_V = #22;
|
||||
ALT_K = #255;
|
||||
ALT_V = #254;
|
||||
CTRL_S = #19;
|
||||
CTRL_Z = #26;
|
||||
CTRL_r = #18;
|
||||
CTRL_I = #09;
|
||||
ctrl_w = #23;
|
||||
|
||||
FUNCTION taste : CHAR;
|
||||
FUNCTION TastFlag (Flag : BOOLEAN;
|
||||
FlagReg : INTEGER) : BOOLEAN;
|
||||
|
||||
IMPLEMENTATION
|
||||
|
||||
|
||||
|
||||
|
||||
VAR saawar : BOOLEAN;
|
||||
regi : REGISTERS;
|
||||
fa : BYTE;
|
||||
|
||||
FUNCTION TastFlag (Flag : BOOLEAN; { der letzte Status des Flags }
|
||||
FlagReg : INTEGER { der aktuelle Status des Flag (0 = aus) }
|
||||
) : BOOLEAN;
|
||||
|
||||
VAR FRegs : REGISTERS;
|
||||
|
||||
BEGIN
|
||||
FRegs.ah := $2; { Funktionsnummer f<>r Tastatursatus lesen }
|
||||
INTR ($16, FRegs );
|
||||
FlagReg := FRegs.al AND FlagReg;
|
||||
IF (Flag AND (FlagReg = 0) ) OR { testen ob sich der Status }
|
||||
(NOT (Flag) AND (FlagReg <> 0) ) THEN { des Flags ge„ndert hat }
|
||||
BEGIN { JA }
|
||||
IF FlagReg = 0 THEN { ist Flag jetzt aus? }
|
||||
BEGIN { JA }
|
||||
TastFlag := FALSE; { Ergebnis der Funktion : Flag aus }
|
||||
END
|
||||
ELSE
|
||||
BEGIN { Flag ist jetzt an }
|
||||
TastFlag := TRUE; { Ergebnis der Funktion : Flag an }
|
||||
END;
|
||||
END
|
||||
ELSE
|
||||
TastFlag := Flag { Status des Flags hat sich nicht ver„ndert }
|
||||
END;
|
||||
|
||||
|
||||
FUNCTION taste : CHAR;
|
||||
VAR t : CHAR;
|
||||
|
||||
PROCEDURE Auswertung (t2 : CHAR);
|
||||
BEGIN
|
||||
CASE t2 OF
|
||||
#15 : t := SHIFT_TAB;
|
||||
#59 : t := F1;
|
||||
#73 : t := PgUp;
|
||||
#60 : t := F2;
|
||||
#81 : t := PgDn;
|
||||
#61 : t := F3;
|
||||
#71 : t := Pos1;
|
||||
#62 : t := F4;
|
||||
#79 : t := Ende;
|
||||
#63 : t := F5;
|
||||
#82 : t := Einf;
|
||||
#64 : t := F6;
|
||||
#83 : t := Entf;
|
||||
#65 : t := F7;
|
||||
#72 : t := CsUp;
|
||||
#66 : t := F8;
|
||||
#80 : t := CsDn;
|
||||
#67 : t := F9;
|
||||
#77 : t := CsRt;
|
||||
#68 : t := f10;
|
||||
#75 : t := CsLt;
|
||||
#132 : t := CTRL_PgUp;
|
||||
#118 : t := CTRL_PgDn;
|
||||
#116 : t := CTRL_CsRt;
|
||||
#115 : t := CTRL_CsLt;
|
||||
#119 : t := CTRL_POS1;
|
||||
#117 : t := CTRL_Ende;
|
||||
|
||||
#88 : t := SHIFT_F5;
|
||||
#89 : t := SHIFT_F6;
|
||||
#90 : t := SHIFT_F7;
|
||||
#91 : t := SHIFT_F8;
|
||||
#92 : t := SHIFT_F9;
|
||||
#93 : t := SHIFT_F10;
|
||||
|
||||
#98 : t := CTRL_F5;
|
||||
#99 : t := CTRL_F6;
|
||||
#100 : t := CTRL_F7;
|
||||
#101 : t := CTRL_F8;
|
||||
#102 : t := CTRL_F9;
|
||||
#103 : t := CTRL_F10;
|
||||
|
||||
#108 : t := ALT_F5;
|
||||
#109 : t := alt_F6;
|
||||
#110 : t := ALT_F7;
|
||||
#111 : t := alt_F8;
|
||||
#112 : t := ALT_F9;
|
||||
#113 : t := alt_F10;
|
||||
|
||||
#37 : t := ALT_K;
|
||||
#47 : t := ALT_V;
|
||||
|
||||
END;
|
||||
END;
|
||||
|
||||
BEGIN
|
||||
saawar := FALSE;
|
||||
t := READKEY;
|
||||
IF t = #0 THEN
|
||||
Auswertung (READKEY);
|
||||
IF t = #12 THEN
|
||||
t := CTRL_ENTF;
|
||||
IF t = #13 THEN
|
||||
t := CR;
|
||||
IF t = #20 THEN
|
||||
t := CTRL_T;
|
||||
IF t = #19 THEN
|
||||
t := CTRL_S;
|
||||
IF t = #11 THEN
|
||||
t := CTRL_K;
|
||||
IF t = #22 THEN
|
||||
t := CTRL_V;
|
||||
IF t = #27 THEN
|
||||
t := Esc;
|
||||
IF t = #25 THEN
|
||||
t := CtrlY;
|
||||
IF t = #26 THEN
|
||||
t := CTRL_Z;
|
||||
IF t = #9 THEN
|
||||
t := TAB;
|
||||
IF t = #8 THEN
|
||||
t := BS;
|
||||
taste:=t;
|
||||
|
||||
END;
|
||||
END.
|
336
XPSPEAK.PAS
Executable file
336
XPSPEAK.PAS
Executable file
@ -0,0 +1,336 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P S P E A K . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die Sprachausgabe der Rufzeichen. Derzeit werden noch die ³
|
||||
³ Sprachfiles vom SUPERKISS 3.0 verwendet. ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Procedure out_laut(Speed,Laenge : Word; Buffer : Pointer); Assembler;
|
||||
Const out_port = $0061;
|
||||
|
||||
asm push bp { rette argumentenpointer }
|
||||
mov bp,sp { point auf den stack }
|
||||
{ rette sonstige register }
|
||||
push bx
|
||||
push cx
|
||||
push dx
|
||||
push es
|
||||
push si
|
||||
push di
|
||||
|
||||
push ds { sicherheitshalber retten }
|
||||
|
||||
in al, $21
|
||||
push ax
|
||||
mov al, $FD
|
||||
out $21, al
|
||||
|
||||
cld { aufw„rts laden }
|
||||
mov di,[bp+12] { lade die l„nge des buffers }
|
||||
or di,di { noch testen }
|
||||
jnz @out_pre { es gibt aber nichts }
|
||||
jmp @out_end
|
||||
@out_pre:
|
||||
mov si,[bp+8] { hole den offset des buffers }
|
||||
mov ax,[bp+10] { segment des buffers }
|
||||
|
||||
mov dx,out_port { addresse des modulports }
|
||||
mov ds,ax { segmentpointer direkt aufsetzen }
|
||||
in al,dx { lies momentanen portwert }
|
||||
shr al,1 { portwert vorbereiten }
|
||||
shr al,1 { f<>r sp„tere carrayschiebung }
|
||||
|
||||
mov bp,[bp+14] { hole ausgabespeed }
|
||||
mov es,ax { und dahinein retten }
|
||||
|
||||
|
||||
@out_periode:
|
||||
lodsb { 12 lade "ax=*(ds:si++)" }
|
||||
mov bx,ax { rette den akku }
|
||||
|
||||
mov cx,7
|
||||
|
||||
@07: mov ax,es { 2 hole alten portwert }
|
||||
shr bl,1 { 2 datenbit ins carry schieben }
|
||||
rcl al,1 { 2 bereite ausgangsdatum vor }
|
||||
shl al,1 { 2 setze evtl. bit 1, l”sche bit 0 }
|
||||
out dx,al { 8 nun speaker ansprechen }
|
||||
|
||||
push cx
|
||||
|
||||
mov cx,bp { 2 hole verz”gerungszeit }
|
||||
@W1: loop @W1
|
||||
|
||||
pop cx
|
||||
|
||||
loop @07
|
||||
|
||||
mov ax,es { 2 hole alten portwert }
|
||||
shr bl,1 { 2 datenbit ins carry schieben }
|
||||
rcl al,1 { 2 bereite ausgangsdatum vor }
|
||||
shl al,1 { 2 setze evtl. bit 1, l”sche bit 0 }
|
||||
out dx,al { 8 nun speaker ansprechen }
|
||||
|
||||
dec di { 2 nun ein wort weniger }
|
||||
jz @out_end0 { 4 es war nicht das letzte }
|
||||
|
||||
mov cx,bp { 2 hole verz”gerungszeit }
|
||||
@W2: loop @W2
|
||||
|
||||
|
||||
jmp @out_periode { 15 springe nach oben }
|
||||
|
||||
@out_end0:jmp @out_end { geht leider nur so... }
|
||||
|
||||
|
||||
@out_end: mov ax,es { hole altenportwert }
|
||||
shl al,1 { l”sche beide untern bits }
|
||||
shl al,1
|
||||
out dx,al { alten portwert wieder setzten }
|
||||
|
||||
pop ax
|
||||
out $21, al
|
||||
|
||||
pop ds { der wurde verwendent . . . }
|
||||
pop di { register restaurieren }
|
||||
pop si
|
||||
pop es
|
||||
pop dx
|
||||
pop cx
|
||||
pop bx
|
||||
|
||||
pop bp { den auch noch }
|
||||
End;
|
||||
|
||||
|
||||
|
||||
Procedure Sprechen (* Zeile : Str80 *);
|
||||
Const maxLaenge = $FF00;
|
||||
|
||||
Type BufferTyp = Array[1..maxLaenge] of Byte;
|
||||
|
||||
Var Buffer : ^BufferTyp;
|
||||
Result : Word;
|
||||
maxBuf : LongInt;
|
||||
Datei : File;
|
||||
i,i1 : Byte;
|
||||
P : Word;
|
||||
|
||||
|
||||
Begin
|
||||
{$IFDEF Sound}
|
||||
if Konfig.WavSprach then
|
||||
begin
|
||||
Result:=pos('-',Zeile);
|
||||
if Result>0 then
|
||||
begin
|
||||
Result:=(str_int(copy(Zeile,Result+1,length(Zeile)-Result)));
|
||||
if Result>9 then
|
||||
begin
|
||||
Strip(Zeile);
|
||||
Zeile:=Zeile+'-';
|
||||
end;
|
||||
|
||||
Case Result of
|
||||
10: Zeile:=Zeile+#10;
|
||||
11: Zeile:=Zeile+#11;
|
||||
12: Zeile:=Zeile+#12;
|
||||
13: Zeile:=Zeile+#13;
|
||||
14: Zeile:=Zeile+#14;
|
||||
15: Zeile:=Zeile+#15;
|
||||
end;
|
||||
end;
|
||||
WavStream:=WavStream+Zeile
|
||||
end;
|
||||
|
||||
if not konfig.wavsprach then
|
||||
begin
|
||||
{$ENDIF}
|
||||
Buffer := Nil;
|
||||
if MaxAvail > maxLaenge then maxBuf := maxLaenge
|
||||
else maxBuf := MaxAvail - 1024;
|
||||
GetMem(Buffer,maxBuf);
|
||||
FillChar(Buffer^,maxBuf,#0);
|
||||
for i := 1 to length(Zeile) do
|
||||
case Zeile[i] of
|
||||
'-' : Zeile[i] := '_';
|
||||
',' : Zeile[i] := '!';
|
||||
end;
|
||||
|
||||
P := 1;
|
||||
While length(Zeile) > 0 do
|
||||
begin
|
||||
i1 := 1;
|
||||
if str_int(copy(Zeile,1,2)) in [10..15] then i1 := 2;
|
||||
Assign(Datei,konfig.Spkverz + copy(Zeile,1,i1) + SpkExt);
|
||||
If ResetBin(Datei,T) = 0 Then
|
||||
Begin
|
||||
if (FileSize(Datei) + P) > MaxLaenge then
|
||||
begin
|
||||
LockIntFlag(0);
|
||||
out_laut(VSpeed,P,@Buffer^[1]);
|
||||
LockIntFlag(1);
|
||||
P := 1;
|
||||
end;
|
||||
BlockRead(Datei,Buffer^[P],maxBuf,Result);
|
||||
P := P + Result;
|
||||
FiResult := CloseBin(Datei);
|
||||
end;
|
||||
delete(Zeile,1,i1);
|
||||
end;
|
||||
if P > 1 then
|
||||
begin
|
||||
LockIntFlag(0);
|
||||
out_laut(VSpeed,P,@Buffer^[1]);
|
||||
LockIntFlag(1);
|
||||
end;
|
||||
|
||||
FreeMem(Buffer,MaxLaenge);
|
||||
|
||||
{$IFDEF Sound}
|
||||
end; {soundkarte}
|
||||
{$ENDIF}
|
||||
End;
|
||||
|
||||
|
||||
Procedure SprachMenu;
|
||||
Const ArtMax = 3;
|
||||
Var i : byte;
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
Flag : Boolean;
|
||||
X,Y,
|
||||
Art : Byte;
|
||||
Hstr : String[4];
|
||||
infs : string[80];
|
||||
|
||||
Begin
|
||||
Moni_Off(0);;
|
||||
|
||||
Flag := false;
|
||||
|
||||
for i := 9 to 15 do
|
||||
begin
|
||||
g^.fstr[i]:='';
|
||||
G^.Fstx[i] := 10;
|
||||
end;
|
||||
G^.Fstr[7] := InfoZeile(445);
|
||||
|
||||
G^.Fstr[9] := InfoZeile(446);
|
||||
infs:=InfoZeile(447);
|
||||
|
||||
G^.Fstr[11] := InfoZeile(448);
|
||||
|
||||
|
||||
Art := 1;
|
||||
|
||||
Repeat
|
||||
for i := 9 to 11 do
|
||||
begin
|
||||
G^.Fstr[i][vM+1] := B1;
|
||||
G^.Fstr[i][hM+1] := B1;
|
||||
G^.Fstr[i][vM] := B1;
|
||||
G^.Fstr[i][hM] := B1;
|
||||
end;
|
||||
if speek then G^.fstr[9][vm+1]:=X_ch;
|
||||
|
||||
|
||||
if Art in [1..3] then
|
||||
begin
|
||||
X := vM;
|
||||
Y := Art + 8;
|
||||
end else
|
||||
begin
|
||||
X := hM;
|
||||
Y := Art + 4;
|
||||
end;
|
||||
G^.Fstr[Y][X] := A_ch;
|
||||
|
||||
if HardCur then SetzeCursor(X+1,Y);
|
||||
|
||||
{delete(G^.Fstr[9],vM+1,1);
|
||||
insert(int_str(TNr),G^.Fstr[9],vM+1);
|
||||
if TNC[TNr]^.Bake then G^.Fstr[13][vM+1] := X_ch;}
|
||||
|
||||
{ G^.Fstr[14] := '';}
|
||||
G^.Fstr[15] := '';
|
||||
|
||||
G^.Fstr[10] :=infs+' '+int_str(VSpeed);
|
||||
Fenster(15);
|
||||
|
||||
_ReadKey(KC,VC);
|
||||
Case KC of
|
||||
_Esc : Flag := true;
|
||||
|
||||
{_AltH : XP_Help(G^.OHelp[3]);}
|
||||
|
||||
_Ret : ;
|
||||
|
||||
_F1 : Art := 1;
|
||||
_F2 : Art := 2;
|
||||
_F3 : Art := 3;
|
||||
_F4,
|
||||
_F5,
|
||||
_F6,
|
||||
_F7,
|
||||
_F8,
|
||||
_F9,
|
||||
_F10 : Alarm;
|
||||
|
||||
_Up : if Art > 1 then dec(Art)
|
||||
else Alarm;
|
||||
|
||||
_Dn : if Art < ArtMax then inc(Art)
|
||||
else Alarm;
|
||||
_Andere : case VC of
|
||||
B1:;
|
||||
else Alarm;
|
||||
end;
|
||||
else Alarm;
|
||||
End;
|
||||
|
||||
if (KC in [_F1.._F3,_Ret]) or ((KC = _Andere) and (VC = B1)) then
|
||||
case Art of
|
||||
1 : begin {an/aus}
|
||||
speek:=not speek;
|
||||
end;
|
||||
2 : begin {geschwindigkeit}
|
||||
G^.Fstr[10][vM] := S_ch;
|
||||
Fenster(15);
|
||||
Hstr := int_str(vspeed);
|
||||
GetString(Hstr,Attrib[3],4,2,15,KC,0,Ins);
|
||||
if KC <> _Esc then
|
||||
begin
|
||||
VSpeed := Word(str_int(Hstr));
|
||||
end;
|
||||
end;
|
||||
3 : begin {test}
|
||||
{$IFDEF Sound}
|
||||
If not Konfig.WavSprach then
|
||||
{$ENDIF}
|
||||
sprechen('TEST');
|
||||
|
||||
{$IFDEF Sound}
|
||||
If Konfig.WavSprach then
|
||||
begin
|
||||
WavStream:='TEST';
|
||||
repeat
|
||||
sprachwav;
|
||||
until wavStream='';
|
||||
end;
|
||||
{$ENDIF}
|
||||
end;
|
||||
end;
|
||||
|
||||
SetzeFlags(0);
|
||||
Until Flag;
|
||||
|
||||
ClrFenster;
|
||||
Neu_Bild;
|
||||
Moni_On;
|
||||
End;
|
351
XPSTOP.PAS
Executable file
351
XPSTOP.PAS
Executable file
@ -0,0 +1,351 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P S T O P . P A S ³
|
||||
³ ³
|
||||
³ Routinen f<>r die Auwertung der STOP-Kompression und Codierung. ³
|
||||
³ ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Function STOPCompress (Kanal : Byte; Zeile : String; Code : Byte) : String;
|
||||
Var Hstr : String;
|
||||
t : Word;
|
||||
s : Word;
|
||||
i : Byte;
|
||||
a : Integer;
|
||||
b,c : Byte;
|
||||
ch : Char;
|
||||
long : Boolean;
|
||||
Begin
|
||||
if Zeile > '' then
|
||||
begin
|
||||
Zeile := PackIt(Zeile);
|
||||
FillChar(Hstr,SizeOf(Hstr),0);
|
||||
a := 7;
|
||||
b := 1;
|
||||
long := false;
|
||||
|
||||
i := 0;
|
||||
While (i < length(Zeile)) and not long do
|
||||
begin
|
||||
inc(i);
|
||||
t := HTable[ord(Zeile[i])].Tab;
|
||||
s := $8000;
|
||||
C := 0;
|
||||
|
||||
While (C < HTable[ord(Zeile[i])].Len) and not long do
|
||||
begin
|
||||
inc(C);
|
||||
if t and s = s then Hstr[b] := Chr(ord(Hstr[b]) + 1 shl a);
|
||||
s := s shr 1;
|
||||
dec(a);
|
||||
if a < 0 then
|
||||
begin
|
||||
a := 7;
|
||||
inc(b);
|
||||
if b > 254 then long := true;
|
||||
end;
|
||||
end;
|
||||
Hstr[0] := chr(b);
|
||||
end;
|
||||
|
||||
Hstr := CodeIt(Kanal, Hstr, Code);
|
||||
|
||||
if (length(Hstr) > length(Zeile)) or long then
|
||||
begin
|
||||
Hstr := CodeIt(Kanal, Zeile, Code);
|
||||
Hstr := Chr(length(Hstr)) + Hstr;
|
||||
ch := #255;
|
||||
end else ch := Chr(length(Hstr));
|
||||
|
||||
STOPCompress := ch + Hstr;
|
||||
end else STOPCompress := '';
|
||||
End;
|
||||
|
||||
Function STOPDeCompress (Kanal : Byte; Zeile2 : String; Code : Byte) : String;
|
||||
Var Zeile,
|
||||
Hstr : String;
|
||||
b,i,l : Byte;
|
||||
a : Integer;
|
||||
t,t2 : Word;
|
||||
Bit : LongInt;
|
||||
ch : Char;
|
||||
|
||||
Begin
|
||||
Zeile := Zeile2;
|
||||
ch := Zeile[1];
|
||||
delete(Zeile,1,1);
|
||||
if ch = #255 then delete(Zeile,1,1);
|
||||
|
||||
Zeile := DeCodeIt(Kanal, Zeile, Code);
|
||||
|
||||
if (ch < #255) and (Zeile[0] > #0) then
|
||||
begin
|
||||
Hstr := '';
|
||||
l := 0;
|
||||
Bit := 0;
|
||||
|
||||
for i := 1 to length(Zeile) do
|
||||
begin
|
||||
Bit := (Bit shl 8) or ord(Zeile[i]);
|
||||
l := Byte(l + 8);
|
||||
|
||||
a := 0;
|
||||
|
||||
Repeat
|
||||
b := HTable[a].Len;
|
||||
if l >= b then
|
||||
begin
|
||||
t := HTable[a].Tab;
|
||||
t2 := Word(Bit shr (l-b)) shl (16-b);
|
||||
|
||||
if t = t2 then
|
||||
begin
|
||||
Hstr := Hstr + chr(a);
|
||||
l := l - b;
|
||||
a := -1;
|
||||
end;
|
||||
end;
|
||||
inc(a);
|
||||
Until (a > 257) or (l < 3);
|
||||
end;
|
||||
end else Hstr := Zeile;
|
||||
|
||||
Hstr := UnPackIt(Hstr);
|
||||
|
||||
if Kanal = 0 then
|
||||
begin
|
||||
t := K[0]^.StopCode;
|
||||
K[0]^.StopCode := G^.DetCode;
|
||||
if STOPCompress(0, Hstr, Code) <> Zeile2 then
|
||||
begin
|
||||
Hstr := Zeile2;
|
||||
end;
|
||||
K[0]^.StopCode := t;
|
||||
end;
|
||||
|
||||
STOPDeCompress := Hstr;
|
||||
End;
|
||||
|
||||
|
||||
|
||||
Function PMak (Nr : Byte) : String;
|
||||
Begin
|
||||
if Nr = 53 then PMak := ' ÉÍÍÍÍÍÍËÍÍÍÍÍÍËÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ List Í»' + M1
|
||||
else if Nr = 54 then PMak := ' ºMsg.-#ºPFRAKSºKBº An @ BBS º Von ºDat./Zeitº Titel º' + M1
|
||||
else if Nr = 55 then PMak := ' ÌÍÍÍÍÍÍÎÍÍÍÍÍÍÎÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹' + M1
|
||||
else if Nr = 56 then PMak := ' ÈÍÍÍÍÍÍÊÍÍÍÍÍÍÊÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ' + M1
|
||||
else if Nr = 57 then PMak := ' ÉÍÍÍÍÍÍËÍÍÍÍÍÍËÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍËÍÍ Read Í»' + M1
|
||||
else if Nr = 58 then PMak := ' ºMsg.-#ºPFRAKSº Byteº An @ BBS º Von ºDat./ZeitºGeschrbn.º Lifet. º' + M1
|
||||
else if Nr = 59 then PMak := ' ÌÍÍÍÍÍÍÎÍÍÍÍÍÍÎÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍ͹' + M1
|
||||
else if Nr = 60 then PMak := ' ÈÍÍÍÍÍÍÊÍÍÍÍÍÍÊÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍͼ' + M1
|
||||
else if Nr = 61 then PMak := ' ÉÍÍÍÍÍÍËÍÍÍÍÍÍËÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍËÍÍÍËÍÍÍÍÍÍÍÍ Send Í»' + M1
|
||||
else if Nr = 62 then PMak := ' ºMsg.-#ºPFRAKSº Byteº An @ BBS º Von ºDat./ZeitºLt.º Bulletin-ID º' + M1
|
||||
else if Nr = 63 then PMak := ' ÌÍÍÍÍÍÍÎÍÍÍÍÍÍÎÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÎÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹' + M1
|
||||
else if Nr = 64 then PMak := ' ÌÍÍÍÍÍÍÊÍÍÍÍÍÍÊÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÊÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹' + M1
|
||||
else if Nr = 65 then PMak := ' ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ' + M1
|
||||
|
||||
else PMak := '';
|
||||
End;
|
||||
|
||||
|
||||
Function PackIt (Zeile : String) : String;
|
||||
Var i, j,
|
||||
az : Integer;
|
||||
PM,
|
||||
Hstr : String;
|
||||
Begin
|
||||
Hstr := '';
|
||||
i := 1;
|
||||
while i <= length(Zeile) - 3 do
|
||||
begin
|
||||
az := 0;
|
||||
for j := 53 to maxPMak do
|
||||
begin
|
||||
PM := PMak(j);
|
||||
if Copy(Zeile,i,length(PM)) = PM then
|
||||
begin
|
||||
az := 1;
|
||||
Hstr := Hstr + chr(255) + chr(255) + chr(j-1);
|
||||
i := i + length(PM);
|
||||
j := maxPMak;
|
||||
end;
|
||||
end;
|
||||
if az = 0 then
|
||||
begin
|
||||
if Zeile[i] = Zeile[i+1] then
|
||||
begin
|
||||
if (Zeile[i] = Zeile[i+2]) and (Zeile[i] = Zeile[i+3]) then
|
||||
begin
|
||||
az := 4;
|
||||
while (i + az <= length(Zeile)) and (Zeile[i] = Zeile[i+az]) do
|
||||
az := az + 1;
|
||||
Hstr := Hstr + chr(255) + chr(az) + Zeile[i];
|
||||
i := i + az - 1;
|
||||
end;
|
||||
end;
|
||||
if az = 0 then
|
||||
begin
|
||||
Hstr := Hstr + Zeile[i];
|
||||
if Zeile[i] = chr(255) then Hstr := Hstr + chr(0);
|
||||
end;
|
||||
i := i + 1;
|
||||
end;
|
||||
end;
|
||||
while i <= length(Zeile) do
|
||||
begin
|
||||
Hstr := Hstr + Zeile[i];
|
||||
if Zeile[i] = chr(255) then Hstr := Hstr + chr(0);
|
||||
i := i + 1;
|
||||
end;
|
||||
PackIt := Hstr;
|
||||
End;
|
||||
|
||||
Function UnPackIt (Zeile : String) : String;
|
||||
Var i,
|
||||
az : Integer;
|
||||
Hstr : String;
|
||||
Begin
|
||||
Hstr := '';
|
||||
i := 1;
|
||||
while i <= length(Zeile) do
|
||||
begin
|
||||
if Zeile[i] = chr(255) then
|
||||
begin
|
||||
i := i + 1;
|
||||
if Zeile[i] = chr(0) then Hstr := Hstr + chr(255)
|
||||
else if Zeile[i] = chr(255) then
|
||||
begin
|
||||
i := i + 1;
|
||||
Hstr := Hstr + PMak(ord(Zeile[i])+1);
|
||||
end else
|
||||
begin
|
||||
az := ord(Zeile[i]);
|
||||
i := i + 1;
|
||||
while az > 0 do
|
||||
begin
|
||||
Hstr := Hstr + Zeile[i];
|
||||
az := az - 1;
|
||||
end;
|
||||
end;
|
||||
end else Hstr := Hstr + Zeile[i];
|
||||
i := i + 1;
|
||||
end;
|
||||
UnPackIt := Hstr;
|
||||
End;
|
||||
|
||||
Function DetectStopCode {(LastBt, Cd1, Cd2 : Byte) : Boolean};
|
||||
begin
|
||||
DetectStopCode := LastBt = (cd1 xor cd2 xor 55);
|
||||
end;
|
||||
|
||||
Function CodeIt (Kanal : Byte; Zeile : String; Code : Byte) : String;
|
||||
Var c1,c2 : Byte;
|
||||
i : Integer;
|
||||
flag : Boolean;
|
||||
Hstr : String;
|
||||
Begin
|
||||
if (K[Kanal]^.StopCode > 0) and (Zeile > '') then
|
||||
begin
|
||||
c1 := Byte(K[Kanal]^.StopCode shr 8);
|
||||
c2 := Byte(K[Kanal]^.StopCode and 255);
|
||||
Hstr := Chr(c1) + Chr(c2);
|
||||
Hstr := Hstr + Chr(c1 xor c2 xor 55);
|
||||
flag := true; {======================
|
||||
w„r sch”n, wenns richtig w„re, ist es
|
||||
aber nicht :-) Das ist die angebliche
|
||||
Berechnung des Check-Bytes}
|
||||
|
||||
for i := length(Zeile) downto 1 do
|
||||
begin
|
||||
if flag then begin Hstr := Chr(Ord(Zeile[i]) xor c1) + Hstr; flag := false; end
|
||||
else begin Hstr := Chr(Ord(Zeile[i]) xor c2) + Hstr; flag := true; end;
|
||||
end;
|
||||
CodeIt := Hstr;
|
||||
end else CodeIt := Zeile;
|
||||
End;
|
||||
|
||||
Function DeCodeIt (Kanal : Byte; Zeile : String; Code : Byte) : String;
|
||||
Var c1,c2 : Byte;
|
||||
i : Integer;
|
||||
flag : Boolean;
|
||||
Hstr : String;
|
||||
InOrdung:boolean;
|
||||
Begin
|
||||
i := length(Zeile);
|
||||
if i > 3 then
|
||||
begin
|
||||
c1 := Byte(Zeile[i-2]);
|
||||
c2 := Byte(Zeile[i-1]);
|
||||
InOrdung:=false;
|
||||
if ((((Word(c1) shl 8) + Word(c2)) = K[Kanal]^.StopCode) ) and
|
||||
(DetectStopCode (Byte(Zeile[i]), c1,c2) ) {and
|
||||
!weg lassen! (not k[kanal]^.mo.MonActive) } then InOrdung:=true;
|
||||
|
||||
{nachfolgender Teil f<>r den Spion-Autodetect!}
|
||||
{$IFDEF code}
|
||||
if (DetectStopCode (Byte(Zeile[i]), c1,c2) ) and
|
||||
(k[kanal]^.mo.MonActive) then InOrdung:=true;
|
||||
{$ENDIF}
|
||||
|
||||
|
||||
if InOrdung then
|
||||
begin
|
||||
G^.DetCode := ((Word(c1) shl 8) + Word(c2));
|
||||
Hstr := '';
|
||||
flag := (length(Zeile) mod 2) = 0;
|
||||
for i := 1 to length(Zeile) - 3 do
|
||||
begin
|
||||
if flag then begin Hstr := Hstr + Chr(Ord(Zeile[i]) xor c1); flag := false; end
|
||||
else begin Hstr := Hstr + Chr(Ord(Zeile[i]) xor c2); flag := true; end;
|
||||
end;
|
||||
Zeile := Hstr;
|
||||
end else G^.DetCode := 0;
|
||||
end else G^.DetCode := 0;
|
||||
DeCodeIt := Zeile;
|
||||
End;
|
||||
|
||||
Function CodeStr (Kanal : Byte; Zeile : String) : String;
|
||||
Var i : Integer;
|
||||
Begin
|
||||
for i := 1 to length(Zeile) do
|
||||
begin
|
||||
Zeile[i] := Chr(CodeTab[Ord(Zeile[i])]);
|
||||
end;
|
||||
CodeStr := Zeile;
|
||||
End;
|
||||
|
||||
Function DeCode (Kanal : Byte; Zeile : String) : String;
|
||||
Var i : Integer;
|
||||
Begin
|
||||
for i := 1 to length(Zeile) do
|
||||
begin
|
||||
Zeile[i] := Chr(DeCodeTab[Ord(Zeile[i])]);
|
||||
end;
|
||||
DeCode := Zeile;
|
||||
End;
|
||||
|
||||
Function GetCode (Call : Str9) : Word;
|
||||
Begin
|
||||
{ReadUser(Call);
|
||||
GetCode := U^.Komp;}
|
||||
|
||||
GetCode:=200; {Hier sollte eigentlich der Code <20>bergeben werden,
|
||||
der dem User zugeordnet ist. Bei Tests mit anderen
|
||||
Codes umstellen!!!}
|
||||
End;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Function F2C(Call : Str9) : Str9; Begin F2C := Call; End;
|
||||
|
||||
|
||||
|
255
XPSTR.PAS
Executable file
255
XPSTR.PAS
Executable file
@ -0,0 +1,255 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P S T R . P A S ³
|
||||
³ ³
|
||||
³ Library - Unit mit oft ben”tigten Routinen f<>r die Stringverarbeitung ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
Function str_int (* Zeile : Str10 : LongInt *);
|
||||
Var i : Integer;
|
||||
Zahl : LongInt;
|
||||
Begin
|
||||
Val(Zeile,Zahl,i);
|
||||
if (i > 0) then Zahl := 0;
|
||||
Str_Int := Zahl;
|
||||
End;
|
||||
|
||||
|
||||
Function int_str (* i : LongInt) : Str10 *);
|
||||
Var Hstr : String[10];
|
||||
Begin
|
||||
str(i,Hstr);
|
||||
int_str := Hstr;
|
||||
End;
|
||||
|
||||
|
||||
Function ConstStr (* VC : Char ; L : Byte) : Str80; *);
|
||||
Const ML = 80;
|
||||
Var Bstr : String[80];
|
||||
Begin
|
||||
if L > ML then L := ML;
|
||||
Bstr := '';
|
||||
FillChar(Bstr[1],L,VC);
|
||||
Bstr[0] := Chr(L);
|
||||
ConstStr := Bstr;
|
||||
End;
|
||||
|
||||
|
||||
Function RetStr (* Zeile : String) : String *) ;
|
||||
Var i : Byte;
|
||||
Begin
|
||||
i := pos(M1,Zeile);
|
||||
if i = 0 then i := Length(Zeile)
|
||||
else Dec(i);
|
||||
Zeile[0] := Chr(i);
|
||||
RetStr := Zeile;
|
||||
End;
|
||||
|
||||
|
||||
Function CutStr (* Zeile : String) : String *) ;
|
||||
Var i : Byte;
|
||||
Begin
|
||||
i := pos(B1,Zeile);
|
||||
if i = 0 then i := Length(Zeile)
|
||||
else Dec(i);
|
||||
Zeile[0] := Chr(i);
|
||||
CutStr := Zeile;
|
||||
End;
|
||||
|
||||
|
||||
Function RestStr (* (Zeile : String) : String *);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
i := pos(B1,Zeile);
|
||||
if i > 0 then
|
||||
begin
|
||||
i1 := length(Zeile) - i;
|
||||
Zeile[0] := Chr(i1);
|
||||
move(Zeile[i+1],Zeile[1],i1);
|
||||
While (Zeile[0] > #0) and (Zeile[1] = ' ') do delete(Zeile,1,1);
|
||||
end else Zeile := '';
|
||||
RestStr := Zeile;
|
||||
End;
|
||||
|
||||
|
||||
Function UpCaseStr (* (Zeile : String) : String *) ;
|
||||
Var i : Byte;
|
||||
Begin
|
||||
for i := 1 to Ord(Zeile[0]) do
|
||||
if Zeile[i] in ['a'..'z'] then dec(Zeile[i],$20);
|
||||
UpCaseStr := Zeile;
|
||||
End;
|
||||
|
||||
|
||||
Procedure KillEndBlanks (* var Zeile : String *);
|
||||
Begin
|
||||
While (Zeile[0] > #0) and (Zeile[Ord(Zeile[0])] = B1) do dec(Zeile[0]);
|
||||
End;
|
||||
|
||||
|
||||
Procedure KillStartBlanks (* Var Zeile : String *);
|
||||
Begin
|
||||
While (Zeile[0] > #0) and (Zeile[1] = B1) do
|
||||
begin
|
||||
dec(Zeile[0]);
|
||||
move(Zeile[2],Zeile[1],Ord(Zeile[0]));
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Function ParmStr (* (Nr : Byte; VC : char; Zeile : String) : String *);
|
||||
Var i,i1,
|
||||
i2,i3 : Byte;
|
||||
Hstr : String;
|
||||
Begin
|
||||
if Zeile > '' then
|
||||
begin
|
||||
i2 := 0;
|
||||
i3 := 254;
|
||||
While (ord(Zeile[0]) > 0) and (Zeile[1] = VC) do
|
||||
begin
|
||||
delete(Zeile,1,1);
|
||||
inc(i2);
|
||||
end;
|
||||
|
||||
Hstr := '';
|
||||
i1 := 1;
|
||||
for i := 1 to Ord(Zeile[0]) do
|
||||
begin
|
||||
if Nr = i1 then if Zeile[i] <> VC then
|
||||
begin
|
||||
Hstr := Hstr + Zeile[i];
|
||||
i3 := i;
|
||||
end;
|
||||
if (Zeile[i] = VC) and (Zeile[i-1] <> VC) then inc(i1);
|
||||
end;
|
||||
While (Hstr[0] > #0) and (Hstr[Ord(Hstr[0])] = B1) do Hstr[0] := Chr(Ord(Hstr[0])-1);
|
||||
While (Hstr[0] > #0) and (Hstr[1] = B1) do delete(Hstr,1,1);
|
||||
ParmAnz := i1;
|
||||
ParmPos := Byte(i3 + i2 - length(Hstr) + 1);
|
||||
ParmStr := Hstr;
|
||||
end else
|
||||
begin
|
||||
ParmAnz := 0;
|
||||
ParmPos := 0;
|
||||
ParmStr := '';
|
||||
end;
|
||||
End;
|
||||
|
||||
Function SFillStr (* Anz : Byte; VC : Char; Zeile : String) : String *);
|
||||
Var i,i1 : Byte;
|
||||
Begin
|
||||
i := length(Zeile);
|
||||
if i < Anz then
|
||||
begin
|
||||
i1 := Anz - i;
|
||||
move(Zeile[1],Zeile[i1+1],i);
|
||||
FillChar(Zeile[1],i1,VC);
|
||||
Zeile[0] := Chr(Anz);
|
||||
end;
|
||||
SFillStr := Zeile;
|
||||
End;
|
||||
|
||||
|
||||
Function EFillStr (* Anz : Byte; VC : Char; Zeile : String) : String *);
|
||||
Var i : Byte;
|
||||
Begin
|
||||
i := length(Zeile);
|
||||
if i < Anz then
|
||||
begin
|
||||
FillChar(Zeile[i+1],Anz-i,VC);
|
||||
Zeile[0] := Chr(Anz);
|
||||
end;
|
||||
EFillStr := Zeile;
|
||||
End;
|
||||
|
||||
Function CEFillStr (* Anz : Byte; VC : Char; Zeile : String) : String *);
|
||||
Var i : Byte;
|
||||
Begin
|
||||
i := length(Zeile);
|
||||
if i < Anz then
|
||||
begin
|
||||
FillChar(Zeile[i+1],Anz-i,VC);
|
||||
Zeile[0] := Chr(Anz);
|
||||
end;
|
||||
cEFillStr:=copy(Zeile,1,Anz);
|
||||
End;
|
||||
|
||||
|
||||
|
||||
Function ZFillStr (* Anz : Byte; VC : Char; Zeile : String) : String *);
|
||||
Begin
|
||||
While length(Zeile) < Anz do Zeile := VC + Zeile + VC;
|
||||
if length(Zeile) > Anz then Zeile := copy(Zeile,1,Anz);
|
||||
ZFillStr := Zeile;
|
||||
End;
|
||||
|
||||
|
||||
Function Hex (* Dezimal : LongInt; Stellenzahl : Byte) : Str8 *);
|
||||
Const HexChars : Array [0..15] of Char = ('0','1','2','3','4','5','6','7',
|
||||
'8','9','A','B','C','D','E','F');
|
||||
Var Stelle : Byte;
|
||||
Begin
|
||||
if (Stellenzahl > 8) then Stellenzahl := 8;
|
||||
Hex := ' ';
|
||||
Hex[0] := Chr(Stellenzahl);
|
||||
for Stelle := Stellenzahl downto 1 do
|
||||
begin
|
||||
Hex[Stelle] := HexChars[Dezimal and $0F];
|
||||
Dezimal := Dezimal shr 4;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Function Adr_absolut(Zeiger : Pointer) : LongInt;
|
||||
Begin
|
||||
if Zeiger = NIL then Adr_absolut := 0
|
||||
else Adr_absolut := (LongInt(Seg(Zeiger^)) shl 4) + Ofs(Zeiger^);
|
||||
End;
|
||||
|
||||
|
||||
Function Pointer_Str (* Zeiger : Pointer) : Str9 *);
|
||||
Begin
|
||||
if Zeiger = NIL then Pointer_Str := 'NIL '
|
||||
else Pointer_Str := Hex(Seg(Zeiger^),4) + DP + Hex(Ofs(Zeiger^),4);
|
||||
End;
|
||||
|
||||
|
||||
Function FormByte (* Zeile : str11) : str11 *);
|
||||
var Bstr : String[11];
|
||||
i,i1 : Byte;
|
||||
Begin
|
||||
Bstr := '';
|
||||
i1 := length(Zeile);
|
||||
for i := 1 to i1 do
|
||||
begin
|
||||
Bstr := Zeile[i1+1-i] + Bstr;
|
||||
if (i > 1) and (i < i1) and (i mod 3 = 0) then Bstr := Pkt + Bstr;
|
||||
end;
|
||||
FormByte := Bstr;
|
||||
End;
|
||||
|
||||
|
||||
Function Bin (* Dezimal : LongInt ; Stellenzahl : Byte) : Str32 *);
|
||||
Var Stelle : Byte;
|
||||
Begin
|
||||
if Stellenzahl > 32 then Stellenzahl := 32;
|
||||
Bin[0] := Chr(Stellenzahl);
|
||||
for Stelle := Stellenzahl downto 1 do
|
||||
begin
|
||||
if (Dezimal and $01) > 0 then Bin[Stelle] := '1'
|
||||
else Bin[Stelle] := '0';
|
||||
Dezimal := Dezimal shr 1;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Strip (* var Call: str9 *);
|
||||
Var p : Byte;
|
||||
Begin
|
||||
p := pos('-',Call);
|
||||
if p > 0 then Call := Copy(Call,1,p-1);
|
||||
End;
|
1050
XPTAST.PAS
Executable file
1050
XPTAST.PAS
Executable file
File diff suppressed because it is too large
Load Diff
932
XPUSEDIT.PAS
Executable file
932
XPUSEDIT.PAS
Executable file
@ -0,0 +1,932 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P U S E R . P A S ³
|
||||
³ ³
|
||||
³ Userdatenbank-Verwaltung ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
{Folge:
|
||||
Call
|
||||
Name
|
||||
System
|
||||
QTH
|
||||
Locator
|
||||
Adresse
|
||||
Telefon
|
||||
Umlaut
|
||||
PacLen
|
||||
Maxframe
|
||||
Scan (anwesenheit)
|
||||
SSIDs
|
||||
VIP
|
||||
FBBStreng
|
||||
Vorbereitung
|
||||
MailLesen
|
||||
MailKillen
|
||||
Nachbereitung
|
||||
ByeBye
|
||||
Prompt
|
||||
|
||||
}
|
||||
|
||||
|
||||
Procedure UserEditieren(*User_:User_Typ2; Kanal :Byte; Neu:boolean; ZMax:Byte*);
|
||||
Const ArtMax = 12;
|
||||
|
||||
Var AnAusDiff, e,i : Byte;
|
||||
KC : Sondertaste;
|
||||
VC : Char;
|
||||
atr : array[1..3] of byte;
|
||||
Anfang,
|
||||
geaendert,
|
||||
grossSave, {grosschreibungs-flag speichern}
|
||||
RemAll_,
|
||||
Flag,
|
||||
Flag1,
|
||||
Seitenwechsel : Boolean;
|
||||
ulw,
|
||||
Flagbyte,
|
||||
obf,
|
||||
X,Y,
|
||||
Seite,
|
||||
Art : Byte;
|
||||
HStr,
|
||||
Eing,
|
||||
Teil1,
|
||||
Teil2,
|
||||
Teil3,
|
||||
Teil4,
|
||||
Teil5,
|
||||
teil6,
|
||||
teil7 : str80;
|
||||
ZeileOU,
|
||||
ZeileRL,
|
||||
ULautZ,
|
||||
eingh : string;
|
||||
Zahl : longint; {//db1ras}
|
||||
|
||||
HStrAn, HStrAus : string[20];
|
||||
SaveDat : User_typ2; {schluávergleich: wirklich ge„ndert??}
|
||||
Udat : file of User_Typ2;
|
||||
|
||||
|
||||
Begin
|
||||
Seite:=1;
|
||||
Anfang:=true;
|
||||
if (User_.MaxFrames<1) or (user_.maxframes>7) then User_.maxFrames:=Konfig.MaxFrameStd;
|
||||
if (user_.paclen<5) or (user_.paclen>255) then user_.paclen:=Konfig.PacLenStd;
|
||||
User_.VErsion1:=1; User_.Version2:=80;
|
||||
Flag := false;
|
||||
Flag1 := false;
|
||||
grosssave:=gross;
|
||||
gross:=false;
|
||||
HstrAn :=InfoZeile(76);
|
||||
HstrAus:=InfoZeile(77);
|
||||
Teil1:=infozeile(366); {Allgemein}
|
||||
Teil2:=InfoZeile(378);
|
||||
Teil3:=Infozeile(367); {Poll}
|
||||
Teil4:=Infozeile(368); {Poll}
|
||||
Teil5:=Infozeile(369); {Poll}
|
||||
Teil6:=InfoZeile(371); {Kompression beim Login}
|
||||
teil7:=InfoZeile(373); {Passwort beim Login}
|
||||
ULautZ :=infozeile(372);
|
||||
ZeileOU:=InfoZeile(389);
|
||||
ZeileRL:=InfoZeile(404);
|
||||
|
||||
if Length(HstrAn)>Length(HstrAus) then AnAusDiff:=Length(HstrAn);
|
||||
if Length(HstrAus)>Length(HstrAn) then AnAusDiff:=Length(HstrAus);
|
||||
if Length(HstrAus)=Length(HstrAn) then AnAusDiff:=Length(HstrAus);
|
||||
Art := 1;
|
||||
Seitenwechsel:=true;
|
||||
|
||||
SaveDat:=User_;
|
||||
|
||||
Repeat
|
||||
|
||||
if Seitenwechsel then
|
||||
begin
|
||||
Seitenwechsel:=false;
|
||||
if anfang then
|
||||
begin
|
||||
for i := 1 to Zmax do WriteRam(1,i,Attrib[2],1,cefillstr(80,B1,B1));
|
||||
WriteRam(1,1,Attrib[5],1,cefillstr(80,B1,B1+InfoZeile(365)));
|
||||
|
||||
WriteRam(1,maxz,Attrib[5],1,cefillstr(80,B1,B1+ ZeileOU));
|
||||
end else for i := 3 to Zmax-1 do WriteRam(1,i,Attrib[2],1,cefillstr(80,B1,B1));
|
||||
WriteRam(67,2,Attrib[5],1,cefillstr(14,B1,B1+ParmStr(2,bs,Teil5)+b1+int_Str(Seite)+'/3'));
|
||||
Case Seite of
|
||||
1: begin
|
||||
Art:=1;
|
||||
WriteRam(1,2,Attrib[5],1,cefillstr(66,B1,B1+ParmStr(3,bs,Teil5)));
|
||||
|
||||
WriteRam(1,4,Attrib[2],1,cefillstr(9,B1,B1+ParmStr(1,b1,Teil1))+': '+User_.Call);
|
||||
WriteRam(1,5,Attrib[2],1,cefillstr(9,B1,B1+ParmStr(2,b1,Teil1))+': '+User_.alias);
|
||||
WriteRam(34,4,Attrib[2],1,cefillstr(9,B1,ParmStr(3,b1,teil1))+': '+User_.Name);
|
||||
WriteRam(1,6,Attrib[2],1,cefillstr(9,B1,B1+ParmStr(4,b1,teil1))+': '+User_.System);
|
||||
WriteRam(34,5,Attrib[2],1,cefillstr(9,B1,parmstr(5,b1,teil1))+': '+User_.QTH);
|
||||
WriteRam(34,6,Attrib[2],1,cefillstr(9,B1,parmstr(7,b1,teil1))+': '+UpcaseStr(User_.Locator));
|
||||
WriteRam(1,8,Attrib[2],1,cefillstr(9,B1,B1+parmstr(6,b1,teil1))+': '+User_.Adress);
|
||||
WriteRam(1,9,Attrib[2],1,cefillstr(9,B1,B1+parmstr(8,b1,teil1))+': '+User_.Telefon);
|
||||
WriteRam(1,11,Attrib[2],1,cefillstr(9,B1,B1+ParmStr(9,b1,teil1))+': '+int_str(User_.PacLen));
|
||||
WriteRam(34,11,Attrib[2],1,cefillstr(9,B1,ParmStr(10,b1,teil1))+': '+int_str(User_.MaxFrames));
|
||||
|
||||
WriteRam(1,13,Attrib[2],1,cefillstr(9,b1,b1+ParmStr(1, b1, ULautZ))+':');
|
||||
WriteRam(12,13,Attrib[2],1,'[ ] '+cefillstr(16,b1,ParmStr(2, b1, ULautZ)));
|
||||
WriteRam(34,13,Attrib[2],1,'[ ] '+cefillstr(16,b1,ParmStr(3, b1, ULautZ)));
|
||||
WriteRam(56,13,Attrib[2],1,'[ ] '+cefillstr(16,b1,ParmStr(4, b1, ULautZ)));
|
||||
case User_.umlaut of
|
||||
1: writeRam(13,13,attrib[2],1,'X');
|
||||
2: writeRam(35,13,attrib[2],1,'X');
|
||||
3: writeRam(57,13,attrib[2],1,'X');
|
||||
end;
|
||||
|
||||
{+int_str(User_.umlaut));}
|
||||
|
||||
|
||||
|
||||
|
||||
if User_.Anwesenheit then WriteRam(1,15,Attrib[2],1,' [X]'+cefillstr(10,B1,B1+ParmStr(12,b1,teil1)))
|
||||
else WriteRam(1,15,Attrib[2],1,' [ ]'+cefillstr(10,B1,B1+ParmStr(12,b1,teil1)));
|
||||
|
||||
|
||||
if User_.VIP then WriteRam(15,15,Attrib[2],1,'[X] '+cefillstr(9,B1,parmstr(11,b1,teil1)))
|
||||
else WriteRam(15,15,Attrib[2],1,'[ ] '+cefillstr(9,B1,parmstr(11,b1,teil1)));
|
||||
|
||||
{SHOW} if User_.show then WriteRam(30,15,Attrib[2],1,'[X] '+cefillstr(9,B1,B1+ParmStr(13,b1,teil1)))
|
||||
else WriteRam(30,15,Attrib[2],1,'[ ] '+cefillstr(9,B1,ParmStr(13,b1,teil1)));
|
||||
|
||||
{RemSch} if User_.RemSchreib then WriteRam(45,15,Attrib[2],1,'[X] '+cefillstr(34,B1,B1+ParmStr(1,bs,teil3)))
|
||||
else WriteRam(45,15,Attrib[2],1,'[ ] '+cefillstr(34,b1,ParmStr(1,bs,teil3)));
|
||||
|
||||
WriteRam(1,17,Attrib[2],1,cefillstr(9,B1,B1+parmstr(1,b1,teil2) )+': ');
|
||||
i:=1;
|
||||
x:=12;y:=17;
|
||||
while i<17 do
|
||||
begin
|
||||
if user_.ssids[i-1] then WriteRam(x,y,Attrib[2],1,'[X] '+cefillstr(5,B1,parmstr(i+1,b1,teil2)))
|
||||
else WriteRam(x,y,Attrib[2],1,'[ ] '+cefillstr(5,B1,parmstr(i+1,b1,teil2)));
|
||||
{for e:=0 to 15 do
|
||||
if}
|
||||
inc(i);
|
||||
inc(x,8);
|
||||
if i=9 then
|
||||
begin
|
||||
inc(y);
|
||||
x:=12;
|
||||
end;
|
||||
end;
|
||||
{User_.SSids}
|
||||
|
||||
WriteRam(2,20,Attrib[2],1,ParmStr(1,bs,teil6));
|
||||
WriteRam(62,21,Attrib[2],1,cefillstr(10,B1,B1+ParmStr(5,bs,teil6))+': '+int_str(user_.StopCode));
|
||||
Case User_.Kompression of
|
||||
0:
|
||||
begin
|
||||
WriteRam(1,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(2,bs,teil6)));
|
||||
WriteRam(20,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(4,bs,teil6)));
|
||||
{WriteRam(40,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(4,bs,teil6)));}
|
||||
|
||||
end;
|
||||
1:
|
||||
begin
|
||||
WriteRam(1,21,Attrib[2],1,' [X]'+cefillstr(19,B1,B1+ParmStr(2,bs,teil6)));
|
||||
WriteRam(20,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(4,bs,teil6)));
|
||||
{ WriteRam(40,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(4,bs,teil6)));}
|
||||
end;
|
||||
3:
|
||||
begin
|
||||
WriteRam(1,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(2,bs,teil6)));
|
||||
WriteRam(20,21,Attrib[2],1,' [X]'+cefillstr(19,B1,B1+ParmStr(4,bs,teil6)));
|
||||
{ WriteRam(40,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(4,bs,teil6)));}
|
||||
end;
|
||||
{3:
|
||||
begin
|
||||
WriteRam(1,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(2,bs,teil6)));
|
||||
WriteRam(20,21,Attrib[2],1,' [ ]'+cefillstr(19,B1,B1+ParmStr(3,bs,teil6)));
|
||||
WriteRam(40,21,Attrib[2],1,' [X]'+cefillstr(19,B1,B1+ParmStr(4,bs,teil6)));
|
||||
end;}
|
||||
end;
|
||||
|
||||
if User_.AutoBOXPassw then WriteRam(1,23,Attrib[2],1,' [X]'+cefillstr(60,B1,B1+ParmStr(1,BS,teil7)))
|
||||
else WriteRam(1,23,Attrib[2],1,' [ ]'+cefillstr(60,B1,B1+ParmStr(1,bs,teil7)));
|
||||
|
||||
end;
|
||||
2:begin
|
||||
WriteRam(1,2,Attrib[5],1,cefillstr(67,B1,B1+ParmStr(4,bs,Teil5)));
|
||||
Art:=20;
|
||||
x:=2;y:=4;
|
||||
i:=1;
|
||||
While g^.Remotes[i].Befehl<>'' do
|
||||
begin
|
||||
writeRam(x,y,Attrib[2],1,cefillstr(14,B1,'[ ] '+g^.Remotes[i].Befehl));
|
||||
if User_.RemAusnahmen[i] then writeRam(x+1,y,attrib[2],1,'X');
|
||||
inc(X,15);
|
||||
if i in [5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90] then
|
||||
begin
|
||||
x:=2;
|
||||
inc(y);
|
||||
end;
|
||||
inc(i);
|
||||
end;
|
||||
end;
|
||||
3:begin
|
||||
Art:=21;
|
||||
WriteRam(1,2,Attrib[5],1,cefillstr(67,B1,B1+ParmStr(5,bs,Teil5)));
|
||||
|
||||
if User_.FBBStreng_ then WriteRam(1,4,Attrib[2],1,' [X] '+cefillstr(30,B1,parmStr(2,bs,teil3)))
|
||||
else WriteRam(1,4,Attrib[2],1,' [ ] '+cefillstr(30,B1,ParmStr(2,bs,Teil3)));
|
||||
|
||||
WriteRam(45,4,Attrib[2],1,cefillstr(15,B1,ParmStr(5,bs,teil4))+': '+User_.Synonym);
|
||||
|
||||
{2. spalte x=24}
|
||||
WriteRam(1,6,Attrib[2],1,cefillstr(15,B1,B1+ParmStr(3,bs,teil3))+': '+User_.Vorbereitung);
|
||||
|
||||
WriteRam(1,8,Attrib[2],1,cefillstr(15,B1,B1+parmStr(1,bs,teil4)) +': '+User_.MailLesen);
|
||||
WriteRam(45,8,Attrib[2],1,cefillstr(15,B1,ParmStr(2,bs,teil4)) +': '+User_.MailKillen);
|
||||
|
||||
WriteRam(1,10,Attrib[2],1,cefillstr(15,B1,B1+ParmStr(4,bs,teil3)) +': '+User_.Nachbereitung);
|
||||
WriteRam(1,12,Attrib[2],1,cefillstr(15,B1,B1+ParmStr(3,bs,teil4)) +': '+User_.ByeBye);
|
||||
WriteRam(1,14,Attrib[2],1,cefillstr(15,B1,B1+ParmStr(4,bs,teil4)) +': '+User_.Prompt);
|
||||
WriteRam(1,15,Attrib[2],1,cefillstr(15,B1,B1+ParmStr(6,bs,teil4)) +': '+User_.PWPrompt);
|
||||
WriteRam(1,16,Attrib[2],1,cefillstr(15,B1,B1+ParmStr(1,bs,teil5)) +': '+User_.SStopPrompt);
|
||||
|
||||
end;
|
||||
end; {case}
|
||||
end; {if seitenwechsel}
|
||||
|
||||
|
||||
{
|
||||
|
||||
Case KC of
|
||||
_Esc : Flag := true;
|
||||
|
||||
_Ret : ;
|
||||
|
||||
_F1 : Art := 1;
|
||||
_F2 : Art := 2;
|
||||
_F3 : Art := 3;
|
||||
_F4 : Art := 4;
|
||||
_F5 : Art := 5;
|
||||
_F6 : Art := 6;
|
||||
_F7 : Art := 7;
|
||||
_F8 : Art := 8;
|
||||
_F9 : Art := 9;
|
||||
_F10 : Art := 10;
|
||||
_CTRLF1: ART:=11;
|
||||
|
||||
|
||||
|
||||
End;
|
||||
|
||||
if (KC in [_F1.._F10,_Ret,_CTRLF1]) or ((KC = _Andere) and (VC = B1)) then}
|
||||
|
||||
if not Anfang then
|
||||
begin
|
||||
if kc=_Tab then kc:=_RET;
|
||||
if kc=_ShTab then kc:=_Up;
|
||||
if Seite=1 then
|
||||
begin
|
||||
if (kc=_dn) or (kc=_Ret) then inc (art);
|
||||
if art>19 then art:=1;
|
||||
|
||||
if (kc=_up) then dec (art);
|
||||
if art<1 then art:=19;
|
||||
end; {if Seite1}
|
||||
if Seite=3 then
|
||||
begin
|
||||
if (kc=_dn) or (kc=_Ret) then inc (art);
|
||||
if art>30 then art:=21;
|
||||
|
||||
if (kc=_up) then dec (art);
|
||||
if art<21 then art:=30;
|
||||
end; {if Seite3}
|
||||
end;
|
||||
anfang:=false;
|
||||
|
||||
case Art of
|
||||
1 : begin {call}
|
||||
eingh:=User_.Call;
|
||||
GetString(eingh,Attrib[2],9,12,4,KC,1,Ins);
|
||||
User_.Call:=UpcaseStr(eingh);
|
||||
WriteRam(12,4,Attrib[2],1,cefillstr(9,b1,User_.Call));
|
||||
|
||||
end;
|
||||
|
||||
2 : begin {alias-call}
|
||||
eingh:=User_.alias;
|
||||
GetString(eingh,Attrib[2],9,12,5,KC,1,Ins);
|
||||
User_.alias:=UpcaseStr(eingh);
|
||||
WriteRam(12,5,Attrib[2],1,cefillstr(9,b1,User_.alias));
|
||||
|
||||
end;
|
||||
|
||||
|
||||
3 : {System}
|
||||
begin
|
||||
eingh:=User_.System;
|
||||
GetString(eingh,Attrib[2],10,12,6,KC,1,Ins);
|
||||
User_.System:=upcaseStr(eingh); {//db1ras}
|
||||
WriteRam(12,6,Attrib[2],1,cefillstr(10,b1,User_.System));
|
||||
end;
|
||||
|
||||
4 : begin {name}
|
||||
eingh:=User_.Name;
|
||||
GetString(eingh,Attrib[2],30,45,4,KC,1,Ins);
|
||||
User_.Name:=eingh;
|
||||
WriteRam(45,4,Attrib[2],1,cefillstr(30,B1,User_.Name));
|
||||
end;
|
||||
|
||||
5 : begin {qth}
|
||||
eingh:=User_.QTH;
|
||||
GetString(eingh,Attrib[2],30,45,5,KC,1,Ins);
|
||||
User_.QTH:=eingh;
|
||||
WriteRam(45,5,Attrib[2],1,cefillstr(30,b1,User_.QTH));
|
||||
end;
|
||||
|
||||
6 : begin {locator}
|
||||
eingh:=User_.Locator;
|
||||
GetString(eingh,Attrib[2],7,45,6,KC,1,Ins);
|
||||
User_.Locator:=upcaseStr(eingh);
|
||||
WriteRam(45,6,Attrib[2],1,cefillstr(10,b1,User_.Locator));
|
||||
end;
|
||||
|
||||
7 : begin {adresse}
|
||||
eingh:=User_.Adress;
|
||||
GetString(eingh,Attrib[2],60,12,8,KC,1,Ins);
|
||||
User_.Adress:=eingh;
|
||||
WriteRam(12,8,Attrib[2],1,cefillstr(60,b1,User_.Adress));
|
||||
end;
|
||||
|
||||
8 : begin {telefon}
|
||||
eingh:=User_.Telefon;
|
||||
GetString(eingh,Attrib[2],20,12,9,KC,1,Ins);
|
||||
User_.Telefon:=eingh;
|
||||
WriteRam(12,9,Attrib[2],1,cefillstr(20,b1,User_.Telefon));
|
||||
end;
|
||||
|
||||
9 : begin {Paclen}
|
||||
eing:=int_str(User_.PacLen);
|
||||
GetString(eing,Attrib[2],3,12,11,KC,1,ins);
|
||||
Flagbyte := str_int(eing);
|
||||
if flagbyte in [5..255] then eing:=eing else flagbyte:=Konfig.PacLenStd;
|
||||
|
||||
User_.PacLen:=flagbyte;
|
||||
WriteRam(12,11,Attrib[2],1,cefillstr(3,b1,int_str(User_.PacLen)));
|
||||
end;
|
||||
|
||||
10: begin {Maxframes}
|
||||
eing:=int_str(User_.MaxFrames);
|
||||
GetString(eing,Attrib[2],1,45,11,KC,1,ins);
|
||||
Flagbyte := str_int(eing);
|
||||
if flagbyte in [1..7] then eing:=eing else flagbyte:=Konfig.MaxFrameStd;
|
||||
|
||||
User_.Maxframes:=flagbyte;
|
||||
WriteRam(45,11,Attrib[2],1,int_str(User_.MaxFrames));
|
||||
end;
|
||||
|
||||
|
||||
11 : begin {Umpaut}
|
||||
WriteRam(1,maxz,Attrib[5],1,cefillstr(80,B1,B1+ZeileRL ));
|
||||
ulw:=1;
|
||||
atr[1]:=5;
|
||||
atr[2]:=2;
|
||||
atr[3]:=2;
|
||||
repeat
|
||||
case User_.umlaut of
|
||||
0: begin
|
||||
writeRam(13,13,attrib[atr[1]],1,' ');
|
||||
writeRam(35,13,attrib[atr[2]],1,' ');
|
||||
writeRam(57,13,attrib[atr[3]],1,' ');
|
||||
end;
|
||||
1: begin
|
||||
writeRam(13,13,attrib[atr[1]],1,'X');
|
||||
writeRam(35,13,attrib[atr[2]],1,' ');
|
||||
writeRam(57,13,attrib[atr[3]],1,' ');
|
||||
end;
|
||||
2: begin
|
||||
writeRam(13,13,attrib[atr[1]],1,' ');
|
||||
writeRam(35,13,attrib[atr[2]],1,'X');
|
||||
writeRam(57,13,attrib[atr[3]],1,' ');
|
||||
end;
|
||||
3: begin
|
||||
writeRam(13,13,attrib[atr[1]],1,' ');
|
||||
writeRam(35,13,attrib[atr[2]],1,' ');
|
||||
writeRam(57,13,attrib[atr[3]],1,'X');
|
||||
end;
|
||||
end;
|
||||
_ReadKey(KC,VC);
|
||||
|
||||
if kc=_right then inc (ulw);
|
||||
if kc=_left then dec (ulw);
|
||||
if ulw=0 then ulw:=3;
|
||||
if ulw=4 then ulw:=1;
|
||||
if vc=#32 then
|
||||
begin
|
||||
if (user_.umlaut=0) or (user_.umlaut<>ulw) then user_.umlaut:=ulw
|
||||
else user_.umlaut:=0;
|
||||
end;
|
||||
case ulw of
|
||||
1: begin
|
||||
atr[1]:=5;
|
||||
atr[2]:=2;
|
||||
atr[3]:=2;
|
||||
end;
|
||||
2: begin
|
||||
atr[1]:=2;
|
||||
atr[2]:=5;
|
||||
atr[3]:=2;
|
||||
end;
|
||||
3: begin
|
||||
atr[1]:=2;
|
||||
atr[2]:=2;
|
||||
atr[3]:=5;
|
||||
end;
|
||||
end;
|
||||
if user_.umlaut=4 then user_.umlaut:=0;
|
||||
until kc in udbexit;
|
||||
writeRam(13,13,attrib[2],1,' ');
|
||||
writeRam(35,13,attrib[2],1,' ');
|
||||
writeRam(57,13,attrib[2],1,' ');
|
||||
case User_.umlaut of
|
||||
1: writeRam(13,13,attrib[2],1,'X');
|
||||
2: writeRam(35,13,attrib[2],1,'X');
|
||||
3: writeRam(57,13,attrib[2],1,'X');
|
||||
end;
|
||||
{eing:=int_str(User_.Umlaut);
|
||||
GetString(eing,Attrib[2],1,12,9,KC,1,Ins);
|
||||
Flagbyte := Byte(str_int('$'+ eing[1]));
|
||||
if not (FlagByte in UmlMenge) then Eing:='0';
|
||||
if str_int(eing) in [0..5] then
|
||||
User_.Umlaut:=str_int(eing);
|
||||
WriteRam(1,9,Attrib[2],1,cefillstr(80,B1,B1+InfoZeile(372) +' '+int_str(User_.umlaut)));}
|
||||
WriteRam(1,maxz,Attrib[5],1,cefillstr(80,B1,B1+ZeileOU ));
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
12: begin {Anwesenheit /Scan}
|
||||
if User_.Anwesenheit then writeRam(3,15,Attrib[5],1,'X')
|
||||
else WriteRam(3,15,Attrib[5],1,' ');
|
||||
repeat
|
||||
_ReadKey(KC,VC);
|
||||
if vc=#32 then User_.Anwesenheit:=not User_.Anwesenheit;
|
||||
if User_.Anwesenheit then writeRam(3,15,Attrib[5],1,'X')
|
||||
else WriteRam(3,15,Attrib[5],1,' ');
|
||||
until kc in UdbExit;
|
||||
if User_.Anwesenheit then writeRam(3,15,Attrib[2],1,'X')
|
||||
else WriteRam(3,15,Attrib[2],1,' ');
|
||||
end;
|
||||
|
||||
13: begin {VIP}
|
||||
if User_.VIP then writeRam(16,15,Attrib[5],1,'X')
|
||||
else WriteRam(16,15,Attrib[5],1,' ');
|
||||
repeat
|
||||
_ReadKey(KC,VC);
|
||||
if vc=#32 then User_.VIP:=not User_.VIP;
|
||||
if User_.VIP then writeRam(16,15,Attrib[5],1,'X')
|
||||
else WriteRam(16,15,Attrib[5],1,' ');
|
||||
until kc in UdbExit;
|
||||
if User_.VIP then writeRam(16,15,Attrib[2],1,'X')
|
||||
else WriteRam(16,15,Attrib[2],1,' ');
|
||||
end;
|
||||
|
||||
|
||||
14: begin {show}
|
||||
if User_.show then writeRam(31,15,Attrib[5],1,'X')
|
||||
else WriteRam(31,15,Attrib[5],1,' ');
|
||||
repeat
|
||||
_ReadKey(KC,VC);
|
||||
if vc=#32 then User_.show:=not User_.show;
|
||||
if User_.show then writeRam(31,15,Attrib[5],1,'X')
|
||||
else WriteRam(31,15,Attrib[5],1,' ');
|
||||
until kc in UdbExit;
|
||||
if User_.show then writeRam(31,15,Attrib[2],1,'X')
|
||||
else WriteRam(31,15,Attrib[2],1,' ');
|
||||
end;
|
||||
|
||||
15: begin {RemSchreib}
|
||||
if User_.RemSchreib then writeRam(46,15,Attrib[5],1,'X')
|
||||
else WriteRam(46,15,Attrib[5],1,' ');
|
||||
repeat
|
||||
_ReadKey(KC,VC);
|
||||
if vc=#32 then User_.RemSchreib:=not User_.RemSchreib;
|
||||
if User_.RemSchreib then writeRam(46,15,Attrib[5],1,'X')
|
||||
else WriteRam(46,15,Attrib[5],1,' ');
|
||||
until kc in UdbExit;
|
||||
if User_.RemSchreib then writeRam(46,15,Attrib[2],1,'X')
|
||||
else WriteRam(46,15,Attrib[2],1,' ');
|
||||
end;
|
||||
|
||||
|
||||
|
||||
16: {SSIDs}
|
||||
begin
|
||||
ulw:=0;
|
||||
WriteRam(1,maxz,Attrib[5],1,cefillstr(80,B1,B1+ZeileRL ));
|
||||
repeat
|
||||
x:=13; y:=17;
|
||||
for obf:=0 to 15 do
|
||||
begin
|
||||
if obf=ulw then atr[1]:=5 else atr[1]:=2;
|
||||
if user_.ssids[obf] then writeRam(x,y,Attrib[atr[1]],1,'X')
|
||||
else writeRam(x,y,Attrib[atr[1]],1,' ');
|
||||
inc (x,8);
|
||||
if obf=7 then
|
||||
begin
|
||||
x:=13;
|
||||
inc(y);
|
||||
end;
|
||||
end;
|
||||
_ReadKey(KC,VC);
|
||||
|
||||
if vc=#32 then user_.SSids[ulw]:=not user_.ssids[ulw];
|
||||
if kc=_right then inc(ulw);
|
||||
if kc=_left then dec(ulw);
|
||||
if ulw=255 then ulw:=15;
|
||||
if ulw=16 then ulw:=0;
|
||||
until kc in UdbExit;
|
||||
atr[1]:=2;
|
||||
x:=13; y:=17;
|
||||
for obf:=0 to 15 do
|
||||
begin
|
||||
if user_.ssids[obf] then writeRam(x,y,Attrib[atr[1]],1,'X')
|
||||
else writeRam(x,y,Attrib[atr[1]],1,' ');
|
||||
inc (x,8);
|
||||
if obf=7 then
|
||||
begin
|
||||
x:=13;
|
||||
inc(y);
|
||||
end;
|
||||
end;
|
||||
WriteRam(1,maxz,Attrib[5],1,cefillstr(80,B1,B1+ZeileOU ));
|
||||
end;
|
||||
|
||||
17: begin
|
||||
{Kompression}
|
||||
ulw:=1;
|
||||
if user_.Kompression=1 then WriteRam(3,21,Attrib[5],1,'X')
|
||||
else WriteRam(3,21,Attrib[5],1,' ');
|
||||
repeat
|
||||
_ReadKey(KC,VC);
|
||||
|
||||
|
||||
if vc=#32 then
|
||||
begin
|
||||
if (ulw=1) then
|
||||
if (User_.Kompression=1) then User_.Kompression:=0
|
||||
else User_.Kompression:=1;
|
||||
{if (ulw=2) then
|
||||
if (User_.Kompression=2) then User_.Kompression:=0
|
||||
else User_.Kompression:=2;}
|
||||
if (ulw=3) then
|
||||
if (User_.Kompression=3) then User_.Kompression:=0
|
||||
else User_.Kompression:=3;
|
||||
end;
|
||||
|
||||
|
||||
if kc=_right then inc(ulw,2);
|
||||
if kc=_left then dec(ulw,2);
|
||||
if (ulw<1) or (ulw>200) then ulw:=3;
|
||||
if (ulw<190) and (ulw>3) then ulw:=1;
|
||||
case ulw of
|
||||
1:
|
||||
begin
|
||||
if user_.Kompression=1 then WriteRam(3,21,Attrib[5],1,'X')
|
||||
else WriteRam(3,21,Attrib[5],1,' ');
|
||||
if user_.Kompression=3 then WriteRam(22,21,Attrib[2],1,'X')
|
||||
else WriteRam(22,21,Attrib[2],1,' ');
|
||||
{if user_.Kompression=3 then WriteRam(42,21,Attrib[2],1,'X')
|
||||
else WriteRam(42,21,Attrib[2],1,' ');}
|
||||
end;
|
||||
{2:
|
||||
begin
|
||||
if user_.Kompression=1 then WriteRam(3,21,Attrib[2],1,'X')
|
||||
else WriteRam(3,21,Attrib[2],1,' ');
|
||||
if user_.Kompression=2 then WriteRam(22,21,Attrib[5],1,'X')
|
||||
else WriteRam(22,21,Attrib[5],1,' ');
|
||||
if user_.Kompression=3 then WriteRam(42,21,Attrib[2],1,'X')
|
||||
else WriteRam(42,21,Attrib[2],1,' ');
|
||||
|
||||
|
||||
end;}
|
||||
3:
|
||||
begin
|
||||
if user_.Kompression=1 then WriteRam(3,21,Attrib[2],1,'X')
|
||||
else WriteRam(3,21,Attrib[2],1,' ');
|
||||
if user_.Kompression=3 then WriteRam(22,21,Attrib[5],1,'X')
|
||||
else WriteRam(22,21,Attrib[5],1,' ');
|
||||
{if user_.Kompression=3 then WriteRam(42,21,Attrib[5],1,'X')
|
||||
else WriteRam(42,21,Attrib[5],1,' ');}
|
||||
end;
|
||||
end;
|
||||
|
||||
until kc in UdbExit;
|
||||
|
||||
|
||||
if user_.Kompression=1 then WriteRam(3,21,Attrib[2],1,'X')
|
||||
else WriteRam(3,21,Attrib[2],1,' ');
|
||||
if user_.Kompression=3 then WriteRam(22,21,Attrib[2],1,'X')
|
||||
else WriteRam(22,21,Attrib[2],1,' ');
|
||||
{if user_.Kompression=3 then WriteRam(42,21,Attrib[2],1,'X')
|
||||
else WriteRam(42,21,Attrib[2],1,' ');}
|
||||
|
||||
end;
|
||||
|
||||
18: begin
|
||||
eingh:=int_str(User_.stopcode);
|
||||
GetString(eingh,Attrib[2],5,74,21,KC,1,Ins);
|
||||
User_.stopcode:=str_int(UpcaseStr(eingh));
|
||||
WriteRam(62,21,Attrib[2],1,cefillstr(17,B1,B1+ParmStr(5,bs,teil6)+': '+int_str(user_.StopCode)));
|
||||
end;
|
||||
|
||||
19: begin
|
||||
{autopw}
|
||||
|
||||
if User_.AutoBoxPassw then writeRam(3,23,Attrib[5],1,'X')
|
||||
else WriteRam(3,23,Attrib[5],1,' ');
|
||||
repeat
|
||||
_ReadKey(KC,VC);
|
||||
if vc=#32 then User_.AutoBoxPassw:=not User_.autoboxpassw;
|
||||
if User_.autoboxpassw then writeRam(3,23,Attrib[5],1,'X')
|
||||
else WriteRam(3,23,Attrib[5],1,' ');
|
||||
until kc in UdbExit;
|
||||
if User_.autoboxpassw then writeRam(3,23,Attrib[2],1,'X')
|
||||
else WriteRam(3,23,Attrib[2],1,' ');
|
||||
|
||||
end;
|
||||
|
||||
{Seite 2:}
|
||||
20: begin
|
||||
ulw:=0;
|
||||
e:=1;i:=2;
|
||||
repeat
|
||||
y:=2;
|
||||
x:=2;y:=4;
|
||||
i:=1;
|
||||
While g^.Remotes[i].Befehl<>'' do
|
||||
begin
|
||||
if i=e then ATR[1]:=5 else ATR[1]:=2;
|
||||
if User_.RemAusnahmen[i] then writeRam(x+1,y,Attrib[atr[1]],1,'X')
|
||||
else writeRam(x+1,y,Attrib[atr[1]],1,' ');
|
||||
inc(X,15);
|
||||
if i in [5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90] then
|
||||
begin
|
||||
inc(y);
|
||||
x:=2;
|
||||
end;
|
||||
inc(i);
|
||||
ulw:=i-1;
|
||||
end;
|
||||
i:=e;
|
||||
_ReadKey(KC,VC);
|
||||
if VC=#32 then user_.RemAusnahmen[e]:=not user_.remAusnahmen[e];
|
||||
case Kc of
|
||||
_dn:begin
|
||||
if e+5>ulw then Alarm else inc(e,5);
|
||||
end;
|
||||
_up:begin
|
||||
if (e-5<1) or (e+5>200) then Alarm else dec(e,5);
|
||||
end;
|
||||
_right:begin
|
||||
if e+1>ulw then e:=1 else inc(e);
|
||||
end;
|
||||
_left:begin
|
||||
if e-1<1 then e:=ulw else dec(e);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
until kc in [_PgUp, _Pgdn, _ESC];
|
||||
i:=1;
|
||||
x:=2;y:=4;
|
||||
While g^.Remotes[i].Befehl<>'' do
|
||||
begin
|
||||
if User_.RemAusnahmen[i] then writeRam(x+1,y,attrib[2],1,'X')
|
||||
else writeRam(x+1,y,attrib[2],1,' ');
|
||||
inc(X,15);
|
||||
if i in [5,10,15,20,25,30,35,40,45,50,55,60,65,70,75] then
|
||||
begin
|
||||
x:=2;
|
||||
inc(Y);
|
||||
end;
|
||||
inc(i);
|
||||
end;
|
||||
end;
|
||||
|
||||
{Seite 3:}
|
||||
21: begin {FBBStreng}
|
||||
if User_.FBBStreng_ then writeRam(3,4,Attrib[5],1,'X')
|
||||
else WriteRam(3,4,Attrib[5],1,' ');
|
||||
repeat
|
||||
_ReadKey(KC,VC);
|
||||
if vc=#32 then User_.FBBStreng_:=not User_.FBBStreng_;
|
||||
if User_.FBBStreng_ then writeRam(3,4,Attrib[5],1,'X')
|
||||
else WriteRam(3,4,Attrib[5],1,' ');
|
||||
until kc in UdbExit;
|
||||
if User_.FBBStreng_ then writeRam(3,4,Attrib[2],1,'X')
|
||||
else WriteRam(3,4,Attrib[2],1,' ');
|
||||
end;
|
||||
|
||||
22: {Synonym}
|
||||
begin
|
||||
eingh:=User_.Synonym;
|
||||
GetString(eingh,Attrib[2],10,62,4,KC,1,Ins);
|
||||
User_.Synonym:=eingh;
|
||||
WriteRam(62,4,Attrib[2],1,cefillstr(10,b1,User_.Synonym));
|
||||
end;
|
||||
|
||||
23: {Vorbereitung}
|
||||
begin
|
||||
eingh:=User_.Vorbereitung;
|
||||
GetString(eingh,Attrib[2],60,18,6,KC,1,Ins);
|
||||
User_.Vorbereitung:=eingh;
|
||||
WriteRam(18,6,Attrib[2],1,cefillstr(60,B1,User_.vorbereitung));
|
||||
end;
|
||||
|
||||
24: {MailLesen}
|
||||
begin
|
||||
eingh:=User_.MailLesen;
|
||||
GetString(eingh,Attrib[2],10,18,8,KC,1,Ins);
|
||||
User_.MailLesen:=eingh;
|
||||
WriteRam(18,8,Attrib[2],1,cefillstr(10,B1,User_.MailLesen));
|
||||
end;
|
||||
|
||||
25: {MailL”schen}
|
||||
begin
|
||||
eingh:=User_.MailKillen;
|
||||
GetString(eingh,Attrib[2],10,62,8,KC,1,Ins);
|
||||
User_.MailKillen:=eingh;
|
||||
WriteRam(62,8,Attrib[2],1,cefillstr(10,B1,User_.MailKillen));
|
||||
end;
|
||||
|
||||
26: {Nachbereitung}
|
||||
begin
|
||||
eingh:=User_.Nachbereitung;
|
||||
GetString(eingh,Attrib[2],60,18,10,KC,1,Ins);
|
||||
User_.Nachbereitung:=eingh;
|
||||
WriteRam(18,10,Attrib[2],1,cefillstr(60,B1,User_.Nachbereitung));
|
||||
end;
|
||||
|
||||
27: {ByeBye}
|
||||
begin
|
||||
eingh:=User_.ByeBye;
|
||||
GetString(eingh,Attrib[2],10,18,12,KC,1,Ins);
|
||||
User_.ByeBye:=eingh;
|
||||
WriteRam(18,12,Attrib[2],1,cefillstr(10,B1,User_.ByeBye));
|
||||
end;
|
||||
|
||||
28: {Prompt}
|
||||
begin
|
||||
eingh:=User_.Prompt;
|
||||
GetString(eingh,Attrib[2],60,18,14,KC,1,Ins);
|
||||
User_.Prompt:=eingh;
|
||||
WriteRam(18,14,Attrib[2],1,cefillstr(60,B1,User_.Prompt));
|
||||
end;
|
||||
|
||||
29: {PWPrompt}
|
||||
begin
|
||||
eingh:=User_.PWPrompt;
|
||||
GetString(eingh,Attrib[2],60,18,15,KC,1,Ins);
|
||||
User_.PWprompt:=eingh;
|
||||
WriteRam(18,15,Attrib[2],1,cefillstr(60,B1,User_.PWPrompt));
|
||||
end;
|
||||
|
||||
30: {SStopPrompt}
|
||||
begin
|
||||
eingh:=User_.SStopPrompt;
|
||||
GetString(eingh,Attrib[2],60,18,16,KC,1,Ins);
|
||||
User_.SStopPrompt:=eingh;
|
||||
WriteRam(18,16,Attrib[2],1,cefillstr(60,B1,User_.SStopPrompt));
|
||||
end;
|
||||
|
||||
|
||||
end;
|
||||
if kc=_Esc then Flag := true;
|
||||
if kc=_PgDn then
|
||||
begin
|
||||
inc(Seite);
|
||||
Seitenwechsel:=true;
|
||||
end;
|
||||
if kc=_PgUp then
|
||||
begin
|
||||
dec(Seite);
|
||||
Seitenwechsel:=true;
|
||||
end;
|
||||
if Seite>3 then Seite:=1;
|
||||
if Seite<1 then Seite:=3;
|
||||
Until Flag;
|
||||
geaendert:=false;
|
||||
if User_.Call<>SaveDat.Call then Geaendert:=true;
|
||||
if User_.Alias<>SaveDat.alias then Geaendert:=true;
|
||||
if User_.name<>SaveDat.Name then Geaendert:=true;
|
||||
if User_.QTH <>SaveDat.QTH then Geaendert:=true;
|
||||
if User_.Locator <>SaveDat.Locator then Geaendert:=true;
|
||||
if User_.Adress <>SaveDat.Adress then Geaendert:=true;
|
||||
if User_.Telefon <>SaveDat.Telefon then Geaendert:=true;
|
||||
if User_.PacLen <>SaveDat.PacLen then Geaendert:=true;
|
||||
if User_.Umlaut <>SaveDat.Umlaut then Geaendert:=true;
|
||||
if User_.FBBStreng_ <>SaveDat.FBBStreng_ then Geaendert:=true;
|
||||
if User_.VIP <>SaveDat.VIP then Geaendert:=true;
|
||||
if User_.MaxFrames <>SaveDat.MaxFrames then Geaendert:=true;
|
||||
if User_.Anwesenheit <> SaveDat.Anwesenheit then geaendert:=true;
|
||||
if User_.Show<>SaveDat.Show then Geaendert:=true;
|
||||
if User_.RemSchreib<>SaveDat.RemSchreib then Geaendert:=true;
|
||||
if User_.System <>SaveDat.System then Geaendert:=true;
|
||||
if User_.MailLesen<>SaveDat.MailLesen then Geaendert:=true;
|
||||
if User_.Mailkillen<>SaveDat.Mailkillen then Geaendert:=true;
|
||||
if User_.ByeBye<>SaveDat.ByeBye then Geaendert:=true;
|
||||
if User_.Prompt<>SaveDat.Prompt then Geaendert:=true;
|
||||
if User_.pwPrompt<>SaveDat.pwPrompt then Geaendert:=true;
|
||||
if User_.SStopPrompt<>SaveDat.SStopPrompt then Geaendert:=true;
|
||||
if User_.StopCode<>SaveDat.StopCode then Geaendert:=true;
|
||||
|
||||
for i:=0 to 15 do
|
||||
if User_.SSids[i]<>SaveDat.ssids[i] then Geaendert:=true;
|
||||
for i:=1 to maxrem do
|
||||
begin
|
||||
if (g^.Remotes[i].Befehl<>'') and (user_.RemAusnahmen[i]<>SaveDat.RemAusnahmen[i])
|
||||
then Geaendert:=true;
|
||||
end;
|
||||
|
||||
if User_.Vorbereitung<>SaveDat.Vorbereitung then Geaendert:=true;
|
||||
if User_.Nachbereitung<>SaveDat.Nachbereitung then Geaendert:=true;
|
||||
if User_.Synonym<>SaveDat.Synonym then Geaendert:=true;
|
||||
if User_.Kompression<>SaveDat.Kompression then Geaendert:=true;
|
||||
if User_.AutoBoxPassw<>SaveDat.AutoBoxPassw then geaendert:=true;
|
||||
|
||||
if geaendert then
|
||||
begin
|
||||
WriteRam(1,16,Attrib[5],1,cefillstr(80,B1,B1+InfoZeile(196)));
|
||||
_ReadKey(KC,VC);
|
||||
VC := UpCase(VC);
|
||||
end else begin
|
||||
KC := _Dn;
|
||||
VC :='N';
|
||||
end; {saveDat}
|
||||
if (KC =_Ret) or (VC in YesMenge) then
|
||||
begin
|
||||
{sortUser;}
|
||||
WriteRam(1,16,Attrib[5],1,cefillstr(80,B1,B1+InfoZeile(232)));
|
||||
PutUser(User_,art,0,neupos, true);
|
||||
|
||||
{Aenderungen auf die connecteten Kanaele weiterleiten //db1ras}
|
||||
For i:=1 to maxlink Do
|
||||
If k[i]^.Connected Then
|
||||
If k[i]^.Call=User_.Call Then Begin
|
||||
If k[i]^.System<>User_.System Then Begin
|
||||
k[i]^.User_Name := GetName(i,User_.Call,k[i]^.Umlaut,true);
|
||||
SetzeSysArt(i);
|
||||
End Else
|
||||
k[i]^.User_Name := GetName(i,User_.Call,k[i]^.Umlaut,true);
|
||||
End Else Begin
|
||||
hstr:=k[i]^.Call;
|
||||
Strip(hstr);
|
||||
If (hstr = User_.Call) And
|
||||
(UserSuchRoutine(k[i]^.Call,Zahl,false,true) = false) Then
|
||||
Begin
|
||||
If k[i]^.System<>User_.System Then Begin
|
||||
k[i]^.User_Name := GetName(i,User_.Call,k[i]^.Umlaut,true);
|
||||
SetzeSysArt(i);
|
||||
End Else
|
||||
k[i]^.User_Name := GetName(i,User_.Call,k[i]^.Umlaut,true);
|
||||
End;
|
||||
End;
|
||||
|
||||
{ Den Code hier verstehe ich nicht. Sollte aber von meinem Code }
|
||||
{ (oberhalb) mit abgedeckt werden (hoffe ich zumindest) //db1ras }
|
||||
{ if user_.stopCode<>SaveDat.StopCode then
|
||||
begin
|
||||
geaendert:=false;
|
||||
for i:=1 to maxlink do
|
||||
begin
|
||||
if k[i]^.Call=User_.Call then
|
||||
begin
|
||||
Geaendert:=true;
|
||||
k[i]^.StopCode:=User_.StopCode;
|
||||
end;
|
||||
if not Geaendert then
|
||||
begin
|
||||
hstr:=K[i]^.Call;
|
||||
strip(hstr);
|
||||
strip(User_.Call);
|
||||
for i:=1 to maxlink do
|
||||
begin
|
||||
if hstr=User_.Call then
|
||||
begin
|
||||
Geaendert:=true;
|
||||
k[i]^.StopCode:=User_.StopCode;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
}
|
||||
end else if (Neu) and (UserAnz>0) then dec(UserAnz);
|
||||
gross:=grosssave;
|
||||
|
||||
End;
|
||||
|
1591
XPUSER.PAS
Executable file
1591
XPUSER.PAS
Executable file
File diff suppressed because it is too large
Load Diff
892
XPV24.PAS
Executable file
892
XPV24.PAS
Executable file
@ -0,0 +1,892 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P V 2 4 . P A S ³
|
||||
³ ³
|
||||
³ - Routinen zur Bedienung bis zu 4 Schnittstellen + ³
|
||||
³ Hardware-Umschaltung bei Multiplexkarten. ³
|
||||
³ ³
|
||||
³ - Interface zum TFPCR-, TFPCX-Treiber von DL1MEN bzw. DG0FT ³
|
||||
³ Es wird nach dem passenden Software-Interrupt im Bereich ³
|
||||
³ $40 bis $FF gesucht! ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
Function IntFlag : Boolean;
|
||||
Var FlagInt : Word;
|
||||
Begin
|
||||
asm
|
||||
pushf
|
||||
pop ax
|
||||
mov FlagInt, ax
|
||||
end;
|
||||
IntFlag := (FlagInt and $200) = $200;
|
||||
End;
|
||||
|
||||
|
||||
Procedure RTS_Setzen (Nr : Byte);
|
||||
Begin
|
||||
Port[COM[Nr].Base+$04] := (Port[COM[Nr].Base+$04] or $02);
|
||||
End;
|
||||
|
||||
Procedure RTS_Loeschen (Nr : Byte);
|
||||
Begin
|
||||
Port[COM[Nr].Base+$04] := (Port[COM[Nr].Base+$04] and (FF-$02));
|
||||
End;
|
||||
|
||||
|
||||
Procedure IRQsLock;
|
||||
Begin
|
||||
if IrqMask > 0 then Port[$21] := Port[$21] or IrqMask;
|
||||
SynchError := false;
|
||||
OverRun := false;
|
||||
End;
|
||||
|
||||
Procedure IRQsFree;
|
||||
Begin
|
||||
if IrqMask > 0 then Port[$21] := Port[$21] and (FF - IrqMask);
|
||||
End;
|
||||
|
||||
Procedure get_Chr_TFPC; assembler;
|
||||
VAR b : Byte;
|
||||
NoData : Byte;
|
||||
ASM
|
||||
XOR AX, AX
|
||||
CMP TFPC_installed, 0
|
||||
JNZ @jumptfpc
|
||||
|
||||
@jumpdrsi:
|
||||
JMP @modifydrsi
|
||||
|
||||
JMP @polldrsi
|
||||
|
||||
@modifydrsi:
|
||||
LEA BX, @modone-1
|
||||
MOV DL, Kiss_Int
|
||||
MOV CS:[BX], DL
|
||||
LEA BX, @jumpdrsi
|
||||
MOV DX, 9090h
|
||||
MOV CS:[BX], DX
|
||||
|
||||
@polldrsi:
|
||||
XOR AX, AX
|
||||
MOV AH, 0h
|
||||
INT $00
|
||||
@modone:
|
||||
CMP AH, 1
|
||||
JNZ @abort
|
||||
|
||||
MOV b, AL
|
||||
MOV NoData, 0
|
||||
JMP @Ende
|
||||
|
||||
@jumptfpc:
|
||||
jmp @modifytfpc
|
||||
jmp @polltfpc
|
||||
|
||||
@modifytfpc:
|
||||
LEA BX, @nummer-1
|
||||
MOV DL, Kiss_Int
|
||||
MOV CS:[BX], DL
|
||||
LEA BX, @nummer2-1
|
||||
MOV CS:[BX], DL
|
||||
LEA BX, @jumptfpc
|
||||
MOV DX, 9090h
|
||||
MOV CS:[BX], DX
|
||||
|
||||
@polltfpc:
|
||||
XOR AX, AX
|
||||
MOV AH, 01h
|
||||
INT $00
|
||||
@nummer:
|
||||
CMP AX, 01
|
||||
JNZ @Abort
|
||||
|
||||
MOV AH, 02
|
||||
INT $00
|
||||
@nummer2:
|
||||
MOV B, AL
|
||||
MOV NoData, 0
|
||||
JMP @Ende
|
||||
|
||||
@abort:
|
||||
MOV NoData, 1
|
||||
|
||||
@Ende:
|
||||
CMP NoData, 0
|
||||
JNZ @Final
|
||||
|
||||
XOR BL, BL
|
||||
MOV BL, b
|
||||
|
||||
LEA DI, V24Buffer
|
||||
ADD DI, BufferPos
|
||||
|
||||
MOV [DS:DI], BL
|
||||
|
||||
INC BufferPos
|
||||
|
||||
CMP BufferPos, maxComBuf
|
||||
JNZ @Final
|
||||
|
||||
LEA DI, V24Buffer
|
||||
|
||||
MOV AL, [DS:DI]
|
||||
|
||||
CMP AL, 0
|
||||
JZ @Final
|
||||
|
||||
@ClearV24Buffer:
|
||||
|
||||
MOV AH, 0
|
||||
MOV [DS:DI], AH
|
||||
INC DI
|
||||
MOV AL, [DS:DI]
|
||||
CMP AL, 0
|
||||
JNZ @ClearV24Buffer
|
||||
|
||||
@Final:
|
||||
END;
|
||||
|
||||
|
||||
|
||||
(*Procedure get_Chr_TFPC;
|
||||
Var r : Registers;
|
||||
b : Byte;
|
||||
Begin
|
||||
if TFPC_installed then
|
||||
begin
|
||||
r.AH := $01;
|
||||
Intr(Kiss_Int,r);
|
||||
if r.AX = 1 then
|
||||
begin
|
||||
r.AH := $02;
|
||||
Intr(Kiss_Int,r);
|
||||
b := r.AL;
|
||||
V24Buffer[BufferPos] := b;
|
||||
inc(BufferPos);
|
||||
if BufferPos >= maxComBuf then ClearV24Buffer;
|
||||
end;
|
||||
end;
|
||||
|
||||
if DRSI_installed then
|
||||
begin
|
||||
r.AH := $00;
|
||||
Intr(Kiss_Int,r);
|
||||
if r.AH = 1 then
|
||||
begin
|
||||
b := r.AL;
|
||||
V24Buffer[BufferPos] := b;
|
||||
inc(BufferPos);
|
||||
if BufferPos >= maxComBuf then ClearV24Buffer;
|
||||
end;
|
||||
end;
|
||||
End; *)
|
||||
|
||||
|
||||
{
|
||||
Procedure get_Chr_Hs (* V24Nr : Byte *);
|
||||
Begin
|
||||
Repeat
|
||||
CB := Port[COM[V24Nr].Base + $05];
|
||||
TRead := CB and $01 = $01;
|
||||
if TRead then
|
||||
begin
|
||||
V24Buffer[BufferPos] := Port[COM[V24Nr].Base];
|
||||
inc(BufferPos);
|
||||
if BufferPos >= maxComBuf then ClearV24Buffer;
|
||||
end;
|
||||
if CB and $02 = $02 then OverRun := true;
|
||||
Until not TRead;
|
||||
End;
|
||||
}
|
||||
|
||||
Procedure get_Chr_Hs (* V24Nr : Byte *); Assembler;
|
||||
Asm
|
||||
@1:
|
||||
xor ax, ax
|
||||
mov al, V24Nr
|
||||
dec al
|
||||
shl al, $01
|
||||
mov bx, Offset Default_Base
|
||||
add bx, ax
|
||||
mov dx, [ds:bx]
|
||||
add dx, $05
|
||||
|
||||
in al, dx
|
||||
test al, $02
|
||||
jz @2
|
||||
mov OverRun, $01
|
||||
@2:
|
||||
test al, $01
|
||||
jz @4
|
||||
|
||||
sub dx, $05
|
||||
in al, dx
|
||||
|
||||
mov si, BufferPos
|
||||
mov bx, Offset V24Buffer
|
||||
mov [ds:bx+si], al
|
||||
inc BufferPos
|
||||
cmp BufferPos, maxComBuf
|
||||
jb @3
|
||||
mov BufferPos, $00
|
||||
@3:
|
||||
jmp @1
|
||||
@4:
|
||||
End;
|
||||
|
||||
(*
|
||||
{$F+} Procedure Com_Int1; {$F-} Interrupt;
|
||||
Const V24Nr = 1;
|
||||
Begin
|
||||
Repeat
|
||||
CB := Port[COM[V24Nr].Base + $05];
|
||||
TRead := CB and $01 = $01;
|
||||
if TRead then
|
||||
begin
|
||||
V24Buffer[BufferPos] := Port[COM[V24Nr].Base];
|
||||
inc(BufferPos);
|
||||
if BufferPos >= maxComBuf then ClearV24Buffer;
|
||||
end;
|
||||
if CB and $02 = $02 then OverRun := true;
|
||||
Until not TRead;
|
||||
|
||||
if COM[V24Nr].IRQ_Nr > 7 then Port[$A0] := $20;
|
||||
Port[$20] := $20;
|
||||
End;
|
||||
|
||||
{$F+} Procedure Com_Int2; {$F-} Interrupt;
|
||||
Const V24Nr = 2;
|
||||
Begin
|
||||
Repeat
|
||||
CB := Port[COM[V24Nr].Base + $05];
|
||||
TRead := CB and $01 = $01;
|
||||
if TRead then
|
||||
begin
|
||||
V24Buffer[BufferPos] := Port[COM[V24Nr].Base];
|
||||
inc(BufferPos);
|
||||
if BufferPos >= maxComBuf then ClearV24Buffer;
|
||||
end;
|
||||
if CB and $02 = $02 then OverRun := true;
|
||||
Until not TRead;
|
||||
|
||||
if COM[V24Nr].IRQ_Nr > 7 then Port[$A0] := $20;
|
||||
Port[$20] := $20;
|
||||
End;
|
||||
|
||||
{$F+} Procedure Com_Int3; {$F-} Interrupt;
|
||||
Const V24Nr = 3;
|
||||
Begin
|
||||
Repeat
|
||||
CB := Port[COM[V24Nr].Base + $05];
|
||||
TRead := CB and $01 = $01;
|
||||
if TRead then
|
||||
begin
|
||||
V24Buffer[BufferPos] := Port[COM[V24Nr].Base];
|
||||
inc(BufferPos);
|
||||
if BufferPos >= maxComBuf then ClearV24Buffer;
|
||||
end;
|
||||
if CB and $02 = $02 then OverRun := true;
|
||||
Until not TRead;
|
||||
|
||||
if COM[V24Nr].IRQ_Nr > 7 then Port[$A0] := $20;
|
||||
Port[$20] := $20;
|
||||
End;
|
||||
|
||||
{$F+} Procedure Com_Int4; {$F-} Interrupt;
|
||||
Const V24Nr = 4;
|
||||
Begin
|
||||
Repeat
|
||||
CB := Port[COM[V24Nr].Base + $05];
|
||||
TRead := CB and $01 = $01;
|
||||
if TRead then
|
||||
begin
|
||||
V24Buffer[BufferPos] := Port[COM[V24Nr].Base];
|
||||
inc(BufferPos);
|
||||
if BufferPos >= maxComBuf then ClearV24Buffer;
|
||||
end;
|
||||
if CB and $02 = $02 then OverRun := true;
|
||||
Until not TRead;
|
||||
|
||||
if COM[V24Nr].IRQ_Nr > 7 then Port[$A0] := $20;
|
||||
Port[$20] := $20;
|
||||
End;
|
||||
*)
|
||||
|
||||
{$F+} Procedure Com_Int1; {$F-} Interrupt; Assembler;
|
||||
Asm
|
||||
@1:
|
||||
mov dx, ComAdr1
|
||||
add dx, $05
|
||||
in al, dx
|
||||
test al, $02
|
||||
jz @2
|
||||
mov OverRun, $01
|
||||
@2:
|
||||
test al, $01
|
||||
jz @4
|
||||
|
||||
sub dx, $05
|
||||
in al, dx
|
||||
|
||||
mov si, BufferPos
|
||||
mov bx, Offset V24Buffer
|
||||
mov [ds:bx+si], al
|
||||
inc BufferPos
|
||||
cmp BufferPos, maxComBuf
|
||||
jb @3
|
||||
mov BufferPos, $00
|
||||
@3:
|
||||
jmp @1
|
||||
@4:
|
||||
mov al, $20
|
||||
mov ah, EoiPic1
|
||||
test ah, $01
|
||||
jz @5
|
||||
out $A0, al
|
||||
@5:
|
||||
out $20, al
|
||||
End;
|
||||
|
||||
|
||||
{$F+} Procedure Com_Int2; {$F-} Interrupt; Assembler;
|
||||
Asm
|
||||
@1:
|
||||
mov dx, ComAdr2
|
||||
add dx, $05
|
||||
in al, dx
|
||||
test al, $02
|
||||
jz @2
|
||||
mov OverRun, $01
|
||||
@2:
|
||||
test al, $01
|
||||
jz @4
|
||||
|
||||
sub dx, $05
|
||||
in al, dx
|
||||
|
||||
mov si, BufferPos
|
||||
mov bx, Offset V24Buffer
|
||||
mov [ds:bx+si], al
|
||||
inc BufferPos
|
||||
cmp BufferPos, maxComBuf
|
||||
jb @3
|
||||
mov BufferPos, $00
|
||||
@3:
|
||||
jmp @1
|
||||
@4:
|
||||
mov al, $20
|
||||
mov ah, EoiPic2
|
||||
test ah, $01
|
||||
jz @5
|
||||
out $A0, al
|
||||
@5:
|
||||
out $20, al
|
||||
End;
|
||||
|
||||
|
||||
{$F+} Procedure Com_Int3; {$F-} Interrupt; Assembler;
|
||||
Asm
|
||||
@1:
|
||||
mov dx, ComAdr3
|
||||
add dx, $05
|
||||
in al, dx
|
||||
test al, $02
|
||||
jz @2
|
||||
mov OverRun, $01
|
||||
@2:
|
||||
test al, $01
|
||||
jz @4
|
||||
|
||||
sub dx, $05
|
||||
in al, dx
|
||||
|
||||
mov si, BufferPos
|
||||
mov bx, Offset V24Buffer
|
||||
mov [ds:bx+si], al
|
||||
inc BufferPos
|
||||
cmp BufferPos, maxComBuf
|
||||
jb @3
|
||||
mov BufferPos, $00
|
||||
@3:
|
||||
jmp @1
|
||||
@4:
|
||||
mov al, $20
|
||||
mov ah, EoiPic3
|
||||
test ah, $01
|
||||
jz @5
|
||||
out $A0, al
|
||||
@5:
|
||||
out $20, al
|
||||
End;
|
||||
|
||||
|
||||
{$F+} Procedure Com_Int4; {$F-} Interrupt; Assembler;
|
||||
Asm
|
||||
@1:
|
||||
mov dx, ComAdr4
|
||||
add dx, $05
|
||||
in al, dx
|
||||
test al, $02
|
||||
jz @2
|
||||
mov OverRun, $01
|
||||
@2:
|
||||
test al, $01
|
||||
jz @4
|
||||
|
||||
sub dx, $05
|
||||
in al, dx
|
||||
|
||||
mov si, BufferPos
|
||||
mov bx, Offset V24Buffer
|
||||
mov [ds:bx+si], al
|
||||
inc BufferPos
|
||||
cmp BufferPos, maxComBuf
|
||||
jb @3
|
||||
mov BufferPos, $00
|
||||
@3:
|
||||
jmp @1
|
||||
@4:
|
||||
mov al, $20
|
||||
mov ah, EoiPic4
|
||||
test ah, $01
|
||||
jz @5
|
||||
out $A0, al
|
||||
@5:
|
||||
out $20, al
|
||||
End;
|
||||
|
||||
|
||||
{----------------------------------------------------------------------------
|
||||
| Eine der V24-Schnittstellen initialisieren
|
||||
+----------------------------------------------------------------------------}
|
||||
Procedure V24_Init;
|
||||
Var T,Nr,INr,dB : Byte;
|
||||
V24Install : Boolean;
|
||||
Begin
|
||||
for T := 1 to TNC_Anzahl do
|
||||
begin
|
||||
Nr := TNC[T]^.RS232;
|
||||
|
||||
if (Nr < 5) and not COM[Nr].Active then with COM[Nr] do
|
||||
begin
|
||||
V24Install := (Port[Base + $05] and $60) = $60;
|
||||
|
||||
if V24Install then
|
||||
begin
|
||||
While (Port[Base + $05] and $01) = $01 do dB := Port[Base];
|
||||
|
||||
{FIFO-Controlregister eines NSC 16550A initialisieren sofern installiert}
|
||||
{Beim 8250/16450 geht diese Initialisierung ins Leere und bewirkt nichts}
|
||||
Port[Base + $02] := FifoCfg;
|
||||
FifoOn := Port[Base + $02] and $C0 = $C0;
|
||||
|
||||
OrgLCR := Port[Base + $03]; { altes LCR sichern }
|
||||
OrgMCR := Port[Base + $04]; { altes MCR sichern }
|
||||
OrgIER := Port[Base + $01]; { altes IER sichern }
|
||||
Port[Base + $03] := Port[Base + $03] or $80; { LCR : DLAB=1 }
|
||||
OrgLODIV := Port[Base + $00]; { alte Baudrate sichern }
|
||||
OrgHIDIV := Port[Base + $01];
|
||||
Port[Base+3] := OrgLCR;
|
||||
|
||||
Inline($FA);
|
||||
if not HwHs then
|
||||
begin
|
||||
if IRQ_Nr > 7 then INr := IRQ_Nr + 104
|
||||
else INr := IRQ_Nr + 8;
|
||||
|
||||
GetIntVec(INr,Old_Vector);
|
||||
|
||||
Case Nr of
|
||||
1 : SetIntVec(INr,@Com_Int1);
|
||||
2 : SetIntVec(INr,@Com_Int2);
|
||||
3 : SetIntVec(INr,@Com_Int3);
|
||||
4 : SetIntVec(INr,@Com_Int4);
|
||||
end;
|
||||
|
||||
if IRQ_Nr > 7 then
|
||||
begin
|
||||
Port[$A1] := Port[$A1] and (FF - (1 shl (IRQ_Nr-8)));
|
||||
Port[$21] := Port[$21] and (FF - $04);
|
||||
Port[$20] := $C1;
|
||||
end else
|
||||
begin
|
||||
Port[$21] := Port[$21] and (FF - (1 shl IRQ_Nr));
|
||||
Port[$20] := $C2; { V24 IRQ-Prioritaet setzen }
|
||||
end;
|
||||
end;
|
||||
Inline($FB);
|
||||
|
||||
dB := Byte(Round(115200 / BaudRate));
|
||||
Port[Base + $03] := Port[Base + $03] or $80; { LCR : DLAB=1 }
|
||||
Port[Base + $00] := Lo(dB); { $06 = 19200 bd, $0C = 9600 }
|
||||
Port[Base + $01] := Hi(dB); { HI Baud }
|
||||
Port[Base + $03] := $03; { LCR NoParity 8Data 1Stop:DLAB=0 }
|
||||
|
||||
if not HwHs then
|
||||
begin
|
||||
Port[Base + $04] := $0B; { MCR IRQ-, RTS-, DTR-Ltg freiset.}
|
||||
Port[Base + $01] := $01; { Interrupt bei Empfangsdaten }
|
||||
Verzoegern(200);
|
||||
end else Port[Base + $04] := $03; { MCR RTS und DTR= H }
|
||||
|
||||
Active := true;
|
||||
end else Abbruch_XP(13,int_str(Nr));
|
||||
end;
|
||||
ClearV24Buffer;
|
||||
end;
|
||||
End;
|
||||
|
||||
{-----------------------------------------------------------------------------
|
||||
| V24_Close setzt alle Vektoren wieder zur<75>ck
|
||||
| Neu: Interrupts werden gesperrt (nach DL4NO) 11/1989
|
||||
+----------------------------------------------------------------------------}
|
||||
Procedure V24_Close;
|
||||
Var INr, i : Byte;
|
||||
Begin
|
||||
for i := 1 to 4 do with COM[i] do
|
||||
if Active then
|
||||
begin
|
||||
Port[Base + $01] := $00; { serielles Port-IER sperren }
|
||||
Port[Base + $04] := $00; { IRQ-Leitung in Tristate }
|
||||
|
||||
Inline($FA);
|
||||
|
||||
if not HwHs then
|
||||
begin
|
||||
if IRQ_Nr > 7 then INr := IRQ_Nr + 104
|
||||
else INr := IRQ_Nr + 8;
|
||||
SetIntVec(INr,Old_Vector);
|
||||
end;
|
||||
|
||||
Port[Base + $03] := Port[Base + $03] or $80;
|
||||
Port[Base + $00] := OrgLODIV; { alte Baudrate restaurieren }
|
||||
Port[Base + $01] := OrgHIDIV;
|
||||
Port[Base + $03] := OrgLCR; { LCR restaurieren }
|
||||
Port[Base + $01] := OrgIER; { IER restaurieren }
|
||||
|
||||
Inline($FB);
|
||||
|
||||
Port[Base + $04] := OrgMCR; { MCR restaurieren }
|
||||
Active := false;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure WriteAux (* V24Nr : Byte; Zeile : String *);
|
||||
Var i : Byte;
|
||||
r : Registers;
|
||||
Begin
|
||||
if (V24Nr = 5) then
|
||||
begin
|
||||
for i := 1 to ord(Zeile[0]) do
|
||||
begin
|
||||
if TFPC_installed then r.AH := 3;
|
||||
if DRSI_installed then r.AH := 1;
|
||||
r.AL := Ord(Zeile[i]);
|
||||
Intr(Kiss_Int,r);
|
||||
end;
|
||||
end else with COM[V24Nr] do
|
||||
begin
|
||||
for i := 1 to ord(Zeile[0]) do
|
||||
begin
|
||||
Repeat Until (Port[Base + $05] and 32) = 32;
|
||||
Port[Base] := Ord(Zeile[i]);
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
| Den gew<65>nschten TNC einschalten
|
||||
+-----------------------------------------------------------------------------}
|
||||
Procedure Switch_TNC (* TNr : Byte *);
|
||||
Var sw : Byte;
|
||||
MCR : Byte;
|
||||
Begin
|
||||
if (TNC[TNr]^.RS232 < 5) and (Old_Active_TNC <> TNr) then
|
||||
begin
|
||||
Old_Active_TNC := TNr;
|
||||
sw := TNC[TNr]^.MPX;
|
||||
if sw in [1..4] then with COM[TNC[TNr]^.RS232] do
|
||||
begin
|
||||
MCR := Port[Base + $04];
|
||||
if HwHs then MCR := MCR and $FE
|
||||
else MCR := MCR and $FC;
|
||||
case sw of { RTS DTR }
|
||||
1 : Port[Base + $04] := MCR or $00; { L L } { L = ca.-12V }
|
||||
2 : Port[Base + $04] := MCR or $01; { L H } { H = ca.+12V }
|
||||
3 : Port[Base + $04] := MCR or $02; { H L }
|
||||
4 : Port[Base + $04] := MCR or $03; { H H }
|
||||
end;
|
||||
Verzoegern(2); { ... f<>r alle F„lle ... }
|
||||
end;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Function ReSync (* V24Nr : Byte) : Boolean *);
|
||||
Var w,i,iz : Word;
|
||||
KC : SonderTaste;
|
||||
VC, ch : Char;
|
||||
Flag : Boolean;
|
||||
Hstr : String[10];
|
||||
|
||||
Begin
|
||||
Inc(Resync_Z);
|
||||
if Klingel then Beep(1500,20);
|
||||
i := 0;
|
||||
VC := #0;
|
||||
Flag := false;
|
||||
|
||||
Repeat
|
||||
inc(i);
|
||||
StatusOut(show,1,3,Attrib[14],'COM-' + int_str(V24Nr) + ' Resynch: ' + int_str(i),1);
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,#1);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
move(V24Buffer[2],Hstr[1],10);
|
||||
Hstr[0] := #10;
|
||||
Flag := pos('INVALID',Hstr) = 1;
|
||||
if not Flag then
|
||||
begin
|
||||
move(V24Buffer[1],Hstr[1],10);
|
||||
Hstr[0] := #10;
|
||||
Flag := pos('INVALID',Hstr) = 1;
|
||||
end;
|
||||
{ StatusOut(show,1,3,Attrib[14],hstr,1);}
|
||||
|
||||
While _KeyPressed do _ReadKey(KC,VC);
|
||||
Until (i = 260) or (VC = ^C) or Flag;
|
||||
|
||||
(* if not Flag then
|
||||
begin
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,ESC+M1);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,^Q^X);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
if V24Buffer[0] = 6 then
|
||||
begin
|
||||
WriteAux(V24Nr,^R^X);
|
||||
Wait_Read(V24Nr);
|
||||
end;
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,ESC + 'E1'+ M1);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,^X);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,ESC);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,^Q^X);
|
||||
{^Q^M^X statt JHOST0 geht auch anstatt ESC+M1, QX}
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
if V24Buffer[0] = 6 then
|
||||
begin
|
||||
WriteAux(V24Nr,^R^X);
|
||||
Wait_Read(V24Nr);
|
||||
end;
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,ESC + 'E1'+ M1);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,^X);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,ESC);
|
||||
Wait_Read(V24Nr);
|
||||
|
||||
ch := Chr(V24Buffer[0]);
|
||||
|
||||
i := 10;
|
||||
While (ch <> '*') and (i > 0) do
|
||||
begin
|
||||
Wait_Read(V24Nr);
|
||||
w := BufferPos;
|
||||
While (w > 0) and (ch <> '*') do
|
||||
begin
|
||||
dec(w);
|
||||
ch := Chr(V24Buffer[w]);
|
||||
end;
|
||||
if ch <> '*' then ClearV24Buffer;
|
||||
dec(i);
|
||||
end;
|
||||
|
||||
Flag:=true; VC:=#23;
|
||||
if ch <> '*' then Flag:=False;
|
||||
|
||||
if not Flag then
|
||||
begin
|
||||
ClearV24Buffer;
|
||||
WriteAux(V24Nr,'JHOST1' + M1);
|
||||
Wait_Read(V24Nr);
|
||||
Verzoegern(300);
|
||||
end;
|
||||
|
||||
ClearV24Buffer;
|
||||
|
||||
end;
|
||||
*)
|
||||
|
||||
if Flag and (VC <> ^C) then
|
||||
begin
|
||||
Wait_Read(V24Nr);
|
||||
ClearV24Buffer;
|
||||
ReSync := true;
|
||||
end else ReSync := false;
|
||||
|
||||
SetzeFlags(show);
|
||||
if K[show]^.connected then UserInStatus(show)
|
||||
else UserInStatus (show);
|
||||
End;
|
||||
|
||||
|
||||
Procedure Wait_Read (* V24Nr : Byte *);
|
||||
Var l : LongInt;
|
||||
Begin
|
||||
TimeOut := 0;
|
||||
l := TimerTick;
|
||||
|
||||
if (V24Nr = 5) then
|
||||
begin
|
||||
Repeat
|
||||
get_Chr_TFPC;
|
||||
if l <> TimerTick then
|
||||
begin
|
||||
inc(TimeOut);
|
||||
l := TimerTick;
|
||||
end;
|
||||
Until TimeOut >= Wait_TimeOut;
|
||||
end else if HwHs then
|
||||
begin
|
||||
RTS_Setzen(V24Nr);
|
||||
Repeat
|
||||
if l <> TimerTick then
|
||||
begin
|
||||
inc(TimeOut);
|
||||
l := TimerTick;
|
||||
end;
|
||||
get_Chr_Hs(V24Nr);
|
||||
Until TimeOut >= Wait_TimeOut;
|
||||
RTS_Loeschen(V24Nr);
|
||||
end else Verzoegern(120);
|
||||
End;
|
||||
|
||||
|
||||
Procedure ClearV24Buffer;
|
||||
var ch : Char;
|
||||
Begin
|
||||
FillChar(V24Buffer,SizeOf(V24Buffer),0);
|
||||
BufferPos := 0;
|
||||
End;
|
||||
|
||||
|
||||
Procedure get_Response (* Kanal *);
|
||||
Var V24Nr,
|
||||
a,b : Byte;
|
||||
l : LongInt;
|
||||
Ok : Boolean;
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
V24Nr := V24(Kanal);
|
||||
Ok := false;
|
||||
TimeOut := 0;
|
||||
l := TimerTick;
|
||||
if HwHs then RTS_Setzen(V24Nr);
|
||||
Repeat
|
||||
if HwHs then get_Chr_Hs(V24Nr);
|
||||
if V24Nr = 5 then get_Chr_TFPC;
|
||||
if (BufferPos = 2) and (V24Buffer[1] = 0) then Ok := true;
|
||||
if (BufferPos > 2) then
|
||||
begin
|
||||
if (V24Buffer[1] < 6) and (V24Buffer[BufferPos-1] = 0) then Ok := true;
|
||||
if (V24Buffer[1] > 5) and (V24Buffer[2] + 4 = BufferPos) then Ok := true;
|
||||
end;
|
||||
|
||||
if l <> TimerTick then
|
||||
begin
|
||||
inc(TimeOut);
|
||||
l := TimerTick;
|
||||
end;
|
||||
Until Ok or OverRun or (TimeOut > TNC_TimeOut);
|
||||
|
||||
if HwHs then RTS_Loeschen(V24Nr);
|
||||
|
||||
IRQsFree;
|
||||
if OverRun then Wait_Read(V24Nr);
|
||||
|
||||
if TimeOut > TNC_TimeOut then
|
||||
begin
|
||||
if not ReSync(V24Nr) then DRSI_Hostmode(TncNummer,1);
|
||||
end else BufToResp(Kanal);
|
||||
|
||||
ClearV24Buffer;
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure BufToResp (* Kanal : Byte *);
|
||||
Var V24Nr : Byte;
|
||||
ic : Word;
|
||||
Hstr : String[80];
|
||||
Begin
|
||||
with K[Kanal]^ do
|
||||
begin
|
||||
V24Nr := V24(Kanal);
|
||||
|
||||
if not (SynchError or OverRun) then
|
||||
begin
|
||||
Kan_Char := Chr(V24Buffer[0]);
|
||||
TNC_Code := V24Buffer[1];
|
||||
if (Pseudo or (Kan_Char = TNCKanal)) and ((TNC_Code >= 0) and (TNC_Code < 8)) then
|
||||
begin
|
||||
if (TNC_Code = 6) or (TNC_Code = 7) then
|
||||
begin
|
||||
TNC_Count := V24Buffer[2] + 1;
|
||||
if TNC_Count > FF then ic := FF
|
||||
else ic := TNC_Count;
|
||||
move(V24Buffer[3],Response[1],ic);
|
||||
Response[0] := Chr(ic);
|
||||
if TNC_Count > FF then Response256 := Chr(V24Buffer[TNC_Count + 2]);
|
||||
end else if TNC_Code > 0 then
|
||||
begin
|
||||
move(V24Buffer[2],Response[1],BufferPos - 3);
|
||||
Response[0] := Chr(BufferPos - 3);
|
||||
end;
|
||||
end else SynchError := true;
|
||||
end;
|
||||
|
||||
ClearV24Buffer;
|
||||
|
||||
if SynchError or OverRun then
|
||||
begin
|
||||
Beep(1300,10);
|
||||
Hstr := Star + TNC[TncNummer]^.Ident + B1 + SynchErrStr + int_str(V24Nr);
|
||||
if OverRun then Hstr := Hstr + B1 + OverRunStr;
|
||||
if not K[0]^.RxLRet then Hstr := ^J + Hstr;
|
||||
M_aus(Attrib[28],Hstr + ^J, Kanal);
|
||||
inc(SynchErrAnz);
|
||||
end;
|
||||
|
||||
Pseudo := false;
|
||||
end;
|
||||
End;
|
506
XPWAV.PAS
Executable file
506
XPWAV.PAS
Executable file
@ -0,0 +1,506 @@
|
||||
{***************************************************************************
|
||||
** Unit to play WAV-format files from Turbo Pascal for DOS. **
|
||||
** by Steven H Don **
|
||||
** **
|
||||
** For questions, feel free to e-mail me. **
|
||||
** **
|
||||
** shd@earthling.net **
|
||||
** http://shd.cjb.net **
|
||||
** **
|
||||
***************************************************************************}
|
||||
|
||||
|
||||
{Writes a value to the DSP-chip on the SB}
|
||||
procedure WriteDSP (value : byte);
|
||||
begin
|
||||
{$IFDEF Sound}
|
||||
while Port [base + $C] And $80 <> 0 do;
|
||||
Port [base + $C] := value;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
{Establishes the DSP<->Speaker connection, necessary for older cards.}
|
||||
function SpeakerOn : byte;
|
||||
begin
|
||||
WriteDSP ($D1);
|
||||
end;
|
||||
|
||||
{Discontinues the DSP<->Speaker connection, necessary for older cards.}
|
||||
function SpeakerOff : byte;
|
||||
begin
|
||||
WriteDSP ($D3);
|
||||
end;
|
||||
|
||||
|
||||
{Stops playing the wave-file.}
|
||||
procedure DMAStop;
|
||||
begin
|
||||
{$IFDEF Sound}
|
||||
{Set general variable to indicate no sound}
|
||||
Playing := false;
|
||||
|
||||
{Function : D0 Stop 8 bit DMA transfer}
|
||||
WriteDSP ($D0);
|
||||
{Function : D5 Stop 16 bit DMA transfer}
|
||||
WriteDSP ($D5);
|
||||
|
||||
{$I-}
|
||||
if WavFileOpen then
|
||||
begin
|
||||
Close (SoundFile); {Close the soundfile}
|
||||
if IOResult <> 0 then; {Clear Error flag}
|
||||
end;
|
||||
WavFileOpen := False;
|
||||
{$I+}
|
||||
|
||||
{Free the sound buffer}
|
||||
if SoundBuffer <> nil then begin
|
||||
freemem (SoundBuffer, 16384);
|
||||
SoundBuffer := nil;
|
||||
end;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
{This procedure sets up the DMA controller for DMA transfer.
|
||||
Then it programs the DSP chip to receive the transfer.
|
||||
Finally it initiates the transfer.}
|
||||
{procedure Playback (SoundSeg, SoundOfs, size : longint);}
|
||||
procedure Playback (Location : Pointer; Start, Size : Word);
|
||||
var
|
||||
SoundSeg, SoundOfs : Word;
|
||||
page, offset : longint;
|
||||
|
||||
begin
|
||||
{$IFDEF Sound}
|
||||
{Calculate offset and segment part of the buffer}
|
||||
SoundSeg := Seg (Location^);
|
||||
SoundOfs := Ofs (Location^) + Start;
|
||||
|
||||
{Calculate Offset and Page address of Wave-data}
|
||||
if fmt.BitResolution = 8 then begin
|
||||
offset := SoundSeg Shl 4 + SoundOfs;
|
||||
page := (SoundSeg + SoundOfs shr 4) shr 12;
|
||||
end else begin
|
||||
size := size shr 1;
|
||||
page := (SoundSeg + SoundOfs shr 4) shr 12;
|
||||
offset := (SoundSeg Shl 3 + SoundOfs shr 1) mod 65536;
|
||||
end;
|
||||
|
||||
{Decrease size by one. This is necessary because the
|
||||
DMA controller sends one byte/word more than it is told to}
|
||||
{Setup DMA Controller for transfer}
|
||||
Port [DMAPort [Channel, 1]] := 4 or (Channel and 3);
|
||||
if fmt.BitResolution = 16 then Port [$D8] := 0;
|
||||
Port [DMAPort [Channel, 3]] := 0;
|
||||
Port [DMAPort [Channel, 2]] := $48 or (Channel and 3);
|
||||
Port [DMAChannel [Channel, 2]] := Lo (offset);
|
||||
Port [DMAChannel [Channel, 2]] := Hi (offset);
|
||||
Port [DMAChannel [Channel, 1]] := page;
|
||||
Port [DMAChannel [Channel, 3]] := Lo (size);
|
||||
Port [DMAChannel [Channel, 3]] := Hi (size);
|
||||
Port [DMAPort [Channel, 1]] := (Channel and 3);
|
||||
|
||||
{Set DSP}
|
||||
if Card = SB8 then begin
|
||||
{Set up 8-bit card, sorry no stereo SBPRO support}
|
||||
WriteDSP ($14);
|
||||
end else begin
|
||||
{Set up 16-bit card}
|
||||
if fmt.BitResolution = 8 then begin
|
||||
{8-Bit file}
|
||||
WriteDSP ($C0);
|
||||
if fmt.Channels = 1 then WriteDSP ($00); {Mono}
|
||||
if fmt.Channels = 2 then WriteDSP ($20); {Stereo}
|
||||
end else begin
|
||||
{16-Bit file
|
||||
Perhaps this also needs to be changed}
|
||||
WriteDSP ($B0);
|
||||
if fmt.Channels = 1 then WriteDSP ($10); {Mono}
|
||||
if fmt.Channels = 2 then WriteDSP ($30); {Stereo}
|
||||
end;
|
||||
end;
|
||||
|
||||
{Send the size of the transfer to the SB}
|
||||
WriteDSP (Lo (size));
|
||||
WriteDSP (Hi (size));
|
||||
|
||||
{Set global variable to indicate playing sound}
|
||||
Playing := true;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
{This procedure is called at the end of a DMA transfer. It starts the
|
||||
playing of the next portion of the wave-file and reads in another block.}
|
||||
procedure ServiceIRQ; interrupt;
|
||||
var
|
||||
b, t : Byte;
|
||||
|
||||
begin
|
||||
{$IFDEF Sound}
|
||||
{relieve card}
|
||||
if Card = SB16 then begin
|
||||
Port [base + $4] := $82;
|
||||
t := Port [base + $5];
|
||||
if t and 1 = 1 then b := Port [base + $E]; { 8bit interrupt}
|
||||
if t and 2 = 2 then b := Port [base + $F]; {16bit interrupt}
|
||||
end else begin
|
||||
{8bit interrupt}
|
||||
b := Port [base + $E];
|
||||
end;
|
||||
|
||||
{Acknowledge hardware interrupt}
|
||||
Port [$20] := $20;
|
||||
|
||||
{Stop playing}
|
||||
Playing := false;
|
||||
if FreeBuffer then begin
|
||||
Dispose (SoundBuffer);
|
||||
SoundBuffer := nil;
|
||||
end;
|
||||
|
||||
{The following is done when the remaining part of the file
|
||||
is less than 16K.}
|
||||
if OverHead>0 then begin
|
||||
{Play the last part of the sound}
|
||||
if Upper then
|
||||
PlayBack (SoundBuffer, 0, OverHead)
|
||||
else
|
||||
PlayBack (SoundBuffer, 16384, OverHead);
|
||||
|
||||
{The file may be closed}
|
||||
Close (SoundFile);
|
||||
WavFileOpen:=False;
|
||||
OverHead := 0;
|
||||
|
||||
{The next time this routine is called, the sound buffer must
|
||||
be freed so that the memory it occupies is available to the
|
||||
calling programme.}
|
||||
FreeBuffer := true;
|
||||
end;
|
||||
|
||||
{If there is more than 16K to be played and/or read, it will
|
||||
be done in chunks of 16K.}
|
||||
if dataC.SoundLength - SoundRead > 0 then begin
|
||||
if dataC.SoundLength - SoundRead > 16384 then begin
|
||||
{Load into appropriate part of the buffer}
|
||||
if Upper then begin
|
||||
PlayBack (SoundBuffer, 0, 16384);
|
||||
BlockRead (SoundFile, SoundBuffer^ [16384], 16384);
|
||||
end else begin
|
||||
PlayBack (SoundBuffer, 16384, 16384);
|
||||
BlockRead (SoundFile, SoundBuffer^, 16384);
|
||||
end;
|
||||
|
||||
{Update position indicators}
|
||||
inc (SoundRead, 16384);
|
||||
Upper := Not Upper;
|
||||
end else begin
|
||||
{Load in the last part of the Wave-file and play it.}
|
||||
OverHead := dataC.SoundLength-SoundRead;
|
||||
if Upper then begin
|
||||
PlayBack (SoundBuffer, 0, 16384);
|
||||
BlockRead (SoundFile, SoundBuffer^ [16384], Overhead);
|
||||
end else begin
|
||||
PlayBack (SoundBuffer, 16384, 16384);
|
||||
BlockRead (SoundFile, SoundBuffer^, Overhead);
|
||||
end;
|
||||
inc (SoundRead, Overhead);
|
||||
Upper := Not Upper;
|
||||
end;
|
||||
end;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
procedure PlayWave (FileName : String);
|
||||
begin
|
||||
{$IFDEF Sound}
|
||||
|
||||
{Assume no error}
|
||||
WaveError := 0;
|
||||
|
||||
{Return error if no sound card found}
|
||||
if Base = 0 then begin
|
||||
WaveError := NoCard;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
{Stop any DMA-transfer that might be in progress}
|
||||
DMAStop;
|
||||
|
||||
{Initialize settings}
|
||||
FreeBuffer := false;
|
||||
OverHead := 0;
|
||||
|
||||
{Allow access to read-only files}
|
||||
FileMode := 0;
|
||||
|
||||
{$I-}
|
||||
{Check for existence of file}
|
||||
Assign (SoundFile, FileName);
|
||||
Reset (SoundFile, 1);
|
||||
{If it doesn't exist, maybe the extension should be added}
|
||||
{ if IOResult <> 0 then begin
|
||||
Assign (SoundFile, FileName + '.WAV');
|
||||
Reset (SoundFile, 1);
|
||||
end;}
|
||||
{$I+}
|
||||
FileMode:=2;
|
||||
{If it doesn't resist, return an error}
|
||||
if IOResult <> 0 then begin
|
||||
WaveError := FileNotFound;
|
||||
Exit;
|
||||
end;
|
||||
WavFileOpen:=True;
|
||||
{Read the RIFF header}
|
||||
BlockRead (SoundFile, Header, 8);
|
||||
{Check for 'RIFF', if not found : don't play}
|
||||
if Header.RIFF <> rId then begin
|
||||
WaveError := InvalidWAVE;
|
||||
Close (SoundFile);
|
||||
WavFileOpen:=false;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
{Read the WAVE header}
|
||||
BlockRead (SoundFile, Wave, 4);
|
||||
{Check for 'WAVE', if not found : don't play}
|
||||
if Wave.WAVE <> wId then begin
|
||||
WaveError := InvalidWAVE;
|
||||
Close (SoundFile);
|
||||
WavFileOpen:=False;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
{Search for the fmt chunk, that starts with 'fmt '}
|
||||
repeat
|
||||
BlockRead (SoundFile, fmtH, 8);
|
||||
if fmtH.fmt <> fId then Seek (SoundFile, FilePos (SoundFile)-7);
|
||||
until fmtH.fmt = fId;
|
||||
|
||||
{Read format specifier}
|
||||
BlockRead (SoundFile, fmt, fmtH.fmtDataLength);
|
||||
|
||||
{Check format}
|
||||
with fmt do begin
|
||||
if (Card = SB8) then begin
|
||||
{16bit files can't be played through 8bit card}
|
||||
if (BitResolution = 16) then begin
|
||||
WaveError := No16BitCard;
|
||||
Close (SoundFile);
|
||||
WavFileOpen:=False;
|
||||
Exit;
|
||||
end;
|
||||
{Stereo files are only played over 16bit card}
|
||||
if (Channels = 2) then begin
|
||||
WaveError := NoStereoCard;
|
||||
Close (SoundFile);
|
||||
WavFileOpen:=False;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
{Can only play uncompressed WAVs}
|
||||
if WaveType <> 1 then begin
|
||||
WaveError := InvalidWAVE;
|
||||
Close (SoundFile);
|
||||
WavFileOpen:=False;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
|
||||
{Search for data chunk, starting with 'data'}
|
||||
datac.data := 0;
|
||||
repeat
|
||||
BlockRead (SoundFile, dataC, 8);
|
||||
if dataC.data <> dId then Seek (SoundFile, FilePos (SoundFile)-7);
|
||||
until datac.data = dId;
|
||||
|
||||
{Some wave-files have an incorrect SoundLength. This makes sure
|
||||
that the SoundLength is never larger than actually fits in the
|
||||
wave file.}
|
||||
if dataC.SoundLength>FileSize (SoundFile)-FilePos (SoundFile)-1 then
|
||||
dataC.SoundLength := FileSize (SoundFile)-FilePos (SoundFile)-1;
|
||||
WaveType.Length := dataC.SoundLength;
|
||||
|
||||
{The WaveLength (not SoundLength) indicates the number of Samples,
|
||||
not the number of bytes, so this needs to be adjusted for the
|
||||
number of channels (Mono/Stereo) and the bit-resolution (8/16-Bit)}
|
||||
if WaveType.Stereo = true then WaveType.Length := WaveType.Length shr 1;
|
||||
if WaveType.Resolution = 16 then WaveType.Length := WaveType.Length shr 1;
|
||||
|
||||
{set DMAChannel}
|
||||
if fmt.BitResolution = 8 then Channel := DMA8;
|
||||
if fmt.BitResolution = 16 then Channel := DMA16;
|
||||
|
||||
{Update global variables so that calling programs can identify
|
||||
the wave being played. Pretty useless for games though}
|
||||
WaveType.SampleRate := fmt.SampleRate;
|
||||
WaveType.Resolution := fmt.BitResolution;
|
||||
WaveType.Stereo := fmt.Channels = 2;
|
||||
SoundRead := 0;
|
||||
|
||||
{Allocate 32K of memory to the sound buffer}
|
||||
getmem (SoundBuffer,16384);
|
||||
{If there was an error allocating memory, don't play.}
|
||||
if SoundBuffer = nil then begin
|
||||
WaveError := NoMemory;
|
||||
Close (SoundFile);
|
||||
WavFileOpen:=False;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
{set sample rate}
|
||||
case Card of
|
||||
{Original SB requires a special 'time-frame' computation}
|
||||
SB8 : begin
|
||||
WriteDSP ($40);
|
||||
WriteDSP (256 - 1000000 div fmt.SampleRate);
|
||||
end;
|
||||
{SB16 just needs the samplerate. Much easier}
|
||||
SB16 : begin
|
||||
WriteDSP ($41);
|
||||
WriteDSP (hi (fmt.SampleRate));
|
||||
WriteDSP (lo (fmt.SampleRate));
|
||||
end;
|
||||
end;
|
||||
|
||||
{check length of file}
|
||||
if dataC.SoundLength>32768 then begin
|
||||
{must be played in parts}
|
||||
BlockRead (SoundFile, SoundBuffer^, 32768);
|
||||
SoundRead := 32768;
|
||||
PlayBack (SoundBuffer, 0, 16384);
|
||||
Upper := false;
|
||||
end else begin
|
||||
{can be played at once}
|
||||
BlockRead (SoundFile, SoundBuffer^, dataC.SoundLength);
|
||||
PlayBack (SoundBuffer, 0, dataC.SoundLength);
|
||||
SoundRead := dataC.SoundLength;
|
||||
{$I-}
|
||||
close(Soundfile);
|
||||
if ioresult>0 then;
|
||||
WavFileOpen:=False;
|
||||
{$I+}
|
||||
end;
|
||||
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
{Stops playing the sound file}
|
||||
procedure StopWave;
|
||||
begin
|
||||
DMAStop;
|
||||
end;
|
||||
|
||||
{$F+}
|
||||
procedure ExitWavePlayer;
|
||||
begin
|
||||
{$IFDEF Sound}
|
||||
{Restores the ExitProc pointer to the original value}
|
||||
ExitProc := OldEP;
|
||||
|
||||
{Stops any DMA-transfer that might be in progress}
|
||||
DMAStop;
|
||||
|
||||
{Free interrupt vectors used to service IRQs}
|
||||
case IRQ of
|
||||
2 : SetIntVec($71, OldIRQ);
|
||||
10 : SetIntVec($72, OldIRQ);
|
||||
11 : SetIntVec($73, OldIRQ);
|
||||
else
|
||||
SetIntVec (8 + IRQ, OldIRQ);
|
||||
end;
|
||||
|
||||
{Mask IRQs}
|
||||
case IRQ of
|
||||
2 : Port[$A1] := Port[$A1] or 2;
|
||||
10 : Port[$A1] := Port[$A1] or 4;
|
||||
11 : Port[$A1] := Port[$A1] or 8;
|
||||
else
|
||||
Port[$21] := Port[$21] or (1 shl IRQ);
|
||||
end;
|
||||
{$ENDIF}
|
||||
end;
|
||||
{$F-}
|
||||
|
||||
Procedure FindBlaster;
|
||||
var
|
||||
BLASTER : String;
|
||||
p : Byte;
|
||||
|
||||
begin
|
||||
{$IFDEF Sound}
|
||||
|
||||
Playing := false;
|
||||
Base := 0;
|
||||
{Get BLASTER environment string}
|
||||
(*BLASTER := GetEnv ('BLASTER');
|
||||
if (BLASTER = '') then Exit;*)
|
||||
|
||||
{Extract type of card from BLASTER string}
|
||||
Card := SB8;
|
||||
(* p := 0;
|
||||
repeat inc (p) until (BLASTER [p] = 'T') or (p > length (BLASTER));
|
||||
if BLASTER [p + 1] > '5' then Card := SB16; *)
|
||||
if Konfig.SBHiDMA>0 then Card:=SB16;
|
||||
{Extract base address from BLASTER string}
|
||||
(* p := 0;
|
||||
repeat inc (p) until (BLASTER [p] = 'A') or (p > length (BLASTER));
|
||||
Base := Ord (BLASTER [p + 2]) - Ord ('0');
|
||||
Base := (Base shl 4) + $200; *)
|
||||
Base:=konfig.SBBaseADR;
|
||||
{Extract IRQ level from BLASTER string}
|
||||
(* p := 0;
|
||||
repeat inc (p) until (BLASTER [p] = 'I') or (p > length (BLASTER));
|
||||
IRQ := Ord (BLASTER [p + 1]) - Ord ('0'); *)
|
||||
IRQ:=konfig.SBIRQ;
|
||||
{Extract low DMA channel from BLASTER string}
|
||||
(*p := 0;
|
||||
repeat inc (p) until (BLASTER [p] = 'D') or (p > length (BLASTER));
|
||||
DMA8 := Ord (BLASTER [p + 1]) - Ord ('0'); *)
|
||||
DMA8:=konfig.SBLoDMA;
|
||||
{Extract high DMA channel from BLASTER string}
|
||||
(*p := 0;
|
||||
repeat inc (p) until (BLASTER [p] = 'H') or (p > length (BLASTER));
|
||||
DMA16 := Ord (BLASTER [p + 1]) - Ord ('0'); *)
|
||||
DMA16:=Konfig.SBHiDMA;
|
||||
|
||||
{Enable speaker}
|
||||
SpeakerOn;
|
||||
|
||||
{Save old IRQ vector}
|
||||
case IRQ of
|
||||
2 : GetIntVec($71, OldIRQ);
|
||||
10 : GetIntVec($72, OldIRQ);
|
||||
11 : GetIntVec($73, OldIRQ);
|
||||
else
|
||||
GetIntVec (8 + IRQ, OldIRQ);
|
||||
end;
|
||||
|
||||
{Set new IRQ vector}
|
||||
case IRQ of
|
||||
2 : SetIntVec($71, Addr (ServiceIRQ));
|
||||
10 : SetIntVec($72, Addr (ServiceIRQ));
|
||||
11 : SetIntVec($73, Addr (ServiceIRQ));
|
||||
else
|
||||
SetIntVec (8 + IRQ, Addr (ServiceIRQ));
|
||||
end;
|
||||
|
||||
{Enable IRQ}
|
||||
case IRQ of
|
||||
2 : Port[$A1] := Port[$A1] and not 2;
|
||||
10 : Port[$A1] := Port[$A1] and not 4;
|
||||
11 : Port[$A1] := Port[$A1] and not 8;
|
||||
else
|
||||
Port[$21] := Port[$21] and not (1 shl IRQ);
|
||||
end;
|
||||
if IRQ in [2, 10, 11] then Port[$21] := Port[$21] and not 4;
|
||||
|
||||
{Save ExitProc pointer and set it to our own exit procedure.
|
||||
The ExitProc procedure is called after the main (calling)
|
||||
programme terminates. The main programme doesn't have to take
|
||||
care of resetting the IRQs and so on.}
|
||||
OldEP := ExitProc;
|
||||
ExitProc := Addr (ExitWavePlayer);
|
||||
|
||||
{$ENDIF}
|
||||
end;
|
512
XPXBIN.PAS
Executable file
512
XPXBIN.PAS
Executable file
@ -0,0 +1,512 @@
|
||||
{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ ³
|
||||
³ X - P a c k e t ³
|
||||
³ ³
|
||||
³ ³
|
||||
³ X P X B I N . P A S ³
|
||||
³ ³
|
||||
³ X-Protokoll-Verarbeitung ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
|
||||
|
||||
|
||||
Function CRC_Zeile (CRCZeile : string) : String;
|
||||
|
||||
var CRC : Word;
|
||||
z : word;
|
||||
|
||||
Begin
|
||||
CRC:=0;
|
||||
for z := 1 to length(CRCZeile)
|
||||
do CRC := g^.crcFeld[(CRC shr 8)] xor ((CRC shl 8) or ORD(CRCZeile[z]));
|
||||
{if xbtest then crc:=0;
|
||||
xbtest:=false;}
|
||||
CRC_zeile:=HEx(CRC,4);
|
||||
End;
|
||||
|
||||
|
||||
Procedure XBinAbbruch(kanal : byte);
|
||||
begin
|
||||
with k[kanal]^ do
|
||||
begin
|
||||
s_pac(kanal,nu,true,#13+Meldung[10]+#13);
|
||||
s_pac(kanal,nu,true,M1+'XBIN-TX abgebrochen.'+m1);
|
||||
{ xbtest:=true;}
|
||||
CloseXBinProt(kanal);
|
||||
FiResult := CloseBin(TxFile);
|
||||
xbin.an:=false;
|
||||
xbin.rx:=false;
|
||||
xbin.tx:=false;
|
||||
xbin.eof:=false;
|
||||
xbin.rtxok:=true;
|
||||
|
||||
rx_save:=false;
|
||||
BoxZaehl:=5;
|
||||
setzeflags(kanal);
|
||||
end;
|
||||
end;
|
||||
|
||||
Function Endung(Kanal:byte) : Str8;
|
||||
begin
|
||||
Endung:= sfillstr(3,'0',int_str(Kanal));
|
||||
end;
|
||||
|
||||
Procedure OpenXBinProt {(Kanal:byte)};
|
||||
begin
|
||||
with K[kanal]^ do
|
||||
begin
|
||||
assign(XbinPFile, Sys1Pfad+XBinProtokoll+Endung(Kanal));
|
||||
rewrite(XBinPfile);
|
||||
xbin.ProtPos:=0;
|
||||
xbin.pdat:=true;
|
||||
xbin.retries:=0;
|
||||
xbin.datpos:=0;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
Procedure CloseXBinProt {(Kanal:byte)};
|
||||
begin
|
||||
with K[kanal]^ do
|
||||
begin
|
||||
close(XBinPfile);
|
||||
xbin.pdat:=false;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{XBinCheck (kanal : Byte; XBinZ:string; DtPos:longint; XZeile:string);}
|
||||
Procedure XBinCheck;
|
||||
|
||||
VAR CRC1, CRC2 : Str8;
|
||||
i,
|
||||
frNr : byte;
|
||||
proto:xbinfile_;
|
||||
Art : char;
|
||||
bef:integer;
|
||||
rept:string;
|
||||
firesult:word;
|
||||
|
||||
begin
|
||||
with K[kanal]^ do
|
||||
begin
|
||||
if not xbin.pdat then
|
||||
begin
|
||||
OpenXBinProt(kanal);
|
||||
xbin.ProtPos:=0;
|
||||
end;
|
||||
delete (XBinZ, 1,2);
|
||||
|
||||
art:=xbinz[1];
|
||||
delete(xbinz,1,1);
|
||||
|
||||
if Art=#255 then
|
||||
begin
|
||||
frnr:=ord(XbinZ[1]);
|
||||
if frnr>XBin.FrameNr then
|
||||
begin
|
||||
i:=Length(XZeile);
|
||||
rept:=EFillStr(i,#0,rept);
|
||||
while frnr>xbin.framenr do
|
||||
begin
|
||||
BlockWrite(RXFile,rept,i,bef);
|
||||
if xbin.pdat then
|
||||
begin
|
||||
Proto.DatPos:=DtPos;
|
||||
Proto.FrameNr:=XBin.FrameNr;
|
||||
Proto.OK:=false;
|
||||
proto.rxcrc:='FAIL';
|
||||
proto.crc:='URE!';
|
||||
write(XBinPfile, Proto);
|
||||
end;
|
||||
DtPos:=FilePos(RxFile);
|
||||
inc(Xbin.FrameNr);
|
||||
end;
|
||||
rept:='';
|
||||
end else Proto.FrameNr:=frnr;
|
||||
|
||||
delete(XbinZ,1,1);
|
||||
CRC1:=XBinZ;
|
||||
|
||||
|
||||
if xbin.pdat then
|
||||
begin
|
||||
Proto.DatPos:=DtPos;
|
||||
if not xbin.RTXOK then
|
||||
begin
|
||||
seek(XBinPFile, Proto.FrameNr);
|
||||
read (xbinpfile, proto);
|
||||
seek(RXFile, Proto.DatPos);
|
||||
seek(XBinPFile, Proto.FrameNr);
|
||||
end;
|
||||
crc2:=CRC_Zeile(XZeile);
|
||||
if CRC2<>CRC1 then Proto.OK:=false else Proto.OK:=true;
|
||||
proto.rxcrc:=CRC1;
|
||||
proto.crc:=crc2;
|
||||
|
||||
write(XBinPfile, Proto);
|
||||
end;
|
||||
inc(Xbin.FrameNr);
|
||||
end {if art=255}
|
||||
else begin {art=0}
|
||||
|
||||
bef:=ord(XBinZ[1]);
|
||||
|
||||
case bef of
|
||||
TRASK:
|
||||
begin
|
||||
if xbin.rtxok then XBin.DatPosA:=filePos(RXFile);
|
||||
xbin.rtxok:=true;
|
||||
{xbin.pdat:=false;}
|
||||
reset(XbinPFile);
|
||||
rept:='';
|
||||
while not EOF(xbinpfile) do
|
||||
begin
|
||||
read(xbinpfile, proto);
|
||||
if not proto.ok then rept:=rept+chr(Proto.framenr);
|
||||
end;
|
||||
if rept<>'' then
|
||||
begin
|
||||
xbin.rtxok:=false;
|
||||
if length(rept)>5 then
|
||||
begin
|
||||
rept:=copy(rept,1,5);
|
||||
end;
|
||||
|
||||
s_pac(kanal,nu,true,xprot+COMD+chr(REP)+rept);
|
||||
{xbin.pdat:=true;}
|
||||
end else
|
||||
begin
|
||||
s_pac(kanal,nu,true,xprot+COMD+chr(TROK));
|
||||
{rewrite(XBinPFile);}
|
||||
xbin.ProtPos:=FilePos(XBinPFile);
|
||||
seek(RXFile, XBin.DatPosA);
|
||||
xbin.FrameNr:=0;
|
||||
end;
|
||||
end; {TRASK}
|
||||
|
||||
TROK:
|
||||
begin
|
||||
if XBin.EOF then
|
||||
begin
|
||||
s_pac(kanal,nu,true,xprot+COMD+chr(XEOF));
|
||||
s_pac(kanal,nu,true,M1+'XBIN-TX abgeschlossen.'+m1);
|
||||
{ xbtest:=true;}
|
||||
CloseXBinProt(kanal);
|
||||
FiResult := CloseBin(TxFile);
|
||||
xbin.an:=false;
|
||||
xbin.rx:=false;
|
||||
xbin.tx:=false;
|
||||
xbin.eof:=false;
|
||||
xbin.rtxok:=true;
|
||||
|
||||
rx_save:=false;
|
||||
BoxZaehl:=5;
|
||||
setzeflags(kanal);
|
||||
end else
|
||||
begin
|
||||
{Rewrite(XbinPFile);}
|
||||
xbin.ProtPos:=FilePos(XBinPFile);
|
||||
seek(TXFile, XBin.DatPosA);
|
||||
end;
|
||||
filesendwait:=false;
|
||||
xbin.FrameNr:=0;
|
||||
end; {TROK}
|
||||
|
||||
REP:
|
||||
begin
|
||||
xbin.Nachford:=xbin.Nachford+copy(xbinZ, 2, length(xbinz));
|
||||
filesendwait:=false;
|
||||
xbin.rtxok:=false;
|
||||
end; {REP}
|
||||
|
||||
XEOF:
|
||||
begin
|
||||
xbin.rx:=false;
|
||||
xbin.tx:=false;
|
||||
rx_save:=false;
|
||||
xbin.eof:=false;
|
||||
xbin.rtxok:=true;
|
||||
BoxZaehl:=5;
|
||||
CloseXBinProt(kanal);
|
||||
CloseRxFile(Kanal,0);
|
||||
xbin.an:=false;
|
||||
setzeflags(kanal);
|
||||
s_pac(kanal,nu,true,M1+'XBIN-RX abgeschlossen.'+m1);
|
||||
end; {xeof}
|
||||
end;
|
||||
end;
|
||||
end; {with kanal...}
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{**}
|
||||
|
||||
{Function XBinStr (Kanal : Byte; Zeile : String; TXPos:longint) : String;}
|
||||
Function XBinStr;
|
||||
var hstr:string;
|
||||
proto:xbinfile_;
|
||||
begin
|
||||
with K[kanal]^ do
|
||||
begin
|
||||
hstr:=xprot+#255+chr(XBin.FrameNr)+CRC_Zeile(Zeile);
|
||||
XBinStr:=HStr;
|
||||
if not XBin.pdat then OpenXBinProt(kanal);
|
||||
if (XBin.PDat) and (Xbin.RTXok) then
|
||||
begin
|
||||
Proto.retries:=0;
|
||||
Proto.FrameNr:=XBin.FrameNr;
|
||||
Proto.DatPos :=TXPos;
|
||||
Proto.RXCRC:='XBTX';
|
||||
Proto.CRC:='XBTX';
|
||||
Proto.OK:=true;
|
||||
write(XBinPFile, Proto);
|
||||
end;
|
||||
|
||||
inc(xbin.FrameNr)
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
Function Position(Fnr :Byte; kanal : Byte) : longint;
|
||||
var proto:xbinfile_;
|
||||
begin
|
||||
with k[kanal]^ do
|
||||
begin
|
||||
close (XbinPFile); reset(XbinPFile);
|
||||
seek(xbinPfile, fnr);
|
||||
|
||||
read(xbinpfile, Proto);
|
||||
if xbin.tx then
|
||||
begin
|
||||
seek(xbinPfile, fnr);
|
||||
inc(proto.retries);
|
||||
write(xbinpfile, Proto);
|
||||
if proto.retries=11 then XBinAbbruch(kanal);
|
||||
end;
|
||||
xbin.framenr:=fnr;
|
||||
Position:=proto.DatPos;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure XBinWrite {(kanal:Byte; Zeile:string)};
|
||||
Var i,i1 : Integer;
|
||||
Free : LongInt;
|
||||
DatPos:longint;
|
||||
Result : Word;
|
||||
Hstr : String[80];
|
||||
VC : Char;
|
||||
Bstr : String;
|
||||
XBinRX : string;
|
||||
|
||||
begin
|
||||
with k[kanal]^ do
|
||||
begin
|
||||
if MldOk in [5,6,10] then
|
||||
begin
|
||||
if MldOk = 10 then
|
||||
begin
|
||||
FiResult := CloseBin(RxFile);
|
||||
FiResult := EraseBin(RxFile);
|
||||
if xbin.pdat then closeXBinProt(kanal);
|
||||
S_PAC(Kanal,NU,false,InfoZeile(41) + M1);
|
||||
Send_Prompt(Kanal,FF);
|
||||
end else CloseRxFile(Kanal,1);
|
||||
xbin.rx:=false; xbin.an:=false; xbin.tx:=false; xbin.framenr:=0;
|
||||
setzeFlags(kanal);
|
||||
end
|
||||
else
|
||||
begin
|
||||
|
||||
if length(zeile)>8 then
|
||||
begin
|
||||
XBinRX := copy (Zeile, 1, 8);
|
||||
delete (Zeile,1,8);
|
||||
end else
|
||||
begin
|
||||
XBinRX := Zeile;
|
||||
zeile:='';
|
||||
end;
|
||||
DatPos:=filePos(RXFile);
|
||||
XBinCHECK(Kanal, XBinRX, DatPos, Zeile);
|
||||
|
||||
i1 := length(Zeile);
|
||||
{if (RX_Count + i1) > RX_Laenge then i1 := Byte(RX_Laenge - RX_Count);}
|
||||
BlockWrite(RXFile,Zeile[1],i1,Result);
|
||||
RX_CRC := Compute_CRC(RX_CRC,copy(Zeile,1,Result));
|
||||
if XBin.RTXOk then RX_Count := RX_Count + i1;
|
||||
FileInfo(Kanal,0,RX_Laenge,RX_Count,0,0);
|
||||
|
||||
if RX_Count >= RX_Laenge then
|
||||
begin
|
||||
|
||||
{if xbin.pdat then closeXbinprot(kanal);}
|
||||
Result := Word(RX_CRC);
|
||||
BoxZaehl:=5;
|
||||
AutoBinOn := AutoBin;
|
||||
Ignore := false;
|
||||
SetzeFlags(Kanal);
|
||||
(*
|
||||
Hstr := Time_Differenz(RX_Time,Uhrzeit);
|
||||
Zeile := FName_aus_FVar(RxFile);
|
||||
While pos(BS,Zeile) > 0 do delete(Zeile,1,pos(BS,Zeile));
|
||||
|
||||
Zeile := M1 + B1 + InfoZeile(103) + B1 +
|
||||
EFillStr(14,B1,Zeile) + InfoZeile(100) +
|
||||
int_str(Result) + B2 + LRK + Hex(Result,4) + B1 +
|
||||
BdStr + FileBaud(Hstr,int_str(RX_Count)) + B2 +
|
||||
LRK + Hstr + RRK + M1;
|
||||
|
||||
if (RX_Soll_CRC > 0) and (Result <> RX_Soll_CRC)
|
||||
then Zeile := Zeile + B1 + InfoZeile(113) + ^G + M1;
|
||||
if SysArt in [1..6,14,18] then
|
||||
S_PAC(Kanal,NU,true,M1)
|
||||
else
|
||||
begin
|
||||
{S_PAC(Kanal,NU,false,Zeile);
|
||||
Send_Prompt(Kanal,FF);}
|
||||
end; *)
|
||||
end;
|
||||
end; {else (mldok)}
|
||||
end;{with kanal}
|
||||
end; {procedure xbinwrite}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Procedure XBinSend (* Kanal : Byte; OFlag : Boolean; *);
|
||||
Var Zeile : String;
|
||||
Hstr : String[9];
|
||||
i,l : Byte;
|
||||
ch : Char;
|
||||
FileEnde : Boolean;
|
||||
Result : Word;
|
||||
XBTrans : Boolean;
|
||||
TXSpos,
|
||||
DatPos : longint;
|
||||
Begin
|
||||
|
||||
FileEnde := false;
|
||||
Zeile := '';
|
||||
with K[Kanal]^ do
|
||||
Begin
|
||||
XBTrans:=(XBIN.tx);
|
||||
FileFlag := false;
|
||||
if XBin.TX then
|
||||
Begin
|
||||
if TxComp then l := maxCompPac
|
||||
else l := FF;
|
||||
|
||||
if XBTrans then l:=paclen-8;
|
||||
if xbtrans and txcomp then l:=Paclen-10;
|
||||
|
||||
if (not xbin.rtxok) and (xbin.nachford<>'') then
|
||||
begin
|
||||
reset(TXFile, t);
|
||||
TXSPos:=Position(ord(xbin.Nachford[1]), kanal);
|
||||
if xbin.tx then seek(TxFile, TXSPos);
|
||||
delete(xbin.Nachford,1,1);
|
||||
end;
|
||||
|
||||
if xbin.tx then
|
||||
begin
|
||||
if xbtrans then DatPos:=filepos(TXFile);
|
||||
|
||||
BlockRead(TxFile,Zeile[1],l,Result);
|
||||
|
||||
{if ((TX_Count + Result) > TX_Laenge) and (xbin.rtxok) then Result := TX_Laenge - TX_Count;}
|
||||
|
||||
Zeile[0] := chr(Byte(Result));
|
||||
if XBTRANS then Zeile:=XBinStr(Kanal, Zeile, DatPos)+Zeile;
|
||||
|
||||
{if XBTrans then Zeile[0] := chr(Byte(Result+7));}
|
||||
|
||||
if xbin.rtxok then
|
||||
begin
|
||||
TX_Count := TX_Count + Result;
|
||||
TX_CRC := Compute_CRC(TX_CRC,Zeile);
|
||||
end;
|
||||
|
||||
IF (not XBin.EOF) and (eof(TXFile)) then
|
||||
begin
|
||||
FileEnde := true;
|
||||
xbin.eof:=true;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{ if xbtest then Zeile[10]:='A';
|
||||
xbtest:=false;}
|
||||
|
||||
S_PAC(Kanal,NU,true,Zeile);
|
||||
FileInfo(Kanal,1,TX_Laenge,TX_Count,0,0);
|
||||
|
||||
if (not xbin.rtxok) and (xbin.nachford='') then
|
||||
begin
|
||||
fileende:=true;
|
||||
end;
|
||||
{ 255 }
|
||||
if (xbin.rtxok) and (xbin.frameNr=XBinMaxFrame) then
|
||||
begin
|
||||
s_pac(kanal,nu,true,xprot+COMD+chr(TRASK));
|
||||
FileSendWait:=true;
|
||||
xbin.DatPosA:=FilePos(TXFile);
|
||||
end;
|
||||
|
||||
if FileEnde then
|
||||
Begin
|
||||
TNC_Puffer := false;
|
||||
FileSend := false;
|
||||
Result := Word(TX_CRC);
|
||||
boxzaehl:=5;
|
||||
|
||||
if not DirScroll then SetzeFlags(Kanal);
|
||||
|
||||
(* Hstr := Time_Differenz(TX_Time,Uhrzeit);
|
||||
Zeile := FName_aus_FVar(TxFile);
|
||||
While pos(BS,Zeile) > 0 do delete(Zeile,1,pos(BS,Zeile));
|
||||
|
||||
Zeile := M1 + B1 + InfoZeile(102) + B1 +
|
||||
EFillStr(14,B1,Zeile) + InfoZeile(100) +
|
||||
int_str(Result) + B2 + LRK + Hex(Result,4) + B1 +
|
||||
BdStr + FileBaud(Hstr,int_str(TX_Count)) + B2 +
|
||||
LRK + Hstr + RRK + M1;
|
||||
|
||||
if OFlag then _aus(Attrib[20],Kanal,Zeile);
|
||||
{ if FileSendRem then
|
||||
begin }
|
||||
if SysArt in [1..6,14,18] then
|
||||
S_PAC(Kanal,NU,true,M1)
|
||||
else
|
||||
begin if not XBin.An then
|
||||
begin
|
||||
S_PAC(Kanal,NU,false,Zeile);
|
||||
Send_Prompt(Kanal,FF);
|
||||
end else
|
||||
begin *)
|
||||
S_pac(kanal,NU,TRUE,'');
|
||||
s_pac(kanal,nu,true,xprot+COMD+chr(TRASK));
|
||||
|
||||
xbin.Nachford:='';
|
||||
xbin.framenr:=0;
|
||||
xbin.ok:=false;
|
||||
{xbin.pdat:=false;}
|
||||
xbin.datpos:=0;
|
||||
xbin.retries:=0;
|
||||
xbin.rtxok:=true;
|
||||
|
||||
fileende:=false;
|
||||
filesendwait:=true;
|
||||
(*
|
||||
end;
|
||||
end; *)
|
||||
{ end else S_PAC(Kanal,NU,true,''); }
|
||||
FileSendRem := false;
|
||||
End;
|
||||
End;
|
||||
end; {if xbin.tx}
|
||||
FileFlag := false;
|
||||
End;
|
||||
End;
|
147
XPXMS.PAS
Executable file
147
XPXMS.PAS
Executable file
@ -0,0 +1,147 @@
|
||||
Unit XPXMS;
|
||||
{$F+}
|
||||
|
||||
Interface
|
||||
|
||||
|
||||
Const ixms = $2F;
|
||||
|
||||
Var XMS_Version,
|
||||
XMS_Treiber,
|
||||
HMA : Word;
|
||||
XMS_installed : Boolean;
|
||||
Failure : Byte;
|
||||
|
||||
XmsControl : Pointer;
|
||||
|
||||
RecXms : record { XMS-INFOBLOCK }
|
||||
Len : LongInt; { length of Bytes }
|
||||
fr_Handle : Word; { source handle }
|
||||
fr_Adr : LongInt; { source pointer }
|
||||
to_Handle : Word; { destination handle }
|
||||
to_Adr : LongInt; { destination pointer }
|
||||
end;
|
||||
|
||||
|
||||
Procedure get_XMS_Install;
|
||||
Function get_XMS_Free : Word;
|
||||
Function get_XMS_Ram(SizeKb : Word) : Word;
|
||||
Procedure Free_XMS_Ram(Handle : Word);
|
||||
Procedure Data_To_XMS(Source : Pointer; Handle : Word; Adresse,Count : LongInt);
|
||||
Procedure Xms_To_Data(Source : Pointer; Handle : Word; Adresse,Count : LongInt);
|
||||
Procedure Init_XMS;
|
||||
|
||||
Implementation
|
||||
|
||||
Procedure get_XMS_Install;
|
||||
var Erg : Byte;
|
||||
Begin
|
||||
Erg := 0;
|
||||
if not XMS_installed then
|
||||
begin
|
||||
asm mov ax, $4300
|
||||
int ixms
|
||||
mov Erg, al
|
||||
cmp al, $80
|
||||
jne @NoDrv
|
||||
|
||||
mov ax, $4310
|
||||
int ixms
|
||||
mov Word(XmsControl),bx
|
||||
mov Word(XmsControl+2),es
|
||||
|
||||
xor ah,ah
|
||||
call XmsControl
|
||||
mov XMS_Version,ax
|
||||
mov XMS_Treiber,bx
|
||||
mov HMA,dx
|
||||
|
||||
@NoDrv:
|
||||
end;
|
||||
XMS_installed := (Erg = $80);
|
||||
end;
|
||||
End;
|
||||
|
||||
Function get_XMS_Free : Word;
|
||||
var Free : Word;
|
||||
Begin
|
||||
asm mov ah,$08
|
||||
call XmsControl
|
||||
mov Free,ax
|
||||
mov Failure,bl
|
||||
end;
|
||||
get_XMS_Free := Free;
|
||||
End;
|
||||
|
||||
Function get_XMS_Ram(SizeKb : Word) : Word;
|
||||
var Handle : Word;
|
||||
Begin
|
||||
asm mov ah, $09
|
||||
mov dx, SizeKb
|
||||
call XmsControl;
|
||||
mov Handle, dx
|
||||
end;
|
||||
get_XMS_Ram := Handle;
|
||||
End;
|
||||
|
||||
Procedure Free_XMS_Ram(Handle : Word);
|
||||
Begin
|
||||
asm mov ah, $0A
|
||||
mov dx, Handle
|
||||
call XmsControl;
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Data_To_XMS(Source : Pointer; Handle : Word; Adresse,Count : LongInt);
|
||||
var Erg : Word;
|
||||
m : Pointer;
|
||||
Begin
|
||||
m := Addr(RecXms);
|
||||
If Count mod 2 <> 0 then inc(Count);
|
||||
|
||||
RecXms.Len := count;
|
||||
RecXms.fr_Handle := 0;
|
||||
RecXms.fr_Adr := LongInt(Source);
|
||||
RecXms.to_Handle := handle;
|
||||
RecXms.to_adr := Adresse;
|
||||
asm mov ah, $0b
|
||||
mov si, Word [m]
|
||||
mov bl,0
|
||||
call XmsControl
|
||||
mov Erg, ax
|
||||
mov Failure,bl
|
||||
end;
|
||||
End;
|
||||
|
||||
|
||||
Procedure Xms_To_Data(Source : Pointer; Handle : Word; Adresse,Count : LongInt);
|
||||
var Erg : Word;
|
||||
m : Pointer;
|
||||
Begin
|
||||
m := Addr(RecXms);
|
||||
If Count mod 2 <> 0 then inc(Count);
|
||||
|
||||
RecXms.Len := count;
|
||||
RecXms.to_Handle := 0;
|
||||
RecXms.to_adr := LongInt(Source);
|
||||
RecXms.fr_Handle := Handle;
|
||||
RecXms.fr_Adr := Adresse;
|
||||
|
||||
asm mov ah, $0b
|
||||
mov si, Word [m]
|
||||
mov bl,0
|
||||
call XmsControl
|
||||
mov Erg, ax
|
||||
mov Failure,bl
|
||||
end;
|
||||
End;
|
||||
|
||||
Procedure Init_XMS;
|
||||
Begin
|
||||
XMS_installed := false;
|
||||
get_XMS_Install;
|
||||
End;
|
||||
|
||||
End.
|
||||
|
Loading…
Reference in New Issue
Block a user