SOFTWARE

TRUE BASIC
FINALMENTE UNO STANDARD PER IL BASIC!


di Giorgio Dose

All'inizio degli anni sessanta i linguaggi per computer erano poco conosciuti e comprensibili solo da coloro che li avevano studiati per anni. Con l'aumentare dell'interesse, soprattutto da parte degli studenti, verso la programmazione e l'uso dei computer, si avvertì la necessità di disporre di un linguaggio di programmazione di facile apprendimento e di semplice utilizzo. Dalle menti fervide di un gruppo di studenti americani e dei loro professori uscì uno dei primi linguaggi interattivi per computer: il BASIC, the Beginners All-purpose Symbolic Instruction Code. 
    Da allora il Basic ha fatto molta strada e si può senz'altro affermare che è diventato il linguaggio più popolare e che la sua immediatezza d'uso ha contribuito non poco alla diffusione dei computer. Con l'implementazione del linguaggio nella memoria ROM e con la possibilità di usare il registratore a cassette per la conservazione dei dati, la vendita dei microcomputer ha preso letteralmente il volo. 
    Un uso sempre maggiore di questo linguaggio sulle macchine più disparate portò inevitabilmente il Basic originale a subire notevoli cambiamenti. I progettisti di software creavano continuamente nuove funzioni per aumentarne la flessibilità e per sopperire alla sua innata lentezza. Ben presto i dialetti del Basic differirono sempre di più uno dall'altro e, nonostante che alcuni di essi, come il MicrosoftBASIC, siano diventati molto popolari, esiste ancora oggi una elevata incompatibilità tra i vari sistemi. 
    Un programma, ad esempio, scritto per un computer con una risoluzione grafica di 200x200 pixel non potrà mai funzionare su un computer con grafica ad alta risoluzione senza che per questo vengano apportate notevoli modifiche. 

TrueBASIC 

    Visti i molti dialetti del Basic, l'American National Standards Institute nominò una commissione che potesse esaminare i pregi e i difetti di ognuno. Prendendo il meglio dei vari dialetti venne creato uno standard che avrebbe dovuto portare il Basic al state-of-art dei linguaggi per computer. 
    Uno dei membri della commissione era Tom Kurtzche, con l'aiuto di John Kemeny e altri studenti, aveva ideato il linguaggio Basic originale. Gli stessi progettisti, attenendosi alle norme dello standard ANSI, svilupparono anche il TrueBASIC. È questo un linguaggio ideale per l'Amiga perché pur permettendo vecchi costrutti, come i numeri di linea e i vari GOTO e GOSUB, possiede alcune delle più avanzate strutture come SELECT CASE, DO-LOOP, DO-WHILE e DO-UNTIL. Il TrueBASIC è trasportabile; ogni programma scritto con questo linguaggio sull'Amiga può funzionare su un Macintosh o IBM, ad esempio, senza alcuna modifica, compresa la parte grafica. 

L 'Editor

    L'editor è di grandissimo aiuto nella scrittura dei programmi, Sia il TrueBASIC che l'AmigaBASIC lavorano a tutto schermo ma l'editor del TrueBASIC è più veloce e più facile da usare. 
    L'editor del TrueBASIC è ricco di svariati gadgets. Molto importante è la finestra dei messaggi d'errore che compare nella parte inferiore dello schermo ed ha le dimensioni di una linea di testo. La finestra è normalmente vuota e cambia colore quando viene visualizzato il messaggio d'errore. Contemporaneamente il cursore si posiziona alla linea causa dell'errore. La finestra può contenere fino a 5 messaggi ma può visualizzare solo uno di essi alla volta. È necessario clickare sulla finestra per far comparire il messaggio successivo. 
    L'editor dispone delle normali funzioni quali scroll bars e frecce, cut and paste, search and replace eccetera ma dispone anche di ulteriori comandi che necessitano di una piccola spiegazione. 

    Include Legge un file da disco e lo serisce nel programma immediatamente dopo la linea corrente. 
    Keep Cancella tutte le linee tranne quelle del blocco specificato. 
    Edit Visualizza, nella finestra di editing, solo le linee del blocco desiderato. 
    Move to block Muove il cursore al blocco (subroutine) definito con un nome. 
    Compile Salva il programma in forma compilata su un disk file; questo riduce la lunghezza del programma ed aumenta la velocità di esecuzione. 

    L'editor ha in sè tutte le caratteristiche di un word-processor ed infatti alcuni dei file di testo presenti sul dischetto sono stati scritti usando l'editor. 

