@MaW: Nie wiem do czego potrzebujesz tablicy E, ale wstawiłem Twój kod (nieco zmodyfikowany) do mojej wersji i wygląda to tak:
10 GRAPHICS 0:POKE 752,1
11 DIM T$(1000):L=37
12 T$=" Prima Aprilis - edycja 2010 ;)"
13 T$(38)=" Idea by Sikor, programming by Sikor, MaW, Mono..."
14 T$(91)=" Made only for fun."
15 T$(113)=""
20 POKE 710,0:? T$(1,L);
30 DIM F(3),V(3),P(3),D(3),C(5)
40 FOR S=0 TO 3:V(S)=0:P(S)=0:NEXT S
50 DATA 0,8,4,2,12,10
60 FOR I=0 TO 5:READ D:C(I)=D:NEXT I
70 S=0
80 DLL=PEEK(560)+256*PEEK(561):DLV1=16
90 DIM LL$(128),LR$(128),L$(6):L$(1)=CHR$(160):L$(2)=CHR$(25):L$(3)=CHR$(32):L$(4)=CHR$(32):L$(5)=CHR$(153):L$(6)=CHR$(160)
91 FOR I=0 TO 15:FOR J=0 TO 7
92 LL$(1+I*8+J)=L$(2+SGN(2*J-I)):LR$(1+I*8+J)=L$(5+SGN(2*J+1-(15-I)))
93 NEXT J:NEXT I
100 L=L+1:IF L>LEN(T$) THEN L=1
110 POSITION 0,0:? CHR$(254)
120 POSITION 38,0:? T$(L,L);
130 IF V(S)>0 THEN V(S)=V(S)-1:GOTO 190
140 POSITION P(S),19:? " ";
150 F(S)=INT(256*RND(0))
160 V(S)=INT(16*RND(0))
170 P(S)=38-INT(F(S)/256*39)
180 D(S)=INT(6*RND(0))
185 IF S<2 THEN V=1+V(S)*8:POSITION 0,21+S:? LL$(V,V+7);
186 IF S>=2 THEN V=1+V(S)*8:POSITION 31,19+S:? LR$(V,V+7);
190 POSITION P(S),19:? CHR$(20);
200 SOUND S,F(S),C(D(S)),V(S)
205 IF S<2 THEN D=V(S)/2:IF D<=7 THEN V=1+V(S)*8+D:POSITION D,21+S:? LL$(V,V);
206 IF S>=2 THEN D=INT(0.5+V(S)/2):IF D<8 THEN V=8+V(S)*8-D:POSITION 38-D,19+S:? LR$(V,V);
210 S=S+1:IF S>3 THEN S=0
300 A=PEEK(20)
310 IF PEEK(20)=A THEN 310
320 POKE DLL,DLV1-16:POKE DLL+6,128-DLV1
330 DLV1=DLV1*2:IF DLV1>128 THEN DLV1=16
10000 GOTO 100
Zsynchronizowałem zmiany dlist z ramką (linia 300..310), żeby ekran nie latał "w te i we wte" ;) oraz modyfikuję puste linie na początku dlist i tylko jeden wiersz trybu 0 dzięki czemu mamy na ekranie 23 wiersze, a nie 22.
Jeśli chodzi o synchronizację to trick jest prosty - komórka 20 zmienia się co ramkę na VBLK więc czekam na zmianę po czym szybko zapisuję nowe puste linie do dlist. BASIC jest na tyle wolny, że odbywa się to zapewne już po wyświetleniu drugiego wiersza trybu tekstowego (który zamieniany jest na puste linie). Gdyby w przyszłości metoda okazała się za wolna, można spróbować innej sztuczki:
300 A=PEEK(20): FOR B=0 TO 1:IF PEEK(20)=A THEN B=0:NEXT B
310 POP
Technika jest szybsza niż GOTO, bo BASIC przy każdej pętli FOR odkłada na stos "adres" początku pętli FOR..NEXT dzięki czemu nie szuka numeru wiersza (wyszukiwanie wiersza odbywa się zawsze od początku pamięci programu, co trwa i trwa). No a POP zdejmuje to, co FOR wstawiło.
Ostatnio edytowany przez mono (2010-03-31 19:29:27)
Post's attachmentsPRIMAA3.LST 1.31 kb, liczba pobrań: 2 (od 2010-03-31)
Tylko zalogowani mogą pobierać załączniki.
hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje