(C) WLODEK BLACK
Hello!
BASIC CALCULATOR
It is well known, and many have met with this: in the assembler
programs sometimes arises the need for complicated
mathematical calculations, algorithms which are beyond the
ADD, SBC, or RR. Programming such a "math" hard ... K
Fortunately, he provides us with the Spectrum tool for
mathematical problems in mashinnokodovyh programs. This
BASIC calculator - a powerful module of the operating system to
which can be accessed as a set of procedures for the
calculations. The calculator consists of an evaluator and
set of procedures for obtaining input data and issue
finished results. Site purebasic .
Stack calculator
Input data, which will operate the calculator,
placed in a designated area of memory - a stack of
calculator. With the engine stack it unites the principle of
organization - "Last in - first out". Beginning and end of the
stack calculator can be found in the system variables and STKBOT
STKEND (23651 and 23653; words). Should not be without at
need to change these addresses. One item of data for
Calculator - 5-byte numbers in the format of BASIC or
parameters are string values (starting address and length of
the string). Thus, each value on the stack calculator takes 5
bytes. Another property of the stack calculator - it grows from
the bottom up.
To perform any action on numbers, they should be
put on a stack calculator. For example, we must add 5 and
7: send in a stack of 5, then 7, then execute the operation
"Fold." For entry into the stack calculator data available
multiple entry points for the "CALL":
# 2D22 - STK-DIGIT. Accumulator value = digit in ASCII -> stack
(The figures);
# 2D28 - STACK-A. Battery -> stack (in the form of a "floating
comma ");
# 2D2B - STACK-BC. BC -> stack (-"-);
# 2AB1 - STK-STORE. A, E, D, C, B -> stack in 5-byte internal
format, just send string parameters (in this case A = 0);
# 2ABB - the same without checks on the correctness (sometimes
useful, if the system is deliberately distorted BASIC).
(How many of you had at one time worked with a programmable
calculator Elektronika MK-54 "(61, 52), must immediately
see the complete identity of the stack of the calculator and
that. There are no psychological barriers - remember how you
used a calculator, and also program the
BASIC calculator ZX! The principle is absolutely the same:
first, recorded on the data stack, then enter the codes of
operations on them). Here's how it will look an example of "5
+7" in the form sequence of instructions in assembly language:
LD A, 5, number 5
CALL # 2D28; STACK-A - A enters the stack
LD A, 7, number 7
CALL # 2D28
RST # 28; call calculator
DEFB # 0F; code addition
DEFB # 38; completion calculator
CALL # 2DA2; FP-TO-BC - a stack -> BC.
At the exit from the sample in a pair of BC will be the result
of calculations. If you call an example of a PRINT USR, be
printed result. Of course, add numbers such as 5 and 7, we can
easily and straight into the machine code, but it was only an
example showing how to work with a calculator.
Team RST # 28 is called a calculator. All subsequent bytes
will be regarded as the operation code calculator, until
meet code # 38 - the symbol of the end of the calculator.
Result of the calculation is placed on top of the current
stack. His can be removed from the stack, or print on the
screen or printer or leave on the stack for subsequent
calculations. That sets procedures to obtain the results of
calculations:
# 2BF1 - STK-FETCH. Removes from the stack the last value and
puts it in the registers B, C, D, E, A. If the stack was
parameters of a character string, then: DE - start address, BC
- length; # 2DA2 - FP-TO-BC. Removes from the stack and places
high value it in a couple of BC, rounded to the nearest integer
(int (N +0.5)); # 2DD5 - FP-TO-A - the same, but the placement
of a 1-byte result a battery;
# 2DE3 - PRINT-FP - prints the current flow (associated with
screen, printer or other device), the value from the top
stack calculator in a form most suitable for the particular
value (whole or real). Options from the top of the stack
calculator is considered as number, if they are
parameters of the line, will be printed as a number (this
would be a mistake);
# 203C - prints the string given by: DE = address of the
beginning, BC = length. Can be used independently of the
calculator - easy to print character strings.
In the above example "5 +7" may be inserted at the end of CALL
# 2DE3 to output the result.
When using the PRINT-FP needed to take care of
inclusion of the desired channel and stream to output the
results:
LD A, STREAM
CALL # 1601
STREAM - channel number:
1 - service line screen;
2 - the main screen;
3 - printer.
The calculator performs the action and on the symbolic values.
Here is a list of operation codes calculator has both
DEFB after "RST # 28":
# 00 - jump true
# 01 - exchange
# 02 - delete
# 03 - subtract (subtraction; X-Y)
# 04 - mult (multiplication; X * Y)
# 05 - div (division; Y / X)
# 06 - to-power (exponentiation; X ^ Y)
# 07 - or
# 08 - no-'-no
# 09 - no-l-eq
# 0A - no-gr-eq
# 0B - nos-eql
# 0C - no-gtr
# 0D - no-less
# 0E - nos-eql
# 0F - add (addition; X + Y)
# 10 - str-'-no
# 11 - str-l-eq
# 12 - str-gr-eq
# 13 - strs-negl
# 14 - str-gtr
# 15 - str-less
# 16 - str-gtr
# 17 - strs-add
# 18 - val $ (recursion, only through the fp-calc-2)
# 19 - usr-s
# 1A - read-in
# 1B - neg
# 1C - code
# 1D - val (recursion, only through the fp-calc-2)
# 1E - len
# 1F - sin
# 20 - cos
# 21 - tan
# 22 - asn
# 23 - acs
# 24 - atn
# 25 - ln
# 26 - exp
# 27 - int
# 28 - sqr
# 29 - sgn
# 2A - abs
# 2B - peek
# 2C - int (Y +0.5)
# 2D - user-no
# 2E - str $
# 2F - chr $
# 30 - not
# 31 - duplicate
# 33 - jump
# 34 - stk-data
# 35 - djnz
# 36 - less-0
# 37 - greater-0
# 38 - end-calc (completion of the work with a calculator)
# 39 - get-argt
# 3A - trunc
# 3B - fp-calc-2 (secondary call calculator - Recursion)
# 3C - e-to-fp
# 3D - restack (Y integer -> Y in the floating form)
# 86 and beyond - series-2006
# A0 - 0 (constant, entering the stack constant)
# A1 - 1
# A2 - 1 / 2
# A3 - PI / 2
# C0 and more - st-mem-0
# E0, and more - get-mem-0
If a single operation - the result replaces the source operand
on top of the stack. If the operation is a two-place - are
removed from the stack two source operands and the result is
placed on the new vertex stack. Operations on string values
vyponyayutsya not stack calculator - for them is given a
place in time workspace on the calculator stack placed only
pointers to the location of the string data: the start address
Line and length (in the registers of the processor is: DE =
address of the beginning, BC = length). Since one element of
the stack contains 5 bytes as unused fifth byte is entered 0.
The group of service procedures to Record has the following
subprograms:
# 16B0 - cleaning editorial line, a temporary workspace
and a stack calculator;
# 16BF - clearing the temporary working area and a stack
calculator; # 16C5 - cleaning up the stack calculator.
In the next issue we consider: input of arbitrary
real numbers; transmission parameters of the USR-sub
BASIC Variable BASIC; input string values in character
variables USRpodprogrammu through BASIC (for example, WORDSERV
utilities, etc., in which the file names are entered through
INPUT BASIC, and are used in mashinnokodovyh programs).
To be continued.