(C) Maximum / INTEGER
Hello, dear readers
ADVENTURER 'a, it's you again worries
Maximum with his unquenchable thirst chtoto write in assembly
language ...
This time I present to your court
rather complex protsedurki, although
someone like ... In this article will focus on
metematike rampant, everyone there cosines and roots,
multiplied by the sine!
Well, to the body, ie, to the point:
Many people probably do not like the speed of the built-in
calculator, but with numbers need to somehow work, many write
clever protsedurki such as division of H on L, and the output
of the integer part of D, E in the fractional part of the sine
is calculated from the tables, etc., etc.
Here are the procedures in the library version 1. 0, it
included:
- Addition;
- Subtraction;
- Multiplication;
- Division;
- Cosine;
- Sinus;
- A few auxiliary procedures.
All these operations operate on the IEEE
numbers (real) band which
-5. 9E-39 to +3. 4E38, processed
7 digits after the decimal point, which is very accurate!
To represent these numbers need
only 4 bytes, in the form of mantissa-order.
For operations on IEEE numbers used registers DE, HL, D - for
the storage order, EHL - to store the mantissa, 7-bit Register
H - stores number sign.
For example:
H L E D
2 = 01000000 00000000 00000000 00000001
= # 40 # 00 # 00 # 01
1 = 01000000 00000000 00000000 00000000
= # 40 # 00 # 00 # 00
-12.5
= 11100100 00000000 00000000 00000011
= # E4 # 00 # 00 # 03
0.1
= 01100110 01100110 01100110 11111100
= # 66 # 66 # 66 # FC
For ease of IEEE were
written by two auxiliary procedures
to transfer numbers from one number system to another, ie, in
IEEE Int, and vice versa (Int - this word with sign).
These procedures may arise
mathematical errors, in this case
vent to ERROR, and Reg. A
will be:
1 - overflow numbers;
2 - when divided by zero.
This should insert its own procedure
processing oschibok until there RET.
We now describe the procedures:
1. Add two IEEE numbers.
At the entrance: the stack IEEE number to which you want
to add, and DE, HL - that add.
At the exit: DE, HL - sum of the numbers.
Example: We need to add 2 and 10:
LD DE, # 0100; it
LD HL, # 4000, number 2
PUSH HL; enters
PUSH DE; on stack
LD DE, # 0300; it
LD HL, # 5000; number 10
CALL IEEE_Add
...
(Note that the number is entered on the stack, the first
HL, and then DE!)
2. The difference between two IEEE numbers.
At the entrance: the stack IEEE number, from
which should be taken away, and in DE, HL - that
rob.
At the exit: DE, HL - the difference between the numbers.
Example: You must take 1 of 2:
LD DE, # 0100; it
LD HL, # 4000, number 2
PUSH HL; enters
PUSH DE; on stack
LD DE, # 0000 is
LD HL, # 4000; number 1
CALL IEEE_Sub
...
3. Multiplication of two IEEE numbers.
At the entrance: the stack IEEE number that you multiply,
and in DE, HL - at that multiply.
At the exit: DE, HL - Multiplication
number.
Example: multiply 10 by 2:
LD DE, # 0300; it
LD HL, # 5000; number 10
PUSH HL; enters
PUSH DE; on stack
LD DE, # 0100; it
LD HL, # 4000, number 2
CALL IEEE_Mul
...
4. Dividing the two IEEE numbers.
At the entrance: the stack IEEE number to be divided, and
in DE, HL - at that Radel.
At the exit: DE, HL - split number.
Example: you divide 10 by 2:
LD DE, # 0300; it
LD HL, # 5000; number 10
PUSH HL; enters
PUSH DE; on stack
LD DE, # 0100; it
LD HL, # 4000, number 2
CALL IEEE_Div
...
5. Translated from format to format Int
IEEE.
At the entrance: the HL - the number for the translation.
At the exit: DE, HL - IEEE number.
Example: We need to convert the number 20 in the
IEEE format:
LD HL, 20
CALL Int_IEEE
...
For the number -20 is:
LD HL, -20
CALL Int_IEEE
6. Translated from the format in the IEEE format
Int.
At the entrance: DE, HL - the number for the translation.
The output of: HL - Int number.
7. Returns the integer portion of the IEEE
numbers in the form Int HL.
At the entrance: DE, HL - IEEE number.
The output of: HL - Int number.
Example:
...
LD DE, num_1
LD HL, num_2
CALL IEEE_Trunc
...
8. Cosine.
At the entrance: DE, HL - degree specified
in radians.
At the exit: DE, HL - cosine of a number.
Example:
...
LD DE, num_1
LD HL, num_2
CALL IEEE_Cos
...
9. Sine.
At the entrance: DE, HL - degree specified
in radians.
At the exit: DE, HL - sine of a number.
Example:
...
LD DE, num_1
LD HL, num_2
CALL IEEE_Sin
...
10. Square of the number.
At the entrance: DE, HL - number.
At the exit: DE, HL - square numbers.
Example:
...
LD DE, num_1
LD HL, num_2
CALL IEEE_Square
...
Well, sort of, and all that is necessary for
normal operation with the library.
See you in the next room ...
Math Library
17-19.03.99 (C) Maximum / iNTEGER
ERR_Overflow EQU 1
ERR_Div_by_0 EQU 2
ERROR ret
IEEE_Add - Addition of two IEEE numbers:
LD DE, num0_1
LD HL, num0_2
PUSH HL
PUSH DE
LD DE, num1_1
LD HL, num1_2
CALL IEEE_Add
IEEE_Add
bit 6, h
jp z, exit_2
ld iy, 0
add iy, sp
ld a, h
ld b, (iy +5)
bit 6, b
jr z, IEEE_A6
xor b
push af
push de
ld a, d
ld d, b
ld b, e
ld e, (iy +4)
sub (iy +3)
jp pe, IEEE_A7
jp m, IEEEA13
ld c, (iy +2)
jr z, IEEEA14
IEEE_A1 push hl
res 7, d
res 7, h
IEEE_A2 srl d
rr e
rr c
dec a
jr nz, IEEE_A2
ld a, b
bit 7, (iy-1)
jr nz, IEEE_A8
IEEE_A3 add a, c
adc hl, de
pop bc
pop de
jp po, IEEE_A4
srl h
rr l
rra
inc d
jp pe, IEEEA12
IEEE_A4 ld e, a
ld a, b
and # 80
or h
ld h, a
IEEE_A5 pop af
IEEE_A6 pop bc
pop af
pop af
push bc
ret
IEEE_A7 pop de
jr nc, exit_1
jr IEEE_A5
IEEE_A8 sub c
sbc hl, de
IEEE_A9 pop bc
IEEEA10 pop de
IEEEA11 bit 6, h
jr nz, IEEE_A4
add a, a
adc hl, hl
dec d
jp po, IEEEA11
IEEEA12 ld sp, iy
pop bc
pop hl
pop hl
push bc
IEEE_Ov ld a, ERR_Overflow
jp ERROR
IEEEA13 ld c, b
ld b, (iy +3)
ld (iy-3), b
ld b, (iy +2)
ex de, hl
neg
jr IEEE_A1
IEEEA14 ld a, b
push hl
res 7, h
res 7, d
bit 7, (iy-1)
jr z, IEEE_A3
sub c
sbc hl, de
jr nz, IEEEA15
or a
jr z, IEEEA16
IEEEA15 jr nc, IEEE_A9
ld de, 0
ex de, hl
ld c, a
pop af
cpl
ld b, a
xor a
sub c
sbc hl, de
jr IEEEA10
IEEEA16 ld d, h
ld e, h
pop af
pop af
jr IEEE_A5
exit_1 pop af
exit_2 pop bc
pop de
pop hl
push bc
ret
IEEE_Sub - The difference between the two IEEE numbers:
LD DE, num0_1
LD HL, num0_2
PUSH HL
PUSH DE
LD DE, num1_1
LD HL, num1_2
CALL IEEE_Sub
IEEE_Sub
ld a, # 80
xor h
ld h, a
jp IEEE_Add
IEEE_Mul - Multiplication IEEE numbers:
LD DE, num0_1
LD HL, num0_2
PUSH HL
PUSH DE
LD DE, num1_1
LD HL, num1_2
CALL IEEE_Mul
IEEE_Mul
ld iy, 0
add iy, sp
ld a, # 40
and h
ld b, (iy +5)
and b
jr z, IEEE_M9
ld a, h
xor b
and # 80
ld b, a
ld a, (iy +3)
add a, d
ld c, a
jp pe, IEEEA12
push bc
res 7, h
ld c, e
xor a
ex de, hl
ld l, (iy +2)
ld b, 8
IEEE_M1 rr l
jr nc, IEEE_M2
add a, d
IEEE_M2 rra
djnz IEEE_M1
rr l
ld h, a
ld a, (iy +4)
ld b, 8
IEEE_M3 rra
jr nc, IEEE_M4
add hl, de
IEEE_M4 rr h
rr l
djnz IEEE_M3
rra
ld b, 7
IEEE_M5 rr (iy +5)
jr nc, IEEE_M6
add a, c
adc hl, de
IEEE_M6 rr h
rr l
rra
djnz IEEE_M5
pop bc
ld e, a
ld d, c
bit 6, h
jr nz, IEEE_M7
rl e
adc hl, hl
jr IEEE_M8
IEEE_M7 inc d
jp pe, IEEEA12
IEEE_M8 ld a, b
or h
ld h, a
pop bc
pop af
pop af
push bc
ret
IEEE_M9 pop hl
pop de
ex (sp), hl
ld hl, 0
ld e, h
ld d, l
ret
IEEE_Div - Division Two IEEE numbers:
LD DE, num0_1
LD HL, num0_2
PUSH HL
PUSH DE
LD DE, num1_1
LD HL, num1_2
CALL IEEE_Sub
IEEE_Div
bit 6, h
ld a, ERR_Div_by_0
jp z, ERROR
ld iy, 0
add iy, sp
ld b, (iy +5)
bit 6, b
jp z, IEEE_M9
ld a, (iy +3)
sub d
jp pe, IEEEA12
push af
ld d, b
ld c, e
ld e, (iy +4)
ld a, d
xor h
and # 80
res 7, d
res 7, h
push af
ex de, hl
ld a, (iy +2)
ld b, # 08
IEEE_D1 sub c
sbc hl, de
jr nc, IEEE_D2
add a, c
adc hl, de
IEEE_D2 rl (iy-4)
add a, a
adc hl, hl
djnz IEEE_D1
ld b, 8
IEEE_D3 sbc hl, de
jr nc, IEEE_D4
add hl, de
IEEE_D4 rla
add hl, hl
djnz IEEE_D3
cpl
IEEE_D5 ld l, a
ld a, h
ld b, 8
IEEE_D6 sub d
jr nc, IEEE_D7
add a, d
IEEE_D7 rl e
add a, a
djnz IEEE_D6
pop bc
ld a, c
cpl
ld h, a
ld a, e
pop de
cpl
bit 7, h
jr nz, IEEE_D9
dec d
jp pe, IEEEA12
IEEE_D8 ld e, a
ld a, h
or b
ld h, a
pop bc
pop af
pop af
push bc
ret
IEEE_D9 srl h
rr l
rra
jr IEEE_D8
Int_IEEE - Translation numbers in the format
int format IEEE:
LD HL, num
CALL Int_IEEE
At the exit: DE, HL - IEEE Number
Int_IEEE
ld a, # 80
and h
jp z, I_IEEE1
ex de, hl
ld hl, 0
sbc hl, de
or a
I_IEEE1 ld de, 0
adc hl, de
ret z
ld d, 14
I_IEEE2 bit 6, h
jp nz, I_IEEE3
add hl, hl
dec d
jp I_IEEE2
I_IEEE3 ld e, 0
or h
ld h, a
ret
IEEE_Int - Translation numbers in the format
IEEE in the number format of Int:
LD DE, num_1
LD HL, num_2
CALL IEEE_Int
The output of: HL - Int Number
IEEE_Int
push hl
push de
ld de, # ff00
ld hl, # 4000
call IEEE_Add
bit 6, h
ret z
ld a, # 80
and h
ld c, a
res 7, h
ld a, d
or a
jp m, IEEE_I5
ld a, # 0e
sub d
jp c, IEEE_Ov
ld b, a
xor a
cp e
jp z, IEEE_I1
inc a
IEEE_I1 dec b
inc b
jp z, IEEE_I3
IEEE_I2 srl h
rr l
adc a, 0
djnz IEEE_I2
IEEE_I3 inc c
ret p
or a
jp z, IEEE_I4
inc hl
IEEE_I4 ex de, hl
ld hl, 0
sbc hl, de
ret
IEEE_I5 inc c
ld hl, 0
ret p
dec hl
ret
IEEE_Trunc - Returns the integer portion
of IEEE Int numbers in the form of HL
LD DE, num_1
LD HL, num_2
CALL IEEE_Trunc
The output of: HL - Int Number
IEEE_Trunc
bit 6, h
ret z
ld a, # 80
and h
ld c, a
res 7, h
ld a, 14
sub d
jr z, IEEE_T2
jp m, IEEE_T3
ld b, a
IEEE_T1 srl h
rr l
djnz IEEE_T1
IEEE_T2 inc c
ret p
ex de, hl
ld hl, 0
or a
sbc hl, de
ret
IEEE_T3 ld hl, 0
ret
IEEE_Cos - cosine of a number:
number is given in radians!
LD DE, num_1
LD HL, num_2
CALL IEEE_Cos
At the exit: DE, HL - The number of
IEEE_Cos
bit 6, h
jp z, IEEE_Null
ld a, d
cp # f3
jp m, IEEE_Null
call IEEE_C0
ld b, # 00
jr nz, IEEE_C1
ld b, # 80
call IEEE_C2
IEEE_C1 ld a, d
add a, # 02
ex af, af '
ld a, # 02
jr IEEE_S1
IEEE_Sin - sine of a number:
number is given in radians!
LD DE, num_1
LD HL, num_2
CALL IEEE_Sin
At the exit: DE, HL - The number of
IEEE_Sin
bit 6, h
ret z
ld a, d
cp # f3
ret m
push hl
call IEEE_C0
jr nz, IEEE_S0
call IEEE_C2
xor a
IEEE_S0 ex af, af '
xor a
pop bc
IEEE_S1 ex af, af '
xor b
cpl
and # 80
ld (d31), a
ld a, d
cp # fe
call z, IEEE_C2
ex af, af '
add a, a
ex af, af '
cp # fd
jr nz, $ +5
call IEEE_C2
cp # fc
ex af, af '
add a, a
ex af, af '
jr nz, IEEE_S2
ex af, af '
inc a
ex af, af '
ld bc, # 4000
push bc
ld b, # fd
push bc
set 7, h
call IEEE_Add
IEEE_S2 ex af, af '
exx
ld l, a
ld h, 0
ld de, Sin_Tab
add hl, de
ld a, (hl)
ld (d32), a
exx
ld (d33), de
ld (d35), hl
call IEEE_Square
push hl
push de
ld bc, # 7a3b
push bc
ld bc, # 0021
push bc
ld bc, # 4d67
push bc
ld bc, # 0157
push bc
ld bc, # e144
push bc
ld bc, # 00b2
push bc
call IEEE_Add
call IEEE_Div
call IEEE_Add
ld (d3b), de
ld (d3d), hl
call IEEE_Div
ld c, h
ld a, h
xor # 80
ld h, a
ld (d37), de
ld (d39), hl
ld h, c
push hl
push de
ld de, (d3b)
ld hl, (d3d)
call IEEE_Add
ld (d3f), de
ld (d41), hl
ld a, (d32)
srl a
jr c, IEEE_S3
or a
jr nz, IEEE_S6
ld de, (d33)
ld hl, (d35)
inc d
IEEE_S4 call IEEE_S8
IEEE_S5 ld a, (d31)
or h
ld h, a
ret
IEEE_S6 ld de, (d3b)
ld hl, (d3d)
push hl
push de
ld de, (d37)
ld hl, (d39)
call IEEE_Add
jr IEEE_S4
IEEE_S3 ld hl, # 5a82
ld de, # ff79
push hl
push de
inc d
or a
jr nz, $ +4
set 7, h
push hl
push de
ld de, (d37)
ld hl, (d39)
jr nz, IEEE_S7
ld a, h
xor # 80
ld h, a
IEEE_S7 push hl
push de
ld hl, (d35)
ld de, (d33)
call IEEE_Add
call IEEE_Mul
call IEEE_S8
call IEEE_Add
jr IEEE_S5
IEEE_S8 push hl
push de
ld hl, (d41)
ld de, (d3f)
call IEEE_Div
ret
IEEE_C2 ld a, e
IEEE_C3 dec d
add a, a
adc hl, hl
jr z, IEEE_C4
bit 6, h
jr z, IEEE_C3
IEEE_C5 ld e, a
ex af, af '
inc a
ex af, af '
ld a, d
ret
IEEE_C4 or a
jr nz, IEEE_C3
ld d, a
jr IEEE_C5
IEEE_C0 push af
res 7, h
ld bc, # 517c
push bc
ld bc, # fdc0
push bc
call IEEE_Mul
call IEEE_q
pop af
ex af, af '
ld a, d
inc a
ret
Sin_Tab db 0,1,3,2,2,3,1,0,2,3,1,0,0,1,3,2
IEEE_q ld a, h
or a
ret z
jp m, IEEE_q4
IEEE_q1 bit 7, d
ret nz
ld b, d
inc b
ld a, e
IEEE_q2 add a, a
adc hl, hl
djnz IEEE_q2
ld d, # ff
res 7, h
ld e, a
IEEE_q3 bit 6, h
ret nz
dec d
sla e
adc hl, hl
jr nz, IEEE_q3
inc e
dec e
jr nz, IEEE_q3
ld d, e
ret
IEEE_q4 res 7, h
call IEEE_q1
bit 6, h
ret z
set 7, h
push hl
push de
ld hl, # 4000
ld d, l
ld e, l
call IEEE_Add
ret
d31 db 0
d32 db 0
d33 dw 0
d35 dw 0
d37 dw 0
d39 dw 0
d3b dw 0
d3d dw 0
d3f dw 0
d41 dw 0
IEEE_Null
ld hl, # 4000
ld d, l
ld e, l
ret
IEEE_Square - square numbers
LD DE, num_1
LD HL, num_2
CALL IEEE_Square
At the exit: DE, HL - The number of
IEEE_Square
pop bc
push hl
push de
push bc
jp IEEE_Mul