OldComp.cz

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

Registrace na OCP IV ZDE!

Právě je 17 srp 2018, 03:04

Všechny časy jsou v UTC + 1 hodina




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 črc 2018, 12:08 
Offline
Kecka

Registrován: 28 říj 2016, 20:03
Příspěvky: 49
Has thanked: 1 time
Been thanked: 18 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 747 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 13 črc 2018, 12:46 
Offline
Radil

Registrován: 11 lis 2013, 09:29
Příspěvky: 254
Has thanked: 11 times
Been thanked: 76 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 črc 2018, 16:39 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 23 bře 2014, 19:13
Příspěvky: 1435
Has thanked: 58 times
Been thanked: 247 times
Tak na to zrychlení jsem hodně zvědavý!

_________________
Když lékař zkazí operaci, jde sedět, do vězení ho pošlou soudci.
Když někdo spáchá vážnou nehodu, jde sedět, pošlou ho tam soudci.
Když něco zkazí soudce, tak měl jiný právní názor.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 13 črc 2018, 18:13 
Offline
Radil
Uživatelský avatar

Registrován: 12 kvě 2013, 18:34
Příspěvky: 303
Bydliště: Třebíč
Has thanked: 120 times
Been thanked: 50 times
Ja taky.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 13 črc 2018, 20:50 
Offline
Radil

Registrován: 27 zář 2014, 22:56
Příspěvky: 405
Has thanked: 340 times
Been thanked: 184 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, XY4150
DOS Programming
OldComp GitHub


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 14 črc 2018, 09:50 
Offline
Kecka

Registrován: 28 říj 2016, 20:03
Příspěvky: 49
Has thanked: 1 time
Been thanked: 18 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 črc 2018, 17:06 
Offline
Kecka

Registrován: 28 říj 2016, 20:03
Příspěvky: 49
Has thanked: 1 time
Been thanked: 18 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 607 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 607 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 607 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 črc 2018, 17:10 
Offline
Kecka

Registrován: 28 říj 2016, 20:03
Příspěvky: 49
Has thanked: 1 time
Been thanked: 18 times
Fraktál po změně parametrů


Přílohy:
Frac2-42.png
Frac2-42.png [ 17.85 KiB | Zobrazeno 606 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 14 črc 2018, 19:03 
Offline
Radil

Registrován: 11 lis 2013, 09:29
Příspěvky: 254
Has thanked: 11 times
Been thanked: 76 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 črc 2018, 10:42 
Offline
Kecka

Registrován: 28 říj 2016, 20:03
Příspěvky: 49
Has thanked: 1 time
Been thanked: 18 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 475 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Fraktály na MZ-800
PříspěvekNapsal: 18 črc 2018, 12:16 
Offline
Kecka

Registrován: 28 říj 2016, 20:03
Příspěvky: 49
Has thanked: 1 time
Been thanked: 18 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 418 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 418 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


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevní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:  
cron
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz