atarionline.pl MAD-Pascal - Początki - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1: CommentAuthorMADRAFi
      • CommentTime14 Jan 2019 22:01 zmieniony
       
      Po 28 latach wrocilem do Atari, w pewnym sensie bo do dyspozycji mam jedynie emulator, a po 22-23 latach do pascala.
      Nie jest latwo, szczegolnie ze nigdy wybitny w tym nie bylem. Dopiero teraz widze jak malo wiem na temat budowy i dzialania 8bit atari.

      Po przejrzeniu forum jako jezyk programowania wybralem MAD-Pascal'a. Wiele osob wskazywalo go jak na najbardziej przystepny, niestety ilosc dokumentacji nie wyjasnia mi jak pewne rzeczy dzialaja.

      Nieocenione sa wszelkiego rodzaju przyklady gier oraz porgramow dolaczone do MAD-Pascala.
      Duze brawa dla Kolegi Bociana za przygotowanie kilku bibliotek i szablonu projektu.

      Mysle ze przydalby mi sie ktos w rodzaju mentora ktory pokierowalby mnie na prawidlowe rozwiazanie.


      Udalo mi sie skonstruowac program ktory definiuje wlasna display liste. Mieszany tryb (100 linii w trybie 160x192@4) + kilka linni pustych oraz w trybie 40x24)
      Bylem tez w stanie wyswietlic wczesniej przygotowany obrazek.

      Problemy ktore napotkalem do tej pory:

      1. Obrazek nie ma prawidlowych kolorow. Rozumiem ze GTIA musi jeszcze nalozyc kolor na niego po przygotowaniu przez ANTICA. Niestety nadal nie rozumiem jakw procesie przygotowywania grafiki w programie graficznym to potem przeniesc do kodu.
      Obecnie grafike zapisuje w bitmapie 160x100, 4 kolory.
      Potem ten plik konwertuje programem do pliku dat.

      2. Nie wiem jak potraktowac temat ladowania wiekszej ilosci obrazkow. Czy trzeba je zaladowac do pamieci na raz? i potem podmieniac w display list? Nie rozumiem chyba koncepcji. Przy planowanych kilkunastu grafikach moze nie starczyc pamieci, no i tez troche bez sensu jest trzymac nie uzywane rzeczy w pamieci.

      4. Poniewaz wybralem taki tryb a nie inny (Z braku umiejetnosci), text na ekranie wypisuje przy uzyciu write.
      Potrzebuje wyczyscic ekran/linie przed umieszczeniem nowego tekstu. Uzycie CtrlScr; powoduje wyczysczenie calego ekranu, razem z wyswietlona wczesniej grafika.

      5. W jaki sposob mam wiedziec jaki rozmiar ma grafika, muzyka i pod jakim adresem w pamieci to umiescic, tak by nie zamazywalo to innych danych.
      Probowalem relatywnego adresowania, ale nie zawsze to dzialalo. CZesc informacji podaje kompilator ale mysle ze brakuje mi jakiegos elementu by zrozumiec jak zaplanowac uzycie pamieci.
      (Dokumentacji mape pamieci Atari przegladalem)

      6. Probowalem podmienic font wykorzystujac framework bociana. Niestety oprocz zmienionego fontu w czesci napisow pokazuje sie sieczka na ekranie. Zapewne problem z adresacja.

      7. Scroll, poleglem totalnie chociaz przegladalem conajmniej 2-3 przyklady jego uzycia. Bylem w stanie zmodyfikowac czyjs program, ale w swoim na mojej wlasnej display liscie jedynie co udalo mi sie uzyskac to przesuniecie napisu o kilka pikseli w lewo po czym tekst skakal do bazowej pozycji i tak w kolko. Czy to bylo spowodowane brakim obslugi przerwam?

      Jakiego IDE uzywacie do programowania w MAD-Pascalu?
      W jaki sposob debugujecie kod?

      W tej chwili uzywam edytora Atom z dodanym stworzonym przez siebie modulem ktory dodaje 2 targety. Pierwszym kompiluje plik .pas do .a65. Drugim targetem .a65 zostaje skompilowany do pliku .obx.
      Niestety nie potrafilem zrobic 1 akcji build. Nie wiem tez czy jest sposob by debugowac mad-pascala na atari.
      Altirra jest w stanie debugowac assembler, ja ggo nie znam.
      Rozszerzenia Atoma pozwalaja na debugowanie w roznych jezykach ale nie wiem czy da sie to jakos dostosowac.
      gdb.exe debugger gnu nie chcial mi zadzialac.
      • 2: CommentAuthorPecet
      • CommentTime15 Jan 2019 08:01
       
      odnosnie IDE, to ponizej masz link do tutka od Bociana:
      ->link<-

      debugowanie: ja pod altirra patrze w monitor pamieci.

      w ogole w tym topicu (na poczatku jest o C, potem wchodzi mad pascal) znajdziesz troche przydatnych informacji.

      ->link<-

      Jezeli chcesz wyswietlic inny obrazek, to mozesz np. podmienic w display list adres pamieci ekranu.
      • 3: CommentAuthortebe
      • CommentTime15 Jan 2019 08:01 zmieniony
       
      ClrEOL
      czyszczenie wiersza od aktualnej pozycji X:Y do końca wiersza (EOL)

      ->link<-

      pozycje kursora ustalamy dzięki GotoXY, odczytujemy przez WhereX, WhereY

      biblioteka IMAGE ułatwia ładowanie obrazków z dysku, zamiast DPEEK(88) musisz umieścić swój adres pamięci danych obrazu

      uses graph, image;

      begin

      InitGraph(15);

      LoadMIC('D:CLOUDS.MIC', pointer(dpeek(88)) );

      end.
      • 4:
         
        CommentAuthorpirx
      • CommentTime15 Jan 2019 09:01
       
      hscroll tak działa, jak napisałeś - przesuwa obraz w bok z rozdzielczością cyklu koloru. używa się go tak, że skrolujesz hscroll aż nie wjedzie Ci kolejny bajt (albo 2), jak już wjedzie to sam skrolujesz całość jakąś metodą i wracasz z hscroll do wartości wyjściowej.
      Skrol o bajt można zrobić zmieniając adres w display list.
      piszę tak dość ogólnie, bo można to robić na różne sposoby, ale skoro już Ci się coś majta na ekranie, to jesteś prawie w domu.
      • 5: CommentAuthorMADRAFi
      • CommentTime15 Jan 2019 09:01
       
      Dziekuje za odpowiedzi :)

      ClrEol znalazlem, ale sadzilem ze bedzie jakas prostrza metoda niz wyczyszczenie linii przed umieszczeniem tam tekstu. Nie wiem tez jak to bedzie wydajnosciowo :)

      Co do LoadMIC, czy to aby nie za wolna metoda - operacje dyskowe nie sa chyba za szybkie? Przechodzenie miedzy ekranami trwaloby za dlugo.
      Chyba musialbym zaczytac klika obrazkow do pamieci i wyswietlac je, a po zmianie lokalizacji doczytac nowa partie grafik.

      Jezeli teraz grafike mam zdefiniowana w plikach resource.rc jako:

      GFX_ADDRESS RCDATA 'assets/obrazek.dat'
      to jak nalezaloby podejsc do tematu zaczytywania grafik?

      No i o co chodzi z tym kolorem obrazkow? Rozumiem ze musze recznie zdeiniowac 4 kolory w tym trybie?
      • 6: CommentAuthorPecet
      • CommentTime15 Jan 2019 10:01
       
      Jezeli robisz grafike pod gre, jedyny chyba sposob to skladanie ekranow z "klockow". Inaczej jak zauwazyles szybko zapelnisz pamiec.
      ->link<-
      • 7: CommentAuthortebe
      • CommentTime15 Jan 2019 10:01 zmieniony
       
      Atari ma 9 rejestrów kolorów, musisz wstawić odpowiednie wartości do przynajmniej 4-ech z nich

      jeśli masz włączony system, to wpisujesz do cieni tych rejestrów, czyli kopii, które system później na przerwaniu VBLANK przepisze do rejestrów sprzętowych $d012...

      jeśli grafika nie składa się z Tilesów (kafelków, klocków) to kompresja, im wydajniejsza tym lepsza

      albo, skorzystać z pamięci dodatkowej i tam wszystko umieścić i przepisywać (TMemmoryStream)

      w resource podajesz pod jakim adresem umieścić dany plik, zaczytanie takiego obrazka polega na przepisaniu pod adres docelowy, albo prościej - ustanowienie nowego adresu wyświetlania na ten z resource
      • 8: CommentAuthorMADRAFi
      • CommentTime15 Jan 2019 14:01 zmieniony
       
      Pobawilem sie rejestrami kolorow i mam problem ze albo mam nieodpowiednie tlo i tekst w liniach trybu 0 lub nieodpowiednie kolory obrazka. Wnioskuje ze powinienem miec rozne wartosci kolorow przypisane w display liscie dla odpowiednich trybow. Tak by odpowiednie punkty obrazka mialy odpowiednie kolory.
      Jezeli tak to w jaki sposob sie to wykonuje?

      dl_start
      dta DL_BLANK8 ; // 8 blank line
      dta DL_MODE_160x192G4 + DL_LMS, a(GFX_ADDRESS) ; // gfx line + graphics memory start
      :99 dta DL_MODE_160x192G4 ; // x graphics line
      dta DL_BLANK8 ; // 8 blank lines
      dta DL_MODE_40x24T2 + DL_LMS, a(VIDEO_RAM_ADDRESS) ; // mode 0 line + text memory start
      :5 dta DL_MODE_40x24T2 ; // 5x mode 0 line
      dta DL_BLANK8 ; // 2x 8 blank lines
      dta DL_MODE_40x24T2 + DL_HSCROLL ; // mode 0 line
      dta DL_BLANK8 ; // 8 blank lines
      dta DL_JVB, a(dl_start) ; // jump to beginning
      • 9: CommentAuthortebe
      • CommentTime15 Jan 2019 16:01
       
      :) skoro zmieniasz tryby w liniach (wierszach), to musisz zaprząc do działania przerwanie DisplayList, na początku każdego takiego obszaru program przerwania będzie musiał ustawić kolory odpowiednie dla danego trybu
      • 10: CommentAuthorVidol
      • CommentTime15 Jan 2019 16:01 zmieniony
       
      kolory ustawiasz tylko dla pierwszego trybu dl od gory, w tym przypadku dla obrazka. Aby miec poprawne kolory w pozostalych trybach musisz wlaczyc przerwania dli w i w nich ustawiac odpowiednio kolory.Miedzy trybami masz 8 pustych lini w ktorych trzeba wlaczyc przerwanie.
      Nie wiem jak to poprawnie zrobic mad pascalu. Ja by to zrobil tak, ze zamiast dta Dl_blank8 wstawil bym

      dta $F0

      Druga sprawa, po linii ze scrollem nie potrzeba pustych linii tylko od razu skok na poczatek dl.

      I oczywiscie trzeba napisac procedury przerwan, ktore beda zmienialy kolory.

      EDIT: Tebe byl szybszy.
      • 11: CommentAuthorPecet
      • CommentTime15 Jan 2019 17:01
       
      Jeżeli będziesz zmieniał kolory w DLI, to ustawiaj rejestry, a nie ich cienie.
      • 12: CommentAuthorMADRAFi
      • CommentTime15 Jan 2019 20:01
       
      W tej chwili mam juz 2 Display Listy i przelaczam sie miedzy nimi w zaleznosci od potrzeby.
      Wiekszosc ekranow mam w tej mieszanej ( zalozenie trybu mieszanego grafika + tekst). Druga DL to normalny tryb 40x24. Przelaczanie dziala bardzo ladnie.

      Niestety przerwania dli i ustawianie w niej kolorow sa kompletnie czarna magia dla mnie.
      Przegladam przykladay ale za duzo tam assemblera.

      To jest przyklad DLI ustawionego na ekranie tytulowym gry bociana PAC-MAD:
      procedure Dli1T; interrupt;
      begin
      asm {
      pha
      mva #0 _ATARI._COLOR2
      mva #$06 _ATARI._COLOR1
      :3 sta _ATARI._WSYNC
      mva #$08 _ATARI._COLOR1
      sta _ATARI._WSYNC
      mva #$0a _ATARI._COLOR1
      sta _ATARI._WSYNC
      mva #$0c _ATARI._COLOR1
      sta _ATARI._WSYNC
      mva #$0a _ATARI._COLOR1
      sta _ATARI._WSYNC
      mva #$08 _ATARI._COLOR1
      mwa #DLI2T _ATARI._VDSLST
      pla
      };
      end;

      Na tyle na ile cos lapie to mva ustawia wartosci kolorow w pewnych rejestrach.

      Czy ktos moglby mi to przetlumaczyc na jezyk ludzki?
      Jak dopasowac ten assembler do swojej display listy ?
      • 13: CommentAuthortebe
      • CommentTime15 Jan 2019 20:01 zmieniony
       
      z Pascala do Assemblera droga niedaleka ;)

      plik *.A65 który otrzymujesz po kompilacji to nic innego jak właśnie plik *.ASM z tymi 'znaczkami', 'znaczki' czyli mnemoniki, rozkazy, makrorozkazy, pseudo rozkazy, dyrektywy są opisane m.in. na ->link<-

      mva, mwa, mvx, mwx, mvy, mwy to w sumie makro rokazy, zlepek kilku prostych rozkazów aby pisało się szybciej

      znaczenie ich działania jest opisane tutaj ->link<-

      odpowiednikiem dla
      mva #$12 color0


      w Mad Pascalu jest
      color0:=$12;


      jeśli podejrzeć bibliotekę 'atari.pas' to tam 'color0' to jest cień rejestru, 'colpf0' to rejestr sprzętowy

      colpf0:=$12;
      • 14: CommentAuthortebe
      • CommentTime15 Jan 2019 20:01
       
      inne podejście do zmiany kolorów

      uses crt, atari;

      begin

      repeat

      case vcount of
      10: colbk:=$26;
      20: colbk:=$36;
      30: colbk:=$46;
      end;

      until keypressed;

      end.
      • 15: CommentAuthorPecet
      • CommentTime15 Jan 2019 20:01
       
      ja DLi zrobiłem w ten sposób (dli dla opornych;)):
      procedure Dli; interrupt;
      begin
      asm { phr };
      Poke(54282,1); //wsync
      Poke(53271,34);
      Poke(53273,22);
      asm { plr };
      end;
      • 16: CommentAuthorMADRAFi
      • CommentTime15 Jan 2019 21:01 zmieniony
       
      Dziekuje, to bardzo pomocne.

      Dlaczego czasem widze 1 wsync, a czasem kilka jeden pod drugim?

      Kluczowa jest tez informacja iz nasza display lista musi miec w 1 linii dodatkowo dodane DL_DLI

      Teraz zadzialo to kolory zostaly zmienione. Ale nie rozwiazalo to mojego problemu.

      Do dyspozycji sa 4 kolory. Konkretne elementy obrazka sa powiazane z kolorami ramki oraz tla.

      Gdy ustawie by obrazek mial prawidlowe barwy to zmienia sie kolor ramki, tla.

      Innymi slowy kolor napisu w obrazku powiazy jest nadal z kolorem ramki. A cala ta zabawa z DLI miala na to zaradzic.

      Czyli pierwsze 100 linii maja ustawione 4 kolory w 1 sposob
      a kolejne linie w 2 sposob
      • 17: CommentAuthortebe
      • CommentTime15 Jan 2019 23:01
       
      x1 wsync to jedna linia, x2 wsync to dwie linie

      ->link<-

      $D40A (W) WSYNC
      Wait for horizontal synchronization. Zapis dowolnej wartości do tego rejestru powoduje uaktywnienie przez ANTIC sygnału RDY, czym zatrzymuje on 6502 do chwili wystąpienia impulsu synchronizacji poziomej.
      • 18: CommentAuthorMADRAFi
      • CommentTime16 Jan 2019 20:01 zmieniony
       
      To akurat mozna bylo sie domyslec. Tylko dlaczego w jednej DLI ktos czeka 1 cykl, a ktos 5.

      Przyklad tutaj:

      procedure Dli1T; interrupt;
      begin
      asm {
      pha
      mva #0 _ATARI._COLOR2
      mva #$06 _ATARI._COLOR1
      :3 sta _ATARI._WSYNC
      mva #$08 _ATARI._COLOR1
      sta _ATARI._WSYNC
      mva #$0a _ATARI._COLOR1
      sta _ATARI._WSYNC
      mva #$0c _ATARI._COLOR1
      sta _ATARI._WSYNC
      mva #$0a _ATARI._COLOR1
      sta _ATARI._WSYNC
      mva #$08 _ATARI._COLOR1
      mwa #DLI2T _ATARI._VDSLST
      pla
      };
      end;


      Wyglada na to ze moja DLI powinna zmienic kolory na poczatku, potem poczekac na konkretna wartosc vcount i znow zmienic zestaw kolorow.

      Czy moze ktos pomoc rozkminic budowe DLI?

      Co oznaczaja 3 rozne wpisy DL_DLI w roznych definicjach linii ? Czy to oznacza mozliwosc 3 wywolan procedury DLI?
      • 19:
         
        CommentAuthorbocianu
      • CommentTime16 Jan 2019 20:01
       
      cześć MADRAFi!

      Szybko odpowiadam - czasem czekam jedną linię, a czasem 3 bo chce zmienić kolor w KONKRETNEJ linii ekranu.

      DL_DLI występuje w kilku liniach, bo przerwanie DLI możemy wywołać kilka razy w czasie rysowania jednego ekranu. Należy tylko uważać, aby poprzednie zdążyło sie wykonać zanim wykonamy następne.

      zwróć uwagę na tę linię:
      mwa #DLI2T _ATARI._VDSLST

      jako ostatnie polecenie przypisuje nowy adres procedury przerwania DLI. Czyli ta procedura (Dli1T) zostanie wywołana raz,
      potem podmieniam adres w rejestrze VDSLST na nową wartość: Dli2T i ta procedura zostanie wywołana po kolejnym napotkaniu DL_DLI w programie listy displejowej ;)
      • 20: CommentAuthorMADRAFi
      • CommentTime16 Jan 2019 21:01 zmieniony
       
      Dzieki, tak wlasnie myslalem ze to tak moze dzialac. Kombinuje z kodem dalej :D

      tylko nie rozumiem co sie dzieje w 1 przerwaniu DLI w ktorym
      Zmieniasz kolor, czekasz na synchornizacje i znow zmieniasz kolor.

      U mnie w programie to na ekranie widze zawsze ostatnia wartosc ustawiona np dla atari.color1
      • 21: CommentAuthorMADRAFi
      • CommentTime16 Jan 2019 22:01 zmieniony
       
      Ok potrzebuje podpowiedzi bo wedlug mnie powinno dzialac w sensie merytorycznym, ale technicznie cos jest nie tak.

      DLI:
      procedure dli1;assembler;interrupt;
      asm {
      pha
      mva #$00 ATARI.COLOR0
      mva #$00 ATARI.COLOR1
      mva #$00 ATARI.COLOR2
      mva #$00 ATARI.COLOR3
      mva #$00 ATARI.COLOR4
      mwa #DLI2 ATARI.VDSLST
      pla
      };
      end;

      procedure dli2;assembler;interrupt;
      asm {
      pha
      lda vcount
      cmp #100
      bmi @+
      lda #0
      sta ATARI.WSYNC
      sta ATARI.COLOR4
      sta ATARI.COLOR3
      sta ATARI.COLOR2
      sta ATARI.COLOR1
      sta ATARI.COLOR0
      @
      sta ATARI.WSYNC
      mva #$00 ATARI.COLOR0
      mva #$0c ATARI.COLOR1
      mva #$00 ATARI.COLOR2
      mva #$00 ATARI.COLOR3
      mva #$00 ATARI.COLOR4
      pla
      };
      end;


      DISPLAY LIST:

      dl_start
      dta DL_DLI + DL_BLANK8
      dta DL_MODE_160x192G4 + DL_LMS, a(GFX_ADDRESS)
      :99 dta DL_MODE_160x192G4
      dta DL_DLI + DL_BLANK8
      dta DL_MODE_40x24T2 + DL_LMS + DL_DLI, a(VIDEO_RAM_ADDRESS)
      :5 dta DL_MODE_40x24T2
      dta DL_DLI + DL_BLANK8
      dta DL_MODE_40x24T2 + DL_HSCROLL
      dta DL_JVB, a(dl_start)


      Wywolanie DLI:

      // vbl interrupt
      GetIntVec(iVBL, oldvbl);
      SetIntVec(iVBL, @vbl);
      nmien:= $40;

      //display list interrupt
      GetIntVec(iDLI, olddli);
      SetIntVec(iDLI, @dli1);
      nmien:= $c0;


      Teroetycznie DLI1 powinna spowodowac ze linie trybu 160x192 beda niewidoczne.
      a linie trybu 40x24 - beda mialy kolor bialy

      A faktycznie wszystko ma 1 kolor.
      • 22:
         
        CommentAuthorbocianu
      • CommentTime16 Jan 2019 22:01
       
      zmieniam kolor czekając co linię, aby uzyskać efekt cieniowanego tekstu widoczny w pierwszym wierszu:

      • 23:
         
        CommentAuthorbocianu
      • CommentTime16 Jan 2019 22:01 zmieniony
       
      początek jest ok - pierwsze przerwanie ustawia wszystkie kolory na #0 - czarny, oraz ustawiasz wektor DLI na nową procedure.
      a potem wywołujesz tę nową procedure zaraz po ostatniej linii trybu DL_MODE_160x192G4, a potem zaraz w następnej linii też je wywołujesz (moim zdaniem niepotrzebnie) i na końcu ekranu jeszcze 3 raz (też niepotrzebnie chyba).

      A co robi Twoja dli2?
      najpierw sprawdzasz czy licznik linii (vcount) jest większy od 100, i jak nie to ponownie zerujesz [niepotrzebnie, bo one są już wyzerowane] wszystkie rejestry koloru, aby w nastepnej linii zamienić kolor tekstu na $c0, a jak jest powyżej 100 (a jest) to od razu zmieniasz kolor tekstu. Tekstu nie tła. Więc jak nie masz tekstu na ekranie to nie będzie różnicy. kolor tła to color2

      wywal na razie niepotrzebne wywołania DLI z listy displayowej i
      spróbuj po prostu tak:

      procedure dli2;assembler;interrupt;
      asm {
      pha
      sta ATARI.WSYNC
      mva #$0f ATARI.COLOR2
      pla
      };
      end;

      Pamiętaj, żeby nie robić niepotrzebnych operacji w DLI, bo one muszą być szybkie i krotkie. Nie wpisuj po raz kolejny zer do rejestrów w które wpisałeś zera w pierwszym wywołaniu już - to niepotrzebne tracenie cykli.
      • 24: CommentAuthorMADRAFi
      • CommentTime16 Jan 2019 22:01
       
      DZieki, to jest na razie faza testowa by zrozumiec dzialanie.

      Taki cieniowany tekst tez chcialem wykonac ale nie rozumialem jak to sie dzieje. To znaczy co innego rozumialem czytajac listingy (czyli to co opisales) a co innego mi wychodzilo - efekt byl taki ze jedynie ostatni kolor mial efekt.

      Wracajac do DLI

      Poprawilem ilosc wywolan DLI - mam teraz tylko 2 (docelowo bedzie 3 ale na razie chce zrozumiec dlaczego to nie dziala.
      1 DLI powinno ustawic wszystkie kolory na czarny. I jak to rozumiem narysowac niewodoczny obrazek w trybie 160x192 ( 100 linii)
      2 DLI powinno ustawic kolor tekstu na wybrany i powinienem widziec tekst ktory jest w tch liniach trybu 40x24


      Efekt bez zmian, wszystko ma 1 kolor bialy :)
      • 25: CommentAuthortebe
      • CommentTime16 Jan 2019 22:01
       
      mva #$00 rejestr oznacza
      lda #$00         ; ładuj $00 do Akumulatora (rejestr A)
      sta rejestr ; wartość z A zapisz pod adresem REJESTR


      jeśli masz
      mva #$00 rejestr1
      mva #$00 rejestr2


      to korzystniej jest zapisać
      lda #$00
      sta rejestr1
      sta rejestr2
      • 26: CommentAuthorMADRAFi
      • CommentTime16 Jan 2019 23:01 zmieniony
       
      @tebe dzieki, to na pewno ladniej wyglada i szybciej bedzie dzialac.
      Aczkolwiek na razie jestem na etapie testowania i probowania dlaczego cos dziala albo nie :)
      Docelowo powinienem miec ustawione 4 rozne kolory.
      Na razie probuje zamalowac gorne 100 lini na czarno by wylapac jak powinienem skonstruowac DLI
      No i srendio mi idzie bo chyba DLI nie wystepuje po prostu :)
      • 27: CommentAuthortebe
      • CommentTime17 Jan 2019 08:01
       
      upewnij się że DLI działa, tylko raz zapisujesz do NMIEN (w twoim przykładzie robisz to dwukrotnie, zmiana kolejności wyłączy jedno z nich), albo $40 jeśli chcesz mieć tylko VBL, albo $C0 jeśli chcesz oba przerwania VBL+DLI

      na przerwaniu DLI umieść
      lda $d20a
      sta $d01a


      jeśli kolor tła będzie mrugał chaotycznie tzn. że przerwanie DLI działa
      • 28: CommentAuthorMADRAFi
      • CommentTime17 Jan 2019 08:01
       
      OK to teraz juz wiem ze:
      1. Jak mam 1 DLI to jest on wywolywany 2 razy i 2 czesci ekranu migocza niezaleznie - widac ze mam mniej wiecej tak jak chcialem wywolanie DLI w display liscie
      2. Jezeli teraz w DLI1 zostawie to migotanie i dodam rozkac

      mwa #DLI2 ATARI.VDSLST


      To 2 wywolanie DLI (na display liscie) nie powinno migac ekranem (nie zmienia sie tam kolor tla, a kolor tekstu)

      3. Wszystko wskazuje na to ze po2 wywolaniu DLI (faktycznie uruchamia sie wtedy procedura DLI2 to ona jest juz nastepnymi wywolaniami DLI. Dlatego caly ekran jest malowany w taki sposob jak opisuje DLI2

      Przy 2 DLI gdzie 1 laduje 2 brakuje mi chyba jeszcze jakiegos elementu ktory to zepnie. Nie umiem powiedziec tylko jakiego.
      • 29: CommentAuthortebe
      • CommentTime17 Jan 2019 10:01
       
      Na przerwaniu VBL ustawiasz adres pierwszego DLI? Przerwanie VBL rozpoczyna odrysowanie ekranu, musisz tam ustawić jakieś wartości początkowe - globalne, inaczej po ostatnim wywołaniu DLI2 już tak zostanie i będzie wywoływane tylko DLI2 do końca świata...
      • 30: CommentAuthorMADRAFi
      • CommentTime17 Jan 2019 18:01
       
      No dokladnie tak to wyglada :)
      Potem w kolko dziala DLI2.

      Jak prawidlowo w przerwaniu VBL ustawic adres DLI1 ?

      Takie cos nie dziala:

      procedure vbl;assembler;interrupt;
      asm {
      phr ; store registers

      mwa #DLI1 ATARI.VDSLST

      plr ; restore registers
      jmp $E462 ; jump to system VBL handler
      };
      end;
      • 31: CommentAuthorVidol
      • CommentTime17 Jan 2019 19:01
       
      tak jak w dli1 ustawiasz adres dli2, tak samo ustaw w dli2 adres dli1 i bedzie git :)
      • 32: CommentAuthorMADRAFi
      • CommentTime17 Jan 2019 19:01
       
      probowalem juz takie podejscie. Tez nie dalo oczekiwanego rezultatu ;)
      • 33: CommentAuthortebe
      • CommentTime17 Jan 2019 20:01
       
      ile linii ekranu dzieli jedno wywołanie DLI od drugiego ?
      • 34: CommentAuthorMADRAFi
      • CommentTime17 Jan 2019 20:01 zmieniony
       
      Jezeli nie wlicze linii na ktorych jest podpiete DLI to 100 linii

      dl_start
      dta DL_DLI + DL_BLANK8
      dta DL_MODE_160x192G4 + DL_LMS, a(GFX_ADDRESS)
      :99 dta DL_MODE_160x192G4
      dta DL_DLI + DL_BLANK8
      dta DL_MODE_40x24T2 + DL_LMS, a(VIDEO_RAM_ADDRESS)
      :5 dta DL_MODE_40x24T2
      dta DL_BLANK8
      dta DL_MODE_40x24T2 + DL_HSCROLL
      dta DL_JVB, a(dl_start)
      • 35: CommentAuthorVidol
      • CommentTime17 Jan 2019 22:01
       
      a tak z ciekawosci, czy konczysz dli rozkazem RTI?
      • 36: CommentAuthortebe
      • CommentTime17 Jan 2019 23:01
       
      tak, bo użył modyfikatora INTERRUPT

      'Procedury/Funkcje oznaczone przez INTERRUPT kompilator będzie kończył rozkazem RTI (standardowo RTS). '
      • 37: CommentAuthorMADRAFi
      • CommentTime18 Jan 2019 09:01
       
      Wrocilem do prob z 1 DLI,
      gdy jest ona taka:

      procedure dli1;assembler;interrupt;
      asm {
      pha
      lda $d20a
      sta $d01a
      sta ATARI.WSYNC
      pla
      };
      end;


      to ta czesc ekranu ktora wywoluje DL_DLI - mryga jak powinna. np umieszczona tuz przed ostatnia tekstowa linia z napisem.
      Gdy zamiast tej DLI wstawie inne:

      procedure dli3;assembler;interrupt;
      asm {
      pha
      mva #$06 ATARI.COLOR1
      :3 sta ATARI.WSYNC
      mva #$08 ATARI.COLOR1
      sta ATARI.WSYNC
      mva #$0a ATARI.COLOR1
      sta ATARI.WSYNC
      mva #$0c ATARI.COLOR1
      sta ATARI.WSYNC
      mva #$0a ATARI.COLOR1
      sta ATARI.WSYNC
      mva #$08 ATARI.COLOR1
      pla
      };
      end;


      to oczekiwalbym ze zamiast mrygajacego tla bede mial wycieniowany napis. No niestety. napis ma kolor ostatniego ustawienia rejestru ATARI.COLOR1

      Moze ja zle ustawiam te rejestry i dlatego nie widze spodziewanego efektu?
      • 38:
         
        CommentAuthorbocianu
      • CommentTime18 Jan 2019 09:01
       
      Zmień sobie color1 na color2 albo 4 i zobacz w którym miejscu masz dli. A potem przesuń je w odpowiednie miejsce regulując ilość zapisów do wsync z 3 na inną wartość i zamień z powrotem na color1
      • 39:
         
        CommentAuthorshanti77
      • CommentTime18 Jan 2019 10:01
       
      Wykorzystaj Altirre, ustawiasz punkt wstrzymania na przerwanie dli i pozniej, odpalasz rozkaz po rozkazie (F11) i obserwujesz zachowanie ekranu. Jeśli chcesz się bawić assemblerem to lepszy będzie MADS.
      • 40: CommentAuthortebe
      • CommentTime18 Jan 2019 10:01
       
      to może uruchom Graph2Font (G2F), stwórz w nim swój ekran, podkoloruj, wygeneruj plik ASM i podziwiaj :)

      p.s.
      może przydałby się w G2F zapis takiego ekranu jako procedura Pascala :)
      • 41: CommentAuthorMADRAFi
      • CommentTime18 Jan 2019 10:01 zmieniony
       

      bocianu:

      Zmień sobie color1 na color2 albo 4 i zobacz w którym miejscu masz dli


      To akurat sobie posprawdzalem i jest ok w dobrym miejscu.
      Chodzi juz wlasnie o ustawienie COLOR1 by kolor tekstu sie zmienial.

      shanti77:

      Nie ciagnie mnie do assembplera wogle, wrecz odwrotnie najchetniej uzywalbym tylko czystego Pascala i przygotowanych bibliotek.


      tebe:

      to może uruchom Graph2Font (G2F), stwórz w nim swój ekran, podkoloruj, wygeneruj plik ASM i podziwiaj :)

      No bardzo bym chcial ale nie uruchamia mi sie zadna wersja. Wywala sie z informacja o niemoznosci wpisania stringa w pole richtext1 ;)
      • 42: CommentAuthortebe
      • CommentTime18 Jan 2019 10:01 zmieniony
       
      ??? to co Ty za system używasz ???

      p.s.
      ->link<-
      • 43: CommentAuthorMADRAFi
      • CommentTime18 Jan 2019 11:01
       
      Znaczy co bez assemblera jednak nie da sie tego ogarnac?
      System Windows 10 Version 1809 (OS Build 17763.253) :)

      Bocianu, niezaleznie czy bede ustawial color1 czy color4, widze tylko ostatnia wartosc :)

      Jedynie DLI w ksztalcie takim jak DLI1 powyzej mryga tlem w tym miejscu w ktorym mam wywolanie przerwania DLI.
      • 44: CommentAuthortebe
      • CommentTime18 Jan 2019 12:01
       
      spróbuj wyczyścić

      Users\'Twoje Konto'\Appdata\Roaming\Graph2font\
      • 45: CommentAuthorPecet
      • CommentTime18 Jan 2019 12:01
       
      skoro nie ciagnie cie do asemblera, to zrob sobie dli w pascalu.
      Przyklad jak dla mnie dosc skomplikowany, ale mozna:
      ->link<-
      • 46:
         
        CommentAuthorbocianu
      • CommentTime18 Jan 2019 14:01
       
      Oczywiście że nie musisz pisać dli w asemblerze (poza zachowaniem stanu rejestrów, bo tego nie da się zrobić w Pascalu). Ja piszę w asemblerze bo umiem i wygodniej mi panować nad ilością cykli cpu. Ale jeżeli tego nie potrzebujesz to pisz w Pascalu ;)
      • 47:
         
        CommentAuthorbocianu
      • CommentTime18 Jan 2019 14:01
       
      Madrafi: dużo łatwiej byłoby mi pomagać z Twoim kodem, gdybym miał całość i mógł go skompilować u siebie. Korzystasz może z gita? Albo wrzucaj może cały katalog projektu spakowany zipem?
      • 48: CommentAuthorMADRAFi
      • CommentTime18 Jan 2019 15:01
       
      Dodatkowo jeszcze taki kwiatek znalazlem:
      NullTermToString powinno zwrocic string.
      a zwraca

      Array[0..255] Of CHAR

      var
      i: byte;
      s: string;
      itemstrings: array [0..0] of word absolute ITEMS_ADDRESS;
      items: array [0..15] of string;

      begin
      for i:=0 to 15 do
      begin
      s:=NullTermToString(itemstrings[i]);
      items[i]:=s;
      end;
      end;


      kompilator zwraca blad

      Error: Incompatible types: got "Array[0..255] Of CHAR" expected "Array[0..15] Of STRING"


      oczywiscie mozna przypisac bezposrednio, ale w srodku nie bedzie string, wiec na ekranie sa smieci.
      • 49: CommentAuthorPecet
      • CommentTime18 Jan 2019 16:01
       
      itemstrings: array [0..0]
      to na pewno jest dobrze? Od zero do zero? Zwłaszcza, że potem iterujesz od zera do 15tu.
      • 50:
         
        CommentAuthorbocianu
      • CommentTime18 Jan 2019 18:01 zmieniony
       
      @Pecet: jak najbardziej dobrze. Rzuć okiem tu, typ drugi:
      ->link<-
      to taki specjalny typ tablicy bez ustalonego z góry rozmiaru, którą mozna relokować w pamięci.

      @MADRAFi: to nie wina funkcji NullTermToString.
      Takie bezpośrednie przypisanie tez nie zadziała:
      s:='dadasdsa';
      items[i]:=s;



      Już tłumaczę dlaczego:
      Tablica items nie przechowuje zawartości stringów, tylko wskaźniki do nich. Nie wiem czy wiesz, co to, więc w skrócie wyjaśnie: Wskaźnik to specjalny typ zmiennej przechowujący fizyczny adres pod którym leży właściwa wartość. Więcej tutaj:
      ->link<-

      Aby to przypisanie zadziałało musimy je zapisać tak:

      items[i]:=@s;

      operator '@' powoduje że nie przypisujemy zawartości zmiennej tylko jej adres (wskaźnik) ;)