Oznámení

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

Assembler - všeobecná logika

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

    Hele je rok 2022 a hlavní úkol mého PC je emulace Amigy
    Amiga - PMD 85

    Komentovat


      Tak dnes jsem se opět hrál s kódem od Photona, který vypíná systém a pak jej obnovuje v mém kódu. Ještě jednou jsem se zaměřil na u mně problémové části kódu a snažil se najít alespoň u mně nejlepší konfiguraci problémových části kódu (jsou jen 2 hlavní). Jednou jsem se rozhodl na základě tohoto, že se mi povedlo uvést můj program po několikátém spuštění do chyby, kdy již nešel vůbec spustit a má změna v kódu od Photona umožnila opětovné spuštění kódu 🙂. Mezi tím se mi a já přesně pořád nevím proč začal opět správně zobrazovat text až ke krajům obrazovky (zobrazoval se mi s odstupem od krajů) a dokonce mi i zobrazuje poslední 2 pixely na pravé straně co být taky problém. Našel jsem nejoptimálnější nastavení kódu od Photona vše uložil. Vypnul jsem A1200 tak na 10 minut. Zapnul. Kód spustil z rozlišení HiRes a i Multiscan Productivity (640x480) Zobrazení bylo správné. Zkompiloval jsem kód do EXE. Spustil kód z HiRes a Multiscanu a zobrazení je správné.

      Pokud se mi to ještě někdy rozjebe, udělám vše proto abych zůstal klidný ale to správné zobrazení textu ke krajům jsem dnes opravdu nečekal 🙂
      Amiga - PMD 85

      Komentovat


        Mohl bych prohodit u MiniWrapperu od Photona u podprogramu návěstí WaitRaster s WaitEOF? Kdyby to šlo, nemusel bych použít podprogram WaitEOF0. V A6 je $dff000. Před spuštěním mého programu používám podprogram WaitEOF0, po ukončení mého programu podprogram WaitEOF.

        Podprogram AllOff0 již používám jak u vstupu tak u výstupu z mého programu, tedy podprogram AllOff dám do komentáře. Nicméně předpokládám, že jinak by výměna návěstí AllOff s IntReqD2 asi nebyla problém, kde bych pak nepoužil již podprogram AllOff0, protože bych jej volal napřímo tím, že bych měl prohozená ty 2 návěstí a nuloval jen INTREQ dva krát po sobě.

        V obrázku je část kódu od Photona s mou úpravou a přidáním návěstí WaitEOF0 a AllOff0.

        Klikni pro plné zobrazení obrázku

Jméno: PhotonWrapper.png
Počet zobrazení: 60
Velikost: 22,3 KB
ID: 155944
        Amiga - PMD 85

        Komentovat


          Autorem citovaného textu je Lisiak4 Přejít na původní příspěvek
          V obrázku je část kódu od Photona s mou úpravou a přidáním návěstí WaitEOF0 a AllOff0.
          Nerad to píšu, ale tvé AllOff0 nedělá nic, co je účelem původního AllOff -- tedy zakázání DMA a přerušení. #$7fff nuluje vše ve dvou registrech k tomu určených: DMACON a INTENA. Zápis této hodnoty do INTREQ je jen zajištění, aby se nevyvolalo žádné přerušení, o které už bylo systémem (Paulou) požádáno (INTerrupt REQuest). Nevím, jestli je to úplně nutné, ale věřil bych Photonovi, který tohle určitě převzal z jiných starších rutin, a nechal bych to tam. Každopádně tvé AllOff0 DMACON ani INTENA nemažou a tudíž ti na pozadí stále běží ošetření všech dříve povolených přerušení (a stále ti běží všechny DMA kanály).
          Pokud ti tvůj program normálně po AllOff nejede, je to nejspíš tím, že pak přerušení, která používáš, nezapneš. Nezapomeň nastavit i bity INTEN a DMAEN, protože ty byly taky smazány!
          Tvoje rutina WaitEOF0 taky nic nedělá. Teda dělá jen to, že počká až přestane pracovat blitter (WaitBlitter). Úkolem té rutiny je vrátit se v okamžiku, kdy je obrazový paprsek za vykreslováním posledního řádku obrazu (tedy začne docházet k vertical-blank). Proč Photon pro jistotu čeká i na blitter netuším -- asi další příklad velké opatrnosti. Tvoje rutina ale na paprsek nečeká - netestuje jeho pozici. (Mimochodem ta rutina nefunguje, pokud by tvůj program běžel na NTSC systému. Tam je nejvyšší vertikální pozice el. paprsku jen $106.)
          Naposledy upravil Defor; 13.05.2022, 15:12:21.

          Komentovat


            Opět díky moc za nasměrování. To nastavení bitů pro práci s bitplany a copperem nebylo ani součástí původního kódu pro práci s textem, který jsem převzal a upravil. Je pravdou že Copper jsem přidal já i když s ním dělám pouze jednoduchou čáru. Nějak jsem si to vše nedal dohromady. To jsem celý já.

            Správně fungování původního podprogramu WaitEOF bylo podmíněno správným nastavením DMA přenosu v DMACON ($dff096), tedy tohle již taky funguje.

            Tak tohle jsou ty přerušení, já to jen používám. Tedy doposud hlavně u Pauly, teď již i u Bitplanu a Copperu.

            Vím že jsem se již jednou ptal na 9.bit DMAEN u DMACON co je hlavní povolení DMA. Má zkušenost je taková. Že pokud jsem pracoval čistě jen s Paulou bez obrazu, nepotřeboval jsem ho nastavovat, ale jakmile již k tomu přidám i práci Bitplanu, nebo Copperu, již potřebuji mít tenhle 9.bit nastaven, jinak mi ani Paula nic nehraje. Tenhle 9.bit (DMAEN) hlavní povolení DMA vnímám jako nějakou komunikaci mezi právě probíhajícími DMA přenosy.

            Právě zjišťuji že teď mám problém ještě s podprogramem AllOff který se provádí až za mým programem, tedy při návratu do systému. Za to ale již snad já nemůžu? Ono tedy někdy se to spustí dobře a někdy mi to zobrazuje jen asi prvních 10 znaků ze 40 a většinou se to spustí správně bez téhle chyby. Jednou se mi to spustilo i s odstupem textu od kraje obrazovky. Taky se mi to i jednou z EXE nespustilo, ale pak jsem udělal další kompilaci. Zdá se mi nevynulování registrů DMACON a INTENA za mým programem jako stabilnější ale ještě to budu testovat. Nulování těchto 2 registrů před mým programem již provádím.

            ​​​​​
            ​​​​
            Amiga - PMD 85

            Komentovat


              Hm, tak ono to vypadá jako by restart A1200 nestačil po tom co spustíš program s ne zrovna ideálním nastavením DMA přenosů. Pomohlo až vypnutí a zapnutí A1200 aby se program začal chovat korektně, když jsou i DMA přenosy nastaveny správně.
              Amiga - PMD 85

              Komentovat


                A abych zde neměl jen blbý kecy tak pár postřehů, ale budu to tak nějak tahat z hlavy, nejsem nastaven na to čumět jakkoliv do kódu.

                Myslím že jsem konečně narazil na příčinu, proč se mi můj program pomocí kódu od Photona co odstaví systém chová někdy při spuštění nestandardně.

                Popis chování, které se projeví ze začátku někdy při spuštění a při třeba tak 5 spuštěním po sobě již méně často​​​​​ co je tak jednou za 20 až 50 spuštění.

                Zobrazování textu jen u prvních 12 písmen že 40.
                Nezobrazení textu, hraje pouze skladba a funguje Copper.
                Nereagovani ukončení programu pomocí klávesy space, pomocí tlačítka na myši program ukončit lze.

                Co mně zmátlo je skutečnost že se program při hledání chyby chová jinak pod prostředím a jinak když je zkompilovaný. Tedy to že přijdete na vodítko které by vás nasměrovalo na to čeho se chytit a které vám funguje pod vývojovým prostředím většinou nefungovalo u kompilovaného programu.

                Problém by dle všeho měl být u podprogramu s offsetem -222 z grafické knihovny. Je to zjištění ze dnes, ještě budu testovat ale kód byl zatím u EXE stabilní, když jsem tenhle offset/podprogram u kódu od Photona nepoužil. Ják bude čas budu hrát na to, že tento podprogram se vykonává dlouze a můj program díky němu začne pracovat bez chyby tak na jeho 20 cyklu. Tenhle podprogram zabezpečuje spuštění mého programu i z grafického módu Multiscan Productivity, tedy se to pokusím dát nějak dohromady 🙂
                Amiga - PMD 85

                Komentovat

                Zpracovávám...
                X