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 15:11 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 15:11 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 12:11
       
      dzieki, na razie pobawie scrollem calego ekranu co punkt, potem scrolling plynny.
      • 4:
         
        CommentAuthorTheFender
      • CommentTime28 Nov 2018 21:11 zmieniony
       
      Płynniej niż co punkt, to dopiero na następcy atari z chipsetem AGA ;) Pozdro
      • 5: CommentAuthortebe
      • CommentTime28 Nov 2018 23:11 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 03:11
       
      Kurka, da się napisać scroll mniej niż jeden pixel hires... aż sobie napisze :D
      • 7: CommentAuthorPecet
      • CommentTime29 Nov 2018 06:11 zmieniony
       
      widzę, że wzbudziłem sensację:)
      chodziło o scrolla co znak w Gr. 0
      • 8:
         
        CommentAuthorbocianu
      • CommentTime29 Nov 2018 09:11
       
      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 10:11 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 11:11
       
      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 12:11 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 14:12
       
      dzieki tebe.
      • 13: CommentAuthorPecet
      • CommentTime30 Jan 2019 19:01
       
      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 22:01 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 17:01
       
      kurde bele człowieku, zdrowie (przynajmniej to psychiczne) mi uratowałeś:) Dzięki, mogę działać dalej.
      • 16: CommentAuthortebe
      • CommentTime31 Jan 2019 18:01
       
      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 20:01
       
      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 22:01
       
      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 18:11 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 19:11
       
      wysłałem to zapytanie do Gury-ego który jest autorem biblioteki PMG i Mad Studia także
      • 21: CommentAuthorPecet
      • CommentTime13 Nov 2019 19:11
       
      Dzięki, tebe.
      • 22: CommentAuthorGury
      • CommentTime14 Nov 2019 15:11
       
      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 11:11 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 15:11 zmieniony
       
      Proszę o zmianę nazwy wątku na bardziej adekwatny ;)
      • 25: CommentAuthorPecet
      • CommentTime15 Nov 2019 16:11
       
      Chętnie, tylko jak to zrobić?:)
      • 26: CommentAuthorzbyti
      • CommentTime15 Nov 2019 16:11 zmieniony
       
      @Pecet zapowiada się fajna giera! :) Graficznie jest super :)
      • 27: CommentAuthorPecet
      • CommentTime15 Nov 2019 18:11
       
      Done.
      • 28: CommentAuthorPecet
      • CommentTime15 Nov 2019 21:11
       
      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 21:11
       
      @Pecet mam takie samo budujące nastawienie przy moich szachach ;)
      • 30: CommentAuthorPecet
      • CommentTime15 Nov 2019 22:11
       
      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 07:11
       
      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 09:11
       
      Glad to hear the problem is solved.
      • 33: CommentAuthorPecet
      • CommentTime14 Mar 2020 13:03
       
      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 15:03
       
      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 18:03
       
      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 09:03
       
      używasz w dli tylko A, więc wystarczy
      PHA
      ...
      PLA
      • 37: CommentAuthorPecet
      • CommentTime16 Mar 2020 09:03
       
      Dzięki pirx.
      • 38:
         
        CommentAuthorsun
      • CommentTime16 Mar 2020 15:03 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 16:03 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 16:03
       
      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 18:03
       
      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 19:03
       
      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 19:03
       
      Działa:) Dzięki ci dobry człowieku.
      • 44: CommentAuthorMADRAFi
      • CommentTime21 May 2020 10:05
       
      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 18:05
       
      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 19:05 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 19:05 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 19:05 zmieniony
       
      • 49: CommentAuthorMADRAFi
      • CommentTime21 May 2020 19:05 zmieniony
       
      ok problem rozwiazany. Powinienem uzyc Poke a nie Dpoke.
      Dziekuje za pomoc.
      • 50:
         
        CommentAuthorjhusak
      • CommentTime22 May 2020 12:05 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 :)