Componi
(by Vittorio Menna, 1992)

[continua da e-Battesimo <<<]

 

COMPONI è un programma di grafica raster, che permette la creazione di primitive a partire da informazioni vettoriali. Crea bitmap a partire da funzioni e da comandi che nascono parametrici, ma che finiscono però per perdere il contenuto di informazioni una volta eseguiti. Il BASIC infatti, da un lato, durante l'immissione dei dati, gestisce le funzioni grafiche e i comandi di disegno in maniera vettoriale e parametrica

[ per esempio il comando per tracciare una linea da A a B è LINE (xA,yA)-(xB,yB),0 ],

ma dall'altro, non essendo un linguaggio object-oriented (orientato agli oggetti), trasforma subito tutto all'istante, dopo la creazione della primitiva data, in bitmap, in una semplice successione di punti sullo schermo. Non ha memoria delle entità create e delle loro caratteristiche, esse dopo il tracciamento sullo schermo perdono ogni informazione supplementare, diventano "sceme" e non possono essere successivamente modificate o trasformate se non agendo sui singoli pixel o su porzioni di schermo. Questo è un grande limite, ed apparve subito anche a me mentre progettavo COMPONI.

A. Saggio - Lezione 8, Raster; Lezione 9, Vettori e Layer


FILES DI PROGRAMMA DI COMPONI

Allego di seguito il testo dei files originali di COMPONI: il testo del manuale (che contiene, con una descrizione forse un po' ingenua, le caratteristiche del programma e l'esposizione delle funzioni e dei comandi implementati) e i listati dei moduli di programma in basic.

(Devo ammettere che mi fa un certo effetto rivedere queste cose... Ah, se sapete come posso fare a farlo funzionare per piacere scrivetemi!)

- MANUALE >>>

- LISTATI DEI MODULI DI PROGRAMMA >>>


MANUALE


- Cos'è COMPONI ?

Componi è un programma di grafica pittorica scritto in IBM Basic ver. 3.30 da Vittorio Menna.
Configurazione minima richiesta: un computer IBM o compatibile al 100% con 640 Kb di memoria e un programma di compilazione Basic ver. 3.30 o superiore. Necessita di una scheda grafica EGA o superiori.


- Lancio del programma

1) Posizionarsi nella directory contenente il programma e il compilatore Basic.
2) Richiamare l'ambiente Basic (battere BASIC o BASICA).
3) Caricare Componi (battere LOAD"COMPONI").
4) Mettere in esecuzione il programma battendo RUN.


- Dare dei comandi a Componi

Dopo aver messo in esecuzione il programma apparirà in basso a sinistra la richiesta "Comando ?". Digitare le tre lettere componenti il comando (per conoscere i comandi definiti vedere paragrafo "Comandi definiti"). Indi, se le lettere sono corrette si passerà all'esecuzione della funzione data, altrimenti verrà visualizzato un messaggio di errore. In questo caso premere un tasto e ridigitare il comando corretto.


- Comandi definiti

