1 Ostatnio edytowany przez maw (2008-06-16 07:55:20)

Witam, próbuję na nowo swoich sił w BASIC'u, chcę po skończeniu pisania skompilować program do XEX-a i mam z tym związane pytanie problem:

Jak wyregulować interwał wykonywania procedur basic'a ?

W basicu obecnie w samym programie korzystam ze sprawdzania PEEK(20) i liczenia różnicy - w przypadku różnicy >50 wykonuję skok do procedury - jednakże to powoduje liczenie parędziesiąt razy na sekundę niepotrzebych ifów...

Czy jest jakiś skuteczny sposób wyliczania okresów wyczekiwania ? Czy byłaby możliwość wywołania konkretnej procedury np. poprzez podpięcie jej wywołania do procedury maszynowej regulowanej przerwaniem DLI ?

//EDIT: no i jeszcze mam przy okazji pytanie: jak zrobić "dwa plany" - tzn. skorzystać z trybu znakowego G.0 dla treści dynamicznej i w tle mieć G.8 z tłem ?

___
Press play on tape...

2

1. Nie wiem, czy nie wgryzajac sie gleboko w bebechy basica mozna z np. dli wywolac okreslony kawalek programu. Pozostaja chyba tylko te nieszczesne if-y.
2. Takie 2 plany jak chcesz miec faktycznie na jednym ekranie, to na gr. 8 musisz emulowac gr.0 - ale w samym basicu wyswietlenie moze trwac wieki. Jakas procka w asm byla by tu mocno pomocna.

3

Hmm... nie jest dla mnie problemem zamiast POSITION X,Y: ? CHR$(C) używać poków: POKE SCREENADRSTART+Y*40+X, C więc jakby ktoś mi napisał taką procedurkę miksującą, to było by miło - mogła by obsługiwać własny zestaw znaków, co nawet by było bardziej korzystne, bo pozwalało by na użycie bitu negacji do rzeczywistej negacji, a bitu siódmego do przesunięcia znaku o 4px.

___
Press play on tape...

4

przeciez turbo basic xl ma instrukcje do pisania po ekranie graficznym (chyba ze sie myle) do atari basica byla taka do wklepania chyba z ksiazki miguta.

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

5 Ostatnio edytowany przez maw (2008-06-16 14:22:48)

hmmm... raczej chodziło by mi o to, by procedura działała od razu dla całego bloku 40x24 znaki, a nie była wywoływana raz po razie - tak jak piszę o góry: by działała jak nakładanie się warstw.

No i raczej turbo basic xl nie wchodzi w grę... musiałbym się go uczyć od nowa, a zanim bym się nauczył, przeszedł by mi cały fun pisania.

___
Press play on tape...

6

maw napisał/a:

No i raczej turbo basic xl nie wchodzi w grę... musiałbym się go uczyć od nowa, a zanim bym się nauczył, przeszedł by mi cały fun pisania.

Nie ucz się, po prostu pisz - TB jest praktycznie całkowicie zgodny z Atari Basic a działa znacznie przyjemniej - np. szybkość działania pętli nie zależy od miejsca w listingu.

http://www.5oft.pl/

7

no to spróbuję :)

___
Press play on tape...

8

xxl napisał/a:

przeciez turbo basic xl ma instrukcje do pisania po ekranie graficznym (chyba ze sie myle) [...]

Nie mylisz się: TEXT x,y,"(prawie) dowolny tekst" - powoduje wyświetlenie tekstu w graficznym trybie (x, y - z dokładnością do jednego punktu). Wcześniej musi być: COLOR 1, żeby coś w ogóle było widać :)

9

Za wolne to jest :(. Jednak najszybszą metodą było by wypełnienie obszaru pamięci znakowej i wklejenie jej całej za jednym razem w obraz GR.8.

___
Press play on tape...

10

A w kwestii stałego interwału wykonywania procedur jest czym się podeprzeć ?.

___
Press play on tape...

11 Ostatnio edytowany przez larek (2008-06-17 09:10:05)

maw napisał/a:

Za wolne to jest :(.

To w takim razie tu masz szybszą prockę. Sam z niej często korzystałem. Jest naprawdę szybka.

Jeśli chodzi o przemieszczanie całych bloków pamięci, to w TBXL jest instrukcja MOVE. Może ona coś pomoże?
Generalnie to jednak na demoniczną szybkość działania programu pisanego w (Turbo-)Basicu to bym nie liczył.

12

No będę go potem do XEXa konwertował - dlatego tak bardzo mi chodzi o stabilizację interwału wykonywania procedur - bo jak się okaże, że po konwersji kulka zapyla 10 razy szybciej, to będzie to trochę śmiesznie wyglądało.

Procedurka fajna, XORa mi brakuje, żeby nie nadpisywała zawartości komórki - spróbuję coś pokombinować.

___
Press play on tape...

13

No to wstaw tam gdzie trzeba PAUSE x (x=50=1sekunda) i kulka nie będzie zapierniczać szybciej.

14

tyle to ja sobie mogę z PEEK(20) wyciągnąć - sam ruch kulki to nie wszystko, ponieważ rysowanie planszy pomiędzy kolejnymi sekwencjami ruchu swoje weźmie.

___
Press play on tape...

15

Do rysowania planszy użyj procedur napisanych w asemblerze i wywołuj je np. poprzez X=USR(ADR(P$)), gdzie P$ to zmienna tekstowa zawierająca "znaczki-dziwaczki" (wiadomo, o sssso chozzzi :) ) Poza tym pamiętaj o paru fajnych komendach Turbo Basica XL, np. CIRCLE a,b,r1,r2 (kreślenie elipsy o środku w punkcie o współrzędnych a,b oraz promieniach r1, r2, przy czym jeśli pominiesz r2, to narysowane zostanie koło o promieniu r1), FILLTO a,b (działa jak znana z Atari Basic sekwencja POSITION a,b:XIO 18,#16,0,0,"S:", ale FILLTO wykonywane jest szybciej) itp. Czas rysowania planszy możesz skrócić wyłaczając obraz (np. poprzez stare, ale jare POKE 559,0). Wiem, że to bardzo proste sposoby, ale bywają skuteczne :)

Loading... Please wait!

16

Nie, nie chodzi mi o takie rysowanie i stawianie "znaczków" - chodzi mi o taką zasadę, jak we flashu - a więc layer wyższy nakładamy na niższy, co odbywa się właśnie w określonych jednostkach czasu.

W jakimś bajtku była procedura maszynowa pozwalająca odpalać zdalnie program w basicu - muszę poszukać - jeżeli dało by się ją podpiąć pod wyświetlanie DLI, to licznik mam jak znalazł, a ja już się o to postaram, by program z basica-a na początku sprawdzał stan określonych komórek pamięci - czyli odczytywał, w jakim dokładnie momencie był odpalony.

___
Press play on tape...

17

nie bijcie... następne pytania mam... czy mógłby mi ktoś napisać procedurkę, która pozwoliła by mi na otrzymanie 6ciu kolorów na ekranie...

...i oprócz tego pozwalała na indywidualne używanie duszków ?

co do duszków: jak używać piątego duszka ? jaką kombinacją PMCNTL czy też DMACTL ? - jego położenie steruje się jednym rejestrem po załączeniu, czy dalej czterema ?

___
Press play on tape...
maw napisał/a:

która pozwoliła by mi na otrzymanie 6ciu kolorów na ekranie...

A nie moze byc piec kolorow? To wiele uprosci... :)

Kaz/Rohar
Prowadzę stronę dla obłąkanych: http://atari.online.pl/

19 Ostatnio edytowany przez maw (2008-06-20 08:42:39)

w sumie... potrzebowałbym 5 kolorów obiektów, 1 kolor ramek (olać piątego playera, missile za ramki posłużą) + kolor tła :)

//EDIT: widzę, co Tebe napisał u Ciebie w wątku:

maks 5 kolorów pola gry + jeśli podbarwiamy duchami, to dany duch/pocisk można użyć tylko raz, oczywiście takie ograniczenia nie pozwalają stworzyć obrazka wyuzdanego kolorystycznie

- idę pytać tam :)

___
Press play on tape...

20

Wracając do tematu - korzystając z komórki 20 zrobiłem prosty ogranicznik do 50 "sekwencji" na sekundę:

XX10 GOSUB YY10
XX20 REM INNE KOMENDY
XX30 REM ..
XX40 REM ..
XX50 REM ..
XX90 GOTO XX10

YY10 T=PEEK(20)
YY20 IF PEEK(20)=T THEN GOTO YY20
YY30 RETURN

Efekt działania kodu widać tylko na skompilowanym do XEXa programie - choć obawiam się, że w przypadku większej ilosci komend niż testowane przeze mnie printy (w przykładzie zastąpione REMami) na nic się to nie przyda, bo czas ich wykonania będzie dłuższy niż te umowne 20 milisekund, więc jeszcze bardziej spowolni wykonanie.

Gorzej jest jeszcze z przejściem przez zero, jeżeli chcemy mieć ograniczenie do 25 sekwencji na sekundę...

___
Press play on tape...

21

nie wiem o co chodzi.

1. chcesz miec ogranicznik do np.25 wywolan jakiejs procedury w jakims czasie?
2. chcesz wywolywac procke co okreslony czas (w sumie np.25 wywolan na sekunde)

to by wymagalo innego podejscia do sprawy ale ogolnie moze trzeba zrobic funkcje, ktora porowna ilosc wywolan badanej procki w okreslonym przedziale czasu i jesli jeszcze sie miesci to prawda, jesli nie nie to zeruje liczniki i fałsz.

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

22

Ale ja wiem o co chodzi: chcę wywoływać główną strukturę programu TBXL/aBAS 25 razy na sekundę - ta pętla po to, żeby nie okazało się, że po kompilacji do XEXa nie da się programu używać. Że jest konieczna, to można sprawdzić prostym kodem:

10 ? I:i=i+1:IF I<5 THEN GOTO 10
20 ? PEEK(20):I=0:GOTO 10

Skompiluj do XEXa i porównaj z tym, co wypisuje program uruchomiony pod kontrolą basica.

Metody odpowiedzialne za odświeżanie ekranu i efekty idą swoim własnym zegarem/przerwaniami, niezależnie od basica. Atari ma trochę zegarów, którymi można regulować czas wywołania maszynówki, ale jak się pytałem, czy jest możliwość regulowania wywołań basica, to nikt mi nie odpowiedział. Więc powrót do punktu wyjścia. Czekanie na zmianę wartości komórki 20 jest chyba najlepszym rozwiązaniem - jeżeli zmieścimy się w 1/50 sekundy, to pętla pozostały czas zajmie. Jeżeli nie zmieścimy się, no to trudno - tracimy 1/25 sekundy (przeskok licznika).

___
Press play on tape...

23

> Czekanie na zmianę wartości komórki 20 jest chyba najlepszym rozwiązaniem

nic nie da.

> - jeżeli zmieścimy się w 1/50 sekundy, to pętla pozostały czas zajmie. Jeżeli nie zmieścimy się, no to trudno - tracimy 1/25 sekundy (przeskok licznika).

tak samo po skompilowaniu.

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

24 Ostatnio edytowany przez maw (2008-07-14 13:27:15)

xxl napisał/a:

> Czekanie na zmianę wartości komórki 20 jest chyba najlepszym rozwiązaniem

nic nie da.

tzn. ?

//EDIT: Chodzi mi o to, żeby program wykonywał się NIE SZYBCIEJ niż 1/50 sekundy, może wolniej. Cały program powoli sprowadza się do kilu inkrementacji i wywołania kilku USRów, co nie powinno być tak czasochłonne niż wszystko pisane w basicu.

___
Press play on tape...

25 Ostatnio edytowany przez mono (2008-07-14 13:37:10)

O ile dobre zrozumiałem problem chodzi Ci MaW o coś takiego:

10 a=peek(20)
20 gosub TwojaProcedura
30 b=peek(20): if (b >= a and b < a+2 or b < a and b < a+2-256) then 30
40 a=b: goto 20

Jeśli Twoja procedura wykonując się przekroczy czas trwania 2 ramek, to po prostu polecimy dalej - jeśli nie przekroczy to zsynchronizujemy się. Pominąłem oczywiście synchronizację z początkiem ramki bo myślę, że na tak dokładnej synchronizacji Ci nie zależy?

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