Finestre

    Il TrueBASIC si presenta con tre finestre: Command, Source e Output con le quali è facile scrivere, eseguire e correggere i programmi. 
    Source è la finestra nella quale viene scritto il programma; l'editor a pieno schermo ed i menu fanno parte di questa finestra. 
    Command è la finestra nella quale si inseriscono i comandi basic in modo immediato per rilevare lo stato del sistema o per le operazioni di debugging. Volendo conoscere, ad esempio, il valore della variabile x, si apre la suddetta finestra, si scrive "Print x" e quindi si preme <RETURN>. Il valore di x comparirà di seguito. Volete una lista dei file presenti sul dischetto? Aprite la finestra Command, scrivete "Files" e quindi date <RETURN>. Il TrueBASIC immediatamente vi mostrerà i file della directory corrente. Qualsiasi comando del TrueBASIC può venir digitato nella finestra Command. 
    La finestra Output è quella dove appare l'uscita del vostro programma. Normalmente questa finestra è chiusa finché non si esegue un programma in TrueBASIC. Allora essa viene aperta ed il risultato del programma, testo e grafica, appare sullo schermo. La finestra può venir aperta anche manualmente e mantenuta aperta mentre si edita un programma nella finestra Source. 
    I programmi in TrueBASIC possono gestire fino a dieci finestre aperte contemporaneamente sullo schermo. Queste finestre possono contenere testo o grafica od entrambi. Solo una finestra alla volta risulta attiva ma è il programma che decide in quale finestra lavorare e in che momento. 

Programmare in TrueBASlC 

    Se siete abituati a programmare in AmigaBASIC o MicrosoftBASIC rimarrete sorpresi dalla facilità d'uso del TrueBASIC. Usando questo linguaggio il programma SpaceZap è stato scritto in un pomeriggio. Il programma gestisce suoni, grafica e imput da mouse in meno di 100 linee! Questo programma può girare su qualsiasi computer con il TrueBASIC mentre la versione con l'AmigaBASIC può funzionare solamente con l'Amiga. Per scrivere un programma equivalente in AmigaBASIC si sarebbe dovuto usare lo Sprite editor per creare uno sprite ed il numero delle linee sarebbe stato notevolmente maggiore. 
    Il TrueBASIC possiede molti comandi tradizionali del Basic ma ne comprende anche molti di inediti quali: 
    Il comando MAT, prefissato ad un comando BASIC, permette di manipolare i dati di un array senza creare un loop. 
    MAT READ - Opera come il tradizionale comando READ con la differenza che esso legge tutti gli elementi di un comando DATA e li pone in un array finché l'array stesso non è completo, e tutto questo senza ricorrere ad un ciclo FOR/NEXT. Ad esempio: 

! Legge i mesi ed i giorni
! della settimana 
! dim mesi$(12), giorni$(7)
mat read mesi$, giorni$

data gennaio,febbraio,marzo,aprile, ...
data lunedi, martedi, mercoledi ...
end 

    MAT PRINT visualizza tutti gli elementi di un array. Esempio: 

! Stampa una piccola lista
!
dim a(10)
for i = 1 to 10   ! carica l'array
iet a(i) = i      ! con questo loop
next i
mat print a       ! stampa l'intero array
end

   PICTURE è il comando che permette di definire una figura grafica e richiamarla come una subroutine. Picture può avere anche dei parametri in modo da rendere possibile delle variazioni ogni volta che il comamdo viene usato. Esempio: 

! Figura di un poligono 

picture poligono(lati)
   for i =0 to lati         ! determina
      let u = 2*Pi*(i/lati) ! i vertici
      plot Cos(u),Sin(u);   ! e traccia
   next i ! i lati
plot

end picture
set window-1 ,1,-1,1        ! def. area disegno
for n =3 to 10              ! poligoni da 3-10 lati
   draw poligono(n)         ! disegna poligono
