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 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
     
    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 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
     
    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
     
    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
     
    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 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 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
     
    :) 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 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
     
    Jeżeli będziesz zmieniał kolory w DLI, to ustawiaj rejestry, a nie ich cienie.
    • 12: CommentAuthorMADRAFi
    • CommentTime15 Jan 2019
     
    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 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
     
    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
     
    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 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
     
    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 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
     
    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 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 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
     
    zmieniam kolor czekając co linię, aby uzyskać efekt cieniowanego tekstu widoczny w pierwszym wierszu:

    • 23:
       
      CommentAuthorbocianu
    • CommentTime16 Jan 2019 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
     
    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
     
    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 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
     
    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
     
    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
     
    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
     
    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
     
    tak jak w dli1 ustawiasz adres dli2, tak samo ustaw w dli2 adres dli1 i bedzie git :)
    • 32: CommentAuthorMADRAFi
    • CommentTime17 Jan 2019
     
    probowalem juz takie podejscie. Tez nie dalo oczekiwanego rezultatu ;)
    • 33: CommentAuthortebe
    • CommentTime17 Jan 2019
     
    ile linii ekranu dzieli jedno wywołanie DLI od drugiego ?
    • 34: CommentAuthorMADRAFi
    • CommentTime17 Jan 2019 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
     
    a tak z ciekawosci, czy konczysz dli rozkazem RTI?
    • 36: CommentAuthortebe
    • CommentTime17 Jan 2019
     
    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
     
    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
     
    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
     
    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
     
    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 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 zmieniony
     
    ??? to co Ty za system używasz ???

    p.s.
    ->link<-
    • 43: CommentAuthorMADRAFi
    • CommentTime18 Jan 2019
     
    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
     
    spróbuj wyczyścić

    Users\'Twoje Konto'\Appdata\Roaming\Graph2font\
    • 45: CommentAuthorPecet
    • CommentTime18 Jan 2019
     
    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
     
    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
     
    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
     
    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
     
    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 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) ;)