Oznámení

Sbalit
Aktuálně žádná oznámení.

Assembler - všeobecná logika

Sbalit
X
 
  • Filtr
  • Čas
  • Zobrazit
Vymazat vše
new posts

    O: Assembler - všeobecná logika

    Boží!

    Komentovat


      O: Assembler - všeobecná logika

      paráda
      A1200, Vampire V1200, 64GB CF, IndyAGA MK3, PCMCIA WiFi, 27" LCD

      Komentovat


        O: Assembler - všeobecná logika

        V nejblizsich dnech, po tom co mi PG napise, ze je to ok, uvolnim EXE soubor ciste s hudbou, bude to jen zamerne zkraceno o 3 patterny. Testovano na A1200, 4 MB fast RAM. Musi PG napsat, ze je to OK.
        Amiga - PMD 85

        Komentovat


          O: Assembler - všeobecná logika

          Bude se jeste ladit vibrato
          Amiga - PMD 85

          Komentovat


            O: Assembler - všeobecná logika

            Autorem citovaného textu je Lisiak4 Přejít na původní příspěvek
            Nevím, jestli a kdy bude grafika, tak zatím takhle pánové

            Skladba: Atari Goes On!
            Autor 8 bit Atari verze: PG
            System: Atari 8-Bit (Stereo)Author: PGTitle: Atari Goes On!Release: Forever 2018Length: 2:11


            Amiga 4 kanálová očesaná verze aktuální k 19.10.2019 :


            Speciální díky: PG, DJM, zxretrosoft
            Již delší dobu jsem na něco zapomínám. Opravit mé speciální díky, když se mi to vše povede dotáhnout do konce. Resetkání je nedílnou součástí toho co mne zatím žene dopředu

            Speciální díky: PG, jack-3d, DJM, zxretrosoft
            Amiga - PMD 85

            Komentovat


              Před pár dny jsem dával na FB jedno starší video z tvorby mě hudební rutiny. Post z FB dávám i sem. Dnes jsem zapracoval na 1 drobnosti (a v nejbližší době dokončím), kterou mne formát MOD naučil a to efekt vibrato hned v prvním řádku patternu s nově hraným tónem, doposud se vibrato dalo aktivovat až v 2.řádku patternu. To jsem spravil. Vibrato můžu hrát jen v 1 určeném hudebním kanálu. Mně to zatím stačí a nechci to dělat zbytečně složité. Možnost zahrát efekt vibrato v prvním řádku s tónem mne stalo co se týče mého formátu další 1 bit. Kompletní šířka mého formátu je 20 byte. Bez dodatečných funkcí dokážu hrát skladbu pomocí 4 byte. Celkově nevyužité a k dispozici ještě 3 byte. Tedy plně využitých zatím 17 byte z 20.

              zde je post z FB s videem:

              Našel jsem při třídění v mobilu jedno starší video z listopadu 2018, které jsem si myslím nikdy nezveřejnil. Jedná se o opravu efektu vibrata, které se ve zvuku sekalo v mé hudební rutině hrající můj vlastní hudební formát. Je to i s nekvalitním zvukovým komentem. V současné době jsem již o kus dál s daným kódem. Přišlo mi to zajímavé. Pouštím skladbu z trackeru 8 bit Atari a pak to zahraju v mém formátu přes sample v emulaci na Amize. Tak si to můžete pustit. ❤️ Amiga

              Amiga - PMD 85

              Komentovat


                Pracuji na tom průběžně. Další úprava je
                DBF D3, SEARCHTAB
                nahradit
                BRA SEARCHTAB

                Změna v kódu není zahrnuta. Já jsem instrukci DBF zatím nepřišel na chuť a nepoužívám ji. Nicméně teď ani použita být nemůže.

                EDIT: ještě tam pak přidám ten raw obrázek, ze kterého si to tahá to písmo 😁
                Přiložené soubory
                Naposledy upravil Lisiak; 11.12.2021, 14:11:17.
                Amiga - PMD 85

                Komentovat


                  Program pro psaní textu.

                  Další úpravy, dávám sem hlavně kvůli raw obrázku, ze kterého se berou data pro text, který jsem doposud ke kódu nepřidal. Druhé DBF v programu nechávám, má své opodstatnění a neměním jej za mě oblíbené BRA. 1 drobná úprava v logice. Další zjednodušení kódu pro jednoduché vypsání jenom textu. Ještě se podívám na Copper list a základ programu by měl být hotov. V současné době má kód cca 100 řádků z původních asi 150. Z programu jsem odstranil zesvětlí a ztmavnutí textu. Text se jen zobrazí.

                  Je to hezká část kódu.
                  Přiložené soubory
                  Amiga - PMD 85

                  Komentovat


                    Asi by to chtělo dát tam i exáč, ať si to člověk nemusí buildovat sám.

                    Pár poznámek ke code (si nemůžu pomoct, co?):
                    - Nejsem si jistý, jestli se dá spoléhat na to, že se po povolení multitaskingu na konci programu vždy správně automaticky nastaví původní screen. Asi to obvykle zafunguje, ale i tak se doporučuje zavolat LoadView() s uloženým původním View. Problémy jsou údajně s RTG. Aby se zbytečně nevynalézalo kolo, tak doporučuji z netu stáhnout například Photonův MiniWrapper, který dělá shutdown/restore systému (ale pozor: ruší VBL přerušení, takže to ani tak nemusí vše v systému přežít bez úhony).
                    - Není to sice u tak krátkého programu vůbec důležité, ale i tak to uvedu: Na některých místech se tam zbytečně dělá aritmetická operace s long-wordem, i když by stačil jen word -- add.l #40,a2 se dá zcela nahradit za add.w #40,a2, protože 680x0 všechny aritmetické operace s adresovými registry automaticky rozšiřuje na 32 bitů. Totéž také platí pro add.l d1,a3, kde stačí použít add.w d1,a3, pokud máme v d1 jen max šestnáctibitové číslo se znaménkem. Obecně platí, že když pracujeme jen s číselnými rozsahy, které se vlezou do 16ti bitů, je zbytečné používat operace nad long-wordy, které jsou vždy pomalejší.
                    - A toto už vůbec není důležité, ale je to taková obecná rada, jak dělat na staré dobré Amize o něco rychlejší kód: Rozvinout smyčky (loop unroll). Pokud dopředu vím, kolikrát se něco má ve smyčce udělat (nebo mám nějaký rozumný odhad) a vnitřek smyčky je malý (pár instrukcí), je režie odskoku na začátek smyčky (bxx,b nebo dbxx.b) velká. Klidně i desítky procent v případě krátkých smyček. Je tedy lepší ty instrukce zkopírovat za sebe (vhodná jsou pro to makra). Sice to bude zabírat více paměti, ale bude to rychlejší.

                    Naposledy upravil Defor; 12.12.2021, 19:37:15.

                    Komentovat


                      Ok, díky za rady. To kopírování Longu místo Wordu jsem zatím vůbec neřešil, ale díky za upozornění. Makra jsou u mně ještě není v pořadí. Já jsem se zatím jen prohrabával tím principem toho kódu a udělal drobné změny. V rámci logiky jsem třeba udělal test 1, tedy konec řádku před 0, tedy konec celého textu. Původně se 0 testovala před 1, co už tedy vadilo i mně v i tak zatím rozdělaném kódu. Restore systému, možná se na to podívám, ale taky to teď není hlavní problém, každopádně dobré o tom vědět.
                      Mně by třeba zajímalo, v Amiga Review se píše, že se má Cooper odstartovat zapsáním nějaké hodnoty na register dff088, nebo dff08a. V programu, ani v původní verzi se tohle nedělá. Není to tedy nutné a co Copper odstartuje, pokud ho odstartovat je třeba?
                      Amiga - PMD 85

                      Komentovat


                        Já tyhle verze dělám hlavně hlavně pro Stano
                        Proto z mé strany zatím jen ten přímý kód.

                        Zamýšlím pak balíček původní kód, zkompilovaný, zkrácený kód, zkompilovaný a můj amatérský výklad zkráceného kódu, kde třeba nepopíšu vše přesně ale princip bude obsažen. Ještě ale musím proběhnout ten Copper list, jak budu mít čas. Je pravdou že jsem 1 věc ohledně volání systému vůči původní verzi zrušil. Nechal jsem jenom ten multitasking. Na to se asi taky podívám. V kódu se celkem pozdě odstavuje multitasking. Má to nějaké opodstatnění, nebo se to může udělat i na začátku? V mé hudební rutině to mám na začátku. Offsety z původního kódu pro systém jsou i -408,-414, co je open/close library, ale teď v rychlosti k tomu nic dalšího nenacházím. Já jen čemu zatím nerozumím, ale pořádně jsem se ještě neměl čas podívat. Koukám že ty offsety se používají v závěru programu a mezi open a close se zapisuje pouze na registr dff080, po tomhle zápisu je ten offset -414, před zápisem na dff080 je offset -408 pak se pouští multitasking a je konec programu.
                        Amiga - PMD 85

                        Komentovat


                          Pár oprav a dodatků:
                          * Opravuji své tvrzení ohledně "add.w Dx,Ax "instrukce: I když obecně stále platí, že je u 68000 vhodnější pracovat pouze s šestnáctibitovými daty (pouze 16ti bitová datová sběrnice), výjimkou je instrukce add.w Dx,Ax, která je pomalejší (o dva takty) než add.l Dx,Ax. Důvodem je, že CPU musí šestnáctibitovou hodnotu v Dx registru nejdříve rozšířit na 32 bitů a pak teprve provést aritmetickou operaci.
                          * Rozvinutí smyček (loop unroll) je u CPU s cache vhodné dělat jen do takové míry, aby byl kód stále v instrukční cache. Nemá smysl rozvinout smyčku do kódu o délce stovek nebo tisíců bajtů, jestliže se pak nevleze do cache. To by bylo kontraproduktivní.

                          K tvým otázkám:

                          * "jsr d(a6)", kde d je -408 je skok do funkce OldOpenLibrary() v exec.library, která otevírá jinou knihovnu (ve tvém případě zřejmě graphics.library).
                          Obdobně -414 je ofset pro funkci CloseLibrary(), kterou se dříve otevřená knihovna zavírá.
                          U AmigaOS je zajištěno, že na adrese 4, je vždy uložena bázová adresa exec.library. Proto ve všech programech uvidíš něco jako "move.l 4.w,a6" -- systémové funkce vyžadují, aby báze knihovny, jejíž funkce se volá, byla uložena v registru a6.
                          Předpokládám, že tvůj program původně otevíral graphics.library, aby mohl zavolat její funkci LoadView (viz. můj předcházející příspěvek).

                          * $dff088 a $dff08a jsou adresy registrů COPJMP1 a COPJMP2. Jsou to tzv. "strobe" registry -- nezáleží, jaká hodnota se do nich zapíše, důležitý je jen proces zápisu. Pokud se do nich zapíše, tak Copper začne provádět instrukce od začátku copper-listu, tedy od adresy uložené v COP1LC nebo COP2LC. Tedy jinými slovy se vynutí, aby Copper skočil na adresu uloženou v těchto registrech a od této adresy začal načítat instrukce. Dá se to připodobnit k CPU instrukci "jmp". Osobně používání COPJMP1/2 registrů nedoporučuji. Není pro to ve většině případů důvod (ale existují výjimky a existence těchto registrů má své opodstatnění). Copper se totiž restartuje (začne provádět instrukce od začátku copper-listu) automaticky na začátku každého vertical-blank. Naopak vynucení skoku na danou adresu přes CPU může přijít v době, kdy je už elektronový parsek na libovolné pozici a v důsledku toho (záleží na tom, co se v copper-listu dělá) se může obraz v tomto frejmu generovat nesprávně.
                          Naposledy upravil Defor; 13.12.2021, 10:38:01.

                          Komentovat


                            Odstavení multitaskingu (nebo obecně systému) by mělo přijít až v okamžiku, kdy se začne manipulovat s hardwarem. V tomto případě s Copperem (nastavení adresy jeho programu do COP1LC registru). Kdyby se to udělalo později, je tu nebezpečí, že běžící systém/programy na pozadí by adresu přepsaly podle svých potřeb. To platí i o čemkoliv jiném (přerušení, audio, floppy, ...).
                            Systém se samozřejmě dá odstavit dřív. Někdy se to dělá proto, aby se zrychlila inicializace dat (decrunch, precomputation, ...). Příliš brzké odstavení ale například způsobovalo, že dos nestihl vypnout motor flopiny po načtení z diskety. Programy tak měly na začátku pauzu, nebo přes trackdisk.device motor samy vypnuly, nebo to prostě neřešily.
                            Vypnutí multitaskingu Forbid() není odstavení systému, jen task scheduler nepřepne kontext na jiný task a nezačne se provádět jeho program. Funkce Disable() zastaví i ošetřování přerušení (ty např. potřebují všechny devices) -- tohle vypnutí systému je důslednější. Nejdůslednější shození systému je zakázáním přerušení a/nebo přepsáním vektorů přerušení. Pozor, systém negarantuje správnou funkčnost svých součástí a zařízení po návratu do systému, i když se vše změněné vrátí do původního stavu. Některá zařízení podle dokumentace (síťové karty například?) vyžadují neustálé ošetřování přerušení (tedy provádění jejich kódu vyvolávaného přerušením).

                            Komentovat


                              Defor 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?
                              Amiga - PMD 85

                              Komentovat


                                Defor .
                                A když jsme u těch dotazů, tohle není tak nutný ale zeptám se když tě tady mám. 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?

                                Když jsem vše napsal blbě tak pardon 🙂
                                Amiga - PMD 85

                                Komentovat

                                Zpracovávám...
                                X