SoundTrack: FrEsHeR / PHaNtIm FaMiLy 1998
__________________________________________
(C) Max / Cyberax Software / BD
__________________________________________
Fractal fern
---------------------
The first time I saw him on the pC - got a little program on
Q. BASIC 'e. Soon I made it to the analog spekovskom
BASIC, and now propose asmovuyu implementation.
The principle of construction is quite simple.
We have the following recurrence formulas:
XNEW = XOLD * A + YOLD * B + C
YNEW = XOLD * D + YOLD * E + F
Here A, B, C, D, E and F - ratios.
I understand that these formulas encompass transformation of
rotation scaling and transfer coordinates simultaneously.
Factors we will have 4 sets and
respectively, 4 variants of the formulas:
+-----+-----+-----+-----+-----+-----+
| A | B | C | D | E | F |
+---+-----+-----+-----+-----+-----+-----+
| 1 | 0 | 0 | 0 | 0 | .16 | 0 |
| 2 | .85 | .4 | 0 | -. 04 | .85 | 1.6 |
| 3 | .2 | -. 26 | 0 | .23 | .23 | 1.6 |
| 4 | -. 15 | .28 | 0 | .26 | .24 | .44 |
+---+-----+-----+-----+-----+-----+-----+
To construct the fractal you want to specify
the initial values of coordinates X and Y.
Then spins an infinite loop. In
cycle for the next X, Y through
earlier, use one of the 4 formulas
probability:
1% (1 st), 85% (2 nd), 7% (3rd), 7% (4-I).
(Somewhere I read that these probabilities are proportional to
the area fern leaves)
Choice of formulas is simple: we take
(Gde-nibud. ..) RND-number from 0 to 1, then
Consider, in what range of horrible number.
R = [0.00, 0.01] - 1-st set of coefficients Comrade
R = (0.01, 0.86] - 2-nd
R = (0.86, 0.93] - 3rd
R = (0.93, 1.00] - 4-th
s M s E above znaZ radiation coefficients
sP C P and the probabilities are taken
X sU T U of pC-applets.
About T sT
g s cycle can stop
* SH D H after a sufficient
E sE A number of iterations.
8 sR I R The result of
sE E will be approximately the
F s from the picture.
s! P!
T s F to implement the entire
A s this nonsense, I isb s J used fixed point
u T s calculations 8.8, with
ps And the sign of (8 bits
¢ s to-point and 8 - Village ~ s l le).
s l
M s L
s l
Now, actually, listing:
ORG # 6000
ENT
; Written by Max / CBX / BD
; XAS Assembler v7.447, 15.08.98.
DOT EQU # C0; KB plate.
X_SCALE EQU # 1800; coeffi-you stretch for
Y_SCALE EQU # 1200; X and Y.
DI
CALL INIT
LD IX, 0
FRACTAL LD HL, CONST1
LD DE, 12
LD A, R
ADD A, # AA
RLCA
RN XOR 0
XOR (IX)
INC IX
LD (RN +1), A; A - RND-number.
CP 3
JR C, OK
ADD HL, DE
CP 220
JR C, OK
ADD HL, DE
CP 238
JR C, OK
ADD HL, DE
OK LD A, HX; have chosen to use a set of
AND # 3F; coefficients.
LD HX, A
PUSH HL
LD DE, (X)
CALL MUL_NM1
LD (TMP1 +1), HL
POP HL
INC L
INC L
PUSH HL
LD DE, (Y)
CALL MUL_NM1
TMP1 LD DE, 0
ADD HL, DE
EX DE, HL
POP HL
INC L
INC L
LD C, (HL)
INC L
LD B, (HL)
INC L
EX DE, HL
ADD HL, BC
PUSH HL
EX DE, HL
PUSH HL
; XNEW calculated.
LD DE, (X)
CALL MUL_NM1
LD (TMP2 +1), HL
POP HL
INC L
INC L
PUSH HL
LD DE, (Y)
CALL MUL_NM1
TMP2 LD DE, 0
ADD HL, DE
EX DE, HL
POP HL
INC L
INC L
LD C, (HL)
INC L
LD B, (HL)
EX DE, HL
ADD HL, BC
LD (Y), HL
; YNEW also calculated.
EX DE, HL
LD BC, Y_SCALE
CALL MUL_NM2; Scale Y.
EX DE, HL
LD HL, # C000
AND A
SBC HL, DE
LD A, H
EX AF, AF
POP DE
LD (X), DE
LD BC, X_SCALE
CALL MUL_NM2; Scale X.
LD DE, # 8000
ADD HL, DE
LD B, H
EX AF, AF
LD H, DOT; to finish.
LD L, A
LD A, (HL)
INC H
LD D, (HL)
INC H
LD L, B
OR (HL)
LD E, A
INC H
LD A, (DE)
OR (HL)
LD (DE), A
LD A, # 7F
IN A, (# FE); Poll SPACE.
RRCA
JP C, FRACTAL
EI
RET
MUL_NM1 LD C, (HL)
INC L
LD B, (HL)
; Procedure for multiplication of two symbolic numbers
; Format 8.8 (DE registers and BC):
MUL_NM2 LD A, D
AND A
JP P, NONEG1
CPL
LD D, A
LD A, E
CPL
LD E, A
INC DE
; To change the sign of his (number)
; To invert and increase by 1.
LD A, B
AND A
JP P, NONEG2
CPL
LD B, A
LD A, C
CPL
LD C, A
INC BC
NONEG3 XOR A
JP ML2
NONEG2 LD A, # FF
JP ML2
NONEG1 LD A, B
AND A
JP P, NONEG3
CPL
LD B, A
LD A, C
CPL
LD C, A
INC BC
LD A, # FF
; At the moment, DE contains a module 1
; Factors, and BC - the second one.
; In the battery - either 0 or FF - a sign that sharp.
ML2 LD HL, 0
! ASSM 1916
RR B
RR C
JR NC, $ +3
ADD HL, DE
RR H
RR L
! CONT
RR B
RR C
; In HLBC now sitting number in the format 16.16
, (The result of multiplying 8.8 * 8.8).
; Further, if the number should be negative; nym - change its
sign. ; After all this, unceremoniously discarding, eat at a
byte from the beginning to the end and drive And the result in
HL.
RRCA
JR NC, NONEG4
LD A, C
CPL
ADD A, 1
LD A, L
CPL
LD H, A
LD A, B
CPL
LD L, A
RET NC
INC HL
RET
NONEG4 LD H, L
LD L, B
RET
; Initialization.
INIT XOR A
OUT (# FE), A
LD HL, # 4000
PUSH HL
LD DE, # 4001
LD BC, # 1800
LD (HL), L
LDIR
LD BC, # 2FF
LD (HL), 68
LDIR
POP DE
LD H, DOT
LD L, E
LD B, # C0
MK_ADTB LD (HL), E
INC H
LD (HL), D
DEC H
INC L
INC D
LD A, D
AND 7
JP NZ, C1
LD A, E
ADD A, 32
LD E, A
JR C, C1
LD A, D
SUB 8
LD D, A
C1 DJNZ MK_ADTB
CL_LP LD (HL), B
INC H
LD (HL), B
DEC H
INC L
JR NZ, CL_LP
INC H
INC H
LD BC, # 801F
MK_B_TB LD A, L
RRCA
RRCA
RRCA
AND C
LD (HL), A
INC H
LD (HL), B
DEC H
RRC B
INC L
JR NZ, MK_B_TB
RET
ORG $ / 1 256 256
; Table of constants with fixed point.
, Must be on the / 256 addresses.
;
; In 8.8 format constant translated very
; Easy, especially with a calculator CITIZEN.
;
; Example: a number of 0.16.
, Multiply it by 256, we obtain 40.96.
, Rounded to 41.
, Translated in the HEX: # 0029.
;
; If the number is <0, before being transferred to to HEX
; It we add 65536 (# 10000).
CONST1 DW # 0000; A = 0
DW # 0000; B = 0
DW # 0000; C = 0
DW # 0000; D = 0
DW # 0029; E =. 16
DW # 0000; F = 0
CONST2 DW # 00DA; A =. 85
DW # 000A; B =. 04
DW # 0000; C = 0
DW # FFF6; D =-. 04
DW # 00DA; E =. 85
DW # 019A; F = 1.6
CONST3 DW # 0033; A =. 2
DW # FFBD; B =-. 26
DW # 0000; C = 0
DW # 003B; D =. 23
DW # 003B; E =. 23
DW # 019A; F = 1.6
CONST4 DW # FFDA; A =-. 15
DW # 0048; B =. 28
DW # 0000; C = 0
DW # 0043; D =. 26
DW # 003D; E =. 24
DW # 0071; F =. 44
For fun, in a block can CONST2 1-e
number is replaced by # 00B0 - get something
resembling a Christmas tree, or # 0060 - also
like the Christmas tree, but some skinned ...
; Current positions:
X DW # 0000
Y DW # 0000
P.S. At this fractal good test
procedure for obtaining random numbers. If
generated values to them are often repeated
or all of the time fall into a certain interval, which lies
inside [0, 255], the fractal will not work (you can try to
remove ksorku with (IX), pointing to the ROM - see what will
be).
Ideally, all numbers should be equally likely, fall into the
range 0 - 255 and their sequence, one after another is not
should be repeated and any trend (such as there are procedures
in which the next number is usually greater than the previous
one).