1

Na razie nic nie robię, ale testowo próbowałem sobie coś takiego wykonać. Potrzebuję szybko przełączyć tryb graficzny o podobnej DL-ce (lekko zmodyfikowanej), prawie takiej samej, ale dla różnych trybów - powiedzmy 9 i 8-ka. Przy samym GR. coś tam i podaniu adresu DL-ki mam czarny ekran, bez wyświetlania grafy (pewnie za szybko się zmieniają tryby), jak dam już pause 0  - jest za wolna zmiana trybów. Przypuszczam, że potrzebne by było jakieś przerwanie, jakieś propozycje?
Aha, testowo DL-ki sobie zapisałem na 5 i 6 stronie, ale to mogę przenieść. Niestety, nie potrafię zrobić zmiany trybu w locie (chodzi o pełny ekran, zmiana sposobu wyświetlania), pewnie jest jakiś prosty sposób. A zależy mi na wyświetleniu niezależnie dwu obrazów, w różnych trybach, ale szybko jeden za drugim (naprzemiennie).

Sikor umarł...

2 Ostatnio edytowany przez drac030 (2009-12-23 23:16:02)

10 DL1=$0400:DL2=$0600:REM adresy obu DL
15 GRAPHICS 24:REM ewentualnie + zapis danych do pamięci obrazu
20 DO:DPOKE $230,DL1:PAUSE 0:DPOKE $230,DL2:PAUSE 0:LOOP

TBXL znasz, to sobie przystosujesz :)

PS. Jeśli PAUSE 0 jest za wolne, to zamiast trzeba dać A=PEEK($14):WHILE PEEK($14)=A:WEND, ale to chyba wyjdzie na to samo, PAUSE 0 czeka 1 ramkę...

KMK
? HEX$(6670358)

3 Ostatnio edytowany przez Sikor (2009-12-23 23:28:31)

Konrad, ale mi chodzi o zmianę sposobu wyświetlania - na przykład z 9 na 8-kę (w przykładzie dałeś akurat 8-kę, ale to nieważne). Czy cykliczna zmiana komórek $230 i $231 zmieni mi tryby graficzne? Bo chyba tutaj cały czas będę miał włączony tryb ANTIC, czyli cały czas 8-ka.

10 DL1=$0400:DL2=$0500:REM adresy obu DL
15 DO: GRAPHICS 24
20 DPOKE $230,DL1:PAUSE 0
25 Graphics 9:DPOKE $230,DL2:PAUSE 0:LOOP

Raczej mi chodzi o coś takiego - czyli cykliczna zmiana z 8 na 9-kę... Zresztą zaraz sprawdzę, może piszę bzdury i Twój przykład jest o.k.
===>
Tak ja przypuszczałem :( Przy zmianie trybów już nie jest tak różowo. W obrębie jednego trybu i zmiany DL-ki to żaden problem, ale jak chce zmienić tryb wyświetlania pomiędzy dwoma trybami graficznymi - to już kicha jest ;(

Sikor umarł...

4 Ostatnio edytowany przez drac030 (2009-12-23 23:58:02)

Aha, chodzi o to, żeby jeszcze GPRIOR zmienić? Skompiluj, powinno się wyrobić (TBXL Compler tłumaczy POKE na LDA/STA). Tylko musisz w POKE/DPOKE użyć stałych.

KMK
? HEX$(6670358)

5

Niestety, nie wyrabia. Nic to, pobawię się po świętach - teraz nie będę miał dostępu do atarki, a na lapku i emulgatorze nie pobawię się za bardzo, bo pod vistą tak se chodzi, a poza tym - nie lubię emulatorów... W każdym razie dzięki za próbę pomocy.

Sikor umarł...

6 Ostatnio edytowany przez mono (2009-12-24 12:06:52)

Próbuj takiej sztuczki:

10 GRAPHICS 8:DL1=DPEEK(560):GP1=PEEK(623)
20 POKE 106,PEEK(106)-32: REM jest to mniej więcej rozmiar trybu GR.8 z dlistą
30 GRAPHICS 10:DL2=DPEEK(560):GP2=PEEK(623)
40 DO
50 DPOKE 560,DL1:POKE 623,GP1:GOSUB 100
50 DPOKE 560,DL2:POKE 623,GP2:GOSUB 100
60 LOOP
100 T=PEEK(20)
110 IF PEEK(20)=T THEN 110
120 RETURN

Być może da się zrobić ładniej jakieś PAUSE albo skorzystać z jakiejś zmiennej RTCLK$ (nie znam TBXL) zamiast wołać GOSUB 100.
Działa to tak, że tworzy GR8 w normalnej pamięci po czym, GR10 w obszarze przed nią. Przełączanie co ramkę (za pomocą zapisu do DLPTRS i GPRIORS) synchronizowane jest przez RTCLK (20). Ponieważ to rejestry cienie to najpierw zapis, potem synchronizacja - nie ma zerwania synchra bo to cienie.
Problemem jest tylko to, że instrukcji TBXL możesz używać na ostatnio otwartym GR. Żeby móc się w pełni przełączyć na poprzedni tryb trzeba by też przepisywać komórki używane przez S:. Ta procedura wystarczy do mrugania statycznymi obrazkami (RTCLK jest zmieniane na przerwaniu VBLK).

Edit: Literówki.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

7

mono: no właśnie mniej więcej o to mi chodziło, żeby zmieniać GPRIOR a nie przełączać tryb instrukcją GRAPHICS, bo to się nie ma prawa zmieścić (procedura otwarcia ekranu jest długa). Zamiast GOSUB 100 dajesz wzmiankowane wyżej PAUSE 0 albo A=PEEK($14):WHILE PEEK($14)=A:WEND (co jest TBXL-owym odpowiednikiem twojego IF PEEK(20) ... ), bo lepiej dać to dwa razy niż wołać podprogram przez GOSUB (albo nawet przez EXEC), co przy interpretacji jest wolne.

KMK
? HEX$(6670358)

8 Ostatnio edytowany przez mono (2009-12-24 12:21:09)

Racja. Może TBXL ma to zoptymalizowane, ale w AB wyszukiwanie linii leci zawsze od początku programu.
A tak na boku: Gdyby nie były potrzebne przerwania NMI, to interlace z dowolną liczbą ekranów można zrobić całkowicie sprzętowo podając odpowiednie adresy nowych dlist w rozkazach JVB. Czyli:

dlist1:
  3*emp8
  linie trybu
  JVB dlist2
dlist2:
  3*emp8
  linie trybu
  JVB ...
...
dlistN:
  3*emp8
  linie trybu
  JVB dlist1

Ale chcąc zmieniać tryb bez pollingu VCOUNT lub RTCLK (albo zmiany na przerwaniu) się nie obejdzie (2 ostatnie wymuszają włączenie NMI).
Więc jeśli Sikor nie potrzebujesz na gwałt trybu 10 ani NMI to można z tego skorzystać.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

9

Tak, jest tzw. "demo bez kodu", tzn. page flipping będzie działał nawet jeśli 6502 będzie zahaltowane. Ale do zmiany trybu na multicolor istotnie CPU się przydaje.

Co do TBXL, GOTO i GOSUB działają w nim tak samo, jak w Atari BASIC-u, tzn. wolno. Dlatego lepiej jest używać EXEC, które posługuje się adresem podprogramu zapisanym w tablicy zmiennych, a nie numerem linii wyszukiwanym od początku programu.

KMK
? HEX$(6670358)

10

e tam odrazu page plipping, dl moze sie roznic adresami w LMS i dostaniemy demo bez kodu ale ze scrollem :D

http://atari.pl/hsc/ad.php?i=1.

11

Przecież to to samo.

KMK
? HEX$(6670358)