Ecco l'elenco dei comandi definiti:
(per leggerlo durante l'esecuzione del programma battere HLP)

GOM : Gomma
PUN : Visualizza un punto in una data posizione
PEN : Penna (disegno libero)
CER : Visualizza un cerchio
PIT : Pennello (disegno libero)
RTT : Visualizza un rettangolo
RIE : Riempie di colore un oggetto
CLS : Cancella lo schermo
LIN : Visualizza una linea
CAR : Visualizza un cardioide
POL : Visualizza un poligono regolare
ELL : Visualizza un ellisse
HLP : Elenco dei comandi definiti
TXT : Inserisce un testo nell'immagine con diversi font
TRI : Visualizza un triangolo
SPR : Crea uno sprite da una zona del video
ROS : Visualizza un rosone simile a un fiore
CUR : Visualizza una curva parabolica
INV : Inverte i colori di una data regione dello schermo
COP : Copia una zona dello schermo su un'altra regione
ARC : Visualizza un arco di cerchio
COL : Editor di colori personalizzati
PER : Riempie un oggetto con un colore letto da file
PLL : Visualizza una polilinea
RND : Visualizza delle figure casualmente sullo schermo
ALT : Altera i colori di una data regione dello schermo
GRI : Crea sul video una griglia di punti
GOF : Cancella la griglia creata in precedenza
RET : Crea una griglia di linee sullo schermo
FIG : Ripete delle figure con un certo criterio
INF : Informazioni sul programma
ANE : Visualizza un anello
ANI : Crea animazioni
CHC : Cambia il colore corrente
DOM : Mostra l'ora, la data corrente e la memoria disponibile
SQU : Squadra il video
CLP : Cancella una parte del video
EXT : Esce dal programma
CEN : Trova il centro di una zona dello schermo
ZOO : Effettua lo zoom di una zona del video di 80x22 pixel
VIS : Copia una zona su un'altra in modo OR, AND o XOR
BOM : Bomboletta spray (disegno libero)
DOS : Si passa nell'ambiente DOS (temporaneamente)
SYS : Si passa definitivamente all'ambiente DOS
VSP : Visualizza uno sprite letto da file
ROO : Rovesciamento orizzontale di una zona del video
ROV : Rovesciamento verticale di una regione dello schermo
SPO : Sposta una zona del video
MOC : Mostra la tavolozza dei colori disponibili
RDE : Ruota una zona del video di 90ø verso destra
RSI : Ruota una zona del video di 90ø verso sinistra
GIR : Visualizza delle linee rotanti attorno a un punto
SFO : Cambia il colore di sfondo, sostituendolo al nero
PRO : Proietta una regione dello schermo nello spazio
SFU : Disegna l'ombra propria di un prisma a base circolare
SCH : Informazioni sulla scheda grafica usata


- I tasti funzione

I comandi, invece di essere dati nel modo sopracitato, possono essere immessi tramite i tasti funzione (F1..F10). I comandi associati ad ognuno di essi sono riportati nell'ultima riga del video (riga di stato). Riportiamo qui le corrispondenze tasto-comando:

F1 : HLP
F2 : LIN
F3 : CER Per avere informazioni sui comandi
F4 : PEN riportati consultare il capitolo
F5 : PIT "Comandi definiti"
F6 : GOM
F7 : CLS
F8 : SCE
F9 : CHC
F10 : ZOO


- La scelta rapida dei comandi

Per richiamare con più facilità i comandi, alla richiesta Comando ?, immettere SCE o premere F8. Indi si passerà ad un elenco da cui, mediante i tasti freccia, può essere messo in esecuzione una data funzione. Il comando selezionato è evidenziato. Per spostarsi da una pagina all'altra usare PgUp e PgDn.


- Ulteriori comandi associati ad un tasto

Frecce cursore : muovono il puntatore nelle direzioni indicate con un incremento o decremento di ST pixels.
"+" : causa l'incremento di 1 unità della variabile ST.
"-" : causa il decremento di 1 unità della variabile ST.

Questi comandi possono essere dati solo mentre si sta svolgendo il comando dato, cioè quando compare un punto sullo schermo. Il tasto Esc, che produce l'uscita dal programma è invece valido solo durante l'immissione del comando.


- Il comando PEN (disegno libero)

Digitando PEN alla richiesta "Comando ?" si accede alla funzione Disegno Libero. In essa i tasti validi sono:

Quelli già visti nel paragrafo "Ulteriori comandi associati ad un tasto".
"P" : per definire la grandezza e la forma della penna (puntiforme/circolare).
"S" : per scegliere la modalità Movim. visibile o nascosto, cioè se il salto di n.pixel (numero definito dalla variabile ST, vedere
capitolo precedente) deve essere tracciato sul video o se deve essere invisibile.
Barra spazio : per impostare il Modo di scrittura: (1-penna alzata / 2-penna tracciante).

[mancano i suggerimenti riguardo le altre funzioni]


- Errori possibili del programma

In alcuni casi, quando vengono specificate finestre video troppo ampie o quando la configurazione minima richiesta non è rintracciabile sul computer, si possono verificare degli errori che provocano il blocco del programma, con la conseguente perdita dell'immagine sullo schermo. Il programmatore si considera non responsabile, poichè sono dovuti da sbadataggini dell'operatore. Per non produrre errori, quindi, si deve prendere l'accorgimento di non specificare finestre video troppo grandi e accertarsi della quantità di memoria disponibile.


LISTATI DEI MODULI DI PROGRAMMA

 

- COMPONI.BAS (modulo iniziale)

10 ' COMPONI - programma di composizione artistica by Vittorio Menna
20 ON ERROR GOTO 50
40 CHAIN"COMPONI1":END
50 SYSTEM

 

- COMPONI1.BAS (modulo creazione menù e interfaccia)

1 ' COMPONI - programma di composizione artistica
2 ' scritto in IBM Basic ver. 3.30 da
3 ' Vittorio Menna
4 ' all'età di 12 anni
5 ' Ultima modifica: 16/1/1992
6 '
10 CLS:KEY OFF:FOR I=1 TO 10:KEY I,"":NEXT I:SCREEN 9,,0,0:CLS:CLEAR:COLOR 15,0:ST=1:GOSUB 500
20 SCREEN 9,,0,1:CLS:SCREEN 9,,0,0:CLEAR:GOSUB 300:LINE(0,350-21)-(640,350-21):LINE(0,300)-(640,300):LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT"Comando ? ":FOR I=1 TO 3
25 A$=INPUT$(1):IF A$=CHR$(27) THEN FINITO=1:GOTO 100
26 IF A$=CHR$(13) OR A$=CHR$(11) OR A$=CHR$(10) OR A$=CHR$(12) OR A$=CHR$(32) THEN GOTO 25
28 IF ASC(A$)>=ASC("a") AND ASC(A$)<=ASC("z") THEN A$=CHR$(ASC(A$)-32)
29 CO$=CO$+A$:LOCATE 23,11:PRINT CO$:NEXT:LOCATE 23,1:PRINT SPC(78)
30 IF CO$="PIT" THEN C=1:N=10000 'PENNELLO
31 IF CO$="TRI" THEN N= 14000 'TRIANGOLO
32 IF CO$="SPR" THEN N= 15000 'CREA SPRITE
33 IF CO$="SQU" THEN N= 4.000000E+04 'SQUADRATURA
34 IF CO$="CUR" THEN N= 17000 'CURVA
35 IF CO$="HLP" THEN N= 11000 'HELP
36 IF CO$="TXT" THEN N= 12000 'TESTO
37 IF CO$="ANI" THEN N= 3.700000E+04 'ANIMAZIONE
38 IF CO$="ELL" THEN N= 21000 'ELLISSE
39 IF CO$="ALT" THEN N= 30000 'ALTER COLOR
40 IF CO$="CER" THEN N= 1000 'CERCHIO
41 IF CO$="COL" THEN N= 25000 'EDIT COLOR
42 IF CO$="VIS" THEN N= 26000 'VISUALIZZA ZONA SU ALTRA(OR,AND,XOR)
43 IF CO$="PER" THEN N= 27000 'COLORI PERSONALIZZATI
44 IF CO$="GRI" THEN N= 31000 'GRIGLIA ON
45 IF CO$="GOF" THEN N= 32000 'GRIGLIA OFF
46 IF CO$="RET" THEN N= 33000 'RETINO
47 IF CO$="FIG" THEN N= 34000 'FIGURE CONTINUE
48 IF CO$="INF" THEN N= 35000 'INFORMAZIONI
49 IF CO$="ANE" THEN N= 36000 'ANELLO
51 IF CO$="POL" THEN N= 18000 'POLIGONI
52 IF CO$="CHC" THEN N= 38000 'CAMBIA COLORE
53 IF CO$="CLP" THEN N= 41000 'CANCELLA PARTE SCHERMO
54 IF CO$="CEN" THEN N= 42000 'TROVA CENTRO
55 IF CO$="ZOO" THEN N= 43000 'ZOOM
56 IF CO$="ROO" THEN N= 44000 'ROVESCIAMENTO ORIZZONTALE
57 IF CO$="ROV" THEN N= 45000 'ROVESCIAMENTO VERTICALE
58 IF CO$="BOM" THEN N= 46000 'BOMBOLETTA SPRAY
59 IF CO$="VSP" THEN N= 16000 'VISUALIZZA SPRITE
60 IF CO$="LIN" THEN N= 3000 'LINEA
61 IF CO$="DOS" THEN N= 47000 'SHELL TO DOS
62 IF CO$="SYS" THEN N= 48000 'EXIT TO DOS
63 IF CO$="IMP" THEN N= 49000 'MENU' IMPOSTAZIONE DATA/ORA
64 IF CO$="SPO" THEN N= 50000 'SPOSTAMENTO
65 IF CO$="MOC" THEN N= 51000 'MOSTRA COLORI DISPONIBILI
66 IF CO$="RSI" THEN M=-1:N=52000 'ROTAZIONE VERSO SINISTRA DI 90°
67 IF CO$="RDE" THEN M=1:N=52000 'ROTAZIONE VERSO DESTRA DI 90°
68 IF CO$="GIR" THEN N= 53000 'GIRANDOLA
69 IF CO$="SFO" THEN N= 54000 'COLORE SFONDO
70 IF CO$="RTT" THEN N= 4000 'RETTANGOLO
71 IF CO$="PRO" THEN N= 55000 'PROEZIONE DI UNA FIGURA
72 IF CO$="SFU" THEN N= 56000 'SFUMATURE
73 IF CO$="SCH" THEN N= 57000 'INFORMAZIONI SCHEDA GRAFICA
74 IF CO$="SCE" THEN GOTO 1000 'SCELTA COMANDI RAPIDA
75 IF CO$="CAR" THEN N= 19000 'CARDIOIDE
76 IF CO$="INV" THEN N= 23000 'INVERTI
77 IF CO$="RND" THEN N= 29000 'FIGURE RANDOM
78 IF CO$="DOM" THEN N= 39000 'DATA,ORA E MEMORIA
80 IF CO$="RIE" THEN N= 5000 'RIEMPI
85 IF CO$="COP" THEN N= 24000 'COPY
86 IF CO$="ROS" THEN N= 20000 'ROSONI
87 IF CO$="PLL" THEN N= 28000 'POLILINEA
90 IF CO$="CLS" THEN N= 6000 'CANCELLA SCHERMO
91 IF CO$="ARC" THEN N= 22000 'ARCO
96 IF CO$="GOM" THEN C=0:N=10000 'CANCELLA
97 IF CO$="PUN" THEN N= 8000 'PUNTO
98 IF CO$="PEN" THEN N= 9110 'PENNA
99 IF CO$="EXT" THEN N= 13000 'END CON CONTROLLO
100 IF FINITO=1 THEN GOTO 130 'END SENZA CONTROLLO
105 IF N<>0 THEN CHAIN"COMPONI2",N,ALL
110 LOCATE 23,1:PRINT"Alla richiesta Comando ? digitare HLP per visualizzare lo schermo di help."
115 BEEP:A$=INPUT$(1):LOCATE 23,1:PRINT SPC(78)
120 GOTO 20
130 KEY OFF:OPEN"O",#1,"GRIGLIA.DAT":CLOSE:KILL"GRIGLIA.DAT":COLOR 15,0:CLS:END
300 DIM TEMPERASE(6000):GET(0,301)-(639,349),TEMPERASE:PUT(0,301),TEMPERASE:ERASE TEMPERASE:KEY OFF
500 KEY 1," HLP":KEY 2," LIN":KEY 3," CER":KEY 4," PEN":KEY 5," PIT":KEY 6," GOM":KEY 7," CLS":KEY 8," SCE":KEY 9," CHC":KEY 10," ZOO":KEY ON
510 LINE(10,350-21)-(10,350):FOR I=62 TO 640 STEP 64:LINE(I+10,350-21)-(I+10,350):LINE(I,350-21)-(I,350):NEXT:RETURN
1000 DIM M(10000):GET(0,0)-(250,299),M
1010 RESTORE 9000:DIM CO$(60):DIM CO2$(60)
1020 FOR I=0 TO 55:READ CO$(I):READ CO2$(I):NEXT I
9000 DATA GOMMA,GOM
9001 DATA PUNTO,PUN
9002 DATA PENNA,PEN
9003 DATA CERCHIO,CER
9004 DATA PENNELLO,PIT
9005 DATA RETTANGOLO,RTT
9006 DATA RIEMPI DI COLORE,RIE
9007 DATA CANCELLA SCHERMO,CLS
9008 DATA LINEA,LIN
9009 DATA CARDIOIDE,CAR
9011 DATA POLIGONO,POL
9012 DATA ELLISSE,ELL
9014 DATA HELP,HLP
9015 DATA TESTO,TXT
9016 DATA TRIANGOLO,TRI
9017 DATA CREA UNO SPRITE,SPR
9018 DATA ROSONE,ROS
9020 DATA CURVE PARABOLICHE,CUR
9021 DATA INVERTI I COLORI DI UNA ZONA,INV
9022 DATA COPIA UNA ZONA,COP
9023 DATA ARCO,ARC
9024 DATA EDITA COLORI PERSONALIZZATI,COL
9025 DATA RIEMPI CON UN COLORE PERSONALE,PER
9026 DATA POLILINEA,PLL
9027 DATA FIGURE CASUALI,RND
9028 DATA ALTERA I COLORI DI UNA ZONA,ALT
9029 DATA GRIGLIA,GRI
9030 DATA TOGLI LA GRIGLIA,GOF
9031 DATA RETINO,RET
9032 DATA FIGURE RIPETUTE,FIG
9033 DATA INFORMAZIONI,INF
9034 DATA ANELLO,ANE
9035 DATA ANIMAZIONI,ANI
9036 DATA CAMBIA IL COLORE CORRENTE,CHC
9037 DATA "MOSTRA ORA,DATA E MEMORIA DISP",DOM
9038 DATA SQUADRA IL VIDEO,SQU
9039 DATA CANCELLA UNA ZONA DEL VIDEO,CLP
9040 DATA USCITA,EXT
9041 DATA TROVA IL CENTRO DI UNA ZONA,CEN
9042 DATA ZOOM DI UN'AREA DI 80x22 PELS,ZOO
9043 DATA COPIA IN 3 MODI UNA ZONA,VIS
9044 DATA BOMBOLETTA SPRAY,BOM
9045 DATA PASSA TEMPORANEAMENTE AL DOS,DOS
9046 DATA USCITA AL DOS,SYS
9047 DATA VISUALIZZA UNO SPRITE DA FILE,VSP
9048 DATA ROVESCIA ORIZZONTALMENTE,ROO
9049 DATA ROVESCIA VERTICALMENTE,ROV
9050 DATA SPOSTA UNA ZONA,SPO
9051 DATA MOSTRA I COLORI DISPONIBILI,MOC
9052 DATA RUOTA DI 90 A DESTRA,RDE
9053 DATA RUOTA DI 90 A SINISTRA,RSI
9054 DATA GIRANDOLA,GIR
9055 DATA CAMBIA IL COLORE DI SFONDO,SFO
9056 DATA PROIETTA FIGURE,PRO
9057 DATA DISEGNA LE OMBRE PROPRIE,SFU
9058 DATA INFORMAZIONI SULLA SCHEDA GRAF,SCH
9999 A=0:PUT(0,0),M:LINE(0,0)-(250,300),,B
10000 LOCATE 23,1:PRINT"Tasti validi: Frecce cursore - Home e End - PgUp e PgDown - pagina N.";INT((A+C)/20)+1;"/";3:FOR I=A TO A+19:LOCATE 2+F,2:PRINT CO$(I);SPC(30-LEN(CO$(I))):F=F+1:NEXT I:F=0:IF POINT(0,300)=15 THEN COL2=5 ELSE COL2=15
10010 LOCATE 2+C,2:COLOR COL2:PRINT CO$(A+C);SPC(30-LEN(CO$(A+C))):A$="":WHILE A$="":A$=INKEY$:WEND:LOCATE 2+C,2:COLOR POINT(0,300):PRINT CO$(A+C);SPC(30-LEN(CO$(A+C)))
10020 Z$=CHR$(0): SU$=Z$+CHR$(72): GIU$=Z$+CHR$(80): PU$=Z$+CHR$(73): PD$=Z$+CHR$(81): EN$=Z$+CHR$(79): INI$=Z$+CHR$(71)
10030 IF A$=SU$ THEN:IF C<>0 THEN C=C-1
10040 IF A$=GIU$ THEN:IF C<>19 AND A+C<>55 THEN C=C+1
10050 IF A$=INI$ THEN C=0
10060 IF A$=EN$ THEN:IF A<>40 THEN C=19 ELSE IF A=40 THEN C=15
10070 IF A$=PU$ THEN:IF A<>0 THEN A=A-20:GOTO 10000
10080 IF A$=PD$ THEN:IF A<>40 THEN A=A+20:IF A=40 AND C>15 THEN C=15
10085 IF A$=PD$ THEN GOTO 10000
10090 IF A$=CHR$(13) THEN CO$=CO2$(A+C):FOR I=0 TO 299:LINE(0,I)-(250,I),0:NEXT I: PUT(0,0),M,OR:ERASE CO$,CO2$,M:A=0:F=0:C=0:COL2=0:COLOR POINT(0,300):LOCATE 23,1:PRINT SPC(78):GOTO 30
10100 GOTO 10010

- COMPONI2.BAS (modulo procedure grafiche)

1 ' COMPONI - programma di composizione artistica
2 ' scritto in IBM Basic ver. 3.30 da
3 ' Vittorio Menna
4 ' all'età di 12 anni
5 ' Ultima modifica: 16/1/1992
6 '
20 CHAIN"COMPONI1",20
200 IF ST=0 THEN ST=1 ELSE IF ST>100 THEN ST=100:GOTO 290
205 IF A$=DE$ THEN X=X+ST:GOTO 290
210 IF A$=SI$ THEN X=X-ST:GOTO 290
220 IF A$=GI$ THEN Y=Y+ST:GOTO 290
230 IF A$=SU$ THEN Y=Y-ST:GOTO 290
240 IF A$=PU$ THEN Y=Y-ST:X=X+ST:GOTO 290
250 IF A$=PD$ THEN Y=Y+ST:X=X+ST:GOTO 290
260 IF A$=EN$ THEN Y=Y+ST:X=X-ST:GOTO 290
270 IF A$=ST$ THEN Y=Y-ST:X=X-ST:GOTO 290
280 IF A$=CHR$(13) THEN SCELTO=1:GOTO 290
281 IF A$="+" THEN ST=ST+1:N=1
282 IF A$="-" THEN ST=ST-1:N=1
290 IF ST>100 THEN ST=100
295 RETURN
300 DIM TEMPERASE(6000):GET(0,301)-(639,349),TEMPERASE:PUT(0,301),TEMPERASE:ERASE TEMPERASE:RETURN
400 IF X<0 THEN X=0
410 IF X>639 THEN X=639
420 IF Y<0 THEN Y=0
430 IF Y>299 AND P=0 THEN Y=299 ELSE IF P=1 AND Y>299-(INT(RG/1.370000))THEN Y=299-(INT(RG/1.370000))
490 RETURN
1000 DIM M(1):GET(0,300)-(0,300),M
1010 PUT(X,Y),M:LOCATE 23,1:PRINT"Centro : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
1020 GOSUB 9000:GOSUB 200:GOSUB 400
1030 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):GOTO 1200
1110 GOTO 1010
1200 LOCATE 23,1:INPUT"Raggio ";R:LOCATE 23,1:PRINT SPC(78):CIRCLE(X,Y),R:GOSUB 300:ERASE M:GOTO 20
3000 DIM M(1):GET(0,300)-(0,300),M
3010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo punto : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
3020 GOSUB 9000:GOSUB 200:GOSUB 400
3030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:PSET(X,Y):LOCATE 23,1:PRINT SPC(78):GOTO 3200
3110 GOTO 3010
3200 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo punto : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
3210 GOSUB 9000:GOSUB 200:GOSUB 400
3220 IF SCELTO=1 THEN GOTO 3300
3230 GOTO 3200
3300 LINE(A,B)-(X,Y):ERASE M:GOTO 20
4000 DIM M(1):GET(0,300)-(0,300),M
4010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
4020 GOSUB 9000:GOSUB 200:GOSUB 400
4030 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):A=X:B=Y:SCELTO=0:PSET(X,Y):GOTO 4200
4110 GOTO 4010
4200 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
4210 GOSUB 9000:GOSUB 200:GOSUB 400
4220 IF SCELTO=1 THEN GOTO 4300
4230 GOTO 4200
4300 LINE(A,B)-(X,Y),,B:ERASE M:GOTO 20
5000 DIM M(1):GET(0,300)-(0,300),M
5010 PUT(X,Y),M:LOCATE 23,1:PRINT"Punto interno all'oggetto da riempire : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
5020 GOSUB 9000:GOSUB 200:GOSUB 400
5030 IF SCELTO=1 THEN GOTO 5100
5040 GOTO 5010
5100 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Colore con cui riempirlo (X<16) ";C:LOCATE 23,1:PRINT SPC(78):IF C>15 OR C<0 THEN BEEP:GOTO 5100
5110 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Colore da assumere come limite (X<16) ";B:LOCATE 23,1:PRINT SPC(78):IF B>15 OR B<0 THEN BEEP:GOTO 5110
5200 PAINT (X,Y),C,B:ERASE M:GOTO 20
6000 LOCATE 23,1:INPUT"Ne sei proprio sicuro (S/N) ";R$:LOCATE 23:PRINT SPC(78):IF R$="S" THEN GOTO 6010 ELSE IF R$="N" THEN GOTO 20 ELSE BEEP:GOTO 6000
6010 FOR I=0 TO 299
6020 LINE(0,I)-(640,I),0
6030 NEXT I:GOTO 20
8000 DIM M(1):GET(0,300)-(0,300),M
8010 PUT(X,Y),M:LOCATE 23,1:PRINT"Coordinate punto : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
8020 GOSUB 9000:GOSUB 200:GOSUB 400
8030 IF SCELTO=1 THEN GOTO 8050
8035 IF A$="P" THEN GOTO 9700
8040 GOTO 8010
8050 PSET(X,Y):ERASE M:GOTO 20
9000 Z$=CHR$(0)
9010 SI$=Z$+CHR$(75)
9020 DE$=Z$+CHR$(77)
9030 SU$=Z$+CHR$(72)
9040 GI$=Z$+CHR$(80)
9050 ES$=CHR$(27)
9060 ST$=Z$+CHR$(71)
9070 EN$=Z$+CHR$(79)
9080 PU$=Z$+CHR$(73)
9090 PD$=Z$+CHR$(81)
9100 SP$=CHR$(32):RETURN
9110 DIM M(1):GET(0,300)-(0,300),M:P=0:N=1:C=1
9120 IF P=0 AND C=1 THEN PUT(X,Y),M,XOR ELSE IF P=0 AND C=2 AND S=0 THEN PSET(X,Y)
9121 IF P=1 THEN CIRCLE(X,Y),RG
9122 IF S=1 AND P=0 AND C=2 THEN LINE(X,Y)-(Q,W)
9125 Q=X:W=Y:LOCATE 23,1:PRINT "X:";X;"Y:";Y;:IF N=1 THEN PRINT TAB(15) "Modo :";C;TAB(28) "Passo :";ST;TAB(42) "Pennello : ";:IF P=1 THEN PRINT"circ."; ELSE PRINT"punto";
9126 IF N=1 THEN LOCATE 23,63:PRINT"Movimento: ";:IF S=0 THEN PRINT"nasc."; ELSE PRINT"visibile";
9130 N=0:A$="":WHILE A$="":A$=INKEY$:WEND:IF P=0 AND C=1 THEN PUT(X,Y),M
9140 GOSUB 9000:GOSUB 200:GOSUB 400:IF A$="P" OR A$="p" THEN GOSUB 9700
9150 IF A$="S" OR A$="s" THEN GOSUB 9800
9180 IF A$=ES$ THEN LOCATE 23,1:PRINT SPC(78):ERASE M:GOTO 20
9230 IF A$=SP$ THEN N=1:IF C=1 THEN C=2 ELSE IF C=2 THEN C=1
9250 IF C=1 THEN GOTO 9270
9270 GOTO 9120
9700 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Pennello: 0-punto/1-circolare ";P:IF P>1 OR P<0 THEN BEEP:LOCATE 23,1:PRINT SPC(78):GOTO 9700
9710 IF P=1 THEN LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Raggio ";RG:LOCATE 23,1:PRINT SPC(78):IF RG<=0 THEN GOTO 9710
9720 N=1:RETURN
9800 IF S=0 THEN S=1 ELSE IF S=1 THEN S=0
9810 N=1:RETURN
10000 X=0:Y=0
10010 LINE(X,Y)-(X+3,Y+3),,B
10015 LOCATE 23,1:PRINT"X:";X;"Y:";Y
10030 IF C<>0 THEN PSET(X+1,Y+1):PSET(X+2,Y+1):PSET(X+2,Y+2):PSET(X+1,Y+2)
10035 IF C=0 THEN PSET(X+1,Y+1),0:PSET(X+2,Y+1),0:PSET(X+2,Y+2),0:PSET(X+1,Y+2),0
10040 A$="":WHILE A$="":A$=INKEY$:WEND:IF C=0 THEN LINE(X,Y)-(X+3,Y+3),0,B
10050 GOSUB 9000:GOSUB 200:GOSUB 400
10090 IF A$=ES$ THEN LOCATE 23,1:PRINT SPC(78):GOTO 20
10132 IF X>636 THEN X=636:GOTO 10150
10133 IF Y<0 THEN X=0:GOTO 10150
10134 IF Y>296 THEN Y=296:GOTO 10150
10150 GOTO 10010
11000 SCREEN 9,,1,1:CLS
11010 PRINT" - COMANDI DEFINITI -"
11020 PRINT" - GOM : Gomma"
11030 PRINT" - PUN : Punto"
11040 PRINT" - PEN : Penna"
11050 PRINT" - CER : Cerchio"
11060 PRINT" - PIT : Pennello"
11070 PRINT" - RTT : Rettangolo"
11080 PRINT" - RIE : Riempi"
11090 PRINT" - CLS : Cancella schermo"
11100 PRINT" - LIN : Linea"
11109 PRINT" - CAR : Cardioide"
11111 PRINT" - POL : Poligono regolare"
11112 PRINT" - ELL : Ellisse"
11130 PRINT" - HLP : Visualizza questo schermo"
11135 PRINT" - TXT : Testo"
11136 PRINT" - TRI : Triangolo"
11137 PRINT" - SPR : Ottiene da una parte dello schermo una matrice di interi(sprite)"
11138 PRINT" - ROS : Rosoni, fiori"
11139 PRINT" - CUR : Curva parabolica"
11160 PRINT" - INV : Inverte i colori di una parte del video"
11161 PRINT" - COP : Copia una zona dello shermo su un'altra"
11162 PRINT:PRINT"- Premere un tasto per leggere la pagina successiva. -":A$=INPUT$(1)
11163 CLS:PRINT" - ARC : Traccia un arco di cerchio"
11164 PRINT" - COL : Edit di colori personalizzati"
11165 PRINT" - PER : Riempie un oggetto con un colore personalizzato letto da file"
11166 PRINT" - PLL : Polilinee"
11167 PRINT" - RND : Figure casuali (random)"
11168 PRINT" - ALT : Altera i colori di una porzione del video"
11169 PRINT" - GRI : Griglia On"
11170 PRINT" - GOF : Griglia Off"
11171 PRINT" - RET : Retino"
11172 PRINT" - FIG : Figure continue"
11173 PRINT" - INF : Informazioni sul programma"
11174 PRINT" - ANE : Anello"
11175 PRINT" - ANI : Animazioni"
11176 PRINT" - CHC : Cambia il colore corrente"
11177 PRINT" - DOM : Mostra l'ora, la data corrente e la memoria libera"
11178 PRINT" - SQU : Squadratura del video"
11179 PRINT" - CLP : Cancella una parte dello schermo"
11198 PRINT" - EXT : Fine con controllo"
11199 PRINT" - Tasto ESC : Fine senza controllo"
11200 PRINT" - CEN : Trova il centro di una zona del video"
11201 PRINT" - ZOO : Zoom di una zona del video di 80x22 pixel"
11210 LOCATE 23,1:PRINT"- Premere Space per rivedere la pagina precedente o Invio per la successiva -":A$=INPUT$(1):IF A$=CHR$(13) THEN GOTO 11211 ELSE IF A$=CHR$(32) THEN GOTO 11000 ELSE GOTO 11210
11211 CLS:LOCATE 1,1
11212 PRINT" - VIS : Copia una zona su un'altra in modo OR, AND o XOR"
11213 PRINT" - BOM : Bomboletta spray"
11214 PRINT" - DOS : Si passa nell'ambiente MS-DOS (temporaneamente)"
11215 PRINT" - SYS : Uscita al DOS"
11216 PRINT" - VSP : Visualizza uno sprite letto da file"
11217 PRINT" - ROO : Rovesciamento orizzontale di una zona dello schermo"
11218 PRINT" - ROV : Rovesciamento verticale di una zona dello schermo"
11219 PRINT" - SPO : Spostamento di una zona del video"
11220 PRINT" - MOC : Mostra la tavolozza dei colori disponibili"
11221 PRINT" - RDE : Ruota una zona del video di 90ø verso destra"
11222 PRINT" - RSI : Ruota una zona del video di 90ø verso sinistra"
11223 PRINT" - GIR : Girandola"
11224 PRINT" - SFO : Cambia il colore corrente per lo sfondo, sostituendolo al nero"
11225 PRINT" - PRO : Proietta una figura nello spazio"
11226 PRINT" - SFU : Disegna l'ombra propria di un cilindro"
11227 PRINT" - SCH : Informazioni sulla scheda grafica usata"
11228 PRINT" - SCE : Scelta rapida dei comandi da una lista"
11299 LOCATE 23,1:PRINT"- Premere Space per rivedere la pagina precedente o Invio per terminare -":A$=INPUT$(1):IF A$=CHR$(32) THEN GOTO 11163 ELSE IF A$<>CHR$(13) AND A$<>CHR$(32) THEN GOTO 11299
11999 SCREEN 9,,0,0:GOTO 20
12000 LOCATE 23,1:LINE INPUT"Battere il testo : ";S$:LOCATE 23,1:PRINT SPC(78)
12005 LOCATE 23,1:INPUT"Font (0-norm/1-grass/2-sottol/3-bord/4-ombr/5-stiliz/6-block/7-decor)";STIL:LOCATE 23,1:PRINT SPC(78):IF STIL<0 AND STIL>7 THEN BEEP:GOTO 12005
12010 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT S$:LN=LEN(S$)*8:IF STIL=2 THEN LINE(0,320)-(LN,320)
12015 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT S$:LN=LEN(S$)*8:IF STIL=2 THEN LINE(0,320)-(LN,320)
12020 DIM M(5000):GET(0,305)-(LN,320),M:LOCATE 23,1:PRINT SPC(78):DIM P(1):GET(0,300)-(0,300),P:PUT(0,305),M,AND:PUT(0,305),M,OR:IF STIL=1 THEN PUT(1,305),M,OR
12023 IF STIL=3 THEN PUT(1,305),M,XOR
12024 IF STIL=4 THEN PUT(1,305),M,OR:PUT(0,305),M,XOR
12025 IF STIL=5 THEN SCREEN 9,,1,0:PUT(0,305),M,OR:PUT(1,305),M,OR:SCREEN 9,,0,0:PUT(1,305),M,XOR:ERASE M:DIM M(6000):SCREEN 9,,1,0:GET(0,305)-(LN,320),M:SCREEN 9,,0,0:PUT(0,305),M,XOR
12026 IF STIL=6 THEN SCREEN 9,,1,0:PUT(0,305),M,OR:PUT(1,305),M,OR:SCREEN 9,,0,0:PUT(1,305),M,XOR:ERASE M:DIM M(6000):SCREEN 9,,1,0:GET(0,305)-(LN,320),M:SCREEN 9,,0,0:PUT(1,305),M,XOR
12027 IF STIL=7 THEN SCREEN 9,,1,0:PUT(0,305),M,OR:PUT(1,305),M,OR:SCREEN 9,,0,0:PUT(1,305),M,XOR:ERASE M:DIM M(6000):SCREEN 9,,1,0:GET(0,305)-(LN,320),M:SCREEN 9,,0,0:PUT(0,306),M,XOR
12029 ERASE M:DIM M(6000):GET(0,305)-(LN,320),M:LOCATE 23,1:PRINT SPC(78)
12030 PUT(X,Y),M:LOCATE 23,1:PRINT"X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M:GOSUB 9000:GOSUB 200:GOSUB 400
12031 IF SCELTO=1 THEN GOTO 12040
12032 IF X>(639-LN) THEN X=639-LN
12033 IF Y>285 THEN Y=285
12034 GOTO 12030
12040 PUT(X,Y),M,OR
12050 ERASE M:ERASE P:SCREEN 9,,0,1:CLS:SCREEN 9,,0,0:GOTO 20
13000 LOCATE 23,1:INPUT"Volete veramente eliminare tutte le modifiche ";R$
13010 IF R$="S" THEN CLEAR:OPEN"O",#1,"GRIGLIA.DAT":CLOSE:KILL"GRIGLIA.DAT":COLOR 15,0:CLS:END
13020 IF R$="N" THEN LOCATE 23,1:PRINT SPC(78):GOTO 20
13030 BEEP:GOTO 13000
14000 DIM M(1):GET (0,300)-(0,300),M
14010 LOCATE 23,1:PRINT"Primo vertice : X:";X;"Y:";Y:PUT(X,Y),M,XOR:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
14020 GOSUB 9000:GOSUB 200:GOSUB 400:IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:PSET(X,Y):LOCATE 23,1:PRINT SPC(78):GOTO 14100
14030 GOTO 14010
14100 LOCATE 23,1:PRINT"Secondo vertice : X:";X;"Y:";Y:PUT(X,Y),M,XOR:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
14110 GOSUB 9000:GOSUB 200:GOSUB 400
14120 IF SCELTO=1 THEN C=X:D=Y:SCELTO=0:PSET(X,Y):LOCATE 23,1:PRINT SPC(78):GOTO 14200
14130 GOTO 14100
14200 LOCATE 23,1:PRINT"Terzo vertice : X:";X;"Y:";Y:PUT(X,Y),M,XOR:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
14210 GOSUB 9000:GOSUB 200:GOSUB 400
14220 IF SCELTO=1 THEN GOTO 14500
14230 GOTO 14200
14500 LINE(A,B)-(C,D):LINE(C,D)-(X,Y):LINE(A,B)-(X,Y):ERASE M:GOTO 20
15000 DIM M(1):GET(0,300)-(0,300),M
15001 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M:GOSUB 9000:GOSUB 200:GOSUB 400
15002 IF SCELTO=1 THEN SCELTO=0:A=X:B=Y:GOTO 15010
15003 GOTO 15001
15010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M:GOSUB 9000:GOSUB 200:GOSUB 400
15012 IF SCELTO=1 THEN GOTO 15015
15013 GOTO 15010
15015 IF X>A THEN TEMP=A:A=X:X=TEMP
15016 IF Y>B THEN TEMP=B:B=Y:Y=TEMP
15020 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Nome del file su cui scrivere la matrice ";FIL$:LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT"Attendere prego...":OPEN"O",#1,FIL$
15030 FOR Q=Y TO B:FOR W=X TO A:D=POINT(W,Q):PRINT #1,D:NEXT W:PRINT #1,"END OF LINE":NEXT Q:GOTO 20
16000 DIM M(1):GET(0,300)-(0,300),M
16001 PUT(X,Y),M:LOCATE 23,1:PRINT"Angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M:GOSUB 9000:GOSUB 200:GOSUB 400
16002 IF SCELTO=1 THEN GOTO 16010
16003 GOTO 16001
16010 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"File da cui leggere la matrice ";FIL$:ON ERROR GOTO 16100
16012 OPEN"I",#1,FIL$:LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT"Attendere prego..."
16013 C=Y:F=0:FOR I=0 TO 10000
16015 INPUT #1,D$:IF D$="END OF LINE" THEN C=C+1:F=0:GOTO 16017
16016 PSET(X+F,Y+C),VAL(D$)
16017 F=F+1:NEXT I:CLOSE #1:GOTO 20
16100 IF ERL=16012 THEN PRINT"File inesistente!";CHR$(7);CHR$(7):A$=INPUT$(1):GOTO 16010
16110 IF ERL=16015 THEN CLOSE #1:GOTO 20
16120 END
17000 DEF FN YP(X)=X^2:DIM M(1):GET(0,300)-(0,300),M
17010 LOCATE 23,1:PRINT"Origine : X:";X;"Y:";Y:PUT(X,Y),M,XOR:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
17011 GOSUB 9000:GOSUB 200:GOSUB 400
17012 IF SCELTO=1 THEN SCELTO=0:LOCATE 23,1:PSET(X,Y):PRINT SPC(78):GOTO 17020
17013 GOTO 17010
17020 LOCATE 23,1:INPUT"Scala ";S:LOCATE 23,1:PRINT SPC(78)
17030 PSET(X,Y)
17040 FOR R=0 TO 640
17050 A=R-X
17060 F=INT(Y-FN YP(A)*S+5.000000E-01)
17065 IF R=0 THEN I=R:J=F
17070 IF F<0 OR F>299 THEN 17090
17080 LINE(R,F)-(I,J):I=R:J=F
17090 NEXT R:ERASE M:GOTO 20
18000 DIM M(1):GET(0,300)-(0,300),M
18005 PUT(X,Y),M:LOCATE 23,1:PRINT"Origine : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
18007 GOSUB 9000:GOSUB 200:GOSUB 400
18008 IF SCELTO=1 THEN SCELTO=0:LOCATE 23,1:PSET(X,Y):PRINT SPC(78):GOTO 18010
18009 GOTO 18005
18010 LOCATE 23,1:INPUT"Raggio ";R:LOCATE 23,1:PRINT SPC(78)
18020 LOCATE 23,1:INPUT"Numero di lati ";N:LOCATE 23,1:PRINT SPC(78)
18030 PI=3.141592
18040 CC=PI/180
18060 ANG=90
18070 A=ANG*CC
18080 P=PI*2/N
18090 Z=CINT(X+R*COS(A)*1.371428)
18100 F=CINT(Y-R*SIN(A))
18110 FOR I=1 TO N
18120 A=A+P
18130 XP=Z:YP=F
18140 Z=CINT(X+R*COS(A)*1.371428)
18150 F=CINT(Y-R*SIN(A))
18160 LINE(XP,YP)-(Z,F)
18170 NEXT I:GOSUB 300:ERASE M:GOTO 20
19000 DIM M(1):GET(0,300)-(0,300),M
19010 PUT(X,Y),M,XOR:LOCATE 23,1:PRINT"Origine : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
19011 GOSUB 9000:GOSUB 200:GOSUB 400
19012 IF SCELTO=1 THEN X0=X:Y0=Y:LOCATE 23,1:PRINT SPC(78):GOTO 19015
19013 GOTO 19010
19015 LOCATE 23,1:INPUT"Parametro ";K:LOCATE 23,1:PRINT SPC(78)
19020 PI=3.141592
19030 FOR A=0 TO 2*PI STEP PI/20
19040 X=K*(1-COS(A))*COS(A)*1.371428
19050 Y=K*(1-COS(A))*SIN(A)
19055 IF A=0 THEN I=X:J=Y
19060 LINE(X+X0,Y0-Y)-(I+X0,Y0-J):I=X:J=Y
19070 NEXT A:ERASE M:GOSUB 300:GOTO 20
20000 DIM M(1):GET(0,300)-(0,300),M
20005 PUT(X,Y),M:LOCATE 23,1:PRINT"Origine : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
20006 GOSUB 9000:GOSUB 200:GOSUB 400
20007 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):ERASE M:X0=X:Y0=Y:GOTO 20010
20008 GOTO 20005
20010 LOCATE 23,1:INPUT"Parametro angolare ";N:LOCATE 23,1:PRINT SPC(78)
20020 PI=3.141592
20030 LOCATE 23,1:INPUT"Parametro raggio ";K:LOCATE 23,1:PRINT SPC(78)
20050 FOR A=0 TO 2.099999*PI STEP PI/100
20060 X=(K+COS(N*A))*COS(A)*1.371428
20070 Y=(K+COS(N*A))*SIN(A)
20080 X=X*20
20090 Y=Y*20
20100 IF A=0 THEN PRESET(X+X0,Y0-Y),0 ELSE LINE -(X+X0,Y0-Y)
20110 NEXT A:GOSUB 300:GOTO 20
21000 DIM M(1):GET(0,300)-(0,300),M
21010 PUT(X,Y),M:LOCATE 23,1:PRINT"Centro : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
21020 GOSUB 9000:GOSUB 200:GOSUB 400
21030 IF SCELTO=1 THEN ERASE M:LOCATE 23,1:PRINT SPC(78):X0=X:Y0=Y:GOTO 21090
21040 GOTO 21010
21090 LOCATE 23,1:INPUT"Dimensione dell'asse verticale ";VER:LOCATE 23,1:PRINT SPC(78)
21100 LOCATE 23,1:INPUT"Dimensione dell'asse orizzontale ";ORIZ:LOCATE 23,1:PRINT SPC(78)
21110 CIRCLE(X,Y),VER,,,,VER/ORIZ:GOSUB 300:GOTO 20
22000 DIM M(1):GET(0,300)-(0,300),M
22005 PUT(X,Y),M:LOCATE 23,1:PRINT"Centro : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
22010 GOSUB 9000:GOSUB 200:GOSUB 400
22020 IF SCELTO=1 THEN ERASE M:LOCATE 23,1:PRINT SPC(78):GOTO 22090
22030 GOTO 22005
22090 LOCATE 23,1:INPUT"Raggio ";R:LOCATE 23,1:PRINT SPC(78)
22100 LOCATE 23,1:INPUT"Angolo iniziale (0-6) : ";A:LOCATE 23,1:PRINT SPC(78):IF A<0 AND A>6 THEN BEEP:GOTO 22100
22105 LOCATE 23,1:INPUT"Angolo finale (0-6) : ";F:LOCATE 23,1:PRINT SPC(78):IF F<0 AND F>6 THEN BEEP:GOTO 22105
22106 LOCATE 23,1:INPUT"Parametro aspetto ";P:LOCATE 23,1:PRINT SPC(78)
22110 CIRCLE(X,Y),R,,A,F,P:GOSUB 300:GOTO 20
23000 DIM D(6000):DIM M(1):GET(0,300)-(0,300),M
23010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
23011 GOSUB 9000:GOSUB 200:GOSUB 400
23012 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):A=X:B=Y:SCELTO=0:GOTO 23020
23013 GOTO 23010
23020 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
23021 GOSUB 9000:GOSUB 200:GOSUB 400
23022 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):GOTO 23030
23025 GOTO 23020
23030 GET(A,B)-(X,Y),D:PUT(A,B),D,PRESET
23040 ERASE M:ERASE D:GOTO 20
24000 DIM D(6000):DIM M(1):GET(0,300)-(0,300),M
24010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
24011 GOSUB 9000:GOSUB 200:GOSUB 400
24012 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):A=X:B=Y:SCELTO=0:GOTO 24020
24013 GOTO 24010
24020 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
24021 GOSUB 9000:GOSUB 200:GOSUB 400
24022 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):C=X:D=Y:SCELTO=0:GOTO 24024
24023 GOTO 24020
24024 PUT(X,Y),M:LOCATE 23,1:PRINT"Nuovo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
24025 GOSUB 9000:GOSUB 200:GOSUB 400
24026 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):GOTO 24030
24027 GOTO 24024
24030 GET(A,B)-(C,D),D:PUT(X,Y),D,OR
24040 ERASE D:ERASE M:GOTO 20
25000 SCREEN 9,,1,1
25010 CLS:LOCATE 9,36:PRINT" 01234567":LOCATE 10,36
25015 LOCATE 10,36:PRINT"0 ........"
25020 LOCATE 11,36:PRINT"1 ........"
25030 LOCATE 12,36:PRINT"2 ........"
25040 LOCATE 13,36:PRINT"3 ........"
25050 LOCATE 23,1:INPUT"Coordinate (A<3,B<7) (8,8 per salvare il colore, 9,9 per finire) : ";B,A:LOCATE 23,1:PRINT SPC(78):IF A>3 OR A<0 OR B>7 OR B<0 GOTO 25055 ELSE GOTO 25060
25055 IF A=8 AND B=8 THEN GOTO 25100 ELSE IF A=9 AND B=9 THEN CLS:SCREEN 9,,0,0:GOTO 20
25056 BEEP:GOTO 25050
25060 IF SCREEN(10+A,38+B)=219 THEN LOCATE 10+A,38+B:PRINT".":GOTO 25050
25070 LOCATE 10+A,38+B:PRINT"Û":GOTO 25050
25100 LOCATE 23,1:INPUT"Nome del file ";FIL$:LOCATE 23,1:PRINT SPC(78):OPEN"O",#1,FIL$+".COL"
25110 FOR Y=0 TO 3
25120 FOR X=0 TO 7
25130 C=SCREEN(10+Y,38+X)
25140 IF C=219 THEN V=V+2^X
25150 NEXT X
25160 PRINT #1,V:V=0
25170 NEXT Y:GOTO 25050
26000 DIM M(1):GET(0,300)-(0,300),M
26010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
26011 GOSUB 9000:GOSUB 200:GOSUB 400
26012 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):A=X:B=Y:SCELTO=0:GOTO 26015
26013 GOTO 26010
26015 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
26016 GOSUB 9000:GOSUB 200:GOSUB 400
26017 IF SCELTO=1 THEN SCELTO=0:LOCATE 23,1:PRINT SPC(78):GOTO 26020
26018 GOTO 26015
26020 DIM F(8000):IF A<X THEN TEMP=A:A=X:X=TEMP
26021 IF B<Y THEN TEMP=B:B=Y:Y=TEMP
26022 GET(X,Y)-(A,B),F
26025 PUT(X,Y),M:LOCATE 23,1:PRINT"Nuovo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
26026 GOSUB 9000:GOSUB 200:GOSUB 400
26027 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):GOTO 26030
26028 GOTO 26025
26030 LOCATE 23,1:INPUT"Modo di visualizzazione (0-OR/1-AND/2-XOR) ";R:LOCATE 23,1:PRINT SPC(78):IF R>2 OR R<0 THEN BEEP:GOTO 26030
26040 IF R=0 THEN PUT(X,Y),F,OR:GOTO 20
26050 IF R=1 THEN PUT(X,Y),F,AND:GOTO 20
26060 IF R=2 THEN PUT(X,Y),F,XOR:GOTO 20
27000 ON ERROR GOTO 27100:LOCATE 23,1:INPUT"Nome del file ";FIL$:LOCATE 23,1:PRINT SPC(78)
27010 OPEN"I",#1,FIL$+".COL":R$=""
27020 FOR I=1 TO 4
27030 INPUT #1,N:R$=R$+CHR$(N)
27040 NEXT I:DIM M(1):GET(0,300)-(0,300),M
27050 PUT(X,Y),M:LOCATE 23,1:PRINT"Punto interno all'oggetto da riempire : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
27055 GOSUB 9000:GOSUB 200:GOSUB 400
27056 IF SCELTO=1 THEN GOTO 27060
27058 GOTO 27050
27060 PAINT(X,Y),R$:ERASE M:CLEAR:GOTO 20
27100 IF ERL=27010 THEN BEEP:LOCATE 23,1:PRINT"File inesistente!":A$=INPUT$(1):LOCATE 23,1:PRINT SPC(78):CLEAR:GOTO 27000
27110 IF ERL=27030 THEN BEEP:LOCATE 23,1:PRINT"Non Š un file-colore!":A$=INPUT$(1):LOCATE 23,1:PRINT SPC(78):CLEAR:GOTO 27000
27120 CLEAR:END
28000 DIM M(1):GET(0,300)-(0,300),M
28010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo punto : X:";X;"Y:";Y;TAB(40) "Passo:";ST:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
28020 GOSUB 9000:GOSUB 200:GOSUB 400
28030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:PSET(X,Y):LOCATE 23,1:PRINT SPC(78):GOTO 28200
28040 IF A$=CHR$(27) THEN GOTO 20
28110 GOTO 28010
28200 PUT(X,Y),M:LOCATE 23,1:PRINT"Altro punto : X:";X;"Y:";Y;TAB(40) "Passo:";ST:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
28210 GOSUB 9000:GOSUB 200:GOSUB 400
28220 IF SCELTO=1 THEN GOTO 28300
28225 IF A$=CHR$(27) THEN ERASE M:GOTO 20
28230 GOTO 28200
28300 LINE(A,B)-(X,Y):A=X:B=Y:SCELTO=0:GOTO 28200
29000 LOCATE 23,1:INPUT"Figura da visualizzare (0-punto/1-cerchio/2-linea/3-quadrato) ";TF:LOCATE 23,1:PRINT SPC(78):IF TF<0 OR TF>3 THEN BEEP:GOTO 29000
29003 LOCATE 23,1:INPUT"Quante figure ";N:LOCATE 23,1:PRINT SPC(78)
29005 FOR I=1 TO N:RANDOMIZE TIMER:X=INT(RND(1)*639):Y=INT(RND(1)*299):A=INT(RND(1)*639):B=INT(RND(1)*299):RG=RND(1):IF RG<=0 THEN RG=1
29010 IF TF=0 THEN PSET(INT(RND(1)*639),INT(RND(1)*299))
29020 IF TF=1 THEN SX=639-X:SY=299-Y:IF SX>SY THEN SX=SY
29021 IF TF=1 AND SX<=0 THEN SX=1
29025 IF TF=1 THEN CIRCLE(X,Y),INT(RND(1)*SX)
29030 IF TF=2 THEN LINE(X,Y)-(A,B)
29040 IF TF=3 THEN LINE(X,Y)-(A,B),,B
29050 NEXT I:GOTO 20
30000 DIM M(1):GET(0,300)-(0,300),M
30010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
30020 GOSUB 9000:GOSUB 200:GOSUB 400
30030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:GOTO 30050
30040 GOTO 30010
30050 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
30060 GOSUB 9000:GOSUB 200:GOSUB 400
30070 IF SCELTO=1 THEN S=X:G=Y:SCELTO=0:GOTO 30090
30080 GOTO 30050
30081 IF G<B THEN TEMP=B:B=G:G=TEMP
30082 IF S<A THEN TEMP=A:A=S:S=TEMP
30090 COL=POINT(X,Y):PUT(X,Y),M:LOCATE 23,1:PRINT"Colore da sostituire con il colore corrente :";COL:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M:GOSUB 9000:GOSUB 200:GOSUB 400
30100 IF X<A THEN X=A
30110 IF X>S THEN X=S
30111 IF Y<B THEN Y=B
30112 IF Y>G THEN Y=G
30113 IF SCELTO=1 THEN GOTO 30120
30114 GOTO 30090
30120 FOR Q=B TO G:FOR W=A TO S
30130 IF POINT(W,Q)=COL THEN PSET(W,Q),POINT(0,300)
30160 NEXT W,Q
30200 GOTO 20
31000 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Distanza fra ogni punto ";DIS
31010 DIM M(1):GET(0,300)-(0,300),M:FOR Y=0 TO 299 STEP DIS
31020 FOR X=0 TO 640 STEP DIS*1.371428
31030 PUT(X,Y),M
31040 NEXT X,Y
31050 ON ERROR GOTO 31100:OPEN"O",#1,"GRIGLIA.DAT":PRINT #1,DIS:CLOSE #1
31060 GOTO 20
31100 IF ERL=31050 THEN LOCATE 23,1:PRINT"Memoria insufficiente!"+CHR$(7)+CHR$(7):A$=INPUT$(1):GOTO 20
31110 END
32000 LOCATE 23,1:INPUT"Ne sei sicuro (S/N) ";R$:LOCATE 23,1:PRINT SPC(78):IF R$="S" THEN GOTO 32100 ELSE IF R$="N" THEN GOTO 32200
32010 BEEP:GOTO 32000
32100 ON ERROR GOTO 32300:OPEN"I",#1,"GRIGLIA.DAT":INPUT #1,DIS:CLOSE #1
32110 DIM M(1):GET(0,300)-(0,300),M:FOR Y=0 TO 299 STEP DIS
32120 FOR X=0 TO 640 STEP DIS*1.371428
32130 PUT(X,Y),M
32140 NEXT X,Y
32200 KILL"GRIGLIA.DAT":GOTO 20
32300 IF ERL=32100 THEN LOCATE 23,1:PRINT"Griglia non precedentemente definita!";CHR$(7);CHR$(7):A$=INPUT$(1):GOTO 20
32310 END
33000 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Distanza fra ogni vertice ";DIS
33010 FOR Y=0 TO 299 STEP DIS
33020 LINE(0,Y)-(640,Y)
33030 NEXT Y
33040 FOR X=0 TO 639 STEP DIS*1.371428
33050 LINE(X,0)-(X,299)
33060 NEXT X
33070 GOTO 20
34000 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Figura da visualizzare (0-cerchio/1-quadrato) ";FIG:LOCATE 23,1:PRINT SPC(78):IF FIG<>1 AND FIG<>0 THEN BEEP:GOTO 34000
34010 IF FIG=0 THEN GOTO 34100
34020 IF FIG=1 THEN GOTO 34200
34030 BEEP:GOTO 34000
34100 DIM M(1):GET(0,300)-(0,300),M
34110 PUT(X,Y),M:LOCATE 23,1:PRINT"Centro : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
34120 GOSUB 9000:GOSUB 200:GOSUB 400
34130 IF SCELTO=1 THEN GOTO 34150
34140 GOTO 34110
34150 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Numero di cerchi da visualizzare ";N:LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Raggio iniziale ";RG:LOCATE 23,1:PRINT SPC(78)
34160 LOCATE 23,1:INPUT"Incremento ";INC:LOCATE 23,1:PRINT SPC(78)
34170 FOR I=1 TO N:RG=RG+INC
34180 CIRCLE(X,Y),RG
34190 NEXT I:ERASE M:GOSUB 300:GOTO 20
34200 DIM M(1):GET(0,170)-(0,170),M
34210 PUT(X,Y),M:LOCATE 23,1:PRINT"Centro : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M,XOR
34220 GOSUB 9000:GOSUB 200:GOSUB 400
34230 IF SCELTO=1 THEN GOTO 34250
34240 GOTO 34210
34250 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Numero di quadrati da visualizzare ";N:LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Lato iniziale ";LA:LOCATE 23,1:PRINT SPC(78)
34260 LOCATE 23,1:INPUT"Incremento ";INC:LOCATE 23,1:PRINT SPC(78)
34270 FOR I=1 TO N
34280 LINE(X-(LA/2)*6/2.400000,Y-(LA/2))-(X+(LA/2)*6/2.400000,Y+(LA/2)),,B
34290 LA=LA+INC:NEXT I:ERASE M:GOSUB 300:GOTO 20
35000 COLOR 15:DIM PORZ(6000):GET(157,60)-(445,213),PORZ:PUT(157,60),PORZ
35010 LINE(157,61)-(445,213),0,B:LINE(160,64)-(442,210),,B:LINE(158,62)-(444,212),,B
35015 LOCATE 7,23:PRINT" - COMPONI - "
35020 LOCATE 9,23:PRINT"Programma di composizione"
35030 LOCATE 10,23:PRINT"artistica scritto da"
35040 LOCATE 11,23:PRINT"Vittorio Menna nel 1991."
35050 LOCATE 13,23:PRINT"Necessita di una scheda grafica "
35055 LOCATE 14,23:PRINT"EGA o VGA. "
35060 LOCATE 23,1:PRINT" - Premere un tasto per continuare. -":A$=INPUT$(1)
35070 LINE(157,61)-(445,213),3,B:PAINT(160,70),0,3:LINE(157,61)-(445,213),0,B
35090 COLOR POINT(0,300):PUT(157,60),PORZ,OR:ERASE PORZ:GOTO 20
36000 DIM M(1):GET(0,300)-(0,300),M
36010 PUT(X,Y),M:LOCATE 23,1:PRINT"Centro dell'anello : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
36020 GOSUB 9000:GOSUB 200:GOSUB 400
36030 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):GOTO 36050
36040 GOTO 36010
36050 LOCATE 23,1:INPUT"Raggio complessivo ";RC:LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Raggio del foro centrale ";RF:I=1:D=POINT(0,300)
36060 CIRCLE(X,Y),RC,I:CIRCLE(X,Y),RF,I:PAINT(X+RF+1,Y+RF+1),D,I:I=D
36065 CIRCLE(X,Y),RC,I:CIRCLE(X,Y),RF,I:PAINT(X+RF+1,Y+RF+1),D,I
36070 GOTO 20
37000 DIM M(1):GET(0,300)-(0,300),M
37010 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Numero di frame da animare ";F:LOCATE 23,1:PRINT SPC(78):DIM X(F+1):DIM Y(F+1):DIM X2(F+1):DIM Y2(F+1)
37020 FOR I=1 TO F
37030 WHILE SCELTO<>1:GOSUB 37500:WEND:SCELTO=0:X(I)=X:Y(I)=Y
37035 WHILE SCELTO<>1:GOSUB 37600:WEND:SCELTO=0:X2(I)=X:Y2(I)=Y
37040 NEXT I:SCREEN 9,,1,1:CLS
37050 PUT(X,Y),M:LOCATE 23,1:PRINT"Punto origine della visualizzazione : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
37060 GOSUB 9000:GOSUB 200:GOSUB 400
37070 IF SCELTO=1 THEN GOTO 37090
37080 GOTO 37050
37090 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Ritardo tra ogni visualizzazione ";R:LOCATE 23,1:PRINT SPC(78)
37100 ON ERROR GOTO 37140:ERASE M:DIM F(5000):FOR I=1 TO F
37110 SCREEN 9,,0,1:GET(X(I),Y(I))-(X2(I),Y2(I)),F
37120 SCREEN 9,,1,1:PUT(X,Y),F,XOR:FOR T=0 TO R:NEXT T:PUT(X,Y),F,XOR
37130 NEXT I:ERASE F:ERASE X:ERASE Y:ERASE X2:ERASE Y2:CLS:SCREEN 9,,0,0:GOTO 20
37140 LOCATE 23,1:PRINT"Errore nella visualizzazione della frame n.";I:BEEP:BEEP:A$=INPUT$(1):GOTO 20
37150 GOTO 20
37500 PUT(X,Y),M:LOCATE 23,1:PRINT"Angolo in alto a sinistra della frame n.";I;": X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
37510 GOSUB 9000:GOSUB 200:GOSUB 400
37520 RETURN
37600 PUT(X,Y),M:LOCATE 23,1:PRINT"Angolo in basso a destra della frame n.";I;": X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
37610 GOSUB 9000:GOSUB 200:GOSUB 400
37620 RETURN
38000 LOCATE 23,1:INPUT"Nuovo colore da rendere corrente (X<=15) ";COL:LOCATE 23,1:PRINT SPC(78):IF COL<0 OR COL>15 THEN BEEP:GOTO 38000
38010 COLOR COL:GOTO 20
39000 LOCATE 23,1:PRINT DATE$,TIME$,FRE(0);"byte liberi":A$=INPUT$(1):GOTO 20
40000 LOCATE 23,1:INPUT"Distanza dalle estremit… del video (pixel) ";DIS:LOCATE 23,1:PRINT SPC(78)
40010 LOCATE 23,1:INPUT"Squadratura in quante parti (1/2/4) ";SQ:LOCATE 23,1:PRINT SPC(78):IF SQ<>1 AND SQ<>2 AND SQ<>4 THEN BEEP:GOTO 40010
40020 LINE(0+DIS,0+DIS)-(639-DIS,299-DIS),,B
40030 IF SQ=1 THEN GOTO 20
40040 IF SQ=2 THEN LINE(639/2,0+DIS)-(639/2,299-DIS):GOTO 20
40050 IF SQ=4 THEN LINE(0+DIS,299/2)-(639-DIS,299/2):SQ=2:GOTO 40040
41000 DIM M(1):GET(0,300)-(0,300),M
41010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
41020 GOSUB 9000:GOSUB 200:GOSUB 400
41030 IF SCELTO=1 THEN SCELTO=0:PSET(X,Y):A=X:B=Y:GOTO 41050
41040 GOTO 41010
41050 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
41060 GOSUB 9000:GOSUB 200:GOSUB 400
41070 IF SCELTO=1 THEN PSET(X,Y):GOTO 41090
41080 GOTO 41050
41090 IF Y>B THEN TEMP=B:B=Y:Y=TEMP
41100 IF X>A THEN TEMP=A:A=X:A=TEMP
41110 FOR I=Y TO B
41120 LINE(X,I)-(A,I),0
41130 NEXT I:ERASE M:GOTO 20
42000 DIM M(1):GET(0,300)-(0,300),M
42010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
42020 GOSUB 9000:GOSUB 200:GOSUB 400
42030 IF SCELTO=1 THEN SCELTO=0:PSET(X,Y):A=X:B=Y:GOTO 42050
42040 GOTO 42010
42050 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
42060 GOSUB 9000:GOSUB 200:GOSUB 400
42070 IF SCELTO=1 THEN GOTO 42090
42080 GOTO 42050
42090 IF Y>B THEN TEMP=B:B=Y:Y=TEMP
42100 IF X>A THEN TEMP=A:A=X:A=TEMP
42105 H=(A-X)/2:F=(B-Y)/2
42110 PSET(X+H,Y+F):ERASE M:GOTO 20
43000 SCREEN 9,,1,0:LINE(0,0)-(80,22),,B:DIM M(6000):GET(0,0)-(80,22),M:LINE(0,0)-(80,22),0,B:SCREEN 9,,0,0
43010 PUT(X,Y),M:LOCATE 23,1:PRINT"Punto origine : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
43020 GOSUB 9000:GOSUB 200:GOSUB 400
43030 IF SCELTO=1 THEN ERASE M:DIM D(22,80):LOCATE 23,1:PRINT SPC(78):GOTO 43050
43035 IF X>639-80 THEN X=639-80
43036 IF Y>299-22 THEN Y=299-22
43040 GOTO 43010
43050 FOR I=0 TO 21
43060 FOR F=0 TO 79:C=C+1
43070 SCREEN 9,,0,0:D=POINT(F+X,I+Y):COLOR POINT(0,300):LOCATE 23,1:PRINT"Punti letti :";C;"A";22*80
43071 SCREEN 9,,1,0:IF D<>0 THEN LOCATE I+1,F+1:COLOR D:PRINT"Û"
43075 NEXT F:NEXT I
43076 FOR I=0 TO 640 STEP 8:LINE(I,0)-(I,308),15:NEXT:FOR I=0 TO 320 STEP 14:LINE(0,I)-(640,I),15:NEXT
43089 ERASE D:SCREEN 9,,0,0:DIM F(6000):GET(X,Y)-(X+80,Y+22),F:SCREEN 9,,1,0:PUT(0,325),F:LINE(0,322)-(640,322),15
43090 SCREEN 9,,1,1:A$=INPUT$(1):SCREEN 9,,0,0:COLOR POINT(0,300):GOTO 20
44000 DIM M(1):GET(0,300)-(0,300),M
44010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
44020 GOSUB 9000:GOSUB 200:GOSUB 400
44030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:GOTO 44050
44040 GOTO 44010
44050 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
44060 GOSUB 9000:GOSUB 200:GOSUB 400
44070 IF SCELTO=1 THEN ERASE M:GOTO 44090
44080 GOTO 44050
44090 IF X>A THEN TEMP=A:A=X:X=TEMP
44100 IF Y>B THEN TEMP=B:B=Y:Y=TEMP
44110 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT"Attendere prego...":FOR I=Y TO B-1
44120 FOR C=X TO (X+A-1)/2
44130 IMG=POINT(C,I):IMG2=POINT(A-1-(C-X),I)
44140 TEMP=IMG:IMG=IMG2:IMG2=TEMP
44150 PSET(C,I),IMG:PSET(A-1-(C-X),I),IMG2:NEXT C,I:GOTO 20
45000 DIM M(1):GET(0,300)-(0,300),M
45010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
45020 GOSUB 9000:GOSUB 200:GOSUB 400
45030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:GOTO 45050
45040 GOTO 45010
45050 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
45060 GOSUB 9000:GOSUB 200:GOSUB 400
45070 IF SCELTO=1 THEN ERASE M:GOTO 45090
45080 GOTO 45050
45090 IF X>A THEN TEMP=A:A=X:X=TEMP
45100 IF Y>B THEN TEMP=B:B=Y:Y=TEMP
45110 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT"Attendere prego...":FOR C=X TO A-1
45120 FOR I=Y TO (Y+B-1)\2
45130 IMG=POINT(C,I):IMG2=POINT(C,B-1-(I-Y))
45140 TEMP=IMG:IMG=IMG2:IMG2=TEMP
45150 PSET(C,I),IMG:PSET(C,B-1-(I-Y)),IMG2
45160 NEXT I,C:GOTO 20
46000 SCREEN 9,,1,0:PSET(0,1): PSET(0,3): PSET(0,5): PSET(4,1):PSET(2,2):PSET(6,2):PSET(4,3): PSET(2,4): PSET(6,4): PSET(4,5): PSET(8,1): PSET(8,3):PSET(8,5):DIM M(50):GET(0,0)-(8,5),M:SCREEN 9,,0,0
46010 PUT(X,Y),M,OR:LOCATE 23,1:PRINT"X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND
46020 GOSUB 9000:GOSUB 200:GOSUB 400
46030 IF A$=CHR$(27) THEN GOTO 20
46040 IF X>639-8 THEN X=639-8
46050 IF Y>299-5 THEN Y=299-5
46060 GOTO 46010
47000 SCREEN 0:CLS:COLOR 15:PRINT"Premere EXIT per tornare nell'ambiente del programma COMPONI":COLOR 7
47010 SHELL:CLS:SCREEN 9,,0,0:GOTO 20
48000 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Ne siete sicuro (S/N) ";R$:LOCATE 23,1:PRINT SPC(78):IF R$<>"S" AND R$<>"s" AND R$<>"N" AND R$<>"n" THEN BEEP:GOTO 48000
48010 IF R$="S" OR R$="s" THEN SYSTEM
48020 IF R$="N" OR R$="n" THEN GOTO 20
49000 SCREEN 9,,1,1:CLS:LOCATE 1,1:PRINT" - MENU' IMPOSTAZIONE DATA E ORA -":ON ERROR GOTO 49500
49010 PRINT:PRINT:PRINT" 1 - Impostazione ora corrente"
49020 PRINT:PRINT" 2 - Impostazione data corrente"
49030 PRINT:PRINT" 3 - Exit"
49040 LOCATE 11,1:D=CSRLIN:INPUT"Opzione scelta ";R:IF R>3 OR R<1 THEN BEEP:GOTO 49040
49050 IF R=3 THEN CLS:SCREEN 9,,0,0:GOTO 20
49060 IF R=1 THEN LOCATE D+1,1:LINE INPUT"Ore : ";ORE$:IF VAL(ORE$)<0 OR VAL(ORE$)>24 THEN BEEP:GOTO 49060
49070 IF R=1 THEN LOCATE D+2,1:LINE INPUT"Minuti : ";MIN$:IF VAL(MIN$)>59 OR VAL(MIN$)<0 THEN BEEP:GOTO 49070
49080 IF R=1 THEN LOCATE D+3,1:LINE INPUT"Secondi : ";SEC$:IF VAL(SEC$)>59 OR VAL(SEC$)<0 THEN BEEP:GOTO 49080
49090 IF R=1 THEN TIME$=ORE$+":"+MIN$+":"+SEC$:GOTO 49000
49100 IF R=2 THEN LOCATE D+1,1:LINE INPUT"Giorno : ";DAY$:IF VAL(DAY$)>31 OR VAL(DAY$)<1 THEN BEEP:GOTO 49100
49110 IF R=2 THEN LOCATE D+2,1:LINE INPUT"Mese : ";MES$:IF VAL(MES$)>12 OR VAL(MES$)<1 THEN BEEP:GOTO 49110
49120 IF R=2 THEN LOCATE D+3,1:LINE INPUT"Anno : ";YEA$:IF VAL(YEA$)<0 THEN BEEP:GOTO 49120
49130 IF R=2 THEN DATE$=MES$+"-"+DAY$+"-"+YEA$:GOTO 49000
49500 BEEP:PRINT"Errore fatale!":A$=INPUT$(1):GOTO 20
50000 DIM M(1):GET(0,300)-(0,300),M
50010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
50020 GOSUB 9000:GOSUB 200:GOSUB 400
50030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:LOCATE 23,1:PRINT SPC(78):GOTO 50050
50040 GOTO 50010
50050 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
50060 GOSUB 9000:GOSUB 200:GOSUB 400
50070 IF SCELTO=1 THEN C=X:D=Y:SCELTO=0:LOCATE 23,1:PRINT SPC(78):GOTO 50090
50080 GOTO 50050
50090 IF C>A THEN SWAP C,A
50100 IF D>B THEN SWAP D,B
50110 ERASE M:DIM D(6000):GET(A,B)-(C,D),D
50120 FOR I=D TO B:LINE(C,I)-(A,I),0:NEXT I:X=C:Y=D
50130 PUT(X,Y),D:LOCATE 23,1:PRINT"Nuovo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),D
50140 GOSUB 9000:GOSUB 200:GOSUB 400
50150 IF SCELTO=1 THEN GOTO 50200
50160 IF X>639-(A-C) THEN X=639-(A-C)
50170 IF Y>299-(B-D) THEN Y=299-(B-D)
50180 GOTO 50130
50200 PUT(X,Y),D,OR:ERASE D:GOTO 20
51000 SCREEN 9,,1,1:CLS:I=0:COLOR ,I
51010 COLOR 1:LOCATE 2,1:PRINT "Blu : 1"
51020 COLOR 2:LOCATE 3,1:PRINT "Verde : 2"
51030 COLOR 3:LOCATE 4,1:PRINT "Azzurro : 3"
51040 COLOR 4:LOCATE 5,1:PRINT "Rosso : 4"
51050 COLOR 5:LOCATE 6,1:PRINT "Viola : 5"
51060 COLOR 6:LOCATE 7,1:PRINT "Arancione : 6"
51070 COLOR 7:LOCATE 8,1:PRINT "Bianco scuro : 7"
51080 COLOR 8:LOCATE 9,1:PRINT "Grigio : 8"
51090 COLOR 9:LOCATE 10,1:PRINT "Blu chiaro : 9"
51100 COLOR 10:LOCATE 11,1:PRINT"Verde chiaro : 10"
51110 COLOR 11:LOCATE 12,1:PRINT"Azzurro chiaro : 11"
51120 COLOR 12:LOCATE 13,1:PRINT"Rosso chiaro : 12"
51130 COLOR 13:LOCATE 14,1:PRINT"Viola chiaro : 13"
51140 COLOR 14:LOCATE 15,1:PRINT"Giallo : 14"
51150 COLOR 15:LOCATE 16,1:PRINT"Bianco luminescente : 15"
51160 COLOR 7:LOCATE 20,1:PRINT"Colore di sfondo :";I;"/";" 63"
51170 LOCATE 22,1:PRINT" - Premere un tasto per vedere il successivo colore di sfondo o ESC per uscire -";
51175 A$=INPUT$(1):IF A$=CHR$(27) THEN SCREEN 9,,0,0:COLOR POINT(0,300),0:GOTO 20
51180 I=I+1:IF I=64 THEN SCREEN 9,,0,0:COLOR POINT(0,300),0:GOTO 20
51190 COLOR ,I:GOTO 51010
52000 DIM M(1):GET(0,300)-(0,300),M
52010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
52020 GOSUB 9000:GOSUB 200:GOSUB 400
52030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:LOCATE 23,1:PRINT SPC(78):GOTO 52050
52040 GOTO 52010
52050 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
52060 GOSUB 9000:GOSUB 200:GOSUB 400
52070 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):GOTO 52090
52080 GOTO 52050
52090 IF X>A THEN SWAP X,A
52100 IF Y>B THEN SWAP Y,B
52110 ERASE M:N=A-X:IF B-Y<N THEN N=B-Y
52120 A=X+N:B=Y+N
52130 N=N-1:DIM D(N,N)
52140 FOR I=0 TO N:FOR C=0 TO N
52150 D(C,I)=POINT(X+C,Y+I):NEXT C:NEXT I
52160 IF M=-1 THEN GOTO 52210
52170 FOR I=0 TO N
52180 FOR C=0 TO N:PSET(X+C,Y+I),D(I,N-C):NEXT C
52190 NEXT I
52200 ERASE D:GOTO 20
52210 FOR I=0 TO N
52220 FOR C=0 TO N:PSET(C,I),POINT(N-I,C):NEXT C
52230 NEXT I:ERASE D:GOTO 20
53000 DIM M(1):GET(0,300)-(0,300),M
53010 PUT(X,Y),M:LOCATE 23,1:PRINT"Centro : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
53020 GOSUB 9000:GOSUB 200:GOSUB 400
53030 IF SCELTO=1 THEN LOCATE 23,1:PRINT SPC(78):X0=X:Y0=Y:GOTO 53050
53040 GOTO 53010
53050 A$="":WHILE A$="":A$=INKEY$:WEND
53060 GOSUB 9000:GOSUB 200:GOSUB 400
53070 IF A$=ES$ THEN GOTO 20
53080 LINE(X0,Y0)-(X,Y):GOTO 53050
54000 LOCATE 23,1:INPUT"Nuovo colore di sfondo (il nero verr… sostituito con esso) (C<64) : ";C:LOCATE 23,1:PRINT SPC(78):IF C>63 OR C<0 THEN BEEP:GOTO 54000
54010 COLOR POINT(0,300),C:GOTO 20
55000 DIM M(1):GET(0,300)-(0,300),M
55010 PUT(X,Y),M:LOCATE 23,1:PRINT"Primo angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
55020 GOSUB 9000:GOSUB 200:GOSUB 400
55030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:GOTO 55050
55040 GOTO 55010
55050 PUT(X,Y),M:LOCATE 23,1:PRINT"Secondo angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
55060 GOSUB 9000:GOSUB 200:GOSUB 400
55070 IF SCELTO=1 THEN SCELTO=0:C=X:D=Y:DIM D(5000):GET(A,B)-(C,D),D:GOTO 55100
55080 GOTO 55050
55100 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Lunghezza del tratto per cui trasportare la figura ";LUN:LOCATE 23,1:PRINT SPC(78)
55110 LOCATE 23,1:INPUT"Incremento sull'asse X, Incremento sull'asse Y ";IX,IY
55120 IF C>A THEN SWAP C,A
55125 IF D>B THEN SWAP D,B
55130 X=C:FOR Y=D TO D+LUN STEP IY
55140 PUT(X,Y),D,OR:X=X+IX:NEXT Y:GOTO 20
56000 DIM M(1):GET(0,300)-(0,300),M
56010 PUT(X,Y),M:LOCATE 23,1:PRINT"Angolo in alto a sinistra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
56020 GOSUB 9000:GOSUB 200:GOSUB 400
56030 IF SCELTO=1 THEN A=X:B=Y:SCELTO=0:GOTO 56050
56040 GOTO 56010
56050 PUT(X,Y),M:LOCATE 23,1:PRINT"Angolo in basso a destra : X:";X;"Y:";Y:A$="":WHILE A$="":A$=INKEY$:WEND:PUT(X,Y),M
56060 GOSUB 9000:GOSUB 200:GOSUB 400
56070 IF SCELTO=1 THEN GOTO 56090
56080 GOTO 56050
56090 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Luce proveniente da (0-sin./1-dex./2-su/3-giù) ";LUCE:LOCATE 23,1:PRINT SPC(78):IF LUCE<0 OR LUCE>3 THEN BEEP:GOTO 56090
56091 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Incremento per la sfumatura ";INC:LOCATE 23,1:PRINT SPC(78)
56095 IF X>A THEN SWAP A,X
56100 IF Y>B THEN SWAP B,Y
56101 IF LUCE=0 THEN GOTO 56170
56102 IF LUCE=3 THEN GOTO 56300
56103 IF LUCE=2 THEN GOTO 56500
56105 C=Y:D=X:F=0:ST=1
56110 FOR I=Y TO B:C=C+ST:IF C>B THEN GOTO 56140
56120 PSET(D,C)
56130 NEXT I
56140 ST=ST+INC:F=F+INC:D=D+F:IF D>A THEN GOTO 56160
56150 C=Y:GOTO 56110
56160 ERASE M:GOTO 20
56170 D=A:C=Y:F=0:ST=1
56180 FOR I=Y TO B:C=C+ST:IF C>B THEN GOTO 56210
56190 PSET(D,C)
56200 NEXT I
56210 ST=ST+INC:F=F+INC:D=D-F:IF D<X THEN GOTO 56230
56220 C=Y:GOTO 56180
56230 ERASE M:GOTO 20
56300 D=X:C=Y:F=0:ST=1
56310 FOR I=X TO A:D=D+ST:IF D>A THEN GOTO 56340
56320 PSET(D,C)
56330 NEXT I
56340 ST=ST+INC:F=F+INC:C=C+F:IF C>B THEN GOTO 56360
56350 D=X:GOTO 56310
56360 ERASE M:GOTO 20
56500 D=X:C=B:F=0:ST=1
56510 FOR I=X TO A:D=D+ST:IF D>A THEN GOTO 56540
56520 PSET(D,C)
56530 NEXT I
56540 ST=ST+INC:F=F+INC:C=C-F:IF C<Y THEN GOTO 56560
56550 D=X:GOTO 56510
56560 ERASE M:GOTO 20
57000 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT"Scheda EGA. Risoluzione 640x350 pixels,16 colori di foreground,64 di background.";
57004 A$=INPUT$(1)
57005 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:PRINT"Modalità testo: 80 col.x 25 rig. (usabili 24). Grandezza caratteri: 8x14 pixels.";
57010 A$=INPUT$(1):GOTO 20

- COMPONI3.BAS (modulo procedura salvataggio immagine)

10 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Nome del file su cui salvare l'immagine ";FIL$:LOCATE 23,1:PRINT SPC(78)
20 DIM M(12342):GET(0,0)-(320,300),M
30 OPEN"O",#1,FIL$:FOR I=0 TO 12342:PRINT #1,M(I):NEXT I
40 ERASE M:DIM M(12040):GET(321,0)-(639,300),M
50 FOR I=0 TO 12040:PRINT #1,M(I):NEXT I:CLOSE
60 ERASE M:CHAIN"COMPONI1",20

 

- COMPONI4.BAS (modulo procedura caricamento immagine)

10 LOCATE 23,1:PRINT SPC(78):LOCATE 23,1:INPUT"Nome del file da cui leggere l'immagine ";FIL$:LOCATE 23,1:PRINT SPC(78):CLS::REM'ON ERROR GOTO 1000
20 DIM M(12342):GET(321,0)-(639,300),M:LINE(0,300)-(640,300)
30 OPEN"I",#1,FIL$
40 FOR I=0 TO 12342:INPUT #1,M(I):NEXT I
50 PUT(0,0),M,OR
60 ERASE M
70 DIM M(12040):GET(0,0)-(300,200),M
80 FOR I=0 TO 12040:INPUT #1,M(I):NEXT I
90 PUT(321,0),M,OR:ERASE M:CLOSE:CHAIN"COMPONI1",20
1000 IF ERL=30 THEN BEEP:PRINT"File inesistente!":A$=INPUT$(1):GOTO 10
1010 IF ERL=40 THEN RESUME NEXT
1020 IF ERL=80 THEN ERASE M:CLOSE:END