atarionline.pl Mad Pascal. Fine scroll + PMG (plus początki w c) - 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: CommentAuthorPecet
    • CommentTime26 Nov 2018 zmieniony
     
    Teraz tak sobie pomyslalem, ze moze w moim kodzie nie ma bledu. Pomylka polega jedynie na sposobie, w jaki to chcialem przetestowac na szybko, wypisujac (przy uzyciu writeln) tekst na ekranie.
    Przyjde do domu, to sprawdze.

    No i tak, jak myślałem - śmiga. Błędem było najwyraźniej testowanie poprzez writeln.
    • 2:
       
      CommentAuthorbocianu
    • CommentTime27 Nov 2018 zmieniony
     
    No to jak już wszystko jasne to nie będę się produkował, ale korzystając z okazji zareklamują moją libkę do robienie list diplayowych. Ja bym tego scrolla zrobił następująco :)

    program hscroll;
    uses atari, b_dl;

    const
    dlist = $5000;
    vmem = $5100;

    var hscroll:byte = 3;
    offset:byte = 0;
    blankSize:byte = 0;
    s:string = 'hello! it is an jumping pascal scroll!!'~;
    blanks:array[0..15] of byte = (
    DL_BLANK8, DL_BLANK7, DL_BLANK6, DL_BLANK5, DL_BLANK4, DL_BLANK3, DL_BLANK2, DL_BLANK1,
    DL_BLANK1, DL_BLANK2, DL_BLANK3, DL_BLANK4, DL_BLANK5, DL_BLANK6, DL_BLANK7, DL_BLANK8
    );

    begin

    DL_Init(dlist);
    DL_Push(DL_BLANK8, 12); // 12 blank lines
    DL_Push(DL_MODE_40x24T2 + DL_HSCROLL + DL_LMS, vmem); // textline
    DL_Push(DL_JVB, dlist); // jump back
    DL_Start;

    move(s[1],pointer(vmem+42),sizeOf(s)); // copy text to vram
    color2:=0;

    repeat
    pause;
    if hscroll = $ff then begin // $ff is one below zero
    hscroll := 3;
    offset := (offset + 1) mod 80; // go trough 0-79
    DL_PokeW(13, vmem + offset); // set new memory offset
    end;
    hscrol := hscroll; // set hscroll
    dec(hscroll);
    blankSize := (blankSize + 1) and 15; // go trough 0-15
    DL_Poke(10, blanks[blankSize]); // set new blankline height
    until false;

    end.


    adres do moich libek:
    ->link<-
    a dokumentacja tu:
    ->link<-
    • 3: CommentAuthorPecet
    • CommentTime28 Nov 2018
     
    dzieki, na razie pobawie scrollem calego ekranu co punkt, potem scrolling plynny.
    • 4:
       
      CommentAuthorTheFender
    • CommentTime28 Nov 2018 zmieniony
     
    Płynniej niż co punkt, to dopiero na następcy atari z chipsetem AGA ;) Pozdro
    • 5: CommentAuthortebe
    • CommentTime28 Nov 2018 zmieniony
     
    :) na Atari można tylko co cykl koloru, czyli min 2 piksle HiRes, na C64 można co 1 piksel HiRes (i na Atari z VBXE)
    • 6:
       
      CommentAuthorYosh
    • CommentTime29 Nov 2018
     
    Kurka, da się napisać scroll mniej niż jeden pixel hires... aż sobie napisze :D
    • 7: CommentAuthorPecet
    • CommentTime29 Nov 2018 zmieniony
     
    widzę, że wzbudziłem sensację:)
    chodziło o scrolla co znak w Gr. 0
    • 8:
       
      CommentAuthorbocianu
    • CommentTime29 Nov 2018
     
    dobrze że tylko sensacje.
    niektóre z pozoru niewinne wątki kończą się bluzgami i obrażaniem się nawzajem... ale to zazwyczaj na głównej :D
    • 9:
       
      CommentAuthorbocianu
    • CommentTime29 Nov 2018 zmieniony
     
    @Pecet: a tak swoją drogą to do scrolla co znak nie potrzebujesz się wcale bawić w display listy. Można to zrobic o wiele prościej:

    program hscroll2;
    uses atari;
    var s:string = 'hello my friends! i''m one char scroll in text mode done in different way, not using display lists '~;
    textStart, screenStart:byte;
    begin
    repeat
    textStart:=1;
    screenStart:=39;
    repeat
    move(s[textStart],pointer(savmsc+160+screenStart),40-screenStart);
    if screenStart>0 then Dec(screenStart)
    else Inc(textStart);
    Pause(5);
    until textStart>Length(s);
    until false;
    end.
    • 10: CommentAuthorPecet
    • CommentTime29 Nov 2018
     
    Tutaj na szczescie bluzgow nie bylo, padla natomiast ciekawa deklaracja - czekam na realizacje;)

    Czyli w tym przykladzie jesli dobrze rozumiem, przesuwamy stringa po pamieci ekranu...

    A wlasnie, jeszcze jedno pytanie: co to jest color clock? To se te dwa bity, gdzie kodowany jest kolor (tak jak np. w basicowym trybie 15, czyli 2 bity = 4 kolory)? To by wyjasnialo skad color, ale dlaczego clock?:)
    • 11: CommentAuthortebe
    • CommentTime29 Nov 2018 zmieniony
     
    ->link<-

    ->link<-

    Jednostka czasu odpowiadająca jednemu okresowi podstawowego sygnału taktującego GTIA (w systemie PAL - 3,546894 MHz, w systemie NTSC - 3,579545 MHz, w systemie SECAM - 3,563 MHz), co odpowiada 1/228 linii, czyli 1/71136 ramki, a także 1/2 cyklu maszynowego. Jednostka ta ma bezpośrednie przełożenie na określenie poziomej pozycji i szerokości wyświetlanych obiektów graficznych i do tego celu również jest używana.

    Jest to czas, w jakim układy graficzne Atari są w stanie dokonać pełnej zmiany koloru w linii poziomej, stąd też wynika najmniejsza szerokość pikseli w kolorowych trybach graficznych. Tryby monochromatyczne ANTIC-a dają możliwość wyświetlania pikseli o szerokości połowy cyklu koloru.
    • 12: CommentAuthorPecet
    • CommentTime4 Dec 2018
     
    dzieki tebe.
    • 13: CommentAuthorPecet
    • CommentTime30 Jan 2019
     
    Dobra, panowie potrzebuję pomocy, bo tego sam nie ogarnę. Nie wiem, czy sobie bazgrze gdzieś po pamięci, czy ki diabeł...
    Zrobiłem sobie coarse scroll i dodałem duszka ( (joystick w prawo scrolluje nam ekran i przesuwa duszka). Działa. Efekt można zobaczyć tutaj:

    Następny krok to dodanie kolejnej klatki dla duszka. I tutaj sprawa, mówiąc delikatnie, się skomplikowała. Efekt można zobaczyć tutaj:


    podmiana klatek duszka jest zrealizowana następująco:
    procedure swap;
    begin
    if p_data[0]=@p0Data then begin
    p_data[0]:=@p0Data1;
    p_data[1]:=@p1Data1;
    end
    else begin
    p_data[0]:=@p0Data;
    p_data[1]:=@p1Data;
    end;
    end;


    przesuwanie duszka:

    procedure mainLoop;
    begin
    scrollDir:=dirValues[stick0];
    if scrollDir=1 then begin
    scrollDir:=0;
    coarseScrollLeft;
    MoveP(0, 80+scrollCounter, 65);
    MoveP(1, 88+scrollCounter, 65);
    swap;
    end
    else if scrollDir=2 then begin
    end;
    end;


    zmienna scrollCounter przyjmuje wartości od 0 do 39. Cały kod jest dostępny tutaj:
    ->link<-

    W załączniku jest też xex.
    • 14: CommentAuthortebe
    • CommentTime30 Jan 2019 zmieniony
     
    zmień nazwę procedury 'swap' na coś innego, SWAP jest w SYSTEM.PAS

    function Swap(a: word): word; overload;
    function Swap(a: cardinal): cardinal; overload;


    myli Twoje 'SWAP' z tymi z SYSTEM.PAS, innymi słowy kompilator do poprawy

    p.s.
    możesz też odwołać się bezpośrednio 'pmlib.swap' i wtedy będzie OK
    • 15: CommentAuthorPecet
    • CommentTime31 Jan 2019
     
    kurde bele człowieku, zdrowie (przynajmniej to psychiczne) mi uratowałeś:) Dzięki, mogę działać dalej.
    • 16: CommentAuthortebe
    • CommentTime31 Jan 2019
     
    jeśli poprawisz linię w programie kompilatora

    if yes then a65(__subBX);


    na

    if Ident[IdentIndex].Kind = FUNC then a65(__subBX);


    to naprawisz kompilator :)

    wcześniejsza linia
    yes := (Ident[IdentIndex].Kind = FUNC);

    jest do zaremowania
    • 17: CommentAuthorPecet
    • CommentTime31 Jan 2019
     
    ok, to mam jeszcze pytanie: czy InitPM z pmg.pas nie powinno obniżać RAMTOP? W sensie obniżać limit dostępnej pamięci (komórka pamięci 106).
    • 18: CommentAuthortebe
    • CommentTime31 Jan 2019
     
    trick z RAMTOP to pewnie można z udziałem systemowego InitGraph uzyskać, przynajmniej tak sobie radzą w Basic-u

    włączasz jakiś tryb wymagający dużo pamięci i korzystasz z pamięci przydzielonej mu przez OS (adres pamięci obrazu w komórkach 88,89)
    • 19: CommentAuthorPecet
    • CommentTime13 Nov 2019 zmieniony
     
    Mam pytanie odnośnie biblioteki PMG w mad pascalu. O co chodzi ze stałymi _M0_MAX - _M3_MAX ? Kiedy tworzę sobie prosty pocisk, madstudio generuje mi taki kod:
    m0Data : array [0.._M0_MAX] of byte = (0,0,3,0,0,0,0,0,0,0);

    Oczywiście wywala mi błąd, ponieważ _M0_MAX jest równe 2. Mogę tablicę zmienić na:
    m0Data : array [0.._M0_MAX] of byte = (0,3,0);

    ale wtedy przy ruchu w pionie pocisk mi się nie zmazuje. I dochodzi do cudownego rozmnożenia.
    • 20: CommentAuthortebe
    • CommentTime13 Nov 2019
     
    wysłałem to zapytanie do Gury-ego który jest autorem biblioteki PMG i Mad Studia także
    • 21: CommentAuthorPecet
    • CommentTime13 Nov 2019
     
    Dzięki, tebe.
    • 22: CommentAuthorGury
    • CommentTime14 Nov 2019
     
    Hi Pecet,
    I suppose you are using older version of Mad Studio, so please download new version first. It does not rely on pmg unit library for example listings anymore. But you are right, code generator does fill unnecessary data for missiles, which will be fixed in next update. There is an option in code generator to use all missiles together without losing data on the same line.
    For now, please edit missile data (removing unnecessary data) manually.
    • 23: CommentAuthorPecet
    • CommentTime15 Nov 2019 zmieniony
     
    Hi Gury,

    I'm not sure if I follow.

    You're right, the latest version of Mad Studio generates different code. But that does not solve my problem.
    In moveM procedure (from PMG unit) constants _M0_MAX - _M3_MAX are used.
    _M0_MAX = 2;          // Number of missile 0 data values
    _M1_MAX = 0; // Number of missile 1 data values
    _M2_MAX = 3; // Number of missile 2 data values
    _M3_MAX = 4; // Number of missile 3 data values


    and
    procedure MoveM (m : byte; x : word; y : byte);
    case m of

    0: begin
    Poke(pm_mem+pm_offset-pm_size+y+_M0_MAX+1, 0);
    move(m_data[m], pointer(pm_mem+pm_offset-pm_size+y), _M0_MAX+1);
    end;
    //cut - other cases
    end;

    // Missile horizontal position
    Poke(53252+m, x);
    end;


    In general: what is the purpose of these M0_MAX - _M3_MAX constants?
    • 24: CommentAuthorzbyti
    • CommentTime15 Nov 2019 zmieniony
     
    Proszę o zmianę nazwy wątku na bardziej adekwatny ;)
    • 25: CommentAuthorPecet
    • CommentTime15 Nov 2019
     
    Chętnie, tylko jak to zrobić?:)
    • 26: CommentAuthorzbyti
    • CommentTime15 Nov 2019 zmieniony
     
    @Pecet zapowiada się fajna giera! :) Graficznie jest super :)
    • 27: CommentAuthorPecet
    • CommentTime15 Nov 2019
     
    Done.
    • 28: CommentAuthorPecet
    • CommentTime15 Nov 2019
     
    Ok, problem solved. I have to clear old missile's position by myself. One poke fixed the issue.

    @zbyti do gry to jeszcze daleka droga:) Mówiąc szczerze to zdziwię się, jeżeli kiedykolwiek to ukończę. Ale kto wie...
    • 29: CommentAuthorzbyti
    • CommentTime15 Nov 2019
     
    @Pecet mam takie samo budujące nastawienie przy moich szachach ;)
    • 30: CommentAuthorPecet
    • CommentTime15 Nov 2019
     
    nie ukrywam, że to forum działa motywująco. Ludzie co jakiś czas chwalą się tym, co sklecili w wolnej chwili i człowiekowi ochota wraca do kodowania.
    Plus sam Mad Pascal to przyjemne narzędzie. IMO jedno z najważniejszych na Atari.
    • 31: CommentAuthorMADRAFi
    • CommentTime16 Nov 2019
     
    Gdyby nie mad pascal, nie zabralbym sie wogle za pisanie na atari. Jest tez duzo fajnych narzedzi ulatwiajacych zycie jak g2f, madstudio, cutass
    • 32: CommentAuthorGury
    • CommentTime16 Nov 2019
     
    Glad to hear the problem is solved.
    • 33: CommentAuthorPecet
    • CommentTime14 Mar 2020
     
    mam takie dli

    procedure Dli; interrupt;
    begin
    asm { phr };
    // wsync:=1;
    col1:=clr1[dliNum];
    col2:=clr2[dliNum];
    inc(dliNum);
    if dliNum=3 then dliNum:=0;
    asm { plr };
    end;


    cel to zmienianie dwóch kolorów co ileś linii. Na razie jest to za pomocą jednej procedury, zmieniam dwa kolory (wartości kolorów mam zapisane tablicy). Pomyślałem, że gdyby każda zmianę kolorów zrobić za pomocą osobnej procedury, to może mógłbym dokonać więcej zmian. Tylko jak to ogarnąć? Próbowałem dostawić SetIntVec(iDLI, @Dli) w samej procedurze dli, ale wychodzi kaszana.
    Ile w ogóle maksymalnie zmian kolorów da się zrobić zanim procek klęknie do miecza?
    • 34: CommentAuthortebe
    • CommentTime14 Mar 2020
     
    ile zmian? raczej ile zmian poza ramką ekranu, 3..6 zależnie od szerokości obrazu i sposobu w jaki to zapiszemy, im mniej cykli CPU tym lepiej

    w przypadku DLI, to musisz stworzyć pętlę i rozpisać te zmiany, w stylu
    sta wsync   ; linia 0
    sta wsync ; linia 1
    lda #44
    ldx #68
    ldy #54
    sta wsync
    sta colbak ; linia 2
    stx color0
    sty color1
    lda #20
    sta color2
    sta wsync ; linia 3
    sta wsync ; linia 4
    • 35: CommentAuthorPecet
    • CommentTime15 Mar 2020
     
    zrobiłem w ten sposób i wyglądana to, że śmiga (przynajmniej na altirze).
    procedure Dli; interrupt;
    begin
    asm { phr
    sta ATARI.WSYNC};
    colpm0:=$16;
    colpm1:=$26;
    colpm2:=$36;
    colpm3:=$46;
    asm { mwa #DLI2 ATARI.VDSLST
    plr };
    end;
    • 36:
       
      CommentAuthorpirx
    • CommentTime16 Mar 2020
     
    używasz w dli tylko A, więc wystarczy
    PHA
    ...
    PLA
    • 37: CommentAuthorPecet
    • CommentTime16 Mar 2020
     
    Dzięki pirx.
    • 38:
       
      CommentAuthorsun
    • CommentTime16 Mar 2020 zmieniony
     
    trochę w temacie, ponieważ sam stosuję (gdyż podpatrzyłem) konstrukcję w stylu:
    sta _a
    stx _x
    sty _y
    ..
    ..
    lda #0
    _a equ *-1
    ldx #0
    _x equ *-1
    ldy #0
    _y equ *-1


    Nie liczyłem cykli, ale zakładam, że skoro jest to popularne, to jest szybsze niż pchanie na stos?
    • 39:
       
      CommentAuthorpirx
    • CommentTime16 Mar 2020 zmieniony
     
    sporo szybsze. jeśli program nie może być samomodyfikowalny (np. na carcie) to można sta-wiać na stronę zerową.
    trzeba tylko uważać, żeby się dli nie ponakładały na siebie.
    • 40: CommentAuthortebe
    • CommentTime16 Mar 2020
     
    na stronę zerową najszybsze, sumarycznie cykli 6 na rejestr w obu wersjach (sta -> lda # ; sta zp -> lda zp), ale chodzi też o szybkość wejścia do przerwania, więc strona zerowa wygrywa
    • 41: CommentAuthorPecet
    • CommentTime16 Mar 2020
     
    Ja mam jeszcze pytanie jak ustawić wąski ekran?
    Próbowałem w ten sposób
    program hello; 
    uses atari, crt, graph;

    begin
    InitGraph(8);
    sdmctl:=1; //Poke(559,1)
    readkey;
    end.


    ale jedyne, co dostaję, to czarny ekran. Zabawa wartością dmactl w czasie vblank również nie przyniosła efektów.
    • 42:
       
      CommentAuthorpirx
    • CommentTime16 Mar 2020
     
    dodaj 32

    Option                          Decimal   Bit
    No playfield 0 0
    Narrow playfield 1 0
    Standard playfield 2 0,1
    Wide playfield 3 0,1
    Enable missle DMA 4 2
    Enable player DMA 8 3
    Enable player and missile
    DMA 12 2,3
    One line player resolution 16 4
    Enable instructions to fetch
    DMA 32 5 (see below)
    • 43: CommentAuthorPecet
    • CommentTime16 Mar 2020
     
    Działa:) Dzięki ci dobry człowieku.
    • 44: CommentAuthorMADRAFi
    • CommentTime21 May 2020
     
    Probowalem zrobic zapetlony scroll. Czyli caly ekran wypelniaja znaki i piszemy do 2 polowek jednoczesnie. Wykonujac scrol obraz powinien sie zapetlic.
    Jest tylko maly problem z czarnym paskiem :)

    Co poszlo nie tak?
    • 45:
       
      CommentAuthorjhusak
    • CommentTime21 May 2020
     
    Jedynka informatyczna - masz dziurę w pamięci to i masz pasek (czytaj - nie cały ekran wypełniają znaki) Użyj monitora z emulatora i podejrzyj pamięć pod $4600.
    • 46: CommentAuthorMADRAFi
    • CommentTime21 May 2020 zmieniony
     
    Nie znam assemblera wiec zagladanie wmonitor emulatora nie duzo mi mowi.
    Jezeli chodzi o pisanie znakow to pisze 48 znakow w wierszu i 21 wierszy.
    • 47:
       
      CommentAuthorshanti77
    • CommentTime21 May 2020 zmieniony
     
    W asm powtarza się coś takiego:
    LDA $311C
    STA ($92),Y
    INY
    LDA #$00
    STA ($92),Y

    czyli zawsze na końcu tablicy masz jedno zero. Być może w pascalu każdy ciąg ma na końcu dopisane 0.
    • 48: CommentAuthorzbyti
    • CommentTime21 May 2020 zmieniony
     
    • 49: CommentAuthorMADRAFi
    • CommentTime21 May 2020 zmieniony
     
    ok problem rozwiazany. Powinienem uzyc Poke a nie Dpoke.
    Dziekuje za pomoc.
    • 50:
       
      CommentAuthorjhusak
    • CommentTime22 May 2020 zmieniony
     
    Powinieneś też poznać metody sprawdzania, co twój kod naprawdę robi :) Czyli jak widać monitor prawdę Ci powie (i zbyti też). Nie trzeba znać asemblera, wystarczy znać zbytiego :)