next n
end 

    TRANSFORMS è un comando per modificare completamente una figura prima di disegnarla. Il TrueBASIC prevede ben cinque funzioni per trasformare un disegno: 

    Shift(a,b) - muove la figura. Ogni punto (x,y) viene spostato al punto (X + a,v + b); Scale(a) - varia la scala del disegno. Ogni punto (x,y) si ritrova in (x*a,y*a) 

    Scale (a,b) - come Scale(a) con la differenza che il punto disegnato in (x,y) va a finire in (x*a,y*b); 

    Rotate(a) - ruota la figura di (a) radianti (o gradi) in senso orario attorno alle coordinate di origine della finestra; 

    Shear(a) - inclina tutte le linee verticali del disegno in senso orario di (a) radianti o gradi. Il punto che si trova in (x,y) viene spostato alla locazione (x + y *tan(a),y). 

    La trasformazione può venir applicata anche agli array consentendo una facile manipolazione degli stessi. 

ON-LINE HELP

    Il TrueBASIC dispone di ulteriori facilitazioni nell'uso dell'help. Per richiamarlo basta digitare 'Help<CR>' nella finestra Command o premere il tasto help. Comparirà una richiesta; selezionare l'item per il quale servono le informazioni con un doppio click (o digitare le prime lettere del comando); si aprirà una finestra con il messaggio di help richiesto. 
    PLOT. Qualsiasi punto dello schermo può essere indirizzato usando il comando 

    'Plot x,y' 

    Volendo indirizzare più punti si userà 

    'Plot points: x1,y1;x2,y2;...'

    Per disegnare linee tra i punti basta aggiungere il carattere ";" dopo le coordinate di ogni singolo punto 

    'Plot xl,yI;x2,y2; ...'

    Per riempire un'area delimitata da punti usare il comando 

    'Plot Area:xl ,yl ;x2,y2; ...' 

    Il colore usato sarà quello corrente. Il comando Plot combinato con il comando Window consente di realizzare dei grafici molto velocemente e senza sforzo. Per la rappresentazione del grafico è necessario fornire innanzi tutto i valori di riferimento per gli assi cartesiani. Ad esempio, volendo disegnare un grafico che rappresenta il numero di automobili costruite in Italia, ogni cinque anni, negli ultimi trent'anni, si deve definire una finestra con il margine sinistro al valore 1958 ed il margine destro al valore 1988; il margine superiore potrà essere di 10 milioni mentre il margine inferiore sarà pari a 0. Una volta definita la finestra in questo modo si userà il comando plot, per l'inserimento dei punti significativi o il tracciamento delle linee, inserendo i valori delle coordinate x e y direttamente in anni e in milioni di automobili e non in pixel come normalmente siamo abituati a fare. 
       Il linguaggio TrueBASIC permette di far uso anche delle librerie. Questo significa che se, ad esempio, avete una routine che usate frequentemente nei vostri programmi, potete sistemarla in una libreria e poi chiamarla da programma. (Queste librerie non hanno niente a che vedere con le librerie dell’Amiga, esse sono proprie del TrueBASIC). Verso e da le librerie possono essere passati valori e variabili; questo semplifica moltissimo la programmazione. Si possono scrivere e correggere diversi moduli indipendentemente uno dall'altro e quindi linkarli con un altro programma per produrre un programma completo. 

Il package

    Non rimarrete certo delusi nell'aprire la confezione del TrueBASIC. Troverete infatti: due dischetti, contenenti uno il programma principale e l'altro numerosi esempi di programmi, e due manuali: the User's Guide e the Reference Manual. Entrambi i manuali sono rilegati con spirale e pubblicati da Addison Wesley: lo stesso editore degli eccellenti Amiga reference manuals. 
    L'User's Guide è rivolto ai neofiti del Basic; il manuale infatti è una guida rapida per chi deve imparare a programmare con questo linguaggio; ogni comando è spiegato chiaramente ed è fornito di numerosi esempi. 
    Il Reference manual è invece rivolto ai programmatori già esperti che vi troveranno specifiche informazioni su ogni comando del TrueBASIC. Ogni capitolo del libro descrive nel dettaglio un diverso aspetto del linguaggio, dalla grafica al trattamento degli errori, ed è corredato di numerosi esempi. Nel manuale sono trattati concetti avanzati come l'assemblaggio di routine, la manipolazione grafica, il trattamento dei file e la compatibilità con i vari dialetti Basic. 
    In conclusione il TrueBASIC è veramente un programma accurato, di uso immediato ed esente da errori. Un semplice test consistente nel conteggio da uno ad un milione ha evidenziato una velocità almeno due volte superiore a quella dell’Amiga- Basic. 
    Per il TrueBASIC sono disponibili un certo numero di librerie esterne di programmi. Tra queste ricordiamo 3D graphics, PC BASIC converter per tradurre da altri dialetti Basic, Communications Support, Sorting and Searching, Advanced String Library e diverse altre. L'Amiga Developers Toolkit comprende routine per grafica avanzata e gestione di suoni, routine per animazioni avanzate e accesso a tutte le funzioni di sistema. All'articolo sono acclusi due semplici programmi per illustrare la semplicità d'uso e le possibilità offerte dal linguaggio. 

