ellvis / zeroteam / blog

ellvis(@)zeroteam(.)sk

---------------------------------------------------------------------

19.02. 2023

Trocha BASICu (1)

   Na Diaspore sa objavil výpis programu na kreslenie  Mandelbrotovho  fraktálu.  Je  napísaný  v  BASICu  pre
BBC Micro a používa celočíselné premenné. Prepísal som ho teda do NewBrainu a tu je  výsledok.  Alebo  vlastne
ani nie je.

Tu je pôvodný program:
100MODE7:REM A BASIC, ASCII MANDELBROT
110REM This implementation copyright (c) 2019-2021, Gordon Henderson
120REM Permission to use/abuse anywhere for any purpose granted, but
130REM it comes with no warranty whatsoever. Good luck!
140C$=".,'~=+:;[/<&?oxOX# " : REM Lightest to darkest...
150S=-2.0:T=1.25:P=2.5:Q=-2.5
160W%=32:H%=24:S%=2^13:M%=4*S%:B%=1:L%=LEN(C$)+1
170J=P/W%:U=Q/H%:Q%=TIME
180FORY%=0TOH%:R%=(U*Y%+T)*S%:V%=(S-J)*S%:FORX%=0TOW%:V%=V%+J*S%:D%=0:E%=0:A%=B%:REPEATIFA%<L%
 J%=D%*D%DIVS%:K%=E%*E%DIVS%:IFJ%+K%<M% Z%=J%-K%+V%:E%=(D%+D%)*E%DIVS%+R%:D%=Z%:A%=A%+1:UNTILFALSE
190UNTILTRUE:PRINT MID$(C$,A%-B%,1);
200NEXT:PRINT:NEXT
210PRINT:PRINT (TIME - Q%) / 100:END
   Na prvý pohľad je to guláš, obsahuje snáď všetky skratky, ktoré BASIC podporuje  (vynechanie  príkazov  LET
a THEN, premenných v NEXT, medzier medzi príkazmi a podobne). Na konverziu treba niekoľko zmien.

   NewBrain je po zapnutí v textovom režime, takže MODE7 netreba. V programe sú 2 typy  premenných,  tie  s  %
v názve sú celočíselné. NewBrain nič také nepozná, riešenie je použiť INT.

   Program používa slučku REPEAT UNTIL. Zaujímavé je tu to, že na jeden REPEAT máme dva-krát UNTIL. Chvíľku mi
trvalo, než som na to prišiel; prvý UNTIL je preskočený ak druhý IF nie je splnený. Nahradí ho IF so skokom na
začiatok riadku ak podmienka platí. Druhý UNTIL sa jednoducho vynechá. Program tiež počíta čas, koľko trvá
jeho vykonanie, tú časť vynechám tiež.

Tu je výsledok konverzie:
100 REM A BASIC, ASCII MANDELBROT
110 REM This implementation copyright (c) 2019-2021, Gordon Henderson
120 REM Permission to use/abuse anywhere for any purpose granted, but
130 REM it comes with no warranty whatsoever. Good luck!
140 C$=".,'~=+:;[/<&?oxOX# " : REM Lightest to darkest...
150 S1=-2.0: T1=1.25: P1=2.5: Q1=-2.5
160 W9=32: H9=24: S9=2^13: M9=4*S9: B9=1: L9=LEN(C$)+1
170 J1=P1/W9: U1=Q1/H9
180 FOR Y9=0 TO H9
181 R9=(U1*Y9+T1)*S9: R9=INT(R9): V9=(S1-J1)*S9: V9=INT(V9)
182 FOR X9=0 TO W9
183 V9=V9+J1*S9: V9=INT(V9): D9=0: E9=0: A9=B9
184 IF A9<L9 THEN J9=D9*D9/S9: J9=INT(J9): K9=E9*E9/S9: K9=INT(K9): IF J9+K9<M9 THEN
 Z9=J9-K9+V9: E9=(D9+D9)*E9/S9+R9: E9=INT(E9): D9=Z9: A9=A9+1: IF A9<L9 THEN 184
190 PRINT MID$(C$,A9-B9,1);
200 NEXT X9: PRINT: NEXT Y9
210 PRINT: END
   Program používa dva rôzne názvy premenných, tie s číslom 9 sú  celočíselné.  Je  to  čisto  kvôli  lepšiemu
prehľadu.

   Stačí RUN a program zobrazí sieť bodiek. A to je všetko.  Takže  to  nefunguje.  Skontroloval  som  program
niekoľko krát a nič som nenašiel, všetko sa mi zdá v poriadku. Než som to ale vzdal, skúsil  som  moju  verziu
v emulátore BBC Micro (https://bbcmic.ro). A tam to funguje.

   Keď je teda program v princípe funkčný, skúsil som ho spustiť na niečom inom než je NewBrain. Najprv prišlo
na rad ZX Spectrum a Sam Coupé. Oba počítače s rovnakým  výsledkom  ako  NewBrain.  Na  Z88  program  funguje,
ale tam je to tým, že Z88 používa BBC BASIC.

   Ako poslednú skúšobnú platformu som použil BAS bežiaci  v  Linuxe.  Ten  sa  chová  presne  ako  BBC  BASIC
a program funguje bez problémov. Tu snáď len upozorním na to, že som testoval aj prepísanú verziu  a  nie  len
pôvodnú, aj keď BAS tiež pozná celočíselné premenné (celkovo je veľmi dobre kompatibilný s BBC BASICom, ak  to
niekoho zaujíma viac tak moria.de/~michael/bas/).

Tu je výsledok z BASu:
......,,,,,,,''''''''''''',,,,,,,
.....,,,,,'''''''''''~~==~~'',,,,
....,,,,''''''''''~~~~=:;+~~~''',
...,,,''''''''''~~~~~=+;?[+=~~'''
...,,''''''''''~~~~==+X   /==~~''
..,,'''''''''~~~~=++:;/   /:++=~'
..,''''''''~~~===:  &       /<&:~
.,''''''''~====++;<            +=
.'''''~~=:++++::;x             ;=
.''~~~~=+;xo< <[/              X+
.~~~~===:;?     O               =
.~~~++:;??                     :=
.                             [+=
.~~~++:;??                     :=
.~~~~===:;?     O               =
.''~~~~=+;xo< <[/              X+
.'''''~~=:++++::;x             ;=
.,''''''''~====++;<            +=
..,''''''''~~~===:  &       /<&:~
..,,'''''''''~~~~=++:;/   /:++=~'
...,,''''''''''~~~~==+#   /==~~''
...,,,''''''''''~~~~~=+;?[+=~~'''
....,,,,''''''''''~~~~=:;+~~~''',
.....,,,,,'''''''''''~~==~~'',,,,
......,,,,,,,''''''''''''',,,,,,,
V čom je teda problém? ZaREMoval som riadok 190 a riadok 200 som upravil:
200 NEXT X9: PRINT R9; J9; K9; E9; D9; V9: NEXT Y9
   Takto program nič nekreslí, ale vypisuje stav premenných. A tu je vidieť rozdiel. Jediná premenná, ktorá je
vo všetkých BASICoch rovnaká, je R% / R9.

Tu je príklad ako moc sa výsledky líšia. Najprv BBC BASIC / BAS:
10240  5408  51200  20480 -6656  4096
 9387  2597  43025  18774 -4612  4096
 8533  919  35553  17066 -2744  4096
 7680  73680  1689  3720 -24568  4096
A NewBrain / ZX Spectrum / Sam Coupé:
10240 165888 12800 10240 36864 36864
 9386 165888 10755 9386 36864 36864
 8533 165888 8888  8533 36864 36864
 7680 165888 7200  7680 36864 36864
   Tu je dobre vidieť rôzne výsledky a zostáva si len pozrieť prečo rôzne dialekty počítajú inak.  Ale  to  už
bude téma niektorého z ďalších článkov.

(len pre doplnenie: viem, že pôvodný program funguje aj bez "celočíselnosti" a INT  to  celé  v  podstate  len
zdržuje, to ale nie je cieľ ani podstata tohto článku).



<-- 20230204 Demoscéna na Androide | index | 20230305 Moderné zobrazovadlo pre nemoderný hardvér -->

---------------------------------------------------------------------

made by ellvis using Bluefish in 2023, RSS feed