OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 13:22

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 11 ] 
Autor Zpráva
 Předmět příspěvku: Fraktály na MZ-800
PříspěvekNapsal: 13.07.2018, 13:08 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Fraktály byly oblíbené pro ukazování schopností 8 bitů a oblíbené byly i u vícebitů.
Pestrým vybarvením počítaného fraktálu se dá demonstrovat rozsah barev počítače.
A samotné provedení výpočtu zas demonstruje rychlost počítače. Tedy kombinace
počítače a použitého programovacího jazyka.

Popis fraktálu Mandelbrotovy množiny je možné najít na wikipedii. Kreslení fraktálu
se dá snadno naprogramovat v BASICu. Bohužel takový program poběží poměrně dlouho.
Chtěl bych tedy ukázat experiment, jak nakreslit fraktál čistě z BASICu, a potom jak
je možné program urychlit zkombinováním BASICu a malé rutinky v asembleru.

Začněme programem čistě v BASICu:

Kód:
8 INIT"CRT:M2":TI$="000000
10 F.K=0TO1:F.J=KTO199STEP2:F.I=0TO319:X=I*.01-2:Y=J*.01-1.15:C=X:D=Y
11 F.E=7TO31:S=X*X:T=Y*Y:Y=2*X*Y+D:X=S-T+C
12 IFS+T>4:SET[E AND15]I,J:E=31
13 N.:N.:N.:N.:P.TI$

Proměnné I a J prochází souřadnice pixelů obrazovky, proměnná E slouží pro počítání
iterací.

Program vykreslí 320x200 bodů použitím 16 barev, při výpočtu se provádí maximálně 25
iterací. Vykreslení celého fraktálu trvá více jak 4 hodiny.

Přiložen je obrázek výsledku.

V dalším příspěvku se chci k tomuto vrátit a přepsat části do asembleru. Ovšem jen
tak, aby hlavní část zůstala stále v BASICu, což umožňuje snadné úpravy programu
a jeho parametrů.


Přílohy:
Frac1-bas.png
Frac1-bas.png [ 27.16 KiB | Zobrazeno 10683 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 13.07.2018, 13:46 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 359 times
Been thanked: 304 times
Diky za 'nakopnuti' ;-) Zkusim to pres vikend spustit tak, aby se to pocitalo pres BASIC upraveny pro vypocty pres ALU v unikarte. Jsem zvedav, o kolik se to zrychli.
Jakou mas predstavu o tom prepsani do asembleru? Bude to pouzivat vypocty z BASICu? Pak by jsme to mohli spojit dohromady. Kresleni a pocitani cyklu v as. a vypocty pres ALU.

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 13.07.2018, 17:39 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2773
Has thanked: 224 times
Been thanked: 601 times
Tak na to zrychlení jsem hodně zvědavý!

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 13.07.2018, 19:13 
Offline
Profík
Uživatelský avatar

Registrován: 12.05.2013, 19:34
Příspěvky: 551
Has thanked: 408 times
Been thanked: 166 times
Ja taky.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 13.07.2018, 21:50 
Offline
Radil

Registrován: 27.09.2014, 23:56
Příspěvky: 446
Has thanked: 436 times
Been thanked: 230 times
Mimochodem za objevením fraktálu bylo něco hlubšího. Mandlbrot se snažil matematicky popsat tvary a zákony v přírodě. Doporučuji shlédnutí pořadu Tajný život chaosu (viděl jsem nedávno na Zoomu). Je to o schopnosti hmoty se samoorganizovat, je tam o Turingovi a Mandlbrotovi a dalších.

_________________
ZX Spectrum DELTA, D80, Melodik, XY4150, Aritma 0512
PGP: A6EA 1F93 EF6B D8D1 35AD B6D7 1E79 73E5 1B28 17F9


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 14.07.2018, 10:50 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Mikes21 píše:
Bude to pouzivat vypocty z BASICu?
To by byla také možná cesta. Já spíš chci zkusit něco, co se projeví i na standardním Sharpu bez unikarty.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 14.07.2018, 18:06 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Na 8 bitech je BASIC obvykle implementován formou interpretru. Hlavním důvodem je nejspíš umožnit interaktivní použití - je možné udělat v programu drobnou změnu a rovnou ho spustit, bez toho, že by se musel celý program překládat.

Takový interpretr musí při běhu programu stále dokola analyzovat, co program vlastně znamená, tedy kromě vlastního provádění instrukcí je tam ještě režie navíc. Za jednoduchost použití prostředí se platí určitým zpomalením.

Když chceme něco ze ztracené rychlosti získat zpět, jedna z možností, kterou máme, je zapomenout, že nějaký BASIC je k dispozici a napsat si vše od základu s použitím pouze instrukční sady procesoru. Napíšeme si tedy vlastní program pro výpočet, a určíme si, jakou formou mu může být předán vstup a jak bude dostupný výstup.

Pro náš případ kreslení fraktálu si připravíme výpočetní rutinu, která bude umístěna od adresy 0fe0dh. Jako vstup bude mít jednobajtovou hodnotu cnt, počítající iterace, a čtyři dvoubajtové hodnoty - z0, z1, c0, c1. Ty odpovídají proměnným X, Y, C, D v minule uvedeném BASICovém programu. Vše je shrnuto v následující tabulce, s uvedením adres v paměti:

0fe00h cnt, počítadlo iterací
0fe01h z0, hodnota aktuální iterace
0fe03h z1
0fe05h c0, počáteční hodnota
0fe07h c1
0fe09h pracovní prostor
0fe0dh výpočetní rutina

BASIC nám musí umožnit vložit strojový program do paměti, nastavit mu parametry, spustit ho, a přečíst výsledek. Příkazy potřebné pro toto vše najdeme v manuálu k počítači, v části 6.7 Machine Language Control Statements.

PEEK pro čtení výsledku výpočtu
POKE pro vložení programu, nastavení vstupu
USR pro spuštění výpočtu
LIMIT pro vyhrazení paměti použité rutinou

Kód rutiny je tvořen posloupností bajtů, tak jak je dostaneme z překladače asembleru. Pokud bychom chtěli tyto bajty interpretovat jako znaky, budou mezi nimi i některé netisknutelné znaky. Takové znaky nemůžeme zadat z klávesnice. Pro snadné zadání programu z klávesnice si tedy zvolíme, že jeden znak ponese pouze 5 bitů z kódu programu. Na to nám stačí znaky A-Z a symboly @[\]^_. V případě počítače MZ-800 ovšem místo _ bude znak šipka vlevo. BASIC pro tento počítač totiž přiřadil znak šipky vlevo ke kódu, který v ASCII odpovídá znaku _.

To by mělo být vše, co je potřeba znát, aby byl zhruba jasný princip upraveného programu. Program si uvedeme ve formě screenshotu, aby byly lépe patrné Sharp znaky, které je potřeba zadat, především zmíněná šipka vlevo.

Příloha:
Frac1-list.png
Frac1-list.png [ 3.18 KiB | Zobrazeno 10543 krát ]

Po spuštění programu je vidět, že kreslení probíhá výrazně rychleji. Program kreslí stejný fraktál, jako minule uvedený program v BASICu. Asi po čtyřech minutách je výsledek takovýto.

Příloha:
Frac1-4.png
Frac1-4.png [ 3.29 KiB | Zobrazeno 10543 krát ]

Celý obrázek se vykreslí za 39 minut, a vypadá takto.

Příloha:
Frac1-39.png
Frac1-39.png [ 19.03 KiB | Zobrazeno 10543 krát ]

Můžeme modifikovat parametry programu, a vykreslit pohled na jinou část Mandelbortovy množiny.

9 FORK=0TO1:FORJ=KTO199STEP2:Y=(J*.005-1.15)*2:X=-1.34*2:FORI=0TO319:X=X+.01

A výsledkem bude toto:

[limit 3 soubory, viz další příspěvek]

Vidíme tedy, že jsme získali zpět část rychlosti, ale stále si zachovali možnost snadné změny parametrů programu v prostředí BASICu. Experiment byl úspěšný. ;-)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 14.07.2018, 18:10 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Fraktál po změně parametrů


Přílohy:
Frac2-42.png
Frac2-42.png [ 17.85 KiB | Zobrazeno 10542 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 14.07.2018, 20:03 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 359 times
Been thanked: 304 times
Pustil jsem to pres noc, ale nedojelo mi to. Druhy run probehl za 3:46:20. Cekal jsem trochu min, ale zase ten vypocet je spise jen samy cyklus. Vypocty pres ALU jsou jen zakladni matika a te tam zase tolik neni. Nevim, co by s tim slo delat, aby ALU fakt vyrazne pomohla.

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 17.07.2018, 11:42 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Ještě si můžeme zobrazit Juliovu množinu, příbuznou k Mandelbrotově, kterou vypočítáme podle velice podobného předpisu. Vyberme si třeba předpis
f(z)= z^2 + c, kde c= -0.105 + .93i

Rozdíl je v tom, že u Mandelbrotovy množiny jsou hodnoty z a c nastaveny podle právě zkoumaného bodu, kdežto u Juliovy množiny je hodnota c pevně zvolená a z je nastaveno podle právě zkoumaného bodu.

Program pro vykreslení:

Kód:
8 INIT"CRT:M2":TI$="000000
10 F.K=0TO1:F.J=KTO199STEP2:F.I=0TO319:X=I*.011-1.76:Y=J*.011-1.1:C=-.105:D=.93
11 F.E=15TO39:S=X*X:T=Y*Y:Y=2*X*Y+D:X=S-T+C
12 IFS+T>4:SET[E AND15]I,J:E=39
13 N.:N.:N.:N.:?TI$
V příloze je výsledek.


Přílohy:
Frac3-bas.png
Frac3-bas.png [ 24.52 KiB | Zobrazeno 10411 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 18.07.2018, 13:16 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Také kreslení Juliovy množiny můžeme urychlit. Použijeme velice podobný program ve strojovém kódu, který vložíme od adresy 0fe0dh. Obsah paměti by měl být následující:
Kód:
FE00                                         2A 01 FE
FE10  44 4D CD 4F FE 22 09 FE 2A 03 FE 44 4D 54 5D CD
FE20  4F FE EB 29 ED 4B 01 FE CD 4F FE ED 4B 07 FE 09
FE30  22 03 FE 2A 09 FE E5 B7 ED 52 ED 4B 05 FE 09 22
FE40  01 FE E1 19 7C FE 10 D0 21 00 FE 34 20 BF C9 D5
FE50  50 59 CB 7A 28 0B 06 02 E5 97 67 6F ED 52 D1 10
FE60  F7 29 29 EB 7C 4D 21 00 00 06 0D CB 2C CB 1D 1F
FE70  CB 19 30 01 19 10 F4 D1 C9
Pro zápis dat z BASICu opět použijeme kódování, kde jeden znak kóduje pět bitů. Screenshot se zápisem programu je zde:
Příloha:
Frac3-list.png
Frac3-list.png [ 3.31 KiB | Zobrazeno 10354 krát ]

Obrázek se vygeneruje asi po 35 minutách a vypadá takto:
Příloha:
Frac3-35.png
Frac3-35.png [ 24.52 KiB | Zobrazeno 10354 krát ]


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 11 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz