OldComp.cz

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


Právě je 28.03.2024, 20:14

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 30 ]  Přejít na stránku Předchozí  1, 2
Autor Zpráva
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 12.10.2021, 18:14 
Offline
Site Admin
Uživatelský avatar

Registrován: 11.05.2013, 23:48
Příspěvky: 10111
Bydliště: Praha
Has thanked: 1953 times
Been thanked: 1517 times
Mimochodem, vím že to sem úplně nepatří, ale HAM je prostě super věc:
https://www.youtube.com/watch?v=I1Q_cL-ut9c

_________________
Amiga/Amstrad/Atari/Commodore/Mac/Nintendo/PS/PC/Sega/Tandy/ZX


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 12.10.2021, 19:00 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Já si videa zatím doma nepouštím, mám placená data, nicméně asi se již časem vrátím k plnému on-line.

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 12.10.2021, 22:55 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
misticjoe píše:
Ale tady modrá je a jedná se taky o HAM fill (podle toho, co píše v greetings):
https://youtu.be/RIjuOjdHtfY?t=233

Ano, to je stále možné. Asi jsem měl napsat "většinou" a ne "skoro vždy".
Jde skutečně o to, že pokud se použije HAM5 mód (tedy jen s pěti zapnutými bitplany), tak se dá pátým bitplanem určit jen kombinace 0/0 nebo 1/0, protože šestý bit je vždy Denisou nastavený na nula. Hodnota ve zbylých čtyřech bitplanech tak buď určuje index do palety barev (kombinace 0/0), nebo jestli je to modrá složka pixelu před ním (kombinace 1/0).
Horizontální čára o nějaké barvě (z palety 16 barev) se tak nakreslí:
1) Obsah 1. až 4. bitplanu se všude vynuluje
2) Obsah 5. bitplanu se všude nastaví na jedna
3) Na pozici začátku čáry se do bitplanů 1 až 4 nastaví index barvy
4) Bit v 5. bitplanu se vynuluje. Tím vznikne v tom místě kombinace 0/0 - pixel se obarví nastavenou barvou z palety)
5) Protože další pixel na řádku je kombinace 0/0/0/0/1/0 (bity píšu zleva) znamená to, že se nulou modifikuje modrá složka předcházejícího pixelu. Protože ale kreslíme jen barvami, které i tak mají modrou složku nulovou, je to jedno. Vykreslí se tedy pixel o stejné barvě jako předešlý. A tak pořád podél celého řádku.
6) Čára se ukončí vynulováním bitu v pátém bitplanu na požadované pozici konce čáry. Protože jsou ostatní bity nulové bude mít pixel hodnotu z COLOR00, a zbylé pixely v řádku taky.
To je důvod, proč velké objekty (nejlépe přes celý screen) vyplňované pomocí HAM-fill jsou obvykle jen z červené, zelené a žluté (a odstínů). Pokud se zapne HAM6, je možné modifikovat 6. bit a tedy použít i kombinace 0/1 nebo 1/1 a zajistit, že se nuluje R nebo G složka barvy. Nikdy se ale nedají kreslit čáry barvou, která má všechny tři složky nenulové. Alespoň ne tak rychle. Pokud je na to nějaká finta, tak ji neznám.
P.S.: Na videu, které jsi poslal, jde vidět, že 3D objekty jsou relativně malé -- odhadem někde kolem 128 řádku max. Musí mít HAM6 a ten nechává k dispozici jen jeden volný DMA slot z každé osmice na sběrnici pro CPU (když se čtou data z bitplánů). To je znatelné zpomalení. Odhaduju, že proto jsou ty objekty na výšku tak malé.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 02.01.2022, 10:46 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Chtěl jsem se naučit napsat text, ale používá se zde na to opět Copper. Zjednodušil jsem jeden program na jeho základ, není ještě úplně hotovo, ale je to již použitelný.
Font se bere z externího obrázku a vypisuje na obrazovku.
Většinu kódu jsem okomentoval. Jedná se zatím o můj nejlépe okomentovaný kód, který klidně poslouží pro naučení se assembleru na Amize v kombinaci se seznamem správného zápisu instrukcí a jejích funkcí. Okomentováni ještě není finální. V dolní části kódu je návod, jakým způsobem jsem pracoval s komentáři aby to bylo přehledné, alespoň já to tak vnímám. Já jen že když někdy držkuji, abych taky přispěl. Nevím jestli chápu práci s grafickou knihovnou dobře a zde může můj koment zavádět. Ptal jsem se již na Amigaportaly na tohle tak uvidím.

Pro kompletnost zde cituji svůj dotaz z AP:
proč se prosím u tohohle dle všeho známého zápisu
move.l 38(A1),$dff080

používá offset 38?

našel jsem jen popis co to dělá, ale ne ten důvod proč se použije offset 38. V grafické knihovně nezačíná na tomhle offsetu funkce. Mám tomu rozumět tak, že se z dané funkce ne přímo na jejím začátku vemou data co se potřebuji?

Můj druhý dotaz který jsem uvedl na AP ohledem tohohle kódu a práce s grafickou knihovnou zde:

Jak si načteme pointer na grafickou knihovnu a pak ji přes knihovnu OldOpenLibtary otevřeme, ta nám vrací posunuty pointer na grafickou knihovnu v D0, v D1 je původní pointer. Pracujeme ale dále s D0. Rozumím tomu správně, jedná se pořád o stejný pointer na grafickou knihovnu, jen je posunutý možná kvůli použití absolutního adresování aby jsme v našem programu věděli samotnou grafickou knihovnu načíst na správné adrese?

Mějte hezký den...

V příloze EXE, KÓD, OBRÁZEK (i zde)


Přílohy:
Textro 20.zip [5.76 KiB]
192 krát
Textro 20 OBRAZEK.png
Textro 20 OBRAZEK.png [ 6.97 KiB | Zobrazeno 5763 krát ]

_________________
Amiga - PMD 85
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 02.01.2022, 13:02 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
Lisiak4 píše:
proč se prosím u tohohle dle všeho známého zápisu move.l 38(A1),$dff080 používá offset 38?

Protože na té adrese se nachází původní systémová hodnota (adresa systémového coopperlistu) pro obnovení původního Copper listu.

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 02.01.2022, 13:39 
Offline
Profík
Uživatelský avatar

Registrován: 20.02.2017, 01:17
Příspěvky: 800
Has thanked: 19 times
Been thanked: 48 times
Co se sprajtu tyka, tak ono ani ty 16bitove konzole jako Mega Drive / SNES... to nemeli buhvijak doladene. Ono vubec si myslim ze tento zpusob generovani herni grafiky byl tak trochu omezeny. Tyto systemy maji napevno zadratovan nejaky "fillrate" a jakmile ho prekrocite tak se vam sprajty proste nezobrazi. Nenavidim kdyz mi v Super Mariu zacnou naraz problikavat panaci, protoze NES je za limitem. Nenavidim kdyz mi v Raiden Trad pri maximalnim upgdrade strelby naraz polovina strel stridave mizi z obrazovky, protoze Mega Drive je za limitem.

Z tohoto pohledu je alternativni pristup jako je linebuffering napr. u Atari 7800 urcite zajimavou myslenkou. Prelozeno: osobne uprednostnuji hru kde je grafika generovana plne i kdyz klesne framerate, nez aby neklesal fps a objekty tu a tam mizely...

A diky bohu za Playstation. Ten udelal jasnou tecku za timto omezenym videnim sveta sprajty+pozadi.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 02.01.2022, 18:37 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Lanex píše:
Lisiak4 píše:
proč se prosím u tohohle dle všeho známého zápisu move.l 38(A1),$dff080 používá offset 38?

Protože na té adrese se nachází původní systémová hodnota (adresa systémového coopperlistu) pro obnovení původního Copper listu.

Jasně, to by odpovídalo, tedy vracíme Copper systému, po tom co ukončujeme Copper list v našem programu. Super díky moc!

EDIT:
Pro přesnost, tahle adresa na které je adresa původního systémového Copperlistu je součástí graphics.library?

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 04.01.2022, 00:23 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Další verze, asi předposlední. Dal jsem rozsahy u registrů na menší, když to umožňovala situace a nejednalo se o ADD Dx,Ax, kde jsem nechal Long. U ADD #x,Ax jsem použil Word. Nebyl jsem zvyklý používat rozsahy u podmínek BEQ a jiných ani u skoku BRA a dalších ale ok a ponechal jsem. Původně byly použité 2 různé adresové registry pro pointer na bitplan, to jsem sjednotil, nic mne to nestálo. Taky jsem použil D0 jako pomocnou proměnnou v jednom případě, čím je D0 použita na 2 místech a ničemu to nevadí, tedy jsem uvolnil D6. Původní kód myslím nejdříve nuloval D0 a nim se pak nuloval pomocí MOVE register D5 na 2 místech, to bylo i zavádějící, tak nuluji D5 přímo pomocí rychlejšího MOVEQ. Taky se báze execu načítala 2 krát i když jsme register kde ji máme nijak nepřepisovali, tak snad ničemu nevadí když jí dávám do D6 jen na začátku a nenacitam bázi execu i těsně před ukončením programu a jen program ukončím. Zpřesnil jsem některé komentáře. To tak v kostce co jsem posledně udělal. Ještě se pak podívám na ty registre na návěstí SPRADR. V italské verzi na assembler je o tom nějaký pokec. Snad registre pro sprity a taky ještě 2 registre něco s bitplany. A za mně bude hotovo. U změn v kódu jsem ponechal v poznámce i původní kód, ale to bude vidět i na stejných komentářech. Taková má záloha zatím radši.

Asi to pak vrazim do mé hudební rutiny, nahodim nějakou primitivní melodii i ručně než udělám převodník na můj hudební format.

Vím že se řešil nějaký příznak BOM kvůli A1000 nebo A500 nějaké první verze. Budu to potřebovat při nesystémovém programování aby byl můj program korektní?

Jen poznámka pro mne, ještě hlasitost do 2.byte v registrech

V příloze KÓD, EXE, jen přejmenovaný obrázek PNG, stručný popis v TXT co je v registrech, jak jsem v tom trochu dělal pořádek, a posledně jsem zapomněl přiložit soubor=obrázek RAW, ze kterého se načítají písmena na obrazovku pomocí Copperu, tak ten je již taky.


Přílohy:
TEXTRO 28.zip [6.63 KiB]
195 krát

_________________
Amiga - PMD 85
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 04.01.2022, 16:29 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Lisiak4 píše:
Lanex píše:
Lisiak4 píše:
proč se prosím u tohohle dle všeho známého zápisu move.l 38(A1),$dff080 používá offset 38?

Protože na té adrese se nachází původní systémová hodnota (adresa systémového coopperlistu) pro obnovení původního Copper listu.

Jasně, to by odpovídalo, tedy vracíme Copper systému, po tom co ukončujeme Copper list v našem programu. Super díky moc!

EDIT:
Pro přesnost, tahle adresa na které je adresa původního systémového Copperlistu je součástí graphics.library?


Ano. Viz http://amigadev.elowar.com/read/ADCD_2. ... e00AE.html
Jedná se o ukazatel ActiView (adresa na strukturu View). Struktura GfxBase má na začátku strukturu Library, viz http://amigadev.elowar.com/read/ADCD_2. ... e009C.html
A ta má zase na začátku strukturu Node, viz http://amigadev.elowar.com/read/ADCD_2. ... e0091.html
Poznámka: V C++ by se to stejné napsalo pomocí dědičnosti jako: struct Library : public Node {...}; struct GfxBase : public Library {...}; Ale AmigaOS byl napsán pro (ANSI?) C.
Když se sečtou velikosti struktur, vyjde ti, že ActiView je 38 bajtů od začátku.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 05.01.2022, 12:33 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Oprava: Z té GfxBase se do COP1LC dává hodnota uložená v copinit.
Zmátlo mne, že obvykle se z ní bere adresa ActiView a volá se pak funkce LoadView(). Myslím, že to je korektnější postup.

Tak ještě jedna oprava: Kouknul jsem do Photonova MiniStartupu. Když uklízí, tak do COP1LC dá hodnotu copinit a do COP2LC dá hodnotu LOFlist z GfxBase struktury. Na začátku si z ní ještě uloží ActiView (musí to udělat, protože volá LoadView(NULL) - údajně kvůli RTG) a na konci ho zpátky nastaví (zavolá LoadView).


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 05.01.2022, 13:07 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Ke tvému kódu jen pár poznámek. Nic důležitého.

Ta smyčka COPYCHAR by se snadno dala napsat rychlejší. Ne že by to bylo v tomto případě důležité. Spíš je to jen takové cvičení, jak věci pro Amigu psát s důrazem na rychlost kódu. Místo náročného adresového módu u instrukce move.b (ax,dx.w),(ay,dy.w) je lepší přičíst na začátku offset: add.w dx,ax, add.w dy,ay a používat jednodušší a rychlejší move.b (ax),(ay). Přičítání modula se dá dělat rychlejším add.w #40,ax a nebo ještě lépe na začátku udělat moveq #40,d7 a ve smyčce dělat add.w d7,ax, add.w d7,ay. A dalším zrychlením by bylo celou tu smyčku rozvinout. Dělá se vždy 8x. DBF instrukce má v tomto případě vysokou režii. Takže třeba udělat toto:
Kód:
    add.w d4,a2
    add.w d5,a3
    moveq #40,d7
    move.b (a2),(a3)
rept 7
    add.w d7,a2
    add.w d7,a3
    move.b (a2),(a3)
endr


a nebo asi ještě rychlejší
Kód:
    add.w d4,a2
    add.w d5,a3
    move.b (a2),(a3)
rept 7
    move.b (REPTN+1)*40(a2),(REPTN+1)*40(a3)
endr


Pokud bys nechtěl přijít o původní obsah registrů a2/a3, tak je možno na začátku udělat třeba lea.l (a2,d4.w),a5, lea.l (a3,d5.w),a6 a ve smyčce používat a5/a6.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 11.01.2022, 09:44 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
@defor:

Díky moc za navedení, jak udělat kód efektnější, já jsem rád, že věcem rozumím i na základní úrovni, neboli z původního programu, před jeho úpravami. Ze tvého kódu:
Kód:
    add.w d4,a2
    add.w d5,a3
    moveq #40,d7
    move.b (a2),(a3)
rept 7
    add.w d7,a2
    add.w d7,a3
    move.b (a2),(a3)
endr

by mělo stačit:
Kód:
    add.w d4,a2
    add.w d5,a3
    moveq #40,d7
rept 7
    move.b (a2),(a3)
    add.w d7,a2
    add.w d7,a3
endr

Tedy jedno move.b (a2),(a3), mimo naši smyčku je tam zbytečné. Jo Ty si ho tam dal proto, že máš ADD ve smyčce před instrukcí MOVE. To je lepší?
a je to detail, ale add.w d7,a2, add.w d7,A3, je lepší asi až za move, aby jsme nezačali psát text zbytečně o 1 pixel níže. Stejná logika je i v úplně původní verzi programu. Oprava, už jsem to pochopil. Smyčka má asi delší režii, tak si ji udělal o 1 cyklus kratší. OK. Uvažuji za běhu...

Zatím si pro názornost nechám přičtení #40, místo D7. Ano práce s datovým registrem je u ADD rychlejší. Asi se mi potvrzuje to co si již chvíli myslím, že počet cyklů, nebolí alespoň to která instrukce vůči jiné je rychlejší jde vyčistit i z debuggeru, alespoň v ASM-pro.

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 11.01.2022, 10:59 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Lisiak4 píše:
Tedy jedno move.b (a2),(a3), mimo naši smyčku je tam zbytečné.

Len ak nepotrebuješ posledný riadok znaku. :)
Naopak po rozvinutí makra ti na konci zostane 2x add.w ktoré už nepotrebuješ a ktoré Defor vo svojej ukážke ušetril.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 11.01.2022, 11:14 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Jo, již jsem pak dodal, že jsem to pochopil.
S makrami jsem ještě nedělal a teď asi ani nezačnu ;)

Jsem rád, že jsem celkem rychle pochopil jak je myšlen ten princip bez maker. Mám takovou vlastnost se podceňovat.

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Amiga Assembler - práce s grafikou
PříspěvekNapsal: 13.01.2022, 23:36 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Včera dohledána snad poslední chyba v programu TEXTRO, patřičně okomentováno. Člověka ty spojitosti opravdu někdy baví. Důvod proč použít rozsah Long místo Word začíná za slovem "Musí" a to je i současná oprava chyby, která se projevovala viz text ve foto.


Přílohy:
koment.png
koment.png [ 17.06 KiB | Zobrazeno 5359 krát ]

_________________
Amiga - PMD 85
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ů: 30 ]  Přejít na stránku Předchozí  1, 2

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 5 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:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz