LEZIONE 23 – I DATI GESTITI DAL MSX (2° Parte)

da | Feb 22, 2024 | MSX BASIC | 0 commenti

Riprendiamo la nostra lezione della volta scorsa, di cui la mia ultima spiegazione è stata sui comandi per poter “lavorare” con i files. Oggi parlerò come creare i files sequenziali, ma prima di non aver detto 2 parole del comando MAXFILES=. questo comando ci fa lavorare con più files contemporaneamente. All’accensione del Nostro MSX, il suddetto è per default 1, perciò non possiamo aprire più di un file alla volta, ad esempio se stiamo lavorando in modo grafico ed abbiamo aperto la periferica GRP per scrivere su di esso, non possiamo aprire nessun’altro file. Modificando questo parametro, abbiamo risolto il problema. Il comando inizializzerà tutti le variabili, perciò conviene usarlo sempre all’inizio del programma: MAXFILES=3. Adesso possiamo lavorare con 3 files contemporaneamente. Esso riserverà spazio in memoria per ogni file che verrà aggiunto, perciò conviene usarlo solo quando serve. Per creare un file dati usiamo il comando OPEN e visto che è un nuovo file dobbiamo crearlo per la scrittura: OPEN “[Unità:]Nome File” FOR OUTPUT AS #[numero di porta]. Unità, come ho detto nella lezione precedente può essere il registratore e in questo caso sarà CAS: oppure il DRIVE A: o B: . Le regole sono uguali a quello che ho detto, sempre nella lezione precedente, 6 caratteri senza estensione per le cassette ed 8 caratteri + estensione (anche se non è obbligatoria) per i Drives. Vi ricordate quel programma che ho scritto qualche lezione fa, un’agenda, ecco, useremo quello per i nostri esempi. Avevo messo il Nome, L’indirizzo è il Numero telefonico. Dopo averli creati li possiamo salvare sul nostro file, che chiameremo “AGENDA.DAT” su disco. Per il registratore sarà: CAS:AGENDA. La riga di programma sarà: OPEN “AGENDA.DAT” FOR OUTPUT AS #1. Se possediamo più di un drive e vogliamo creare il nostro disco dati sull’altro, basta aggiungere il nome del drive prima del nome file: “B:AGENDA.DAT”, tutto quello che faremo su di esso, sarà trasferito sul drive B. Salviamo i nostri dati con il comando PRINT #1. Creeremo il record diviso in 3 campi. Adesso prestate attenzione a quello che dirò in seguito. Se vogliamo registrare 3 campi nello stesso record, usando PRINT #1 N$,I$,T$, che sarebbero le variabili di Nome, Indirizzo e Telefono, mettendo le virgole come ho fatto, li vedrà come segni di spaziatura ma non come divisori di variabili, e quando verranno letti, saranno visti come unica variabile. Per fare capire all’MSX che sono più variabili, dobbiamo inserirli dentro con il corrispettivo codice ASCII oppure tra virgolette: PRINT #1, N$; “,”; I$; “,”; T$. Ogni volta che inseriremo un nuovo record verrà accodato sempre dietro l’ultimo, questo avverrà fino a quando non chiuderemo il file con il comando CLOSE: CLOSE #1 . Usato senza cancelletto e numero di porta chiuderà tutti i files aperti. Su cassetta, una volta chiuso il file sequenziale non potrà più essere modificato, perché se lo riapriamo in output cancellerà tutto il suo contenuto, la stessa cosa vale anche su disco. Ma su quest’ultimo c’è la possibilità di poterlo aprire senza cancellare il suo contenuto. OPEN “AGENDA.DAT” FOR APPEND AS #1. Così facendo continueremo ad aggiungere i nostri dati sul file. Possiamo salvare anche dati formattati usando PRINT #1, USING “Stringa Formato”; variabile, variabile, . . Possiamo usare anche una variabile a stringa invece del Nome File. Ad esempio, un programma che lavora con tanti files ed il nome verrà specificato all’interno di esso: INPUT “Nome del File”; NF$: OPEN NF$ FOR OUTPUT AS#1. Passiamo alla fase di lettura dei dati. Adesso il file verrà aperto in entrata, cioè in modalità lettura: OPEN”AGENDA.DAT” FOR INPUT AS #1. Per leggere i dati scritti in precedenza useremo il comando INPUT #1 oppure LINE INPUT #1. La differenza tra i due 2 è che il primo leggerà un campo alla volta mentre il secondo tutto il record anche se abbiamo aggiunto le virgole di separazione. Per fare un esempio, con il salvataggio dei dati fatto sopra, se vogliamo leggere un campo alla volta per inserirlo in 3 variabili, useremo: INPUT #1, N$,I$,T$, se invece vogliamo leggere tutto il record, useremo : LINE INPUT #1, A$. La variabile A$ sarà N$+I$+T$. Quando l’MSX legge i dati dal file sequenziale, dovrà sapere quando questi finiranno, per questo c’è la funzione EOF (Numero porta). EOF (End Of File) controlla se ci sono ancora dati da leggere. La linea di programma da inserire sempre prima della lettura del file è così composta: IF EOF(1) THEN CLOSE #1. Eviteremo un increscioso errore che ci darà l’MSX se facciamo leggere un file dove non ci saranno più dati. Come detto sopra, di seguito inserisco il programma con tutte le modifiche per lavorare con il file. E’ valido solo per i dischetti, ma con qualche modifica può essere usato anche per il registratore a cassette.

5 KEY OFF: SCREEN 0,,,2: WIDTH 40: CLEAR(2000):DEFINT A-Z: DIM M$(50,2)
10 ON ERROR GOTO 1000: CN=0: GOSUB 600
20 CLS:LOCATE 15,1: PRINT “M E N U”: GOSUB 100
30 S$=INKEY$: IF S$=”” THEN 30
40 IF S$<“1″ OR S$>”4” THEN 30
50 ON VAL(S$) GOSUB 200,300,400,500
60 GOTO 30
100 LOCATE 1,4 : PRINT”1 – INSERIMENTO DATI”
110 LOCATE 1,8 : PRINT”2 – MODIFICA DATI”
120 LOCATE 1,12: PRINT”3 – VISUALIZZA DATI”
130 LOCATE 1,20: PRINT”4 – USCITA PROGRAMMA”
140 RETURN
200 IF FRE(“”)<50 OR CN=50 THEN PRINT “ATTENZIONE !! Non si possono fare piu’ inserimenti”: FOR R=0 TO 2000:NEXT R: RETURN ELSE OPEN “AGENDA.DAT” FOR APPEND AS#1 205 CLS: LOCATE 12,0: PRINT “INSERIMENTO” 210 LOCATE 1,4: LOCATE 1,4:INPUT “NOME (MAX 10 CARAT.)”;N$ 215 IF LEN(N$)=0 OR LEN(N$)>10 THEN LOCATE 0,4:PRINT SPACE$(39): GOTO 210
220 LOCATE 1,8: INPUT “INDIRIZZO (MAX 18 CARAT.)”;I$
225 IF LEN(I$)=0 OR LEN(I$)>18 THEN LOCATE 0,8:PRINT SPACE$(39): GOTO 220
230 LOCATE 1,12:INPUT “TELEFONO (MAX 10 CARAT.)”; T$
235 IF LEN(T$)=0 OR LEN(T$)>10 THEN LOCATE 0,12:PRINT SPACE$(39): GOTO 230
240 LOCATE 1,18: PRINT “CORRETTO (S/N)? “
250 S$=INKEY$: IF S$=”” THEN 250
260 IF S$=”s” OR S$=”S” THEN PRINT #1,N$;”,”;I$;”,”;T$:CN=CN+1:M$(CN,0)=N$:M$(CN,1)=I$:M$(CN,2)=T$:GOTO 280
270 IF S$=”N” OR S$=”N” THEN 205 ELSE 250
280 LOCATE 1,18: PRINT “ALTRO INSERIMENTO (S/N)?”
285 S$=INKEY$: IF S$=”” THEN 285
290 IF S$=”N” OR S$=”N” THEN CLOSE #1: RETURN 20
295 IF S$=”s” OR S$=”S” THEN 205 ELSE 285
300 CLS:LOCATE 15,0: PRINT “MODIFICA”
303 INPUT “INSERIRE IL NOME DA RICERCARE”;NO$
306 FOR I=1 TO CN:IF NO$=M$(I,0) THEN 310
308 NEXT: PRINT “Nome non trovato”: FOR R=0 TO 2000:NEXT: RETURN 20
310 LOCATE 0,4:INPUT “NOME(Confermare per non cambiare)”;N$
320 IF N$=”” THEN LOCATE 0,5:PRINT M$(I,0) ELSE M$(I,0)=N$
330 LOCATE 0,8: INPUT “INDIRIZZO(Confermare per non cambiare)”;I$
340 IF I$=”” THEN LOCATE 0,9:PRINT M$(I,1) ELSE M$(I,1)=I$
350 LOCATE 0,12:INPUT “TELEFONO(Confermare per non cambiare)”;T$
360 IF T$=”” THEN LOCATE 0,13:PRINT M$(I,2) ELSE M$(I,2)=T$
370 OPEN “AGENDA.DAT” FOR OUTPUT AS #1
380 FOR I=1 TO CN: PRINT #1, M$(I,0);”,”;M$(I,1);”,”;M$(I,2):NEXT I
390 CLOSE #1: RETURN 20
400 CLS:LOCATE 10,0: PRINT “VISUALIZZAZIONE”
410 FOR I=1 TO CN
420 PRINT M$(I,0);TAB(11);M$(I,1);TAB(30);M$(I,2)
430 IF IMOD10=0 THEN GOSUB 450
440 NEXT: GOSUB 450: RETURN 20
450 PRINT:PRINT “Premere spazio per continuare”
460 IF INKEY$=” ” THEN RETURN ELSE 460
500 CLS:END
600 OPEN “AGENDA.DAT” FOR INPUT AS #1
610 IF EOF(1) THEN CLOSE #1: RETURN
620 CN=CN+1:INPUT #1,M$(CN,0),M$(CN,1),M$(CN,2)
630 GOTO 610
1000 IF ERR=53 THEN OPEN “AGENDA.DAT” FOR OUTPUT AS #1: CLOSE #1: RESUME 20
1010 RESUME NEXT

La spiegazione del programma la farò nella prossima puntata.

Grazie a tutti e arri sentirci.

0 commenti

Invia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

Buongiorno a tutti, In questa puntata parlerò di un interrupt importante, specialmente per i giochi, quando vogliamo far apparire un nemico all'improvviso o un oggetto utile, ma anche per creare un cronometro o un orologio e tante altre cose. Il COMANDO sfrutta il...

LEZIONE 26 – INTERVAL ON, RND ED ALTRI

LEZIONE 21 – MSX e la musica

L'MSX ha un ottimo chip sonoro che può 'suonare' tre voci contemporaneamente. Iniziamo con il commando classico che sentiamo spesso in vari programmi o quando avviene un errore. Il suo nome è BEEP, cioè scrivendo il nome di questo comando riproduciamo questo suono. E'...

it_ITIT_IT