Ready64 Forum

Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Cbm - 02 Agosto 2006, 23:50:58

Titolo: Testo Scorrevole In Basic
Inserito da: Cbm - 02 Agosto 2006, 23:50:58
 Questa routine, pubblicata sul numero 4 di CCC a pagina 48 (http://ready64.altervista.org/ccc/04/48.jpg) potrebbe interessare a chi inizia a scoprire il basic, per cui ho pensato di riportarla qui.
Il listato era rivolto ai possessori di VIC 20, ma è facilmente adattabile anche per il 64, tenendo conto delle diverse dimensioni dello schermo; col 64 passiamo a 40 colonne.

Il risultato è questo:
Codice: [Seleziona]
10 INPUT A$:PRINT CHR$(147)
20 A$="                                        "+A$  -------> tra virgolette 40 spazi
30 FOR I=41 TO 157  
40 PRINT CHR$(19);TAB(200);MID$(A$,I-40,40);" "
50 FOR J=1 TO 100:NEXT J,I:GOTO 30

L'autore aveva pensato di basare la lunghezza del ciclo (riga 30) necessario a far sparire la scritta dal video, su un valore fisso pari alla lunghezza massima consentita per la frase inserita. Quindi, nel caso in cui la frase inserita sia invece di poche lettere, l'attesa per il passaggio successivo diventa lunga, in quanto il programma continua il ciclo credendo di scorrere ancora del testo, col risultato di mostrare uno schermo vuoto troppo a lungo.
La cosa si può ovviare facilmente usando la funzione LEN per conoscere di volta in volta il numero di caratteri della frase, in modo da adeguare per ogni frase la durata del ciclo che porta alla scomparsa della scritta.

Ovvero:
Codice: [Seleziona]
10 INPUT A$:PRINT CHR$(147)
15 N=LEN(A$):N=N+80
20 A$="                                        "+A$
30 FOR I=41 TO N
40 PRINT CHR$(19);TAB(200);MID$(A$,I-40,40);" "
50 FOR J=1 TO 100:NEXT J,I:GOTO 30

Spero non ci siano errori.  :mattsid:
 
Titolo: Testo Scorrevole In Basic
Inserito da: eregil - 03 Agosto 2006, 00:52:14
 In tutta franchezza, visto l'originale, piuttosto che lavorarci sopra, io la riscriverei da zero una routine per far scorrere del testo. L'originale che hai scelto tende a farti confondere le idee e non è proprio codice pulito e ottimizzato, basti pensare al ciclo che comincia da 41, per poi ad ogni iterazione computare I-40: non si poteva semplicemente iniziare un ciclo da 1?

Riscrivere la routine da zero ti aiuterà anche ad affrontare il problema più alla radice e a convincerti del fatto che per il problema, come in molti casi, può esistere più di una soluzione. ;)

Se ti va, o se ti è difficile riscrivere da zero avendo una soluzione sottomano (può succedere), prova qualche variante: fai scorrere il testo non sulle 40 colonne ma dentro una coppia di parentesi distanziate di un numero di colonne prestabilito (38, 22, fai tu); oppure, leggermente più complicato, prova a far "ruotare" una stringa di lunghezza prefissata (che ci stia in una riga dello schermo) in modo che il carattere che esce dallo schermo a sinistra ricompaia subito a destra. Un po' come si è visto in Video Basic per intenderci. ;)

Se provi direttamente le varianti, non basarti sul codice già postato.
Titolo: Testo Scorrevole In Basic
Inserito da: Cbm - 03 Agosto 2006, 23:33:59
 
Citazione da: "eregil"
In tutta franchezza, visto l'originale, piuttosto che lavorarci sopra, io la riscriverei da zero una routine per far scorrere del testo.
In effetti lo noto persino anche io... Mi viene da pensare a come dovevano essere avventurosi i tempi della rivista, quando si arrivava a pubblicare anche materiale non certo esaltante, e lavorando all'indice di CCC me ne sto accorgendo in diverse occasioni.

Comunque, raccogliendo il tuo invito a migliorare il tutto, ho ripreso quel listato, riscrivendolo ma riproponendone la stessa soluzione e poi ho provato a concepirlo diversamente con la variante entro l'intervallo. Devo dire che non è che sia tanto soddisfatto dei risultati, anche se il secondo è solo un'abbozzo macchinoso.

UNO:
Codice: [Seleziona]
10 A$="[40SPAZI]CIAO! "
12 PRINT "[CLR/HOME]"
15 FOR S=1 TO 46
20 PRINT MID$(A$,S,40);"[2SU]"
22 FOR R=1 TO 150:NEXT
25 NEXT S
30 GOTO 15


DUE:
Codice: [Seleziona]
5 A=1539:B=1540:C=1541:D=1542:E=1543
10 PRINT "[CLR/HOME]"
20 POKE A,3:POKE B,9:POKE C,1:POKE D,15:POKE E,33
30 A=A-1:B=B-1:C=C-1:D=D-1:E=E-1
35 IF A=1503 THEN GOTO 5
40 GOTO 10


Citazione
oppure, leggermente più complicato, prova a far "ruotare" una stringa

Cosa intendi per ruotare? Fargli fare avanti e indietro?
Titolo: Testo Scorrevole In Basic
Inserito da: Cbm - 04 Agosto 2006, 01:00:40
 Troppe variabili inutili prima... penso troppo lentamente  :sonno:

Codice: [Seleziona]
5 A=1539
10 PRINT "[CLR/HOME]"
20 POKE A,3:POKE A+1,9:POKE A+2,1:POKE A+3,15:POKE A+4,33
30 A=A-1
35 IF A=1503 THEN GOTO 5
40 GOTO 10
Titolo: Testo Scorrevole In Basic
Inserito da: iAN CooG - 04 Agosto 2006, 01:16:01
 movimento un po' con una versione oneliner:
Codice: [Seleziona]
start tok64 rotfl.prg
0s$="     ":foru=1to3:s$=s$+s$:next:inputa$:sys58692:a$=s$+a$:n=len(a$):a$=a$+s$:forx=0to9e9:foru=1ton:poke211,1:poke214,12:sys58732:printmid$(a$,u,38):fort=1to60:nextt,u,x
stop tok
tokenizzare con bastext -o nome.txt
Ovviamente non puo' essere rieditata perche' supera il limite degli 80 caratteri dell'editor a schermo, ma il parser non ha di questi problemi =)
Titolo: Testo Scorrevole In Basic
Inserito da: eregil - 04 Agosto 2006, 14:00:23
Citazione da: Cbm
Cosa intendi per ruotare? Fargli fare avanti e indietro?

Come ho specificato, che il carattere che scompare a sinistra ricompaia subito a destra. Esempio:

Codice: [Seleziona]
. ciao .
 ciao . .
ciao . .
iao . . c
ao . . ci

ecc. :) Con una stringa un po' più lunga, ha senso...

Il tuo programma UNO è, diciamo, l'originale come sarebbe stato con un po' di pulizia. Il programma DUE, usando le POKE, in BASIC non è efficiente: una sequenza di POKE su schermo è molto più lenta di una PRINT; comunque, (solo) dal punto di vista didattico è legittimo provare a farla, se non altro per capirne la logica e magari prepararti poi a scrivere la stessa cosa in assembly. Restando per il momento al tuo programma BASIC, comunque, ora perché non provi a renderlo un po' più generico? Metti un ciclo FOR in luogo della sequenza di cinque POKE e magari leggi la "stringa" da DATA.
Titolo: Testo Scorrevole In Basic
Inserito da: Cbm - 04 Agosto 2006, 16:13:30
 Ciao Eregil, stamattina lontano dal computer ho pensato ad un passettino in avanti in modo che la parola ora entri ed esca dai bordi (cambiando il colore delle locazioni precedenti e successive alla riga di scorrimento) anche con la seconda "rutinetta", ed ho eliminato il movimento a scatti dovuto alla cancellazione della parola con CLR come succedeva prima. Mi sono collegato giusto per provarlo e mettere il codice qui.

Codice: [Seleziona]
5 A=1543
10 PRINT "CLR/HOME"
15 FOR L1=55771 TO 55775:FOR L2=55816 TO 55820
16 IF A>1504 THEN POKE L1,6
17 IF A>1539 THEN POKE L2,6
18 NEXT L2,L1
20 POKE A,3:POKE A+1,9:POKE A+2,1:POKE A+3,15:POKE A+4,32
30 A=A-1
32 FOR R=1 TO 100:NEXT
35 IF A=1498 THEN GOTO 5
40 GOTO 20

READY.

Quello che volevo chiedere è se fosse possibile utilizzare, e come, gli indirizzi 201 e 202 (o altro modo) della memoria per posizionare il cursore in un punto preciso dello schermo, in modo che un eventuale PRINT fosse stampato a partire da una coordinata precisa. Una specie di istruzione LOCATE ma per il testo.
Titolo: Testo Scorrevole In Basic
Inserito da: eregil - 04 Agosto 2006, 16:32:08
 Guarda il one-liner di Ian Coog qui sopra in questo stesso thread: le POKE e SYS che vedi (nell'ultima parte) servono proprio a cambiare la posizione del cursore.

Le POKE nelle locazioni 201 e 202 non hanno l'effetto desiderato.
Titolo: Testo Scorrevole In Basic
Inserito da: Cbm - 04 Agosto 2006, 16:50:35
 
Citazione da: "eregil"
Guarda il one-liner di Ian Coog qui sopra in questo stesso thread: le POKE e SYS che vedi (nell'ultima parte) servono proprio a cambiare la posizione del cursore.

Le POKE nelle locazioni 201 e 202 non hanno l'effetto desiderato.
Magnifico, grazie!!! Mi era proprio sfuggito il contributo aggiunto da iAN in mezzo ai restanti messaggi.

Nuovamente  :sonno:

 :)
Titolo: Testo Scorrevole In Basic
Inserito da: Cbm - 05 Agosto 2006, 20:57:43
 Visto che l'argomento mi sembra didatticamente utile, già che ci sono aggiungo un esempio di scorrimento verticale che avevo fatto per gioco, più facile da raggiungere, non fosse altro perchè sfrutta la sparizione naturale del testo in alto.
Come al solito anche qui ci sono altre strade più raffinate per ottenere l'effetto, il mio auspicio è sempre quello che si lasci coinvolgere anche qualcuno di non esperto che di solito non scrive nel forum programmazione. Ciao!

Codice: [Seleziona]
5 REM SCORRIMENTO VERTICALE
10 INPUT A$:PRINT CHR$(147):N=LEN(A$)
15 X=RND (1)*39
20 FOR T2=1 TO 24:PRINT " ":FOR R= 1 TO 50:NEXT R,T2
30 FOR T=1 TO N:PRINT SPC(X):PRINT MID$(A$,T,1):FOR R=1 TO 50:NEXT R,T
40 GOTO 15
READY.