SpaceZap

    SpaceZap è stato scritto per valutare se il TrueBASIC supporta un buon livello di routine grafiche; con esso infatti non è possibile gestire gli sprite. È risultato comunque che il TrueBASIC dispone di una buona qualità grafica ed usando il comando Plot Area in unione con la funzione Picture è possibile simulare gli sprites come è stato fatto in questo programma. 

Orbits

    Orbits è un piccolo programma che era stato scritto originariamente per un computer Atari. Esso dimostra come sia facile convertire al TrueBASIC, programmi scritti in altri dialetti Basic e per altri computer. 
    Orbits permette di definire la gravità e la posizione di un massimo di dieci oggetti; il programma poi calcola e visualizza ogni oggetto in relazione a tutti gli altri. 
    Il programma è stato convertito abbastanza facilmente. Tutte le formule matematiche sono state trasferite intatte. Le uniche variazioni riguardano le dimensioni dello schermo e l'indirizzamento dello stesso con i comandi Window e Plot. Questi ultimi sono stati adattati per sfruttare il vantaggio di una maggiore risoluzione e di un numero più elevato di colori disponibili. 
 
 
 


! SpaceZap                     !
! Implementazione in TrueBasic !
! di Amiga magazine            ! 
! Marzo 1988                   !
!                              ! 
!                              ! 
INPUT prompt "Livello di abilita' (0-5) ":skill   ! livello di abilità
LET skill=skill/5
SET back "black"                ! sfondo al nero
SET window -500,500,-500,500    ! dimensiona schermo
LET ox=100                      ! posizione x iniziale della nave
LET oy=100                      ! posizione y iniziale della nave
LET a=9
LET shots=1
!
! disegna la nave
!
PLOT area:ox,oy+3*a;ox+2*a,oy-2*a;ox,oy;ox-2*a,oy-2*a;ox,oy+3*a
BOX KEEP ox-3*a,ox+3*a,oy+3*a,oy-3*a in ship$
                                ! la forma della nave è posta in 
CLEAR                           ! una variabile stringa
DO
   LET tx=0
   BOX SHOW ship$ at ox,oy        ! disegna nave
   BOX CLEAR ox,ox+6*a,oy+7*a,oy  ! cancella nave
   GET MOUSE: x,y,state   ! senti mouse per movimento nave
   IF abs(ox+3*a)-10<0 then LET tx=tx+1
   IF abs(oy+3*a)-10<0 then LET tx=tx+1   ! plot x e y
   IF state>0 then LET tx=tx+1    ! pulsante di sparo premuto?
                                  ! conteggio colpi
   IF state>0 then                ! e suono dello sparo
      FOR ss=1 to 3
         SOUND 100,.03
         SOUND 500,.03
      NEXT ss
   END IF
   IF tx=3 then                   ! colpito ?
      LET score=score+1           ! se sì, incrementa score
      LET ki=ki+1                 ! e incrementa contatore skill
      LET ex=rnd*50               ! disegna esplosione
      SET color "red"
      FOR i=1 to ex 
         IF i>(ex/2) then SET color "yellow"
         PLOT 0,0;rnd*100,rnd*100
         PLOT 0,0;-rnd*100,-rnd*100
         PLOT 0,0;-rnd*100,rnd*100
         PLOT 0,0;rnd*100,-rnd*100
      NEXT i
      CLEAR
      SET color "white"
      PRINT "Shots";shots         ! stampa colpi
      PRINT "Kills";score         ! stampa punteggio
      PRINT "Skill";skill*5       ! stampa livello
      LET ox=(rnd*1000)-500       ! pos. x per nuova nave
      LET oy=(rnd*1000)-500       ! pos. y per nuova nave 
   END IF
   IF x1<>x then LET mx=x+x1      ! nave mancata, calcola x
   IF y1<>y then let my=y+y1      ! nave mancata, calcola y
   LET ox=ox-mx/50
   LET oy=oy-my/50
   IF state>1 then
      GET MOUSE:N1,n2,null        ! reset pulsante di sparo
      SET color "red"             ! cambia colore puntatore
      LET shots=shots+1           ! aumenta di uno i colpi
   END IF
   PLOT 0,0             ! disegna puntatore nel colore corrente
   PLOT 50,0;100,0     ! bianco se non sparo
   PLOT -50,0;-100,0   ! rosso se sparo
   PLOT 0,50;0,100
   PLOT 0,-50;0,-100
   IF state>1 then SET color "white"  ! Sparo? cambia colore
   IF ki>4 then           ! se più di 4 colpiti al livello scelto
      LET skill=skill+.2  ! incrementa skill level di 1
      LET ki=1
   END IF
   LET x1=x
   LET y1=y
   LET ox=ox+(skill*(rnd*35))  ! plot manovra evasiva nave
   LET oy=oy+(skill*(rnd*35))  ! in base al livello di abilità
   LET ox=ox+(skill*(-rnd*35))  ! più alto il livello
   LET oy=oy+(skill*(-rnd*35))  ! più si muove la nave
   IF oy>490 then LET oy=490
   IF oy<-490 then LET oy=-490
   IF ox>490 then LET ox=490
   IF ox<-490 then LET ox=-490
LOOP
END

 
! Orbits                       !
! Implementazione in TrueBasic ! 
! di Amiga Magazine            !
! Aprile 1988                  !
!                              !
!                              !
!                              ! 
SET mode "high16"        ! grafica in alta risoluzione
SET window -500,500,-500,500
                         ! origine al centro dello schermo e
SET color "blue"         ! schermo di larghezza ed altezza di
SET back "black"         ! 1000 punti
DO while t<2 or t>10     ! numero degli oggetti
   PRINT "Numero degli oggetti orbitanti (massimo 10)";
   INPUT t
LOOP
!
! definizione array
!
DIM G(10),X(10),Y(10),U(10),V(10),R(10)
!
! valori per tutti gli oggetti
!
FOR i=1 to t
   PRINT "Per oggetto orbitante n. ";i !valore gravità
   PRINT "Gravità=";
   INPUT G(i)
         let R(i)=G(i)/5
   PRINT "Coordinata X=";    ! coordinata X iniziale
   INPUT X(i)
   PRINT "Coordinata Y=";    ! coordinata Y iniziale
   INPUT Y(i)
   PRINT "X-velocità=";  ! valore velocità X
   INPUT U(i)
   LET U(i)=(U(i))/100
   PRINT "Y-velocità=";      ! valore velocità Y 
   INPUT V(i)
   LET V(i)=(V(i))/100
NEXT i
CLEAR
!
! calcola e definisci i punti 
!
DO
   FOR i=1 to t
      FOR j=1 to t
         IF i<>j then
            LET X1=X(j)-X(i)
            LET Y1=Y(j)-Y(i)
            LET D2=X1*X1+Y1*Y1
            LET G1=G(j)/(D2*sqr(D2))
            LET U(i)=U(i)+G1*X1
            LET V(i)=V(i)+G1*Y1
         END IF
      NEXT j
      IF i=1 or i=9 then SET color "blue"
      IF i=2 or i=10 then SET color "white"
      IF i=3 then SET color "red"
      IF i=4 then SET color "yellow"
      IF i=5 then SET color "green"
      IF i=6 then SET color "cyan"
      IF i=7 then SET color "magenta"
      IF i=8 then SET color "brown"
      box circle X(i)-(R(i)/2),X(i)+(R(i)/2),Y(i)- (R(i)/2),Y(i)+(R(i)/2)
      !PLOT X(i),Y(i);    ! plot prima posizione
      LET Y(i)=Y(i)+V(i)
      LET X(i)=X(i)+U(i)
      box circle X(i)-(R(i)/2),X(i)+(R(i)/2),Y(i)- (R(i)/2),Y(i)+(R(i)/2)
      !PLOT X(i),Y(i)     ! plot seconda posizione
   NEXT i
! CLEAR             ! rimuovere "!" per cancellare le tracce
LOOP
END
 

Settembre 1988