ellvis(@)zeroteam(.)sk--------------------------------------------------------------------- |
19.02. 2023Trocha 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). |
|
--------------------------------------------------------------------- |