Jaap's Psion II Page

This is the manual for the multi-lingual XP, in Italian.


Psion Organiser II
Istruzioni d'Uso


INDICE

PARTE PRIMA INTRODUZIONE 1 COM'È FATTO L'ORGANISER 2 OPERAZIONI PRELIMINARI 3 LA FUNZIONE ORARIO 4 COME SPEGNERE 5 COME REGISTRARE E RITROVARE DATI 6 CANCELLAZIONE DEI DATI 7 I DATAPAKS 8 LA CALCOLATRICE 9 L'AGENDA 10 LE SVEGLIE 11 PROG 12 INFO 13 COPIA 14 AZZERA 15 CONSIDERAZIONI SUI RECORDS 16 PERSONALIZZAZIONE DEL MENU PARTE SECONDA 17 INTRODUZIONE ALL'OPL 18 CREARE UNA PROCEDURA 19 COME MANDARE IN ESECUZIONE UNA PROCEDURA 20 LE VARIABILI 21 LE VARIABILI STRINGA 22 LE VARIABILI A SCHIERA 23 GLI OPERATORI 24 LE PROCEDURE 25 LA GESTIONE DEGLI ARCHIVI DI DATI 26 CICLI, ETICHETTE, SALTI E SALTI CONDIZIONATI 27 LA GESTIONE DEGLI ERRORI 28 LA STAMPA DELLE PROCEDURE 29 IL DIRETTORIO DELLE PROCEDURE 30 CANCELLAZIONE DI UNA PROCEDURA 31 COPIATURA DI PROCEDURE 32 PROGRAMMI ESEMPIO 33 I COMANDI DELL'OPL 34 LE FUNZIONI DELL'OPL APPENDICE A IL SET DI CARATTERI DELL'ORGANISER APPENDICE B IN CASO DI MALFUNZIONAMENTO APPENDICE C DATI TECNICI APPENDICE D PROGRAMMAZIONE IN LINGUAGGIO MACCHINA APPENDICE E MAPPA DELLA MEMORIA APPENDICE F PERIFERICHE INDICE ANALITICO


© Copyright PSION PLC 1986

Per evitare ogni possibile danno il vostro ORGANISER non va esposto a condizioni estreme di temperatura e umidità. Non deve essere soggetto a colpi eccessivi né vanno usati liquidi volatili per la pulizia

UK PATENT NUMBER: 2161300
UK REGISTRATION DESIGN N: 1019736 e 1019737

Scritto da Barry Thomas
Stampato da: EBS - Verona


MEMORIA DEL MODELLO XP:

Il modello XP utilizza 24K dei 32K per l'inserimento dei dati, con 8K utilizzati per altri programmi e periferiche, come lo SPREADSHEET ed il COMMS-LINK.
Ecco perché l'opzione INFO visualizza una memoria di circa 23.000 bytes per il modello XP.

VOCI MANCANTI NEL MENU:

Se vi accorgete che una delle voci del MENU principale come CALC, non appare più sullo schermo, avete accidentalmente premuto il tasto DEL, cancellandola.
Per reinserirla premere il tasto MODE e, alla richiesta "INSERISCI VOCE", digitare la voce stessa e premere EXE.


INTRODUZIONE

Lo Psion Organiser II che avete appena acquistato è un potente calcolatore tascabile, un sistema espandibile con un microprocessore assai più avanzato di quelli che potete trovare in calcolatori molto più grandi.

Il vostro Organiser può essere usato subito. Esso ha una memoria interna in grado di conservare le informazioni anche quando è spento.

L'Organiser ha anche due dispositivi a stato solido unici e versatili alloggiati sotto la copertura scorrevole di protezione. Questi elementi, non più grossi di un dito pollice, sono la chiave della potenza praticamente illimitata dell'Organiser.

La memoria interna dell'Organiser e in grado di contenere circa 32000 caratteri di informazioni (Modello XP) e circa 8000 sul Modello CM, ma l'aggiunta di uno o più Datapak aumenta la capacità di memoria fino a 64000 caratteri per Datapak sul Modello CM e 128000 caratteri per Datapak sul Modello XPr

Ulteriori Datapak vi permettono di creare un sistema informativo personale sicuro e praticamente senza limiti che, quando usato assieme ai programmi aggiuntivi, vi mette a disposizione una potenza di elaborazione senza confronto.

L'Organiser contiene tutto quanto é necessario per un'agenda che vi consenta di registrare appuntamenti e impegni. Potete inserire una segnalazione in corrispondenza di una o di tutte le registrazioni, o potete far sì che il sistema di segnalazioni predisposte internamente operi come una sveglia.

L'Organiser è anche una sofisticata calcolatrice e può eseguire calcoli complessi con qualsiasi numero di livello di parentesi. Si possono usare funzioni matematiche e scientifiche e si possono usare fino a 10 memorie. Potete inserire dati e formule come se li scriveste. L'Organiser dispone anche del linguaggio di programmazione OPL, particolarmente studiato per gestire le vostre basi di dati e per utilizzare pienamente tutte le possibilità che la macchina vi offre.

Una scelta di periferiche e di pacchetti di programmi vi permette, per esempio, di stampare le informazioni memorizzate nell'Organiser, di collegarlo a un altro computer o di inviare le informazioni via telefono.

L'Organiser rende inutili il vostro block-notes, la vostra agenda, il vostro orologio e la vostra calcolatrice e, inoltre, mette una capacità di elaborazione senza confronto in un calcolatore tascabile.

Una gamma di periferiche e di pacchetti di programmi è disponibile per l'Organiser, compresi un alimentatore da rete, un'interfaccia RS232, un lettore di codice a barre, un lettore di schede, un pacchetto di programmi matematici, un pacchetto di programmi finanziari e un programma di controllo ortografico.

Man mano che imparate a usare tutte le possibilità del vostro Organiser, fate pure esperimenti! Non abbiate paura di fare tentativi; non è possibile danneggiare la macchina premendo un qualsiasi tasto, per cui andate avanti alla scoperta di tutto ciò che l'Organiser può fare per voi.

ATTENZIONE

Al momento dell'acquisto del nuovo PSION ORGANISER II lo stesso si presenta in una versione multilingua.

Il menu iniziale apparirà come segue:

ENGLISH FRANÇAIS DEUTSCH ESPANOL ITALIANO SVENSKA NORSK PORTUGUES DANSK NEDERLANDS TURKCE

Per selezionare la versione italiana posizionatevi con il cursore sulla "I" di ITALIANO e premete EXE oppure digitate la lettera "I". Una volta entrati nel menu in italiano è comunque sempre possibile ritornare alla versione multilingua grazie alla voce LINGUA del menu.


1 COM'È FATTO L'ORGANISER

Figura 1
Vista posteriore con la custodia protettiva rimossa

  1. Dispositivo no 1 con il coperchietto di chiusura dell'alloggiamento per un Datapak od un pacchetto di programmi.
  2. Dispositivo no 2.
  3. Regolazione del contrasto.
  4. Coperchietto dell'alloggiamento per la batteria.
  5. Linguetta per la rimozione del coperchietto.

Figura 2
Vista frontale con la tastiera esposta

  1. Schermo
  2. Tastiera
  3. Custodia protettiva
  4. Per liberare la tastiera sfilare la custodia protettiva.

Figura 3
Vista dall'alto dell'Organiser.

  1. Schermo
  2. Porta di espansione

Figura 4
Installazione della batteria.


2 OPERAZIONI PRELIMINARI

INSTALLAZIONE DELLA BATTERIA

L'Organiser ha una batteria PP3 di 9 volt. Si raccomanda, però, per un funzionamento più prolungato, l'uso di batterie alcaline, in particolar modo se sono inseriti i Datapak.

Afferrate la copertura protettiva (Fig 2.3) sotto il punto di separazione (Fig 2.4) e tirate con forza verso il basso fino a sfilarla dall'Organiser. Trovata la linguetta del coperchietto dell'alloggiamento della batteria sulla parte posteriore dell'Organiser, tiratela per togliere il coperchio: il connettore della batteria risulterà visibile su un lato dell'alloggiamento.

Per installare la batteria introducetela nell'apertura assicurandovi che il terminale più piccolo, il positivo, entri per primo. Se la batteria entra solo a metà, allora significa che l'avete inserita al contrario. Giratela in modo che l'altro contatto metallico si inserisca per primo nel connettore della batteria e riprovate.

Per mettere il coperchietto, inserite quest'ultimo negli appositi solchi ai lati dell'alloggiamento della batteria e quindi fate scattare la linguetta al suo posto: l'Organiser è pronto all'uso.

SOSTITUZIONE DELLA BATTERIA

Quando la batteria si sia scaricando, sullo schermo di Organiser apparirà il messaggio di BATTERIA SCARICA. Questo messaggio apparirà per 4 secondi, poi la macchina si spegnerà automaticamente. Prima di usare di nuovo la macchina dovete sostituire la batteria.

Se, per esempio, state registrando un'informazione su un Datapak e la batteria è ormai al limite, la registrazione del record verrà completata, ma poi apparirà il messaggio di batteria scarica e la macchina si spegnerà.

Perchè l'informazione memorizzata nell'Organiser, per esempio nell'agenda o nell'archivio dati principale, sia conservata, è necessaria la presenza della batteria.

Quando dovete cambiare la batteria, assicuratevi per prima cosa che la macchina sia spenta. In caso contrario, non appena verrà tolta la vecchia batteria, tutti i dati della memoria interna dell'Organiser andranno persi. Per aprire l'alloggiamento della batteria sui retro della macchina, seguite le istruzioni già date.

Quando avete tolto la vecchia batteria avete un tempo limitato per inserirne una nuova, dopo di che comincerete a perdere ciò che è contenuto nella memoria dell'Organiser. I dati memorizzati sui Datapak saranno in ogni caso salvi.

Quando la vecchia batteria viene tolta, se non inserite quella nuova entro 30 secondi, l'ora caricata nel sistema con la funzione ORARIO del menu principale andrà persa. Essa può essere reimpostata quando la nuova batteria viene installata e non vi saranno altre perdite.

Se non siete riusciti a installare la nuova batteria entro 90 secondi, il contenuto della memoria andrà perso.

In alternativa, potete usare l'Alimentatore da Rete Psion per alimentare la macchina mentre cambiate la batteria. Ciò significa che non si verificherà alcuna interruzione dell'alimentazione per il vostro Organiser e che quindi non avrete limiti di tempo per inserire la nuova batteria.

ACCENSIONE

Premete il tasto ON/CLEAR, il tasto in alto a sinistra della tastiera. Sullo schermo apparirà il menu, l'elenco delle funzioni disponibili. Se non riuscite a vedere niente o se lo schermo è di difficile lettura, dovrete regolare il contrasto usando l'apposita rotellina sul lato destro della macchina. Provate finchè non trovate la situazione che meglio vi si addice.

LA TASTIERA

Prima di continuare osservate la tastiera. Molti tasti hanno doppia indicazione. I tasti delle lettere normalmente fanno comparire sullo schermo lettere maiuscole. La posizione del carattere sullo schermo è indicata da un cursore lampeggiante. Quando l'Organiser è acceso il cursore apparirà alternativamente come un quadratino o come una lineetta luminosi sotto il carattere.

Tenendo premuto il tasto SHIFT e premendo uno dei tasti delle lettere, potrete accedere ai simboli e ai numeri segnati sopra i tasti. Quando il tasto SHIFT viene tenuto premuto, il cursore appare come una lineetta sotto il carattere senza lampeggiare.

Premendo contemporaneamente SHIFT e NUM, questi numeri e simboli possono essere "bloccati", così non sarà più necessario tenere sempre premuto il tasto SHIFT.

Ciò è molto utile quando si devono inserire lunghe sequenze di numeri. Ripetere l'operazione per riportare la tastiera alla funzione normale (lettere maiuscole).

Per ottenere lettere minuscole premere prima il tasto SHIFT e quindi il tasto CAP/UP. Per riportare la tastiera alle lettere maiuscole, ripetere il procedimento di cui sopra.

I tasti della prima fila in alto ed alcuni dell'ultima, sono alquanto diversi dagli altri tasti perchè, quando sono premuti, non producono un carattere sullo schermo. Ecco la descrizione di questi tasti:

Tasto ON/CLEAR

È il tasto in alto a sinistra della tastiera e viene usato per accendere la macchina o per abbandonare una funzione.

Tasto EXE

È il tasto in basso a destra e viene usato per confermare una operazione o per avvisare l'Organiser che l'introduzione dei dati è stata completata.

Tasti cursore

I 4 tasti sulla prima fila della tastiera, contrassegnati da frecce, sono usati per muovere il cursore lungo i records memorizzati nell'Organiser e vengono usati, in modi differenti, dalle varie funzioni della macchina.

Tasto SHIFT

Ha la stessa funzione dell'analogo tasto di una normale tastiera e consente di utilizzare i caratteri che appaiono sulla parte superiore di un tasto (cifre, operatori aritmetici e altri caratteri speciali).

Tasto DEL

Questo tasto viene usato per cancellare caratteri battuti sulla tastiera; è usato anche da alcune funzioni dell'Organiser.

IL MENU PRINCIPALE

All'inizio lo schermo apparirà così:

RICERCA REGISTRA AGENDA CALC PROG

Il primo carattere della prima parola sullo schermo è coperto da un quadratino lampeggiante: il cursore.

Per muovere il cursore usate i 4 tasti freccia sulla fila superiore della tastiera: sono i cosiddetti tasti cursore. In questo manuale il tasto con la freccia a destra verrà designato come tasto cursore DESTRO, quello con la freccia a sinistra come tasto cursore SINISTRO, ecc..

SCANSIONE DEL MENU

Premendo i tasti cursore DESTRO o SINISTRO il cursore lampeggiante si sposterà sulla prima lettera della voce successiva o precedente del menu. Premendo ulteriormente lo stesso tasto, il cursore si muoverà sullo schermo fino alla riga successiva e così via. Quando il cursore si trova sull'ultima voce visibile sullo schermo, premendo di nuovo il tasto cursore DESTRO apparirà la riga successiva del menu.

l tasti cursore SU e GIU' vi permettono di scandire il menu una riga per volta, invece che una voce alla volta. Quando avrete raggiunto la fine del menu, l'ultima voce sarà SPEGNE. Premendo ancora una volta i tasti cursore DESTRO e GIU' si tornerà alla prima riga del menu, da dove si era cominciato.

La gamma completa delle voci del menu, quando l'Organiser viene acceso, è la seguente:

RICERCAPer ricercare e/o editare records precedentemente registrati
REGISTRAPer registrare informazioni sia nella memoria interna dell'Organiser che su un Datapak.
AGENDATutte le normali funzioni di agenda, più la possibilità di segnalare con una sveglia appuntamenti segnati nell'agenda stessa quando è il momento; elenco degli appuntamenti; ricerca degli appuntamenti
CALCPer calcoli: permette di usare le funzioni numeriche dall'OPL (vedere sotto) e comprende 10 memorie
PROGL'OPL (Organiser Programming Language) è un linguaggio di programmazione completo; esso vi permetterà di scrivere programmi per le vostre applicazioni specifiche.
CANCELLAPer cancellare records dalla memoria dell'Organiser o da un Datapak
SVEGLIAÈ possibile predisporre contemporaneamente fino a 8 sveglie, ogni ora, ogni giorno, ogni settimana.
ORARIOL'ora reale (ora, giorno, data, mese ed anno) è memorizzata in modo permanente nell'Organiser; è usata anche dalle sveglie e da varie funzioni del linguaggio
INFODà una descrizione completa di quanta memoria é occupata dall'AGENDA, quanto to spazio è disponibile su un Datapak installato e quanto spazio è rimasto nella memoria interna dell'Organiser.
COPIAVi permette di copiare informazioni dalla memoria centrale su un Datapak, da un Datapak su di un altro o da un Datapak nella memoria centrale.
AZZERAEsegue una "partenza a freddo" e cancella tutte le informazioni presenti in memoria.
LINGUADa accesso al menu per la selezione delle diverse lingue con cui si può operare con Organiser
SPEGNESpegne l'Organiser.

SCELTA DI UN'OPZIONE

Ora sapete come è composto un menu; ma come fare una scelta dal menu stesso? Vi sono due modi possibili.

In basso a destra della tastiera vi è un tasto etichettato EXE (sta per esegui). Questo è il tasto che indica all'Organiser che avete finito di battere qualcosa o che desiderate scegliere un'opzione fra quelle presentatevi.

Per scegliere un'opzione del menu basta usare i tasti cursore per posizionare il cursore stesso all'inizio della voce prescelta e premere EXE. L'altro metodo consiste nel premere il tasto corrispondente alla prima lettera dell'opzione richiesta. Per esempio, premendo il tasto O il cursore sarà portato sull'opzione ORARIO del menu. L'Organiser vi introdurrà immediatamente nell'opzione prescelta.

È comunque possibile che vi siano nel menu più opzioni che iniziano con la stessa lettera. Ogni volta che tale lettera è premuta il cursore si muoverà verso la parola successiva che inizia con quella lettera.

Premendo di nuovo quella lettera, nell'ipotesi che non vi siano altre voci che inizino con essa, sarete riportati alla prima.

Quando poi il cursore è sulla voce del menu che avete scelta, premete il tasto EXE e sarete immediatamente introdotti in quella particolare opzione.


3 LA FUNZIONE ORARIO

Scegliete dal menu la funzione ORARIO, come detto nel capitolo Operazioni preliminari, premendo il tasto O od usando i tasti cursore per posizionare il cursore sulla prima lettera di ORARIO nel menu e quindi premete il tasto EXE.

La data, il giorno e l'ora appariranno così sullo schermo:

MER 1 GEN 1986  00:03:06

IMPOSTAZIONE DELL'ORA

Appena inserita la batteria, ora e data saranno impostate come 00:00:00 del 1 gennaio 1986. Per impostare l'ora e la data correnti, premete il tasto MODE e il cursore si posizionerà sul giorno del mese. Per impostare la data voluta premete il tasto cursore SU e la cifra verrà aumentata. Continuate a premere SU finchè non otterrete la data corretta.

Noterete che il giorno della settimana cambia automaticamente ogni volta che cambia la data.

Per cambiare il mese, l'anno e l'ora si usano i tasti cursore SINISTRO e DESTRO per posizionare il cursore sulla parte dello schermo che interessa e si usano i tasti cursore SU e GIU' per aumentare o diminuire l'ora o la data. L'ora, secondi inclusi, viene indicata sull'arco delle 24 ore; così, per esempio, le 4,30 del pomeriggio saranno mostrate come 16:30:00.

Dopo aver impostato l'ora e la data, premere EXE per togliere il cursore e premere ON/CLEAR per tornare al menu principale. È sufficiente impostare l'ora e la data una sola volta a patto che non si tolga la batteria per un periodo di tempo troppo lungo.

Adesso che l'ora e la data sono state impostate sull'Organiser, per controllare l'ora o il giorno del mese, per esempio, basta scegliere ORARIO dal menu principale nel solito modo e compariranno orologio e calendario. Premete ON/CLEAR per tornare al menu principale.


4 COME SPEGNERE

Scegliete dal menu principale l'opzione SPEGNE premendo il tasto S o usando i tasti cursore e quindi il tasto EXE. Lo schermo si oscurerà e la macchina vena spenta. Per accenderla di nuovo basta premere ON/CLEAR e l'Organiser vi mostrerà il menu principale pronto per la scelta.

SPEGNIMENTO AUTOMATICO

Se l'Organiser viene lasciato acceso 5 minuti senza premere nessun tasto, si spegnerà da solo per non esaurire la batteria.

Quando ciò accade, non preoccupatevi! Anche se foste a metà dell'editazione di un record o, peggio, anche se steste lavorando su un record lungo, i vostri dati non andranno persi. Basta premere ON/CLEAR una volta e l'Organiser si "risveglierà" al punto esatto di quando si era spento. Tutti i vostri dati sono intatti e potete continuare da dove avete smesso.


5 COME REGISTRARE E RITROVARE DATI

Una delle principali funzioni del'Organiser è quella di memorizzare e consentire la ricerca di una grande quantità di informazioni nel formato che volete. Ciò si può ottenere sia dal menu principale che da un programma memorizzato internamente. Di questo ultimo si tratterà nella Sezione 2, dal capitolo 17 in avanti, con una descrizione completa del linguaggio di programmazione dell'Organiser, l'OPL.

COME SALVARE I DATI

Immaginate di voler memorizzare nomi, indirizzi e numeri telefonici importanti. Una registrazione, detta anche record, potrebbe essere:

Abraham Lincoln, President Tel 01-010-0000 The White House Washington, DC

Se in quel momento non foste già nel menu principale, premete una o due volte ON/CLEAR finchè questo non compaia. Scegliete REGISTRA dal menu o usando il cursore DESTRO e il tasto EXE, o premendo il tasto R. Lo schermo apparirà così:

REGISTRA A:  

Potete ora cominciare a battere le informazioni relative a Lincoln. Battendo il nome proprio, le lettere appariranno sullo schermo alla destra del messaggio REGISTRA A:. Se battete un nome con più lettere di quelle che possono stare nel rimanente spazio di quella riga, allora l'intera riga verrà fatta scorrere verso sinistra, lasciandovi abbastanza spazio per completarla.

REGISTRA A:Abraham Lin_    

Dopo aver battuto il nome completo ed il titolo, potreste voler mettere il numero telefonico su una nuova riga. Per fare ciò, premete il tasto cursore GIU'. Il cursore scenderà alla riga successiva e ciò vi permetterà di inserire il numero. Quando cominciate una nuova riga potete disporre l'informazione nel modo che preferite.

Un altro motivo per suddividere l'informazione in un numero di righe brevi piuttosto che averla su un'unica riga lunga è che quando poi volete ritrovare i dati è possibile vedere due righe contemporaneamente e, in questo caso, il nome e il numero di Lincoln possono essere subito letti.

Si ripete questo procedimento finchè non sia stata battuta l'ultima riga dell'indirizzo. Se ciò che avete battuto vi soddisfa premete il tasto EXE e l'informazione verrà memorizzata. Questa informazione potrà poi essere ritrovata in qualsiasi momento usando l'opzione RICERCA (vedi sotto).

A volte potreste voler editare l'informazione prima della memorizzazione. Ciò si può fare usando i tasti cursore e il tasto DEL (cancella).

Nota. Il tasto DEL cancella il carattere a sinistra del cursore. Tenendo premuto il tasto SHIFT, quando premete il tasto DEL, si cancella il carattere sotto il cursore e il testo a destra si sposta per riempire il vuoto. Se volete unire due righe in un'unica riga lunga, potete facilmente far salire la seconda riga e unirla alla prima. Basta porre il cursore sul primo carattere della seconda riga e premere una volta DEL.

Non è però possibile l'opposto. Non potete dividere una unica riga in due righe separate e non potete inserire una nuova riga nel mezzo di un record.

Quando avete finito di battere il vostro record e avete controllato che non vi siano errori o cose che vorreste cambiare, premete il tasto EXE e l'intero record verrà memorizzato nello Organiser; venete riportati quindi al menu principale.

Se volete abbandonare un record a metà e non memorizzarlo nell'Organiser o in un Datapak, basterà premere il tasto ON/CLEAR. Sullo schermo apparirà il menu principale e il record verrà eliminato.

Ogni record può essere lungo fino a 16 righe e ogni record completo può contenere fino a 254 caratteri.

Ogni riga, poi, può contenere un qualsiasi numero di caratteri, entro i limiti detti sopra.

Se avete inserito un Datapak nell'Organiser in una delle sedi nella parte posteriore del contenitore, potrete memorizzare il record in quel Datapak. Per fare ciò usate il tasto MODE per scegliere il Datapak adatto o prima di inserire l'informazione o in qualunque momento durante l'inserimento.

Per esempio, quando avete finito di battere l'informazione che deve essere contenuta in un record, ma prima di premere il tasto EXE, premete il tasto MODE e vi sarà mostrato con quale dispositivo state lavorando in quel momento.

La memoria interna dell'Organiser viene trattata come i Datapak, se ve ne sono dì inseriti, e viene chiamata dispositivo A: (mentre i Datapak fisici saranno i dispositivi B: e C:). Questa memoria è sempre disponibile, così avrete sempre almeno una destinazione per i vostri dati o una sorgente se state tentando di ritrovarne. Così, se state usando il dispositivo A:, dopo che vi avete battuto le vostre informazioni, lo schermo potrebbe mostrare qualcosa del genere:

REGISTRA A:Abrah Tel 01-010-0000

Premete una volta il tasto MODE e, supponendo che abbiate inserito un Datapak in una delle sedi, lo schermo apparirà così:

REGISTRA B:Abrah Tel 01-010-0000

Naturalmente, se avete inserito il Datapak nella seconda sede (più sotto), allora comparirà C: invece di B:.

RICERCA DI DATI

Se lo schermo non mostra il menu principale premete una o due volte ON/CLEAR. Scegliete RICERCA dal manu o usando il tasto freccia DESTRA, finchè il cursore non lampeggi sulla R di RICERCA e premendo il tasto EXE, o premendo il tasto R. Lo schermo apparirà così:

RICERCA A:  

Per trovare qualcosa dovete semplicemente battere un "suggerimento di ricerca" di 3 u 4 caratteri. Per esempio, se avete in precedenza memorizzato il record relativo a Lincoln e ora volete ritrovarlo, battereste LINC. Lo schermo apparirà:

Abraham Lincoln  Tel 01-010-0000

L'Organiser funziona in modo molto più flessibile di un classificatore a schede o di una guida telefonica perchè consente di ritrovare le informazioni utilizzando una qualsiasi parte del record. Per esempio, il record relativo ad Abraham Lincoln verrebbe trovato battendo uno qualunque dei seguenti suggerimenti di ricerca:

RICERCA A:LINC RICERCA A:PRES RICERCA A:ABR RICERCA A:WASH

In altre parole, potente accedere all'intero record semplicemente battendovi parte dal nome proprio, del cognome, del titolo o qualsiasi parte del suo indirizzo.

Premendo il tasto cursore GIU' un certo numero di volte, si faranno apparire le altre righe del record, una alla volta, fino all'ultima riga. Può occasionalmente succedere di RICERCARE un record che contenga una riga con più di 16 caratteri, cioè più del numero di caratteri che può essere mostrato su una riga dello schermo.

Quando ciò accade, se il record contiene una sola riga, allora si sposterà automaticamente da destra a sinistra. La riga si "avvolge" a sinistra, così voi vedete scorrere con continuità il suo contenuto. Tenendo premuto il tasto cursore DESTRO, lo spostamento sarà più veloce e ciò vi permetterà di raggiungere la fine della riga più rapidamente.

Se il record ha 2 o più righe, allora se alcune delle righe hanno più di 16 caratteri, usando i tasti cursore SU e GIU', ognuna di esse può essere esaminata e qualsiasi riga lunga scorrerà automaticamente sullo schermo. Normalmente le righe lunghe si sposteranno sulla riga più bassa dello schermo, tranne quando è la prima ad essere lunga, nel qual caso essa si sposta sulla riga superiore.

Quando la riga sta scorrendo, la direzione del movimento può essere cambiata usando i tasti cursore. Se la riga sta scorrendo da destra a sinistra, premete il tasto cursore SINISTRO una volta e la riga si fermerà. Premetelo ancora e la riga comincerà a scorrere da sinistra a destra. Usate il tasto cursore DESTRO per invertire il processo.

Se il record trovato non è quello che cercavate, premete EXE e il successivo record che soddisfa al suggerimento di ricerca verrà mostrato nello stesso modo.

Se non vi sono records che soddisfano alla richiesta o se si e raggiunto l'ultimo record valido, allora verrà mostrato il messaggio:

**************** ***FINE DATI****

Premete ancora EXE e verrà mostrato di nuovo il primo record valido. Per tornare al menu principale premete una volta ON/CLEAR.

Non ha importanza se il record memorizzato è tutto in lettere maiuscole e se la stringa che battete dopo il messaggio RICERCA è in lettere minuscole o viceversa. I vostri records possono essere una qualunque combinazione di maiuscole e minuscole e si possono trovare in un batter d'occhio.

Così la stringa ANN troverà sia Anne che Joanne.

Se volete "sfogliare" i record memorizzati, scegliete RICERCA dal menu principale nel solito modo e premete EXE senza battervi nessuna stringa. Verrà mostrato il primo record dell'archivio principale e ogni volta che premerete EXE verranno mostrati i record successivi.

Dopo che l'ultimo record è stato mostrato, comparirà il messaggio FINE DATI. Premete il tasto EXE ancora una volta a tornerete al primo record.

Di nuovo, per tornare al menu principale, basta premere una volta il tasto ON/CLEAR.

COME EDITARE RECORDS

Talvolta può essere necessario alterare dei records. Per esempio, se il numero telefonico o l'indirizzo di qualcuno cambia e voi volete aggiornare il record del vostro Organiser, potete farlo facilmente.

Quando RICERCATE un record esso appare sullo schermo così:

Abraham Lincoln  Tel 01-010-0000

Per editarlo basta premere il tasto MODE. Lo schermo apparirà:

REGISTRA A:Abrah Tel 01-010-0000

Ora, usando i tasti cursore, muovetevi lungo il record e inserendo o cancellando parte del testo, potete aggiornare il record. Qualsiasi riga può essere alterata e voi potete anche aggiungere nuove righe alla fine del record, anche se non potete inserire nuove righe fra quelle vecchie.

A questo punto, potete anche cancellare l'intero record semplicemente premendo il tasto ON/CLEAR. L'intero record sparirà e sullo schermo apparirà il messaggio:

REGISTRA A:  

Se vi capita di fare ciò per sbaglio mentre state editando un record lungo, non preoccupatevi, potete ritrovare il record com'era prima di aver premuto il tasto ON/CLEAR semplicemente premendo il tasto ON/CLEAR ancora una volta. Verrete riportati al menu principale, ma il vostro record rimarrà intatto e potrà essere ritrovato con la funzione RICERCA. Se, comunque, volete realmente cancellare l'intero record, dopo aver premuto il tasto ON/CLEAR una volta, premete il tasto EXE e il record verrà cancellato.

Altrimenti, quando avete finito di editare e siete soddisfatti del record, premete il tasto EXE e l'intero nuovo record verrà memorizzato nel dispositivo corrente, il vecchio record sarà cancellato e l'Organiser vi riporterà al menu principale.

Se il record editato verrà memorizzato in un dispositivo diverso da quello in cui era originalmente memorizzato, il vecchio record non verrà cancellato.


6 CANCELLAZIONE DEI DATI

Talvolta può essere necessario cancellare uno o più records da un archivio. Per fare ciò scegliete CANCELLA dal menu principale nel solito modo. Lo schermo presenterà il messaggio:

CANCELLA A:  

Se ora premete il tasto EXE, il primo record nell'archivio corrente verrà trovato e visualizzato e quindi potrete esaminarlo usando i tasti cursore.

Se volete cancellare il record visualizzato, premete il tasto DEL. La prima riga dello schermo rimarrà immutata, ma l'ultima mostrerà il messaggio:

ELIMINA S/N

Premendo il tasto S il record verrà cancellato e sarà visualizzato il record successivo. Se non volete cancellare il record, premete il tasto N e verrà visualizzato il record successivo. Premendo ripetutamente il tasto EXE potete accedere ai successivi records.

È possibile anche, aggiungendo dopo il comando CANCELLA una stringa di caratteri, cancellare tutti i record che contengono quella particolare stringa; quindi comparirà il messaggio FINE DATI.

Per tornare al menu principale basta premere una volta il tasto ON/CLEAR.


7 DATAPAKS

I DISPOSITIVI

Sul retro del vostro Organiser (vedi Cap. 1) vi sono due dispositivi a stato solido. Quando acquistate il vostro Organiser questi due dispositivi vengono inseriti con coperture che proteggono le connessioni elettriche. Per questo motivo, se non avete inserito nell'alloggiamento un Datapak (o un pacchetto programmi), assicuratevi che sia inserito il coperchietto.

CAMBIO DEI DATAPAKS

Per consentire la loro installazione od estrazione, i Datapak hanno una superficie zigrinata. Cercate di non premere nessun tasto mentre togliete o inserite un Datapak (ciò si evita facilmente mettendo la macchina capovolta su una superficie piana, essendo la tastiera leggermente rientrante).

Per estrarre un Datapak premetelo leggermente spingendolo verso l'esterno. Per inserirlo, basta spingerlo nell'apposito alloggiamento, finchè non si senta uno scatto.

Mettete un'etichetta bianca sul vostro Datapak per poterlo identificare più tardi.

Sono disponibili Datapak con capacità di circa 16000, 32000 e 64000 caratteri (128000 sul modello XP) per i vari possibili usi. Potete tenere un'intera biblioteca di Datapak, suddivisa per argomenti. Così, per esempio, tutti i nomi, gli indirizzi e i numeri telefonici di cui potreste aver bisogno, possono essere facilmente contenuti in un Datapak (oltre 2000 voci fino a 30 caratteri l'una in un Datapak da 64K).

Quando inserite un nuovo Datapak nell'Organiser, la prima volta che proverete ad usarlo l'Organiser lo individuerà come Datapak non ancora usato e mostrerà il messaggio:

FORMATTO B:   ATTENDERE

L'Organiser sta semplicemente verificando la capacità del nuovo Datapak e si sta assicurando che sia completamente vuoto. Dopo 2 o 3 secondi lo schermo si pulirà e voi potrete continuare con qualsiasi operazione steste compiendo, ad esempio, REGISTRA o RICERCA. Potete allora o usare il Datapak che avete appena formattato, o sceglierne un altro premendo MODE finchè il dispositivo che volete usare sia indicato sullo schermo.

Per esempio, dopo avere inserito un record con lo schermo che mostra il messaggio REGISTRA A:, potreste voler inserire un nuovo Datapak nel dispositivo B: e memorizzare il record su di esso. Togliete il coperchietto dall'alloggiamento superiore sul retro della macchina (dispositivo B:) e inserite un nuovo Datapak. Sullo schermo apparirà:

REGISTRA A:Abrah Tel 01-010-0000

Premete MODE una volta:

FORMATTO B:   ATTENDERE

Dopo una breve pausa, sullo schermo apparirà:

REGISTRA B:Abrah Tel 01-010-0000

Premendo EXE memorizzerete l'informazione del vostro record sul Datapak indicato sullo schermo.

Ogni Datapak viene formattato una sola volta quindi, inserendo un Datapak che sia già stato formattato, potrete usarlo immediatamente.

Molte delle funzioni disponibili nel menu principale, come RICERCA e REGISTRA, possono essere eseguite o sulla memoria interna dell'Organiser o su uno dei due Datapak. La macchina li riconosce rispettivamente come dispositivi A:, B: e C:.

L'Organiser controlla Datapak siano stati inseriti e, al momento opportuno, presenterà solo le relative opzioni.

Quando avete usato un particolare dispositivo, l'Organiser suppone che vogliate continuare a usarlo finchè non ne sceglierete un altro.

Se non avete inserito nessun Datapak quando tentate di RICERCARE o REGISTRARE, il tasto MODE non avrà alcun effetto e il dispositivo A: rimarrà il dispositivo corrente.

CONFRONTOTRA MEMORIA INTERNA E DATAPAKS

La memoria interna dell'Organiser differisce dai Datapak per alcuni aspetti. La differenza più ovvia è che la memoria interna non può essere tolta come si può fare con i Datapak; la seconda differenza, tuttavia, è assai più importante.

Quando avete memorizzato dei records nell'Organiser (dispositivo A:), se volete CANCELLARE uno qualunque di questi, esso viene realmente tolto dalla memoria e lo spazio reso in questo modo disponibile può essere utilizzato per un altro record.

Per i Datapaks le cose sono diverse. Cancellare un record da un Datapak è come cancellare con una riga un brano in un libro. Il testo è sempre lì ed occupa uno spazio fisico, ma non è più leggibile.

Coi Datapaks il vantaggio è che potete averne quanti ve ne servono per costruirvi una biblioteca, con un Datapak diverso per ogni argomento. Essi sono completamente sicuri, facili da trasportare e non sono danneggiati da un'eventuale batteria scarica.

Coi Datapaks, se fate dei salvataggi o delle cancellazioni ripetute, utilizzate una capacità di memoria che prima o poi verrà esaurita. Perciò è opportuno evitare di usare comandi di REGISTRA e CANCELLA non necessari.

Comunque, per quanta attenzione facciate, prima o poi il Datapak sarà completamente pieno. La prossima volta che tenterete di REGISTRARE un'informazione su quel Datapak, l'Organiser emetterà il messaggio PACK PIENO. Ulteriori tentativi di memorizzare informazioni su quel Datapak produrranno lo stesso messaggio.

Anche se i Datapaks memorizzano le vostre informazioni in maniera permanente, è possibile ripulire un intero Datapak con un'operazione detta "formattazione". Si ottiene ciò con un'esposizione controllata a una sorgente di raggi ultravioletti con un'apposito apparecchio chiamato FORMATTATORE PSION.

Il Datapak riformato sarà completamente vuoto e quando verrà reinserito nella macchina verrà considerato tale e riformattato come se fosse nuovo.

Osservate che l'etichetta bianca sul lato posteriore di ogni Datapak serve per proteggerlo da un'eccessiva esposizione alla luce e deve essere tolta prima della riformattazione.

Il problema del Datapak che si "riempie" di informazioni che, anche se "cancellate", occupano ancora lo spazio, può essere risolto copiando il resto dell'informazione su un altro pack. Durante la copiatura i records e gli archivi cancellati vengono ignorati, così verrà copiata solo l'informazione voluta, poi il vecchio pack può essere riformattato col "formattatore Psion" e può essere usato di nuovo.


8 LA CALCOLATRICE

L'opzione CALC del menu principale serve per eseguire calcoli aritmetici anche molto sofisticati.

Scegliete CALC dal menu usando il tasto cursore e il tasto EXE o premendo il tasto C.

Sullo schermo apparirà:

CALC  

La tastiera sarà convertita automaticamente in modo SHIFT, così che ì tasti numerici saranno immediatamente accessibili e non richiedono l'uso del tasto SHIFT.

Gli operatori aritmetici fondamentali, +, -, / (divisione), * (moltiplicazione) e ** (elevamento a potenza) sono usati come in un calcolo scritto. Per l'ordine di precedenza di questi operatori si veda il Capitolo 23.

Potete ora inserire un calcolo sulla riga superiore dello schermo, proprio come lo scrivereste, per esempio battendo:

4*7/9

Premendo il tasto EXE sullo schermo apparirà:

4*7/9   =3.11111111111

Mentre l'espressione da calcolare viene visualizzata sulla riga superiore dello schermo, il risultato è presentato sulla riga inferiore. Se l'espressione è più lunga di 16 Caratteri, essa verrà fatta scorrere da destra verso sinistra. Nei calcoli si può usare un qualsiasi numero di livelli di parentesi.

Naturalmente solo le cifre significative del risultato (fino a 12) sono visualizzate, ma questa condizione può essere modificata ogni qualvolta sullo schermo appaia CALC:. Basta battere FIX=n, dove n è un numero tra 1 e 12. I risultati saranno allora presentati con quel numero di cifre decimali. Per ritornare al modo normale di presentazione, battere FIX= senza dare nessun numero.

Così, per esempio, se date il comando FIX=3, il calcolo di cui sopra darà come risultato 3.111.

FUNZIONI DELL'OPL

Nei vostri calcoli potete usare le funzioni matematiche che fanno parte del linguaggio OPL. Queste vi permettono di eseguire molte più operazioni di quelle che potreste eseguire su una normale calcolatrice. Ecco un esempio:

SIN(PI)/(3.8*COS(1.2))

Qui sono usate le funzioni SIN, COS e PI, ma possono essere usate tutte le funzioni numeriche. Quando si preme il tasto EXE sulla riga inferiore dello schermo comparirà un segno di uguale seguito dal risultato.

Se l'espressione da calcolare non è corretta, comparirà un messaggio di errore. Per tornare al punto dell'espressione dove l'errore è stato individuato basta premere il tasto SPACE. Il calcolo verrà rivisualizzato col cursore lampeggiante posizionato sul primo carattere che non è stato riconosciuto.

Per esempio, se avete inserito un carattere che non è nè un operatore aritmetico, nè richiama una procedura dal dispositivo corrente, ad esempio:

10*P/(22/7)

allora il cursore si fermerà sulla P, poichè il carattere non può essere riconosciuto dal calcolatore.

Nota. Il tasto di percentuale (%) non opera come l'equivalente tasto di una normale calcolatrice. Questo tasto serve solo per avere il carattere % da utilizzare nel linguaggio di programmazione, l'OPL. Per il calcolo di percentuali le espressioni vanno introdotte in forma estesa. Così, per esempio, per calcolare il 37 percento di 250 bisognerà scrivere:

37/100*250, o .37*250=92.5

MEMORIE DELLA CALCOLATRICE

L'Organiser possiede 10 memorie che possono essere usate sia per la calcolatrice che per i programmi in OPL.

Esse possono essere usate per memorizzare numeri da utilizzare in calcoli successivi; su di esse si possono eseguire addizioni, sottrazioni ed, infine, esse possono essere ripulite.

I numeri che vi sono memorizzati dalla calcolatrice, possono in seguito essere utilizzati da un programma e viceversa. Non ha importanza che l'Organiser venga spento tra un uso e l'altro, perchè il contenuto delle memorie è conservato finchè non si decide di ripulirle o finchè non si usi il comando AZZERA con la relativa opzione del menu principale.

Sia con la calcolatrice che nell'OPL, queste memorie vengono individuate coi nomi da M0 a M9; si possono usare sia lettere maiuscole che lettere minuscole.

Per memorizzare il risultato di un calcolo in una memoria, premete il tasto MODE quando il risultato è ancora sullo schermo. La riga superiore dello schermo mostrerà il messaggio:

M: premi 0-9

Ora premete uno dei tasti coi numeri, per esempio, 0 e la prima riga mostrerà:

M0: +,-,EXE,DEL

Ora potete scegliere tra 4 opzioni:

+Sommare il risultato sullo schermo alla memoria scelta.
-Sottrarre il risultato sullo schermo dalla memoria scelta.
EXEMemorizzare il risultato sullo schermo nella memoria scelta.
DEL Cancellare il contenuto della memoria.

Premete uno di questi tasti per eseguire una delle operazioni sopraelencate, oppure ON/CLEAR per tornare alla calcolatrice senza alcun cambiamento del contenuto delle memorie. Il calcolo sarà sempre visibile nella riga superiore e il risultato sulla riga inferiore.

Quando un numero è stato memorizzato in una delle memorie, esso può essere usato in un calcolo. Per esempio, l'espressione:

2+3+M0

sommerebbe 2, 3 e il contenuto della memoria M0.

Per accedere al contenuto di una particolare memoria, battete il nome di quella memoria (da M0 a M9) e premete il tasto EXE; il suo contenuto verrà visualizzato.

EDITARE UN RISULTATO

Per editare il vostro calcolo originale o per variarne un parametro, basta premere uno dei tasti cursore, il tasto DEL o il tasto EXE.

Se premete il tasto EXE, il risultato sparirà dalla riga inferiore e potrete editare l'espressione. Premendo i tasti cursore SINISTRO o DESTRO il risultato veni: cancellato e potrete editare la vostra espressione, ma il cursore si sarà mosso come se aveste premuto il tasto EXE e il tasto di quel cursore. Così, se viene premuto il tasto cursore SINISTRO, il risultato sparirà e il cursore si sposterà ora di un carattere dalla fine dell'espressione.

Se si preme il tasto DEL il risultato sparirà e l'ultimo carattere dell'espressione originale sarà cancellato. Premendo ulteriormente i tasti cursore SINISTRO o DESTRO l'espressione può essere modificata e quindi nuovamente eseguita.

Se volete usare il risultato di un'espressione come elemento di un'altra espressione, basta premere uno qualsiasi dei tasti degli operatori (+, -, *, /) e quel risultato verrà mostrato sulla riga superiore e potrà essere utilizzato per formare una nuova espressione.

Potete cancellare l'espressione corrente e/o il risultato in ogni momento premendo il tasto ON/CLEAR.

Premete di nuovo questo tasto per tornare al menu principale.

USO DELLE PROCEDURE CON LA CALCOLATRICE

Potete anche includere programmi che sono stati scritti nel linguaggio di programmazione dell'Organiser e memorizzati sul dispositivo corrente. Ogni procedura chiamata in questo modo può richiedere uno o più parametri che vanno dati in parentesi, od operare su una o più memorie della calcolatrice e restituirà un valore conte se si trattasse di una funzione numerica. Se sul dispositivo corrente fosse caricato il programma di nome FACT: che calcola il fattoriale di un numero, allora potreste includerlo come parte di un'espressione; per esempio, potreste scrivere:

587*2.883/(4+fact:(3))

Il valore 3 viene passato al programma. Il valore restituito è quindi sommato a 4 e il resto del calcolo è eseguito sul risultato.

Dalla calcolatrice i parametri vengono normalmente passati come numeri a virgola mobile. Per passare un intero in una procedura dovete usare la funzione INT dell'OPL nel modo seguente:

5/3+proc:(INT(10))


9 L'AGENDA

Uno degli usi standard più utili dell'Organiser è l'AGENDA che viene scelta dal menu principale nel solito modo con i tasti cursore e il tasto EXE o premendo il tasto A.

Quando si chiama la funzione AGENDA lo schermo viene ripulito e quindi viene presentata la prima scadenza rispetto all'ora e alla data correnti. L'agenda presenta scadenze ogni 30 minuti. Sullo schermo apparirà la scritta:

GIU:30:LUN:17.00

La prima volta che viene visualizzata una generica scadenza essa non conterrà alcun impegno e quindi, sulla riga inferiore, non sarà visualizzato nulla.

La data corrente dell'agenda può essere cambiata usando i tasti cursore SINISTRO e DESTRO. Premete il tasto DESTRO per avanzare nel mese, un giorno alla volta, fino alla fine del mese.

Se tenete premuti i tasti cursore, il comando si ripeterà automaticamente evitando di dover ogni volta premere il tasto. Se premete il tasto cursore DESTRO mentre l'agenda sta mostrando la scadenza per l'ultimo giorno del mese, allora passerete immediatamente al primo giorno del mese successivo. Per tornare indietro lungo i giorni del mese usate il tasto cursore SINISTRO.

Per muoversi lungo le scadenze di uno stesso giorno usate i tasti SU e GIU': così, per avanzare di mezz'ora premete il tasto GIU' e per ritornare indietro di mezz'ora premete il tasto SU.

MER | GIO | VEN   ------------------+------------------+------------------ GEN:01:MER:08.00 | GEN:02:GIO:08.00 | GEN:03:VEN:08.00  | | Compleanno Paola  ------------------+------------------+------------------ GEN:01:MER:08.30 | GEN:02:GIO:08.30 | GEN:03:VEN:08.30  | Dott. Rossi |   ------------------+------------------+------------------ GEN:01:MER:09.00 | GEN:02:GIO:09.00 | GEN:03:VEN:09.00  | | Meccanico   ------------------+------------------+------------------ GEN:01:MER:09.30 | GEN:02:GIO:09.30 | GEN:03:VEN:09.30  | (A) Dentista |   ------------------+------------------+------------------ GEN:01:MER:10.00 | GEN:02:GIO:10.00 | GEN:03:VEN:10.00  | Telefonare Maria | Linate  

Figura 5 L'Agenda

Immaginate l'agenda come un grande foglio diviso in caselle: lo schermo opera come una finestra che muovendosi sul foglio mostra il contenuto di una casella alla volta.

Questo modo di operare è detto INSERISCE ed è l'unico modo col quale potete introdurre nell'agenda delle variazioni. Per introdurre o cambiare un qualsiasi impegno dovete operare nel modo indicato qui di seguito.

Quando vi muovete lungo le scadenze dell'agenda, sulla riga inferiore dello schermo non comparirà nulla, poichè non avete ancora caricato nulla sull'agenda. Per introdure qualcosa basta che cominciate a digitare. Il cursore apparirà sulla riga inferiore dello schermo con "l'invito" EDITA e voi potrete battere il testo che avreste scritto su un'agenda normale. Se battete più di 16 caratteri, il testo, come avviene per tutte le righe troppo lunghe, verrà fatto scorrere verso sinistra.

È bene che le annotazioni siano brevi poichè esse occupano memoria preziosa ed inoltre quelle lunghe richiedono di essere fatte scorrere per essere lette.

In ogni caso ogni annotazione può essere lunga fino a 64 caratteri.

LA SVEGLIA

Quando avete battuto le vostre scadenze, premete il tasto EXE e l'Organiser vi chiederà se volete che una sveglia suoni al momento opportuno, per esempio:

GIU:30:LUN:17.00 AVVISO S/N

Se non volete che questo impegno sia segnalato da una sveglia premete o il tasto N o il tasto ON/CLEAR; se invece volete che la sveglia segnali la scadenza, battete il tasto S. Non servirà premere altri tasti. Lo schermo ora sarà:

GIU:30:LUN:17.00 MINUTI:15

Potete ora specificare quanti minuti prima dell'ora del vostro impegno debba suonare la sveglia. Per esempio, se lavorate vicino al vostro dentista sarà sufficiente che la sveglia suoni 5 o 10 minuti prima del vostro appuntamento perchè voi arriviate puntuali. Ma se dovete andare a prendere qualcuno all'aeroporto può risultare utile essere avvisati con maggior anticipo.

L'Organiser suggerisce 15 minuti come anticipo, ma questo valore può essere cambiato. Premete il tasto cursore SU per aumentare il numero di minuti o il tasto cursore GIU' per diminuirlo. Premendo questi tasti si cambia il numero di minuti di una cifra per volta e, come per le altre funzioni ora e data dell'Organiser, se tentate di diminuire il numero di minuti quando il numero mostrato sullo schermo è 0, la cifra tornerà a 59 minuti e viceversa.

Quando avete deciso con quanti minuti di anticipo volete che il vostro appuntamento sia segnalato, premete il tasto EXE e lo schermo ora mostrerà il testo sulla riga inferiore con l'indicazione che la sveglia è stata impostata, così:

GIU:30:LUN:17.00 (A)Dentista

Se il testo è più lungo di una riga dello schermo, allora l'indicatore della sveglia sarà fatto scorrere assieme al testo.

Se impostate la scadenza a un'ora od a una data passate, allora anche se inserite dei dati in quella scadenza, non avrete la possibilità di impostare la sveglia.

Quando sarà Fora, verrete avvisati da una serie di "bip". Inoltre la data e l'ora annotate appariranno sulla riga superiore dello schermo e l'impegno su quella inferiore. Al solito, se l'annotazione supera i 16 caratteri, essa verrà fatta scorrere sullo schermo.

Il promemoria rimarrà sullo schermo per un minuto, quindi tornerete a qualunque operazione steste eseguendo quando la sveglia aveva iniziato a suonare.

Potete comunque tornare immediatamente al vostro lavoro, anche prima che il minuto sia passato, premendo il tasto ON/CLEAR.

Una situazione che potrebbe verificarsi è quella in cui, quando la sveglia deve suonare, l'Organiser risulti spento. Fortunatamente, anche quando la macchina è spenta, essa mantiene sempre sotto controllo l'ora, la data e tutte le sveglie impostate.

Nel caso debba suonare una sveglia quando la macchina è spenta, la prima cosa che succede è che l'Organiser si accende da solo. Poi tutto si svolgerà come descritto sopra. Vi sarà un avviso sonoro, sulla riga superiore dello schermo appariranno data e ora dell'impegno, su quella inferiore l'impegno stesso.

Tutto ciò verrà visualizzato per un minuto, poi lo Organiser tornerà alle operazioni che stavate svolgendo quando la macchina era stata spenta. Durante quel minuto potete premere il tasto ON/CLEAR quando volete e la macchina tornerà immediatamente al punto di partenza.

Potrebbe anche darsi che abbiate impostato la sveglia per una certa ora, e che poi, a quell'ora non abbiate con voi l'Organiser. In questo caso la sveglia suonerà secondo le modalità descritte, però, quando dopo un minuto, il promemoria apparirà sullo schermo, voi non sareste lì a spegnere la macchina.

Niente paura! Quando saranno passati 5 minuti senza che nessun tasto sia stato premuto, l'Organiser si spegnerà automaticamente.

Dopo che la sveglia è suonata e che il promemoria è apparso sullo schermo, i dati inseriti per quella scadenza si conserveranno finchè voi non li cancellerete, ma sparirà l'indicatore di sveglia all'inizio dei dati.

SE PIU' SVEGLIE SI SOVRAPPONGONO

Poichè l'agenda è divisa in intervalli di mezzora, è facile che due segnali che vi ricordino in anticipo un impegno si sovrappongano. Per esempio, potreste impostare un segnale che vi avvisi di un impegno che avete alle 10 con 45 minuti di anticipo, cioè alle 09,15. Potreste, però, anche impostare un segnale 15 minuti prima di un appuntamento che avete alle 09,30, cioè, di nuovo, alle 09,15.

In un caso di questo genere l'Organiser segnalerà prima il primo impegno, poi il secondo.

COME ANNULLARE UNA SVEGLIA

Se in seguito, decideste di non voler più essere avvisati con un segnale acustico di un dato impegno, dovrete, prima di tutto, tornare a quella scadenza, quindi premete il tasto EXE e apparirà l'invito EDITA all'inizio del testo. Se ora premete di nuovo EXE vi sarà offerta l'opzione SVEGLIA S/N Premete il tasto N e la sveglia verrà annullata.

IL SOTTO-MENU DELL'AGENDA

Prima di approfondire la funzione agenda premete il tasto MODE per vedere tutta la gamma di opzioni disponibili. Lo schermo si pulirà e mostrerà un menu. Non è il menu che contiene RICERCA, REGISTRA e AGENDA. E' un sotto-menu. E'solo un menu di opzioni che riguardano unicamente l'agenda e che si vedono solo all'interno dell'agenda stessa.

Quando viene chiamato il sotto-menu AGENDA, lo schermo apparirà così:

INSERISCE LISTA  RICERCA CERCA

Vi sono altre opzioni oltre u queste, ma esse possono essere viste, come quelle del menu principale, solo scandendo il menu mediante i tasti cursore. Ecco l'intera gamma delle opzioni del sotto-menu agenda:

INSERISCE Questo è il modo in cui vi trovate quando do entrate per la prima volta nell'agenda, modo che vi permette di fissare gli impegni e di impostare una sveglia che suonerà quando sarà il momento opportuno.
LISTA Elenca tutte le scadenze in sequenza. Vi permette di vedere tutti gli impegni e gli appuntamenti semplicemente e subito.
RICERCA Come l'opzione RICERCA del menu principale, troverà subito ogni informazione con 3 o 4 caratteri di suggerimento.
CERCA Vi permette di accedere ad un qualsiasi dato.
REGISTRA Memorizza l'intero contenuto della vostra agenda su un Datapak.
PULISCE Vi permette di "liberare" l'agenda togliendo tutte le scadenze superate fino alla data e all'ora corrente
RICHIAMA Richiama il contenuto di un'agenda da un Datapak, sovrapponendolo al contenuto dell'agenda corrente.
DIR Legge l'elenco delle agenda su un Datapak.
CANCELLA Cancella un'agenda da un Datapak.

Le funzioni del menu vengono scelte esattamente come quelle del menu principale: spostatevi all'interno del menu coi tasti cursore e successivamente premete il tasto EXE oppure battete la prima lettera della funzione che volete scegliere.

INSERISCE

Questa scelta vi riporterà alla pagina dell'agenda che avete appena lasciato.

Basta premere il tasto EXE, quando il cursore è sulla I di INSERISCE o il tasto I. Premete ancora il tasto MODE e tornerete al menu dell'Agenda.

LISTA

La funzione LISTA viene scelta dal menu dell'agenda nel salito modo. Lo schermo si ripulirà e mostrerà la prima scadenza dell'agenda rispetto all'ora e alla data correnti. Così, per esempio se siamo alle 8 del 26 agosto, quando si sceglie l'opzione LISTA verranno mostrate tutte le future scadenze: non compariranno quelle ormai scadute. La prima scadenza oraria che contiene un impegno, ora e data, verrà visualizzata sulla riga superiore e l'impegno sulla riga inferiore. Se l'annotazione è più lunga della riga dello schermo, essa, dopo 2 secondi, verrà fatta scorrere verso sinistra così che tutta la riga possa essere letta completamente. Se quando è stato caricato l'impegno, è stata anche impostata una sveglia, il testo sulla linea inferiore dello schermo sarà preceduto da un indicatore che mostra che la sveglia è impostata. Lo schermo apparirà così:

GIU:18:GIO:12.00 (A)NP Compleanno

Premete di nuovo il testo EXE e apparirà la successiva scadenza dell'agenda e così via.

Quando l'ultima scadenza è stata visualizzata, premete ancora una volta il tasto EXE e verrà mostrato un messaggio di FINE AGENDA. Premete ancora il tasto EXE e tornerete alla prima scadenza.

RICERCA

La funzione RICERCA dell'agenda opera esattamente come l'analoga funzione RICERCA del menu principale. Per localizzare una particolare porzione di testo, scegliete, dal menu dell'agenda, RICERCA nel solito modo, premendo il tasto R o usando i tasti cursore e poi il tasto EXE.

CERCA

L'opzione CERCA viene usata per passare dalla data corrente dell'agenda ad una altra data e, quando viene effettuata la scelta dal menu dell'agenda nel solito modo, lo schermo mostra la data corrente:

1986 OTT 10  

Inizialmente il cursore lampeggia in corrispondenza dell'anno; per spostare il cursore sul mese o sul giorno del mese usate il tasto cursore DESTRO. Il tasto cursore SINISTRO sposterà indietro il cursore. L'anno, il mese, il giorno possono essere fatti avanzare premendo il tasto cursore SU, o fatti retrocedere premendo il tasto cursore GIU'. Quando raggiungete la data voluta premete il tasto EXE per passare a quella scadenza.

PULISCE

Talvolta può essere necessario cancellare dall'agenda scadenze ormai superate: questo può essere fatto quante volte volete con il vantaggio di liberare sul dispositivo A: spazio di memoria che altrimenti sarebbe inutilizzato.

Per fare ciò, basta scegliere nel solito modo, l'opzione PULISCE dal menu dell'agenda.

Lo schermo si ripulirà e mostrerà l'ora e la data della scadenza corrente e vi chiederà di confermare che tutti gli impegni dell'agenda, fino a questa data esclusa, siano cancellati. Lo schermo apparirà così:

AGO:09:GIO:08.00 ELIMINA SINO S/N

Se ora premete il tasto S tutti gli impegni dell'agenda prima della data e dell'ora correnti, quest'ultima scadenza esclusa - nel caso che vi sia -, verranno cancellati e tornerete al menu principale. Se decidete di non cancellare tutte queste scadenze, premete il tasto N e tornerete al menu dell'agenda; le scadenze dell'agenda resteranno intatte. Se premete qualsiasi altro tasto, diverso da S/N, esso non avrà effetto.

REGISTRA

Tutto il contenuto dell'agenda può essere memorizzato in qualunque momento sulla memoria interna dell'Organiser o su un Datapak. Per fare ciò scegliete l'opzione REGISTRA dal menu dell'agenda e sullo schermo apparirà:

REGISTRA A:  

Il tasto MODE può essere usato per scegliere un altro dispositivo. Quando il dispositivo richiesto è scelto, battete il nome di un archivio e premete il tasto EXE. Il contenuto dell'agenda verrà memorizzato sul dispositivo con quel nome. Questo contenuto può quindi essere ricaricato nella memoria interna con l'opzione RICHIAMA.

Un nome d'archivio può avere fino a 8 caratteri; deve cominciare con una lettera dell'alfabeto, ma il resto del nome può essere formato da lettere o numeri.

RICHIAMA

Quando il contenuto dell'agenda è stato memorizzato su un dispositivo, quell'agenda può essere, in seguito, riportata in memoria usando l'opzione RICHIAMA Scegliete l'opzione dal menu della agenda nel solito modo e la riga superiore dello schermo sarà:

RICHIAMA A:  

Il tasto MODE può essere usato per scegliere un altro dispositivo. Dopo aver scelto il dispositivo, potete battere il nome dell'archivio nel quale l'agenda era stata memorizzata. Quest'agenda verrà ritrovata sul dispositivo e andrà a sostituire l'agenda corrente. Lo schermo tornerà al menu dell'agenda.

DIR

Quando un certo numero di agende diverse è stato memorizzato, può darsi che ad un certo punto vogliate vedere i nomi di tutte le agende che sono su un dispositivo. Quando avrete scelto l'opzione DIR, la riga superiore dello schermo mostrerà:

DIR A:  

Il tasto MODE può essere usato per scegliere un altro dispositivo. Quando viene scelto il dispositivo richiesto, premete il tasto EXE e il nome della prima agenda memorizzata in quel dispositivo apparirà sulla riga superiore dello schermo. Premendo ancora EXE si otterranno le altre agende memorizzate su quel dispositivo.

Quando viene visualizzato il nome dell'ultima agenda sul dispositivo, viene dato il solito messaggio di "fine dati". Premete il tasto ON/CLEAR per tornare al menu dell'agenda.

CANCELLA

Per cancellare un'agenda memorizzata su un dispositivo, si usa l'opzione CANCELLA dal menu principale. L'opzione viene scelta nel solito modo e la riga superiore dello schermo sarà:

CANCELLA A:  

Per scegliere un altro dispositivo si può usare il tasto MODE. Quando il dispositivo richiesto è stato scelto, si può battere il nome dell'agenda memorizzata. Quell'agenda verrà cancellata dal dispositivo e lo schermo tornerà al menu dell'agenda.


10 LE SVEGLIE

L'opzione SVEGLIA del menu principale permette di impostare, per il periodo di una settimana, fino a otto sveglie individuali che possono suonare in qualunque momento del giorno. Ogni sveglia può essere impostata per ripetersi ogni settimana, ogni giorno, ogni ora.

L'opzione SVEGLIA viene scelta dal menu principale nel solito modo e, all'inizio, sullo schermo apparirà:

1) LIBERO   premi EXE

Le sveglie sono numerate da 1 a 8, ma possono essere disposte in qualsiasi ordine in ogni momento. Non è necessario impostare la numero 1 prima della numero 2 e così via. Per cambiare il numero delle sveglie premete i tasti cursore SU o GIU'.

Per impostare una qualsiasi sveglia premete il tasto EXE.

Lo schermo mostrerà allora il numero della sveglia, il giorno della settimana e l'ora. Si possono impostare sveglie per ciascuno dei 7 giorni, compreso il giorno corrente. Ciò significa che si possono impostare sveglie individuali per una settimana.

Sullo schermo apparirà:

1) MER 12.25  

con il cursore posizionato sul giorno della settimana.

Il giorno può essere cambiato premendo il tasto cursore GIU' Per spostarvi sulle ore o sui minuti premete i tasti cursori DESTRO e/o SINISTRO

L'ora e i minuti possono essere cambiati come il giorno usando il tasto cursore SU per avanzare e il tasto cursore GIU' per retrocedere.

Quando l'ora voluta è stata impostata, premete il tasto EXE e il cursore sparirà. Per tornare al menu principale premete il tasto ON/CLEAR.

Quando una sveglia è stata impostata potete spostarvi sulla successiva premendo il tasto cursore GIU'

Questa può essere, a sua volta, impostata esattamente come è stata impostata la prima.

SVEGLIE RIPETUTE

Si può impostare ogni sveglia in modo che si ripeta ogni settimana, ogni giorno od ogni ora. Quando si è impostata l'ora della sveglia, come detto sopra, premete il tasto MODE e una R apparirà sotto la parte dell'ora dove è posizionato il cursore.

Potete ora spostare l'indicatore di ripetizione o sul giorno, così che la sveglia suoni ogni settimana in quel giorno; o sull'ora, e la sveglia suonerà ogni giorno a quell'ora; o sui minuti, e la sveglia suonerà ogni ora a quei minuti.

Per confermare l'impostazione scelta, premete il tasto EXE.

Potete ora tornare al menu principale, come detto sopra, premendo il tasto ON/CLEAR.

Per eliminare la ripetizione, scegliete prima la sveglia nel modo già descritto; premete quindi il tasto EXE e il tasto MODE: la R verrà rimossa e la sveglia non sarà ripetuta.

COME DISATTIVARE LE SVEGLIE

Scegliete prima la sveglia che deve essere disattivata, secondo il modo descritto. Premete quindi il tasto DEL e la sveglia verrà disattivata. Premete, infine, il tasto ON/CLEAR per tornare al menu principale.


11 PROG

L'Organiser possiede un linguaggio interno chiamato OPL (Organiser Programming Language). Questo linguaggio di programmazione è veloce, completo e particolarmente adatto per molte applicazioni, comprese l'elaborazione dei dati e la gestione di archivi come quelli creati attraverso il menu principale.

Esso possiede un insieme completo di comandi che comprende funzioni matematiche e scientifiche e strumenti per la gestione degli archivi.

Il linguaggio viene descritto in dettaglio nella seconda parte di questo manuale dove troverete, oltre alla definizione dei comandi e delle funzioni disponibili, anche una spiegazione esauriente delle strutture e dei metodi di programmazione.

Oltre agli esempi che appaiono nel testo per illustrate argomenti specifici, troverete anche un capitolo di programmi che sono non solo utili di per se stessi, ma che mostrano l'uso di tecniche che consentono di sfruttare tutte le potenzialità del linguaggio.

PANORAMICA DEL LINGUAGGIO

L'OPL è un linguaggio basato su procedure. Un programma consiste di un certo numero di procedure. La prima procedura può chiamare un'altra procedura che, a sua volta, può chiamarne un'altra ancora e così via.

Non vi è limite al numero di procedure che possono essere chiamate.

Ogni procedura è costituita da un certo numero di linee di programma che possono contenere una o più istruzioni per l'Organiser. Le linee che contengono più di un'istruzione, le linee multi-istruzione, contengono le differenti istruzioni separate le une dalle altre da uno spazio e da due punti (:):

istruzione :istruzione :istruzione

Una procedura può passare valori alle procedure chiamate che, a loro volta, possono restituire valori alle procedure chiamanti.

I comandi e le funzioni che costituiscono il linguaggio comprendono strutture per basi di dati e vi permettono di scrivere programmi che, con un alto livello di sofisticazione, creano e leggono archivi di dati.

L'OPL verrà approfondito nella seconda sezione di questo manuale a partire dal Capitolo 17.


12 INFO

L'opzione INFO del menu principale vi informa circalo spazio ancora disponibile nella memoria interna dell'Organiser o di un qualsiasi Datapak installato.

Scegliete INFO dal menu principale usando i tasti cursore e poi il tasto EXE, oppure premendo il tasto I.

La riga superiore dello schermo mostrerà il numero di bytes (un byte può contenere un carattere) nella memoria interna dell'Organiser. La riga inferiore mostrerà le porzioni di memoria occupate, espresse in termini percentuali della memoria totale.

Il modello XP dell'Organiser possiede una memoria interna, detta anche RAM (Random Access Memory = memoria ad accesso casuale), di 32768 bytes (8192 nel modello CM). Una piccola parte di questa, però, viene utilizzata dalla macchina per gestione interna.

Se avete un Datapak installato in B:, un'agenda e dei dati, la riga inferiore mostrerà qualcosa di simile:

AGENDA 4% PACK A: 15% PACK B: 36% LIBERO 81%

Lo spazio di memoria occupata sarà il 4% della RAM per l'agenda; il 15% della capacità per i dati sul pack A: e il 36% della capacità per i dati sul pack B:. Ciò lascia libero un 81% di RAM come si vede nell'ultima parte della riga.

Questo messaggio viene fatto ricircolare automaticamente finchè non si prema il tasto ON/CLEAR

L'agenda attiva risiede sempre nella memoria interna dell'Organiser, diversamente dalle agende REGISTRATE che possono essere immagazzinate su un Datapak. Ciò significa che se voi fate un uso estensivo della funzione di agenda, la memoria che avete nel dispositivo A: disponibile per altre attività, diminuirà in proporzione.

Se in un qualunque momento la macchina individua un Datapak che non era stato inizializzato, l'Organiser procederà automaticamente alla sua inizializzazione.


13 COPIA

La funzione COPIA del menu principale serve per copiare archivi di dati da un dispositivo ad un altro: la copiatura può essere fatta dalla memoria interna dell'Organiser ad un Datapak e viceversa, o da un Datapak ad un altro. Per copiare programmi scritti nel linguaggio di programmazione dell'Organiser, l'OPL, vedere la funzione COPIA al Capitolo 31.

Scegliete, nel solito modo, COPIA dal menu principale usando i tasti cursore o premendo il tasto C finchè il cursore si fermi sulla prima lettera di COPIA. Quando premete il tasto EXE sulla riga superiore dello schermo apparirà la scritta:

DA

A questo punto dovrete battere il nome di un dispositivo (cioè A:, B: o C:) e potete anche battere un nome d'archivio. Questo individua l'origine.

Dopo che avete introdotto, il nome del dispositivo e il nome dell'archivio, lo schermo vi chiederà, sulla riga inferiore, il dispositivo di arrivo e il nome dell'archivio:

A

Dovete ora specificare il dispositivo d'arrivo e, di nuovo, potete specificare un nome d'archivio.

Alla richiesta DA, se voi specificate il nome del dispositivo senza dare un nome d'archivio, allora tutti gli archivi dati sul dispositivo d'origine verranno copiati su quello d'arrivo. L'informazione viene ricopiata archivio per archivio. Se sul dispositivo d'arrivo è già presente un archivio con lo stesso nome di quello che viene copiato, allora tutti i records che vengono copiati verranno aggiunti alla fine di quell'archivio già presente sul dispositivo di arrivo.

Così, per esempio, se il vostro archivio MAIN sul dispositivo A: contiene 10 records e voi decidete di copiare tutti gli archivi da A: a B:, allora tutti i records dell'archivio MAIN presente in A: saranno aggiunti a quelli dell'archivio MAIN di B:. Ogni archivio sul dispositivo di origine verrà trattato nello stesso modo.

Nota L'archivio col nome MAIN viene creato automaticamente dall'Organiser quando usate l'opzione a livello alto REGISTRA. Essa è interrogata con l'opzione a livello alto RICERCA.

Se sul dispositivo d'origine vi sono archivi che non hanno corrispondenti sul dispositivo d'arrivo, allora su quest'ultimo saranno creati dei nuovi archivi con quegli stessi nomi.

Se alla richiesta DA, oltre al nome del dispositivo battete anche un nome di archivio, allora solo quell'archivio verrà copiato sul dispositivo d'arrivo.

Quando si copia solo un archivio, se fornire un nome d'archivio alla richiesta A, l'archivio verrà copiato sul dispositivo d'arrivo in un archivio con quel nome.

Nel caso di grandi quantità di informazioni da trasferire, l'operazione di copia può richiedere vari minuti: il tempo dipende dal numero e dalla lunghezza dei records degli archivi d'origine.


14 AZZERA

Questa opzione vi permette di cancellare tutte le informazioni nella memoria interna dell'Organiser. Tutte le scadenze dell'agenda andranno perse assieme agli archivi ed alle procedure memorizzate sul dispositivo A:.

I dati registrati nei Datapak, invece, saranno conservati e non verranno danneggiati da questa opzione.

Scegliete AZZERA dal menu principale e sullo schermo apparirà:

I DATI ANDRANNO  PERSI- PREMI DEL

Se non volete azzerare la macchina, premete il tasto ON/CLEAR e tornerete al menu principale con tutti i dati intatti. Altrimenti premete il tasto DEL e lo schermo presenterà la richiesta:

SICURO   PREMI S/N

Premete il tasto N e tornerete al menu principale e tutti i dati saranno conservati. Se, invece, siete certi di voler cancellare tutti i dati nella macchina, premete il tasto S. Tornate quindi al menu principale.


15 CONSIDERAZIONI SUI RECORDS

Prima di inserire informazioni con l'istruzione REGISTRA, ricordatevi che esse, prima o poi, andranno ritrovate e quindi bisogna organizzarle in modo da facilitarne la ricerca. Alcuni punti da ricordare sono:


16 PERSONALIZZAZIONE DEL MENU

RICERCA REGISTRA AGENDA CALC PROG

Quando accendete il vostro Organiser, il menu apparirà come mostrato sopra. Questo si chiama il menu standard. Potete, comunque, cambiare l'ordine delle voci che appaiono nel menu, o cancellarle del tutto.

L'unica voce del menu che non può essere tolta è SPEGNE ed essa è sempre l'ultima voce. L'Organiser non vi permetterà di aggiungere altro dopo SPEGNE.

Se cancellate una delle funzioni standard del menu come RICERCA o REGISTRA, potete sempre reinserirla dopo.

Non siete, però, obbligati a rimetterla nello stesso posto dal quale era stata tolta. Ciò vi permette di riordinare il menu nell'ordine che preferite.

Per esempio, se usate l'Organiser come agenda, allora può essere comodo porre la funzione AGENDA in prima posizione sul menu cui potete accedere più facilmente quando accendete l'Organiser.

CANCELLAZIONE DI VOCI DEL MENU

Per eliminare una voce del menu, basta mettere il cursore sulla sua prima lettera, nel solito modo, e poi premere il tasto DEL. Così, per esempio, se volete togliere RICERCA dal menu, ponete il cursore sopra quella voce del menu, premete il tasto DEL e lo schermo apparirà così:

RICERCA   ELIMINA S/N

La riga superiore mostra la voce da eliminare dal menu e la riga inferiore vi chiede di confermare che effettivamente volete eliminare quella voce.

Potreste però cambiare idea: in tal caso premete il tasto N e tornerete al menu principale senza aver eliminato alcunchè. Se, invece, premete il tasto S il menu verrà riproposto senza più l'opzione RICERCA.

Quell'opzione non è, però, persa per sempre. Se ora volete inserire nel menu una voce chiamata RICERCA, l'Organiser riconoscerà che voi intendete la funzione standard con quel nome, anche se ora potrebbe essa trovarsi in un posto diverso. Così, quando scegliete quell'opzione, avrete a disposizione la normale opzione RICERCA.

Ciò significa, quindi, che anche se cancellate dal vostro menu una delle voci standard, non potete inserire una delle vostre procedure con lo stesso nome, semplicemente finireste col ritrovarvi la funzione standard che ha quel nome.

Analogamente, se tentate di inserire un'opzione con un nome che già esiste nel menu, l'Organiser ve lo impedirà.

Nota. Quando usate il linguaggio di programmazione dell'Organiser, potete dare alle vostre procedure nomi già presenti nel menu, ma queste non saranno nè visibili, nè disponibili sul menu principale. Una descrizione completa delle procedure e del linguaggio di programmazione dell'Organiser si trova dal Capitolo 17 in avanti.

SOSTITUZIONE DELLE VOCI DEL MENU

Per sostituire una voce del menu, che sia stata cancellata, nella stessa posizione o in qualsiasi altra, ponete, per prima cosa, il cursore nella posizione in cui volete far comparire quella voce.

Se premete il tasto MODE lo schermo presenterà il messaggio:

INSERISCI VOCE  

Potete ora battere il nome di ciò che volete inserire e premete, poi, il tasto EXE La nuova voce apparirà allora in quella posizione del menu, spostando le voci seguenti di una posizione verso destra.

Così, se avete cancellato RICERCA dalla sua posizione in alto nel menu e se l'avete reinserita più in basso, l'Organiser riconoscerà che questa "nuova" voce è in realtà una delle funzioni standard e potrà essere richiamata dalla sua nuova posizione.


17 INTRODUZIONE ALL'OPL

Il Vostro ORGANISER è un potente calcolatore, e come tutti i calcolatori, per funzionare si basa su un insieme di istruzioni.

Il linguaggio OPL (Organiser Programming Language) è messo a disposizione dall'opzione PROG del menu principale. Utilizzando un insieme completo di comandi flessibili, esso permette di scrivere, editare, registrare, mandare in esecuzione e copiare programmi.

Le istruzioni vengono fomite al calcolatore come una lista di operazioni da eseguire e di comandi. Tutti questi appartengono a quel che si chiama il linguaggio di programmazione del calcolatore.

Quel che fa sì che un calcolatore sia qualcosa di realmente utile, non è tanto la sua capacità di eseguire una serie di istruzioni, quanto la capacità che esso ha di memorizzare queste istruzioni per eseguirle in un tempo successivo.

Un programma OPL consiste di una o più procedure o segmenti. A ciascuna procedura deve essere assegnato un nome univoco in modo che essa possa essere conservata (salvata), richiamata, editata e mandata in esecuzione.

Un programma semplice può consistere di una sola procedura; programmi più complessi, invece, sono normalmente costituiti da numerose procedure delle quali una costituisce la procedura principale o procedura a livello più alto.

La procedura principale controlla le altre procedure richiamandole quando esse devono svolgere le loro specifiche funzioni. Le procedure possono anche essere usate come funzioni numeriche per mezzo dell'opzione CALC del menu principale.

Il modo più efficiente di usare l'OPL è quello di scrivere procedure brevi che possano essere testate singolarmente; in seguito, quando esse sono completamente operative, esse possono essere connesse fra di loro per formare il programma completo.

Ciascuna procedura, più o meno lunga, a seconda delle necessità, dovrebbe svolgere una sola funzione: in questo modo programmi che debbono svolgere funzioni simili possono utilizzare la stessa procedura. Si evita in tal modo di avere due procedure diverse in due posti diversi per fare lo stesso lavoro.

In questa sezione del manuale ci si riferirà a programmi costituiti di più procedure; tutti i punti trattati, tuttavia, saranno egualmente applicabili anche a quei programmi costituiti da una sola procedura.

IL MENU PROG

Quando si seleziona l'opzione PROG dal menu principale viene presentato un nuovo menu che contiene le seguenti voci:

EDITA/LISTA/DIR/NUOVO/PARTE/CANCELLA/COPIA

Queste opzioni possono essere scelte, analogamente alle opzioni del menu principale, battendo la lettera iniziale dell'opzione scelta oppure utilizzando i tasti cursore ed il tasto EXE.

EDITA Consente di alterare e di salvare nuovamente una procedura preesistente permettendo in tal modo di apportare cambiamenti, miglioramenti o correzioni a procedure non corrette o con "bachi":
LISTA Permette di ottenere su un'unità periferica, ad esempio su una stampante, il listato di una procedura.
DIR Visualizza su una qualsiasi unità di uscita l'elenco di tutte le procedure.
NUOVO Permette di scrivere nuove procedure e di caricarle o nella memoria interna dell'Organiser o su un dispositivo Datapak.
PARTE Manda in esecuzione una procedura.
CANCELLA Cancella (elimina) una procedura da un dispositivo.
COPIA Copia una procedura o tutte le procedure su un altro dispositivo.

18 CREARE UNA PROCEDURA

Quello che segue è un semplice esempio di procedura:

now: CLS PRINT "SONO LE ",HOUR;":";MINUTE GET

Il nome della procedura è now:. Essa ripulisce lo schermo dell'Organiser e visualizza l'ora e i minuti.

L'ora rimane sullo schermo fino a che non si preme un tasto qualsiasi.

In questo capitolo vi verrà mostrato come caricare questa procedura nel vostro Organiser, come salvarla e come usarla.

Scegliete dal menu l'opzione NUOVO; sullo schermo appare:

NUOVO A:  

Il nome del dispositivo segue la parola NUOVO; in questo caso si tratta del dispositivo A:. Sebbene in tutto questo capitolo ci si riferisca sempre al dispositivo A: (la memoria interna) la spiegazione vale anche per gli altri dispositivi (Datapak). (Ricordarsi di premere il tasto MODE per cambiare dispositivo).

La prima cosa richiesta è il nome della nuova procedura. Questo può avere una lunghezza massima fino ad 8 caratteri e deve iniziare con una lettera. I rimanenti caratteri possono essere lettere o cifre. Battete il nome now come nome della vostra prima procedura.

Quando premete il tasto EXE, il nome della procedura apparirà sulla prima riga dello schermo seguito da due punti. Il cursore, alla fine del nome della procedura, apparirà intermittente.

NOW:_  

Premete il tasto EXE per muovere il cursore sulla riga successiva: potete ora iniziare a battere i comandi. (Il cursore si trova, inizialmente, posizionato alla fine del nome della procedura per un motivo che sarà spiegato più tardi).

Alla fine di ogni riga premere il tasto EXE per indicare che la riga è terminata.

Iniziate con il comando CLS. Questa è un'istruzione dell'OPL per rimuovere tutti i caratteri dallo schermo. Quando avete battuto CLS e premuto il tasto EXE, il testo sullo schermo si sposterà di una riga verso l'alto, lasciando il cursore all'inizio di una riga bianca pronto per il prossimo comando.

Ora, battete questa linea facendo molta attenzione:

PRINT "SONO LE",HOUR;":";MINUTE

Assicuratevi che la riga appaia scritta sullo schermo esattamente come appare qui. I linguaggi per calcolatori sono molto "pignoli" per quanto riguarda il modo in cui voi date i comandi e, persino gli spazi tra le varie parti di un comando, possono essere importanti quanto il comando stesso.

La riga è lunga più di 16 caratteri; perciò essa slitterà sullo schermo (scroll) quando oltrepasserete i limiti di questo per consentirvi di terminarla.

Diamo un'occhiata a questa linea e cerchiamo di capire che cosa fa. La prima parte, cioè l'istruzione PRINT, indica all'OPL che siete pronti per introdurre qualcosa che volete venga visualizzato sullo schermo.

Questa prima parte è seguita da uno spazio e poi da un testo compreso tra virgolette: queste indicano il testo da stampare e la sua esatta lunghezza.

Nel linguaggio dei calcolatori una lista di caratteri come questa è chiamata STRINGA. Una qualsiasi stringa delimitata da virgolette sarà stampata esattamente come appare.

La parte successiva della linea, HOUR, è una funzione Che cosa siano esattamente le funzioni e come vadano usate sarà spiegato in un capitolo successivo, per ora è sufficiente sapere che questa funzione mostra sullo schermo l'ora ricavandola dall'orologio interno del sistema.

Il carattere successivo della linea, un punto e virgola, indica che il testo che lo segue nell'istruzione dovrà essere stampato immediatamente di seguito al testo precedente, senza alcuno spazio di separazione.

Il nuovo testo da stampare è ancora una stringa, ma questa volta è una stringa formata da un solo carattere, un :, anch'esso deve essere inserito tra virgolette e apparirà sullo schermo immediatamente dopo l'ora.

L'ultima parte della linea, infine, è un'altra funzione: MINUTE. Essa permette di ottenere dall'orologio del sistema i minuti; questi verranno stampati sullo schermo sulla stessa linea dell'ora e completeranno la ora richiesta.

La linea successiva, GET, è un'altra funzione che, in questo caso, pone il sistema in attesa che venga premuto un tasto della tastiera. Quando viene premuto un tasto qualsiasi, l'Organiser riprende l'esecuzione della restante parte del programma. Questo permette che il messaggio che voi avete fatto scrivere rimanga sullo schermo fino a quando voi non premete un tasto. Finchè ciò non avviene, il resto della procedura non sarà eseguita.

In questo esempio non vi sono altre istruzioni per cui il programma termina.

In qualsiasi momento durante l'introduzione di un programma, usando i tasti cursori, è possibile tomate ad una linea precedente per apportare dei cambiamenti. Per tornare alla linea precedente, basta premere il tasto SU; a questo punto essa potrà essere editata nel modo usuale.

Nel caso voleste inserire tra due linee una nuova linea, basterà posizionare il cursore all'inizio della linea dove volete fare l'inserimento e premere il tasto EXE.

TRADURRE UNA PROCEDURA

Quando una procedura è stata caricata nell'Organiser, essa è presente nella memoria della macchina nella stessa forma in cui è stata introdotta. A questo punto avete tre possibilità (opzioni):

TRADtradurre la procedura in una forma che l'OPL è capace di eseguire;
REGISTRAregistrare la procedura, così come è, su un dispositivo;
ABBANDONAabbandonare la procedura che è appena stata caricata.

Per fare apparire il menu per la scelta fra queste tre opzioni, premete il tasto MODE. Lo schermo verrà ripulito e quindi mostrerà:

TRAD REGISTRA   ABBANDONA

Questo è un sotto-menu analogo al menu PROG: la scelta viene fatta al solito modo; l'unica differenza consiste nel fatto che, dopo aver effettuata la scelta, siete riportati automaticamente al menu PROG.

ABBANDONA

Quando, dopo aver caricato un NUOVO programma, scegliete l'opzione ABBANDONA, vi viene presentato il seguente messaggio:

ABBANDONA   SICURO S/N

Se premete il tasto S, l'intera procedura caricata sino a quel momento viene eliminata; tutte le procedure caricate precedentemente e che siano state salvate o tradotte (si veda più sotto) rimangono. Se, invece, premete il tasto N, siete riportati automaticamente all'editore potete continuare ad editare la procedura.

Nota Una volta che una procedura sia stata abbandonata col comando ABBANDONA, non è più possibile recuperarla; perciò assicuratevi che questo sia proprio ciò che intendete fare.

TRAD

Dopo aver caricato l'esempio precedente, scegliete dal menu TRAD/REGISTRA/ABBANDONA l'opzione TRAD: la procedura verrà tradotta internamente in una forma che l'OPL è in grado di eseguire. Durante questo processo che dura pochi secondi, sullo schermo apparirà un messaggio che indica che è in corso la traduzione.

Quando la procedura è stata tradotta, sullo schermo apparirà il messaggio REGISTRA A: seguita dal nome della procedura come mostrato qui sotto:

REGISTRA A:now  

Potete ora salvare la procedura su qualsiasi dispositivo disponibile (la memoria interna oppure un Datapak). Per cambiare dispositivo premete il tasto MODE, premete poi il tasto EXE per eseguire il salvataggio.

Quando una nuova procedura viene salvata su un qualsiasi dispositivo, viene salvato anche il testo originale: ciò significa che sul dispositivo sono presenti una versione del programma che può essere eseguita immediatamente ed una versione che può essere editata.

Entrambe le versioni sono registrate con lo stesso nome e, quindi, possono essere considerate come costituenti una singola entità.

Se durame il caricamento avete commesso un errore di battitura, durante l'operazione di traduzione l'OPL, probabilmente, lo individuerà. Per esempio, se invece di PRINT avete battuto PRONT oppure se avete dimenticato una copia di virgolette che delimitano il testo dopo il comando PRINT, l'OPL se ne accorgerà. Se però la procedura contiene degli errori logici, questi non si faranno sentire fino a che la procedura non sarà mandata in esecuzione. È compito vostro assicurarvi che nella procedura non siano presenti errori logici.

Se durante la traduzione viene rivelata la presenza di un errore, il testo della procedura viene, automaticamente, ripresentato e il cursore si posizionerà sulla linea che contiene l'errore in corrispondenza del primo carattere di quella parte di testo che contiene l'errore.

A questo punto potete editare alla solita maniera la linea di testo e apportare le correzioni in modo che possa essere accettata dall'OPL, dopo di che premete il tasto MODE per ritornare al menu TRAD/REGISTRA/ABBANDONA e scegliete di nuovo l'opzione TRAD.

Questa volta, se l'OPL non troverà altri errori, la traduzione verrà completata con successo e sullo schermo apparirà il messaggio REGISTRA.

REGISTRA

Se avete caricato solo in parte una procedura e se volete riprenderla in un secondo tempo per completarla o per apportare delle modifiche, allora dovete scegliere l'opzione REGISTRA del menu TRAD/REGISTRA/ABBANDONA

Questa opzione vi consente di salvare il testo della procedura, esattamente come l'avete battuta, evitando di sprecare memoria per un'inutile versione tradotta.

Lo schema riportato qui sotto mostra la differenza tra TRAD e REGISTRA

Fig. 6 TRAD, REGISTRA e ABBANDONA

Quando una procedura, invece di essere tradotta viene semplicemente salvata non viene fatto nessun controllo per identificare eventuali errori: il testo viene salvato esattamente come è stato scritto. Il controllo degli errori viene fatto solo durante l'operazione di traduzione.

Nota Salvare procedure su Datapaks comporta l'occupazione di spazio che può essere recuperato solo quando il Datapak viene riformattato con lo Psion Formatter. L'uso più economico dei Datapaks è quello di sviluppare i programmi utilizzando la memoria interna dell'Organiser, cioè il dispositivo A:. Quindi, anche se la procedura richiedesse più versioni per operare correttamente, nessuna operazione di editazione comporterà l'uso di spazio su un Datapak.

Se una procedura che è registrata sul dispositivo A: viene editata, ogni volta che essa viene salvata o tradotta, si cancella completamente la versione precedente; con i Datapaks le versioni precedenti rimangono registrate, ma non sono più accessibili: occupano solo dello spazio!

Quando poi si è prodotta la versione corretta di una procedura, questa può essere copiata su un Datapak utilizzando l'opzione COPIA del menu PROG. (Vedi cap.31)

EDITARE UNA PROCEDURA

L'opzione EDITA del menu PROG vi permette, ad esempio, di riprendere una procedura scritta a metà per completarla. Dopo aver fatto la scelta dal menu, sullo schermo appare la scritta:

EDITA A:  

Battete il nome della procedura che volete editare e premete il tasto EXE: sullo schermo sarà visualizzata la procedura e voi potrete aggiungere od eliminare linee o introdurre cambiamenti al testo.

Quando la procedura sarà completata, usate l'opzione TRAD dal menu TRAD/REGISTRA/ABBANDONA per tradurla, come spiegato prima.


19 COME MANDARE IN ESECUZIONE UNA PROCEDURA

Una volta impostata correttamente una procedura, potete mandarla in esecuzione. In altre parole, potete dire al vostro OPL che volete che esso esegua quella particolare serie di istruzioni.

Quando dal menu PROG viene scelta l'opzione PARTE, sullo schermo apparirà:

PARTE A:  

Potete ora inserire il nome di una procedura che sia presente sul dispositivo A.

Per continuare con l'esempio del Cap.18, battete il nome now e premete il tasto EXE.

Lo schermo si ripulirà e quindi mostrerà, a seconda dell'ora, qualcosa di simile:

SONO LE 16:35  

L'OPL manderà quindi in esecuzione la riga successiva della procedura, in questo caso, GET.

Questa istruzione mantiene il sistema in attesa finchè sulla tastiera non verrà battuto un tasto qualsiasi.

Non è importante quale tasto verrà battuto, esso non sarà nè ricordato, nè registrato; questa istruzione, infatti, ha solo lo scopo di darvi la possibilità di leggere lo schermo e di decidere quando continuare.

Quando premete un tasto, l'OPL riconoscerà che la procedura è terminata e l'Organiser tornerà al menu PROG.

Questo è un esempio piuttosto facile, adatto per la vostra prima procedura; gli esempi del cap.32 saranno alquanto più complessi. Si procederà, tuttavia, un passo alla volta e ciò vi permetterà di apprendere tutte le possibilità che l'OPL vi offre e di sfruttare al massimo il vostro Organiser.


20 LE VARIABILI

Una variabile non è altro che uno spazio di memoria a cui è stato assegnato un nome e in cui il vostro programma può immagazzinare un numero o un testo. Si potrebbe scrivere, ad esempio come si fa in algebra, X=10.

In questa espressione X è una variabile numerica.

Il programma memorizza il valore 10 nello spazio di memoria identificato dal nome X. Successivamente potrete cambiare il valore di X dicendo X=X-1. In algebra, una affermazione di questo tipo non avrebbe senso, poichè nessun numero può essere uguale a se stesso meno 1. Tuttavia, molti linguaggi di calcolatori, e fra questi l'OPL, danno al segno di uguale una diversa interpretazione.

Il segno di uguale significa diventa uguale a, così, la parte sinistra dell'equazione diventa uguale a quella destra. Quindi X=X-1 significa che X diventa uguale al valore originale di X, diminuito di 1.

I NOMI DELLE VARIABILI

I nomi delle variabili possono essere lunghi fino a 8 caratteri, alfabetici o numerici, e devono sempre iniziare con una lettera. Ciò vi permette di usare per le variabili nomi che abbiano un qualche significato, come ETA' o PREZZO. I nomi possono anche contenere numeri; per esempio a1 è un nome valido, ma il primo carattere deve essere alfabetico.

DICHIARAZIONE DELLE VARIABILI

Prima di continuare il discorso sulle variabili e su ciò che esse possono fare per voi, dovete imparare come informare l'OPL che state per usarle. Tutte le variabili devono essere dichiarate prima di essere usate.

Ecco una semplice procedura:

nomeprocedura: GLOBAL a,b,c a=1.2 b=2.7 c=3 PRINT a+b+c GET

La prima riga del programma di questa procedura contiene il comando GLOBAL. Esso dichiara le variabili che saranno usate nel programma.

Ogni variabile usata nel programma occupa uno spazio di memoria. Per informare l'OPL di quanto spazio di memoria deve mettere a disposizione, all'inizio del programma o della procedura dovete dichiarare tutte le variabili che avere intenzione di usare.

Questo argomento verrà approfondito più avanti.

Le successive tre righe della procedura definiscono i valori che saranno assegnati alle variabili a, b e c.

Osservare che i primi due numeri, quelli assegnati ad a e b sono decimali. Essi sono numeri a virgola mobile. Tutti i numeri a virgola mobile sono memorizzati con una precisione di 12 cifre e devono essere compresi tra più o meno 1E100 (estremi inclusi).

L'ultima riga della procedura somma i valori delle 3 variabili e fa comparire il risultato sullo schermo. In questo caso il risultato è 6.9.

I NUMERI INTERI

L'OPL accetta due tipi di variabili numeriche, le variabili intere e quelle a virgola mobile.

Un numero intero è un numero come 10 o 537 e, a differenza di un numero a virgola mobile o decimale, non ha il punto decimale.

L'uso delle variabili intere ogni qualvolta sia possibile, rende l'esecuzione dei programmi di gran lunga più veloce che non l'uso di variabili a virgola mobile.

Questo è un grande vantaggio, purchè non sia richiesta la precisione di 12 cifre delle variabili decimali.

Inoltre le variabili intere occupano meno memoria di quelle a virgola mobile poichè richiedono 2 byte di memoria rispetto agli 8 byte richiesti da un numero decimale.

I nomi delle variabili intere, a differenza di quelli delle variabili a virgola mobile, terminano con il segno di percentuale (%).

Il nome non deve avere più di 8 caratteri, compreso il segno di percentuale.

Nell'esempio precedente, come nomi delle variabili venivano usati a, b e c. Se i numeri loro assegnati fossero stati interi, i nomi delle variabili sarebbero stati a%, b% e c%.

L'OPL accetta come interi solo numeri compresi tra -32768 e +32767. Ogni numero al di fuori di questi limiti viene trattato come numero a virgola mobile.

Questa potrebbe essere una procedura che fa uso di numeri e variabili intere:

nomeprocedura: GLOBAL x%,y% x%=7 y%=3.5+x% PRINT y% GET

Questa procedura ha la stessa struttura della precedente. Nella procedura è presente un possibile errore: la variabile y% è una variabile intera, ma nella terza riga del programma le viene assegnato un valore decimale.

In questo caso l'OPL non segnalerà errore; effettuerà, invece, una conversione automatica del valore assegnato alla variabile.

Il membro di destra dell'istruzione vale 10.5, ma la parte decimale del numero viene lasciata cadere prima che il risultato sia assegnato a y%. L'istruzione PRINT visualizzerà quindi il valore 10.

Poichè l'OPL non considera ciò errore, sta a voi assicurarvi che una situazione del genere non si verifichi, a meno che non la vogliate espressamente.

Dovete sempre porre molta attenzione che, nel mischiare tipi di variabili diversi, la risposta ottenuta sia quella prevista.

Ora, tornando all'esempio precedente dove venivano usate solo variabili a virgola mobile, noterete che vi è stata un'altra conversione, ma il valore non è cambiato.

In quella procedura alla variabile a virgola mobile c viene dato il valore intero 3.

Per istruzioni di questo tipo, viene effettuata una conversione automatica così che, come in questo caso in cui il risultato era 3.0, il valore reale della variabile è rimasto lo stesso.

Se assegnate a una variabile intera un numero decimale, l'intero assegnato sarà arrotondato al primo intero più basso. Così, se ponete a%=2.3, allora il valore di a% sarà 2. Se assegnate un numero decimale negativo ad una variabile intera, di nuovo il numero è arrotondato per difetto (piuttosto che verso zero).

Così, se ponete a%=-2.3, allora a% assumerà il valore -3. In ogni caso l'ultimo controllo spetta al programmatore ed è sua la responsabilità di assicurarsi che in ogni caso venga usata la variabile corretta.

Se vi aspettate che un'espressione restituisca un numero a virgola mobile, dovete assicurarvi che all'interno di detta espressione vengano usati i tipi corretti di numeri.

Se, per esempio, volete arrotondare numeri a virgola mobile alla mezza unità, ad esempio arrotondare 2.4 a 2.5 e 2.2 a 2.0, potreste essere tentati di utilizzare la seguente istruzione:

r=INT(2*n+0.5)/2

dove n è il numero che deve essere arrotondato.

Essa, però, darebbe un risultato errato. Per capire il perchè, sostituite una valore qualsiasi, per esempio 3.4, a n. L'espressione diventerà INT(2*3.4+0.5), cioè INT(7.3), e restituirà l'intero 7. Questo, a sua volta 'e diviso per 2, un altro numero intero, cosi il risultato sarà il numero intero 3 e non 3.5. Per ottenere il valore richiesto, 3.5, dovete forzare la divisione perchè dia un risultato a virgola mobile. Il modo più semplice è dividere per il numero decimale 2.0 invece che per il numero intero 2. Distruzione dovrà essere:

r=INT(2*n+0.5)/2.0

e darà il risultato richiesto.

Sono possibili altri errori se non si presta attenzione durante le assegnazioni; conoscendo, però, come l'OPL gestisce le espressioni aritmetiche, essi possono essere evitati.

LE MEMORIE DELLA CALCOLATRICE

Nota Vi sono 10 variabili a virgola mobile sempre disponibili.

Esse sono le memorie della calcolatrice m0, m1, m2..,m9. Queste non vanno dichiarate come variabili poichè sono sempre presenti (se le dichiarate vi sarà segnalato un errore). A queste variabili possono essere assegnati valori in qualsiasi momento ed in qualunque procedura. I valori assegnati vengono mantenuti anche quando abbandonate l'OPL. Essi possono poi essere richiamati dalla calcolatrice con gli stessi nomi e avranno gli ultimi valori che avrete loro assegnato con l'OPL.


21 LE VARIABILI STRINGA

Una stringa è una sequenza di caratteri che verrà trattata come un blocco di caratteri. Le stringhe sono caratterizzate dalla presenza d virgolette all'inizio e alla fine, come nel seguente esempio:

"questa è una stringa"

Potete mettere le stringhe in variabili, ma dovete distinguere tra variabili stringa e variabili numeriche. I nomi delle variabili stringa devono terminare con il segno di dollaro ($) e possono avere fino a 8 caratteri, compreso il segno di dollaro.

Le stringhe possono essere lunghe fino a 255 caratteri; potete, inoltre, assegnare ad una variabile anche una stringa nulla, una stringa, cioè, che non contiene alcun carattere.

Quando dichiarate una variabile stringa dovete specificare esattamente quanto spazio volete avere a disposizione per memorizzarla. Ecco un esempio:

nomeprocedura: GLOBAL this$(10),that$(4) this$="Alphabetic" that$="ally" PRINT this$;that$ GET

La variabile stringa this$ avrà a disposizione spazio per 10 caratteri e that$ ne avrà per 4.

La dichiarazione di una variabile stringa assegna automaticamente una stringa nulla alla variabile.

Le due successive righe del programma assegnano dei valori alle due variabili. In ognuno dei due casi è stata usata la massima lunghezza possibile, ma questo non è obbligatorio. Potete usare qualsiasi lunghezza fino a quella stabilita nella dichiarazione. Se tentate di assegnare a una variabile una stringa più lunga di quanto previsto nella dichiarazione, l'OPL segnalerà l'errore.

CONVERSIONE DI VARIABILI A STRINGA

Se tentate di assegnare un numero a una variabile stringa, vi verrà segnalato un errore. Non vi è nessuna conversione automatica tra una variabile stringa e una variabile numerica. L'OPL, comunque, dispone di mezzi per ottenere la conversione di numeri in stringhe e viceversa: essi sono le funzioni SCI$, FIX$, GEN$ e NUM$. (vedi cap.34).

UNIONE DI STRINGHE

Sommare due variabili numeriche è molto semplice.

Basta usare il segno di addizione e assegnare il risultato a un'altra variabile, per es. a=b+c.

Sommare stringhe o, per usare il termine corretto, concatenarle, è altrettanto semplice.

Se a$="DOWN" e b$="WIND", allora l'istruzione c$=a$+b$ significa che c$ diventa "DOWNWIND". Potete assegnare questo valore a c$ anche con: c$="DOWN"+"WIND".

Nel concatenare stringhe occorre ricordare che la lunghezza massima di una stringa non deve essere superata, cioè sarebbe un errore tentare di sommare una stringa di 200 caratteri con una di 100 perchè in questo modo si supererebbe il massimo di 255 caratteri.

Non dovete neppure superare la massima lunghezza dichiarata.

Se dovete definire una stringa che contenga il carattere delle virgolette (carattere ASCII 34), questo carattere va inserito due volte nella definizione della stringa. Così, se definite a$="ABC""DEF""GHI"", allora il valore risultante di a$ sarà ABC"DEF"GHI.

SCOMPOSIZIONE DI UNA STRINGA

Dopo aver unito due o più stringhe, potreste, in seguito, volerle separare o prenderne solo, per esempio, 5 caratteri. Questo processo viene detto scomposizione di una stringa.

Vi sono 3 funzioni che vi permettono di compiere questa operazione. Esse sono: LEFT$, RIGHT$ e MID$.

Queste funzioni vi permettono di accedere, rispettivamente, alla parte destra, alla parte sinistra o alla parte centrale di una stringa.

Sia, per esempio, a$="ABRAHAM", allora con l'istruzione b$=LEFT$(A$,4) assegnate alla variabile b$ la stringa ABRA, cioè i primi 4 caratteri di a$.

La funzione RIGHT$ opera nello stesso modo. La funzione MID$ è un po' diversa in quanto dovete definire la porzione di stringa che volete, la posizione d'inizio della vostra substringa e la lunghezza della stringa che desiderate vi sia ritornata.

Così, supponendo ancora che a$ contenga "ABRAHAM" la istruzione b$=MID$(a$,4,3) assegnerà a b$ "AHA" poichè avete preso tre caratteri a partire dal 4 carattere di a$.

Tutte le operazioni di scomposizione di una stringa, lasciano immutata la stringa originale a meno che la parte destra dell'equazione non sia la stessa stringa della parte sinistra. Così a$=LEFT$(a$,4) ridarebbe una stringa che contiene i 4 caratteri di sinistra di a$ e li assegnerebbe a a$, sostituendoli, in questo modo, al contenuto originale.


22 LE VARIABILI A SCHIERA

A volle può risultare utile poter riunire più variabili in gruppi coerenti; l'OPL a tale scopo mette a disposizione un altro tipo di variabile, chiamata variabile a schiera (matrici).

Le variabili a schiera possono essere di due tipi: schiere numeriche e schiere di stringhe.

LE SCHIERE NUMERICHE

Sotto uno stesso nome di variabile si possono memorizzare più numeri, differenziandoli mediante un indice numerico. Queste variabili possono essere intere o a virgola mobile.

Ecco come si presentano:

a%(1), b(10).

Le variabili a schiera numeriche possono essere considerate come una lista di numeri, tutti con lo stesso nome, ma numerati in modo da distinguerli uno dall'altro.

Così, potreste avere una schiera di numeri interi, col nome num%, e contenente 5 valori numerati da 1 a 5.

Quando la schiera è dichiarata, il numero fra parentesi indica il numero di elementi nella schiera.

Ecco una procedura semplice che assegna dei valori ad una schiera di numeri interi:

nomeprocedura: LOCAL num%(5) num%(1)=l num%(2)=3 num%(3)=5 num%(4)=7 num%(5)=11 PRINT num%(1)+num%(2)+num%(3)+num%(4)+num%(5) GET

Questo è un modo molto rozzo per trovare la somma dei 5 elementi della schiera, ma mostra bene come vanno usati gli elementi di una schiera.

Le schiere di numeri a virgola mobile vengono usate esattamente nello stesso modo, si deve solo eliminare dal nome della variabile il segno di percentuale.

LE SCHIERE DI STRINGHE

Avete visto come sia possibile raggruppare in schiere variabili numeriche; la stessa cosa è possibile con variabili a stringa.

La differenza consiste nel fatto che con le stringhe, dovete dichiarare non solo il numero di elementi nella schiera, ma anche quale deve essere la lunghezza massima di una stringa, esattamente come fate quando dichiarate la lunghezza di una normale stringa.

Ciò viene fatto quando le schiere sono dichiarate; l'istruzione, ad esempio:

GLOBAL array$(5,10)

riserva lo spazio per 5 stringhe nella schiera array$, ognuna con una lunghezza massima di 10 caratteri.

La schiera, quando è ancora vuota, può essere pensata come una tabella di questo tipo:

array$(1)="" array$(2)="" array$(3)="" array$(4)="" array$(5)=""

Anche se, fino a questo punto, non si è ancora assegnato alcun lesto a ciascuno degli elementi della schiere, si deve però riservare uno spazio di memoria sufficiente a contenere tutte le 5 stringhe quando siano state riempite.

Prima delle assegnazioni, ogni elemento della schiera conterrà una stringa nulla.


23 GLI OPERATORI

Le procedure esemplificate finora hanno fatto uso solo di un unico operatore aritmetico; il più (+).

L'OPL, ovviamente, ne dispone in un numero maggiore e la serie completa degli operatori è mostrata sotto.

Gli operatori si possono dividere in 3 classi: aritmetici, di confronto e logici.

Operatori aritmetici

+ somma
- sottrae
* moltiplica
/ divide
** eleva a potenza
Unità negativa   cambia di segno

Operatori di confronto

> maggiore di
>= maggiore o uguale
< minore di
<= minore o uguale
= uguale a
<>   diverso da

Operatori logici

AND
OR
NOT

ORDINE DI PRECEDENZA DEGLI OPERATORI

I vari operatori sono trattati dall'OPL secondo un ordine di precedenza specifico e rigoroso.

La tabella sottostante riporta, in ordine di precedenza, i vari operatori; operatori che hanno la stessa precedenza sono riportati sulla stessa riga.

NOT, Unary minus   (IL PIU'ALTO)
**
*, /
+, -
=, <, >, <>, >=. <=   
AND, OR(IL PIU'BASSO)

(Gli operatori logici AND, NOT e OR verranno trattati più approfonditamente nel corso di questo stesso capitolo).

Un'espressione aritmetica come a+b+c non presenta problemi poichè il risultato sarà lo stesso indipendentemente dall'ordine con cui si sommano gli elementi.

Ma per l'espressione a+b*c il risultato cambierà a seconda dell'operazione che verrà eseguita per prima: la somma o la moltiplicazione.

Così, per esempio, somma e sottrazione hanno precedenza uguale, ma, a loro volta, hanno una precedenza inferiore a quella della moltiplicazione o della divisione.

Un'espressione del tipo:

a+b*c/d

deve essere calcolata come segue:

b*c viene diviso per d: il risultato va quindi sommato ad a.

Se volete cambiare l'ordine di precedenza degli operatori, potete sempre far uso delle parentesi.

Qualsiasi operazione tra parentesi ha la precedenza sulle operazioni fuori parentesi. Quindi, sempre riferendoci all'equazione di prima, per eseguire prima la somma, seguita dalla divisione e quindi dalla moltiplicazione, dovreste scrivere l'equazione nella forma:

(a+b)*(c/d)

In un'espressione dove tutti gli operatori hanno uguale ordine dì precedenza, questi sono calcolati da sinistra a destra, tranne che nel caso delle potenze che sono calcolate da destra a sinistra. Così, per esempio, nell'espressione:

a%**b%**c%

b% verrà prima elevato a c% e il valore risultante sarà usato come esponente per a%.

Tutto ciò può apparire alquanto complicato, vi è, però modo più semplice di procedere. Se non siete sicuri dello ordine di precedenza di un operatore rispetto ad un altro, usate le parentesi! Esse fanno sì che le espressioni tra parentesi vengano sempre calcolate per prime.

Sebbene l'OPL faccia distinzione tra valori interi e valori a virgola mobile, in un'espressione siete liberi di mescolarli nell'ordine che preferite. Dovete, però, tenere presente come l'OPL si comporta con un'espressione mista.

Per esempio, la vostra procedura potrebbe comprendere l'espressione:

a%=b%+c

Questa espressione mista verrebbe calcolata nel modo seguente. I numeri a virgola mobile hanno la precedeza sui numeri interi, e quindi, nella parte destra dell'equazione il valore di b% sarà convertito in virgola mobile prima che la somma venga eseguita. Il valore in virgola mobile risultante sarà poi automaticamente convertito in intero prima di essere assegnato alla variabile a%. Nella conversione in intero, si perde la parte decimale del valore che risulta dalla parte destra dell'espressione.

LE ESPRESSIONI LOGICHE

Se il valore della variabile a è minore o uguale a quello di b, allora l'istruzione:

PRINT a>b

stamperà zero. Se a è maggiore di b, stamperà meno uno.

In questo esempio, a>b è trattato come espressione logica. Il risultato ha uno di due soli valori possibili, a seconda che a sia o no maggiore di b

Tutte le espressioni logiche rappresentano una qualche condizione. Esse assumono il valore zero se la condizione è falsa e un valore diverso da zero (normalmente meno uno), se la condizione è vera.

Quando ci si aspetta un valore logico, l'OPL attribuirà a zero il significato di falso e ad ogni risultato diverso da zero il significato di vero. Per esempio, le due espressioni:

a<>0 e a

sono equivalenti. Entambe saranno interpretate come logicamente vere se a è diverso da zero.

GLI OPERATORI DI CONFRONTO

Nell'OPL gli operatori di confronto danno sempre conte risultato un intero. Essi sono elencati nella tabella seguente. Essi possono essere usati sia con stringhe che con ogni combinazione di valori interi e in virgola mobile. I loro effetti sono mostrati nella tabella seguente.

Operat. Esemp. InteroRisultato
< a%<b -1 (vero) se a minore di b
> a%>b% -1 (vero) se a% maggiore di b%
<= a<=b -1 (vero) se a minore o uguale di b
>= a>=b% -1 (vero) se a maggiore o uguale di b%
<> a$<>b$-1 (vero) se a$ diverso da b$
= a=b -1 (vero) se a ù uguale u b

L'OPL segnalerà errore ogni volta che tenterete di usare uno qualunque di questi operatori con una combinazione di stringhe e valori numerici, per esempio:

a$<b

GLI OPERATORI LOGICI

Gli operatori AND, OR e NOT sono operatori logici e possono essere usati per operare solo con valori numerici.

AND e OR combinano due valori per dare un risultato unico, mentre NOT opera su un singolo valore.

Questi tre operatori hanno effetti diversi u seconda che siano usati con numeri interi o con numeri a virgola mobile.

Quando vengono usati con valori a virgola mobile, essi interpretano qualunque valore diverso da zero come vero, in modo simile agli operatori di confronto.

I loro effetti sono descritti nella tabella seguente.

Operatore Esempio Risultato intero
AND a AND b -1 (vero) se a e b sono diversi da zero
OR a OR b -1 (vero) se a o b sono diversi da zero
NOT NOT a -1 (vero) se a è zero (inverte il valore)

Quando vengono usati con valori interi, AND, OR e NOT sono operatori logici che operano a livello di bit.

Per esempio, l'istruzione:

PRINT 12 AND 10

stamperia il valore 8. Per capire ciò e necessario scrivere i due interi in notazione binaria:

DecimaleBinario
12 1100
10 1010

L'operatore AND agisce separatamente su ogni coppia di cifre binarie corrispondenti nei due numeri. Quindi, procedendo da sinistra a destra:

1 AND 1 → 1
1 AND 0 → 0
0 AND 1 → 0
0 AND 0 → 0

Il risultato è pertanto il numero binario 1000 che equivale al numero 8 in notazione decimale.

Quale sarà, allora, il risultato dell'istruzione:

PRINT 12 OR 10

Ancora una volta, dovremo scrivere i due numeri in forma binaria e applicare l'operatore logico OR a ciascuna coppia di cifre binarie corrispondenti:

1 OR 1 → 1
1 OR 0 → 1
0 OR 1 → 1
0 OR 0 → 0

Il risultato sarà il numero binario 1110 corrispondente a 14 in notazione decimale.

L'operatore logico NOT, quando opera su un intero, ne fa il complemento a 1, cioè sostituisce, nella sua rappresentazione binaria, ad ogni 1 lo 0 e viceversa.

Per fare il calcolo manualmente dovete scrivere tutte le 16 cifre; per esempio, per trovare il risultato dell'operazione NOT 7, scrivete 7 in forma binaria con 16 cifre:

0000000000000111

quindi prendetene il complemento, cioè

1111111111111000

Questo numero rappresenta, in forma binaria, il numero decimale -8

Un modo veloce per ottenere il risultato dell'operatore NOT che opera su un numero intero, è quello di sommare 1 al numero e cambiare il segno del risultato.

Ad esempio, NOT 23 vale -24, NOT 0 vale -1 e NOT -1 vale 0.

Si deve notare che gli ultimi due risultati sono validi anche nel caso l'operatore NOT operi su numeri a virgola mobile.


24 LE PROCEDURE

I nomi delle procedure possono avere fino a 8 caratteri. Il primo carattere deve essere una lettera dell'alfabeto; gli altri possono essere lettere o numeri. Al nome di una procedura può anche essere aggiunto un qualificatore a seconda di ciò che essa eventualmente restituisce.

Così, la procedura PROC$: restituirà una stringa. Il qualificatore ($ per stringa e % per interi), deve far parte degli 8 caratteri; quindi, per esempio, non è possibile usare il nome PARTICLE%:. Il nome di una procedura è sempre seguito da "due punti"(:).

Un programma è formato da una o più procedure. La procedura a livello più alto chiamerà una o più procedure diverse, ognuna delle quali svolgerà un compito specifico. Le procedure possono anche chiamare se stesse.

Se la procedura a livello più alto viene mandata in esecuzione dal dispositivo A: allora tutte le procedure chiamate da questa, verranno cercate prima su quel dispositivo. Se la procedura non è trovata, essa sarà cercata su un altro dispositivo (B:) e così via.

Se la procedura a livello più alto è sul dispositivo B:, allora l'OPL cercherà prima su B:, poi su C:, poi su A:.

VARIABILI GLOBALI E VARIABILI LOCALI

Nei capitoli precedenti il comando GLOBAL è stato usato per dichiarare delle variabili. Questo è uno dei due comandi con funzioni simili; l'altro è LOCAL.

Il loro uso è simile in quanto entrambi vengono usati per dichiarare liste di variabili che il programma userà, ma vi è un'importante differenza. Le variabili dichiarate dal comando GLOBAL possono essere usate non solo in quella procedura, ma in qualunque procedura da essa chiamata. I valori assegnati a variabili globali in una qualsiasi procedura, saranno disponibili per tutte le altre procedure che essa richiama.

Qualunque procedura può contenere un comando GLOBAL ma le variabili dichiarate da essa saranno globali solo da quel livello in giù, cioè in quella procedura e in ogni procedura da essa chiamata.

Il comando LOCAL può essere usato in qualunque procedura per variabili che saranno usate solo in quella procedura. Ogni procedura può dichiarare il proprio gruppo di variabili col comando LOCAL. Queste variabili sono disponibili solo per la procedura in cui sono dichiarate. Se lo stesso nome viene usato per due variabili locali in due differenti procedure, le due variabili rimarranno del tutto distinte e non si influenzeranno reciprocamente.

Una variabile che sia richiamata in una procedura senza essere stata dichiarata in questa, sarà considerata come se fosse stata dichiarata in una procedura a livello più alto. Essa viene chiamata variabile esterna poichè è stata dichiarata al di fuori della procedura in cui è usata.

Potete usare tutti i comandi GLOBAL e LOCAL tutte le volte che volete, purchè essi compaiano prima di qualunque altra istruzione della procedura. Tentare di usare una variabile che non sia stata precedentemente definita con uno di questi comandi darà come risultato un errore che sarà segnalato quando il programma verrà mandato in esecuzione.

Quando una procedura ne chiama un'altra, quella chiamata viene considerata sotto la procedura chiamante.

Essa, a sua volta, può chiamare altre procedure che saranno gerarchicamente sono di essa.

In figura 7, la procedura a livello più alto proc:, dichiara una variabile globale a%. Questa è quindi disponibile per tutte le procedure inferiori.

La procedura che segue, sales, usa quindi a%. La successiva procedura chiamata, dichiara un'altra variabile globale chiamata anch'essa a%, quindi questa variabile è ora disponibile per tutte le procedure che seguono, ma essa, in effetti, ricopre la prima variabile globale dichiarata con quel nome. Così, quando l'ultima procedura, costs:, usa la variabile a%, essa accede alla variabile dichiarata con quel nome in salary:, poichè è quella che nella gerarchia la precede immediatamente.

Sta al programmatore assicurarsi che, quando siano presenti più variabili con lo stesso nome, ogni procedura possa accedere alle corrette variabili.

Figure 7 Variable availability.

I PARAMETRI DI UNA PROCEDURA

Le procedure possono comunicare per mezzo di variabili globali, come già descritto. E' anche possibile passare valori ad una procedura anche per mezzo di parametri.

Quando scrivete una procedura, dovete far seguire al suo nome un numero di parametri che sarà usato per passare, a questa, valori esterni. I nomi di questi parametri non verranno riconosciuti al di fuori della procedura, come nel caso delle variabili locali. Ecco un esempio:

fact:(n) IF n=0 RETURN 1 ENDIF RETURN n*fact:(n-1)

La procedura calcola il fattoriale di un numero che le è stato passato attraverso il parametro n. Per fare ciò essa chiama se stessa tante volte quanto è necessario.

A differenza degli esempi mostrati sin qui, il nome di questa procedura è seguito da due parentesi che contengono il nome di un parametro. Questo spiega perchè quando si scrive una procedura utilizzando l'opzione NUOVO del menu prog all'inizio il cursore si posiziona alla fine del nome della procedura. Avete così la possibilità di aggiungere al nome della procedura un certo numero di nomi di parametri.

Ecco una procedura che potrebbe essere mandata in esecuzione dal menu principale o dal menu PROG e che chiama la procedura fact%

dofact: LOCAL result,num PRINT "Number for" PRINT "factorial"; INPUT num result=fact:(num) PRINT result GET

La procedura dofact% viene mandata in esecuzione (PARTE) dal menu PROG e fa comparire sullo schermo una richiesta. Ogni numero inserito viene passato alla procedura fact: che ne restituisce il fattoriale (n!).

Questo risultato compare sullo schermo. L'ultima riga della procedura a livello più alto pone il sistema in attesa che un tasto venga premuto prima di tornare al menu PROG.

Come potere vedere, la riga result=fact%(num) in dofact% è quella che passa il valore della variabile num a fact: e poi assegna il valore restituito alla variabile result. (Sono state usate variabili a virgola mobile piuttosto che intere perchè il numero di cifre assegnato a un numero intero sarebbe stato superato per fattoriali di un numero maggiore di 7).

Un metodo simile viene usato per passare valori a procedure che hanno più di un parametro. I parametri vengono dati in parentesi e sono separati da virgole, per esempio proc:(a,b,c).

I valori passati ad una procedura devono corrispondere in numero, ordine e tipo ai parametri dichiarati.

Ci si può riferire a un parametro solo per mezzo del nome con cui è stato dichiarato.

Inoltre, i parametri differiscono dalle variabili vere in quanto i loro valori non possono essere cambiati.

Così, nella procedura fact:, sarebbe stato errato tentare di assegnare a n un altro valore, per esempio scrivendo n=n-1.

COME RESTITUIRE I RISULTATI

Alla fine di una procedura il controllo torna automaticamente al punto dal quale la procedura era stata chiamata. Il comando RETURN può essere usato in qualunque punto della procedura per far sì che questa termini in un punto diverso da quello della sua fine naturale.

Questo comando può anche essere usato per restituire un valore alla procedura che chiama o al calcolatore.

Per mezzo del comando RETURN una procedura può restituire un solo valore, ma qualsiasi numero di valori può essere restituito facendo uso di variabili globali.

Ogni valore che deve essere restituito all'utente dalla procedura a livello più alto, diciamo al calcolatore, deve essere passata col comando RETURN. Se da una procedura ci si aspetta un valore e se nessun valore viene passato da questo comando, allora il valore sarà assunto come zero o come stringa nulla.

Se una procedura è stata dichiarata come procedura di stringa, per esempio proc$: essa può restituire solo una stringa. Se il comando RETURN restituisce alla procedura che chiama un valore numerico, verrà segnalato un errore.

ESECUZIONE DI UNA PROCEDURA

Nel cap. 16 veniva descritto come inserire nuovi elementi nel menu a livello più alto dell'Organiser. E' possibile inserire un nuovo elemento in quel menu, per esempio la procedura dofact: che può essere mandata in esecuzione dal livello più alto. Si omettono i "due punti" quando i nomi di una procedura vengono aggiunti al menu a livello più alto e ogni lettera minuscola sarà automaticamente convertita in lettera maiuscola.

La procedura può essere mandata in esecuzione dalla memoria interna della macchina o da un Datapak.

Quando DOFACT è scelto dal menu principale nel modo usuale, lo schermo si pulirà e la procedura entrerà in esecuzione come se fosse stata chiamata dal menu PROG.

Quando il programma termina, Organiser tornerà al menu principale, e non al menu PROG.

Non è possibile passare valori a una procedura mandata in esecuzione dal menu principale. Ma, inserendo poi valori nella procedura a livello più alto nel modo usuale, i valori possono essere passati a procedure a livelli inferiori.

IL MENU DELLE PROCEDURE

Usando la funzione MENU, ogni procedura può mostrare un menu dal quale si possono fare selezioni con lo stesso metodo dei menu permanenti di Organiser.

Ogni procedura mandata in esecuzione dal menu principale può quindi mostrare un menu che offre un numero di scelte relative all'uso della procedura. Ognuna di queste selezioni può far sì che vengano chiamate altre procedure che, a loro volta, useranno un menu per mostrare le scelte disponibili nelle varie situazioni.

ABBANDONO DI UNA PROCEDURA

Per sospendere l'esecuzione di una procedura, premete prima il tasto ON/CLEAR; questo fermerà la procedura indefinitamente. Potete ora abbandonarla premendo il tasto A. Sullo schermo apparirà:

INTERRUZIONE IN A: nomeproc

Premete ora il tasto SPACE per tornare al punto da cui la procedura è stata chiamata.

Nota. Questo metodo per fermare una procedura non funzionerà se avrete usato il comando ESCAPE OFF.

Questo comando disabilita il tosto ON/CLEAR a fermare o a interrompere le procedure.

Se avete usato il comando ESCAPE OFF e la vostra procedura dovesse entrare in un ciclo che non ha una fine logica, allora l'unico modo per interromperla consiste nel togliere le batterie dal vostro Organiser. In questo caso, però, tutti i dati presenti nelle memoria interna della macchina andranno persi.

Se la vostra procedura usa ripetutamente la funzione GET o KEY, può essere difficile lasciare la procedura in questo modo. Può quindi rendersi necessario premere più volte il tasto ON/CLEAR.


25 LA GESTIONE DEGLI ARCHIVI DI DATI

Prima di cominciare a immagazzinare informazioni nel vostro Organiser, è necessario decidere quale formato volete usare per l'informazione che state per registrare.

ARCHIVI E RECORDS

Le informazioni vengono immagazzinate nel vostro Organiser sotto forma di archivi (files), ad ognuno dei quali è dato un nome univoco. Gli archivi vengono a loro volta, organizzati in records. Un archivio è simile a un catalogo a schede, diviso in schede individuali, ciascuna delle quali contiene una informazione in un particolare formato. Ognuna di queste schede corrisponde ad un record di uno degli archivi del vostro Organiser.

Tutti i records all'interno di un archivio contengono informazioni nello stesso formato, ma l'informazione su ogni scheda è diversa da quella delle altre. In un archivio di nomi e indirizzi, per esempio, ogni record conterrebbe il nome di qualcuno, il suo numero telefonico e l'indirizzo.

I CAMPI

In un catalogo a schede l'informazione memorizzata in ciascun record è organizzata in un modo regolare: per ogni singola informazione viene usata una parte diversa della scheda. Gli archivi di Organiser sono organizzati in modo simile. Ogni voce è memorizzata in una parte distinta del record, chiamata campo. Così, in un archivio di nomi e indirizzi, vi sarebbe un campo per il nome, uno per il numero del telefono e campi separati per ogni riga dell'indirizzo.

A card index file

Fig. 8 Archivio a schede

Quando il vostro Organiser mostra il menu principale, esso presume che tutte le operazioni del tipo REGISTRA o RICERCA vengano eseguite su archivi presenti in memoria o su Datapak.- a seconda di quale dei due dispositivi sia attivo al momento. Questo archivio è chiamato MAIN.

Tuttavia, quando state usando il vostro Organiser dal menu principale, non dovete preoccuparvi del nome dell'archivio, perchè solo il contenuto di quell'unico archivio sarà visibile e accessibile.

L'OPL vi permette di creare altri archivi che possono essere manipolati per mezzo suo; esso vi permette anche di accedere al file MAIN

Il linguaggio OPL presenta un numero di comandi, specifici per la gestione degli archivi di dati, comandi che vi permetteranno manipolazioni sofisticate dei dati.

Questi comandi, unitamente ad altri strumenti potenti che fanno parte dell'OPL, vi daranno una potenza di gestione dei dati insuperabile per una unità tascabile.

CREAZIONE DI UN ARCHIVIO DI DATI

Prima di poter incominciare a caricare i dati in un archivio, dovete creare, su uno dei dispositivi, quell'archivio, con un nome e un formato appropriati, usando il comando CREATE.

Al comando CREATE va fornito un certo numero di parametri secondo il formato seguente.

CREATE <spec$>,logname,fldnm1,fldnm2

Il dispositivo e il nome dell'archivio che costitui scono il parametro <spec$> possono essere una costante a stringa, per esempio, "B:nomefile" o una variabile a stringa, per esempio spec$. Il nome dell'archivio può avere fino a 8 caratteri. Il parametro successivo è il nome del file logico. Questo può essere A, B, C o D.

Il file potrà essere poi richiamato dall'interno del programma richiamando questo nome.

Seguono poi i nomi dei campi. In ogni record possono esserci fino a 16 campi e a questi può essere dato un qualificatore, sia % o $ per indicare, rispettivamente, numeri interi o stringhe. I campi destinati a contenere dati a virgola mobile, non necessitano di un qualificatore. Il nome di un campo può avere fino a 8 caratteri, compreso il qualificatore.

Quando un archivio è stato creato, esso è automaticamente aperto e può, quindi, ricevere records senza dover prima usare il comando OPEN.

Questo archivio è quindi l'archivio corrente e tutti gli accessi ad un file avverranno su questo, finchè non sarà reso corrente un altro archivio per mezzo dei comandi USE, CREATE o OPEN.

APERTURA DI UN ARCHIVIO

Per aprire un archivio che esiste già, la sintassi del comando OPEN è esattamente la stessa del comando CREATE. Si possono aprire fino a 4 archivi contemporaneamente e questi possono essere distribuiti su uno qualsiasi dei 3 dispositivi, per esempio due archivi aperti su A: e altri due su B:, oppure un archivio su A: uno su B: ed altri due su C:.

COME CAMBIARE GLI ARCHIVI

Quando un archivio viene creato o aperto, esso è automaticamente l'archivio corrente e ogni accesso avviene su di esso. Se si sono aperti contemporaneamente più archivi, per cambiare l'archivio corrente si fa uso del comando USE.

Per esempio:

USE B

In questo esempio, l'archivio col nome del file logico B, diventa l'archivio corrente. Ogni accesso avviene ora a questo file finchè non sia cambiato con un altro comando USE o finchè non venga aperto, creato o chiuso un altro archivio. Se si tenta di usare un archivio che non sia stato precedentemente aperto, verrà segnalato un errore.

COME AGGIUNGERE RECORDS A UN ARCHIVIO

Per aggiungere un record a un file aperto, dovete per prima cosa assegnare dei valori al nome del campo corrente. Un campo è del tutto simile ad una variabile, e quindi, per esempio, ad esso possono essere assegnati valori o può essere usato nelle istruzioni INPUT.

Per inserire (INPUT) un valore in un campo, il nome del campo deve essere usato col nome dell'archivio logico, in questo modo:

INPUT B.field$

dove B è il nome dell'archivio logico e field$ è il nome del campo. Essi sono separati da un "punto" (.). Quando ai campi sono stati assegnati dei valori, potete aggiungerli all'archivio aperto mediante il comando APPEND. I campi di ciascun record conterranno i valori che sono stati loro assegnati.

Il comando APPEND non richiede parametri, i campi vengono automaticamente aggiunti all'archivio nell'ordine e col formato corretto.

Inoltre, proprio come avviene per le variabili, se tentate di assegnare una stringa a una variabile numerica, verrà segnalato un errore.

Non è possibile aggiungere records a metà file, essi possono solo essere aggiunti alla fine. In qualunque momento, durante l'accesso a un archivio di dati, il nome del campo in uso in quel momento può essere usato come ogni 'altra variabile, per esempio, in un'istruzione PRINT o in un'espressione numerica o di stringa.

FIRST, NEXT, BACK, LAST e POSITION

Potete cambiare il record corrente usando uno qualunque di questi 5 comandi. Il comando FIRST, come indica il nome stesso, accede al primo record di un archivio. Il comando NEXT accede al record successivo. Se si è superata la fine del file NEXT non segnala errore, ma la funzione EOF restituirà un valore zero (vedi cap.24). Il record corrente sarà quindi nullo.

Il comando BACK accede al record precedente. Se il record corrente è il primo record dell'archivio, allora il record corrente non cambia.

Il comando LAST accede all'ultimo record dell'archivio.

Potete accedere a qualsiasi record usando il comando POSITION. Per esempio, l'istruzione POSITION 3 fa diventare record corrente il record 3.

Potete trovare il numero del record corrente usando la funzione POS che restituisce il numero di questo.

CANCELLAZIONE DI UN RECORD

Per cancellare un record, semplicemente rendetelo corrente usando uno dei comandi sopraddetti (FIRST, NEXT, BACK, LAST o POSITION) e quindi usate il comando ERASE. Ciò rimuove il record corrente dall'archivio e rinumera i record rimanenti.

RICERCA DI UN RECORD

Se volete trovare i records di un archivio che contengono una determinata stringa, potete usare la funzione FIND.

Questa si comporta più o meno come l'opzione RICERCA del menu a livello più alto. La differenza consiste nel fatto che mentre RICERCA del menu principale fa comparire sullo schermo il testo trovato, questa funzione restituisce il numero del record.

Se la stringa viene trovata, il numero restituito corrisponde al record che la contiene e il record diventa record corrente. Se la stringa non viene trovata, allora il numero restituito è zero.

Così, la linea r%=FIND("Abraham") renderebbe il primo record che contiene la stringa "Abraham" il record corrente e assegnerebbe il numero di quel record alla variabile r%.

CHIUSURA DI UN ARCHIVIO

Quando avete finito di lavorare su un determinato archivio, questo può essere chiuso col comando CLOSE.

RIMOZIONE DI UN ARCHIVIO

Qualunque archivio di dati può essere rimosso (cancellato) usando il comando DELETE. L'archivio da cancellare deve essere chiuso prima che venga dato questo comando, altrimenti verrà emesso un messaggio di errore. Il nome del dispositivo e del file vanno specificati in questo modo:

DELETE <spec$>

Il nome del dispositivo e dell'archivio che costituiscono il parametro <spec$> possono essere o una costante a stringa, per esempio "B:nomefile" o una variabile a stringa, per esempio spec$. Una volta cancellato un archivio, non vi è modo di recuperarlo; esso è perso per sempre!

RICOPIATURA DI UN ARCHIVIO

Il comando COPY è uno strumento potente che si comporta in modo analogo all'opzione COPIA del menu principale. Vi sono tre possibili modi di comportarsi: si può fare la copia dì un archivio con lo stesso nome dell'originale; se ne può fare una copia con un altro nome, oppure tutti gli archivi su un dispositivo possono essere copiati su un altro. Ecco come queste tre versioni apparirebbero su un programma:

COPY "device1:nomefile1","device2:" COPY "device1:nomefile1","device2:nomefile2" COPY "device1:","device2:"

Tutte le costanti a stringa possono, in questo esempio, essere sostituite da variabili a stringa.


26 CICLI, ETICHETTE, SALTI E SALTI CONDIZIONATI

Finora abbiamo considerato solo programmi che eseguono operazioni in modo lineare dall'inizio alla fine.

Essi consistono di un certo numero di istruzioni eseguite nell'ordine secondo cui appaiono nel programma. Così, se volete eseguire un'istruzione più di una volta, quella istruzione dovrà comparire tutte le volte che la volete eseguire. Ciò è chiaramente poco pratico. Un metodo più pratico è quello di mettere in grado il programma di ripetere una particolare parte del programma il numero di volte richiesto o finchè non si verifichi una certa condizione.

Questo è un aspetto essenziale del concetto di programma e nell'OPL vi sono diversi modi per realizzarlo.

I primi due sono i cicli DO/UNTIL e WHILE/ENDWH.

Essi sono conosciuti come STRUTTURE di programma, perchè in se stessi non fanno nulla, semplicemente permettono di ripetere altre istruzioni tutte le volte che ciò è necessario.

Esse operano in modo simile con la differenza che, mentre la struttura DO/UNTIL controlla alla fine del ciclo che una condizione sia verificata, la struttura WHILE/ENDWH esegue il controllo all'inizio.

IL CICLO DO/UNTIL

Osserviamo, per prima cosa, un esempio di DO/UNTIL:

a%=10 DO PRINT "A=";a% a%=a%-1 UNTIL a%=0

Come potete vedere, questa è solo una piccola parte di un programma che ha lo scopo dì illustrare come funziona un ciclo.

La prima linea assegna il valore 10 alla variabile intera a%. Il ciclo vero e proprio inizia alla linea successiva con l'istruzione DO. Questa istruzione dice all'OPL: "Esegui tutte le linee del programma che seguono fino all'istruzione UNTIL. Se la condizione che segue quell'istruzione non viene incontrata, ripeti la stessa serie di istruzioni finchè non la incontri".

Ciò vi può sembrare prolisso, ma rileggete e vedrete che, in realtà, è piuttosto semplice.

La linea successiva dice all'OPL di visualizzare un breve testo seguito dal valore della variabile a%. La prima volta nel ciclo il valore di a% sarà 10.

Poi, al valore di a% viene sottratto 1. Il valore di a% è ora 9. Arriviamo quindi all'istruzione UNTIL seguita da una condizione. La condizione è che a% sia uguale a zero.

Poichè questa è la prima volta che il ciclo viene eseguito, il valore di a% è diverso da zero, così il controllo del programma torna all'istruzione DO e il ciclo viene ripetuto. Questa volta il valore di a% scende a 8 e, di nuovo, la condizione non è verificata.

Questo processo continua finchè a% risulti uguale a zero.

A questo punto la condizione è verificata e il controllo del programma passa all'istruzione che segue istruzione UNTIL.

La prima delle istruzioni fra i comandi DO e UNTIL può essere sulla stessa linea del DO: quindi, nella procedura studiata sopra, sarebbe stata valida la linea:

DO PRINT "A=";a%

IL CICLO WHILE/ENDWH

La struttura WHILE/ENDWH opera in modo analogo. Passiamo, quindi, subito, all'esempio:

a=4.1 b=2.7 WHILE a>b PRINT "a maggiore" PRINT "di b" b=b+1.04 ENDWH

In questa struttura il controllo è fatto all'inizio del ciclo.

In entrambe queste strutture, se il programma contiene l'inizio della struttura (DO o WHILE), ma non ha la fine corrispondente del ciclo, allora verrà segnalato un errore.

Per quanti cicli possano esservi annidati, uno nell'almo (fino a un massimo di 8), l'OPL manterrà la traccia del numero e si assicurerà che ogni ciclo abbia un inizio e una fine. Se tentate di accoppiare, per esempio, un DO e un ENDWH, quando farete la traduzione della procedura, verrà segnalato un errore.

Nota. Si possono fare controlli usando gli operatori logici disponibili nell'OPL. Vedi cap. 23 per avere più informazioni su questi operatori.

ETICHETTE E SALTI

Un altro comando che può modificare una sequenza lineare è GOTO. Come dice il suo nome, questo comando trasferisce il controllo del programma a un'altra parte del programma. Questa parte è individuata da un'etichetta. L'etichetta deve essere nella stessa procedura in cui si trova il comando GOTO e il salto non è opzional: esso verrà sempre eseguito:

GOTO exit:: PRINT "SALTA QUESTA LINEA" PRINT "e QUEST'ALTRA" EXIT::

In questo esempio, quando il programma raggiunge la linea con l'istruzione GOTO, salterà alla linea che inizia con l'etichetta exit::.

Osservate che tutte le etichette terminano con un doppio "due punti" (::).

SALTI CONDIZIONATI

GOTO è uno dei modi per fare agganci all'interno di un programma, ma è un sistema abbastanza rozzo e, se usato indiscriminatamente, può portare a programmi difficili da leggere e da correggere.

Un modo più elastico per eseguire un aggancio, in questo caso un salto condizionato, è la struttura IF/ELSEIF/ELSE/ENDIF.

Questa struttura è usata per eseguire una o più istruzioni se (if) si verifica una certa condizione.

Se quella Condizione non si verifica, allora, può essere eseguita l'istruzione ELSEIF per controllare una altra possibile condizione.

All'interno di una stessa struttura IF/ENDIF può essere presente un numero qualsiasi di istruzioni ELSEIF.

Dopo che tutte le situazioni cui si è interessati sono state prese in considerazione per mezzo delle istruzioni ELSEIF, le rimanenti situazioni possono essere trattate con un'istruzione ELSE seguita alla fine dall'istruzione ENDIF.

Ecco un esempio che illustra tutto ciò:

report: LOCAL g% g%=GET PRINT "QUEL TASTO E'" IF g%>64 and G%<91 PRINT "LETTERA MAIUSCOLA" ELSEIF g%>96 and g%<123 PRINT "lettera minuscola" ELSE PRINT "NON UNA LETTERA" ENDIF GET

Il programma si mette in attesa che venga premuto un tasto e stabilisce se il tasto premuto é una lettera maiuscola o minuscola. Se non è una lettera, questo fatto viene segnalato attraverso l'istruzione ELSE.

L'istruzione ELSE non pone condizioni e pertanto prende in considerazione tutte le situazioni diverse da quelle evidenziate nelle istruzioni ELSEIF.

Le istruzioni ELSEIF e ELSE sono opzionali, ma per ogni IF deve esserci un corrispondente ENDIF; in caso contrario verrà segnalato un errore. È ammesso anche che l'istruzione che segue il comando ELSE si trovi sulla sua stessa linea. Così, nella precedente procedura la linea:

ELSE PRINT "NON UNA LETTERA"

sarebbe stata perfettamente valida.


27 LA GESTIONE DEGLI ERRORI

COME "INTRAPPOLARE" GLI ERRORI

In vari punti di questo manuale si è detto che, se un argomento o un parametro viene fornito in modo non corretto, o se non viene rispettata la sintassi di un particolare comando, allora verrà segnalato un errore.

In circostanze normali lo schermo si pulirà e mostrerà un messaggio di errore corrispondente al particolare tipo di errore incontrato dal programma.

In tale caso, l'esecuzione del programma termina. Vi sono tuttavia dei modi per evitare ciò: essi, però, passano tutto il controllo al programmatore e devono, quindi, essere usati con molta attenzione. I dispositivi usati per controllare la segnalazione di errore, sono i comandi ONERR, TRAP e RAISE e le funzioni ERR e ERR$.

Il primo, ONERR, viene usato per rivelare il verificarsi di un errore e per passare il controllo del programma ad un'altra parte della procedura perchè gestisca la situazione.

L'istruzione ONERR deve essere seguita da un'etichetta che deve comparire nella stessa procedura. Per esempio:

ONERR zero:: PRINT PI/0 PRINT PI RETURN zero:: PRINT "NON SI PUO'" PRINT "FALLO" ONERR OFF

La prima linea dice all'OPL di saltare, ogni volta che si verifica un errore, alla linea che inizia con la etichetta zero:: Così, quando la linea successiva, nell'esempio, tenta di eseguire una divisione per 0, il che comporterebbe la segnalazione di un errore, il programma salta all'etichetta.

Qui stampiamo il nostro messaggio. Notate che, in questo esempio, la linea successiva a quella contenente un errore, non verrà mai eseguita.

Dopo che è stato attivato il comando ONERR, tutti gli errori, anche quelli in altre procedure, faranno sì che il programma salti sempre allo stesso punto, cioè all'etichetta zero:: Se volete dirottare il programma altrove, il comando ONERR deve o essere usato di nuovo con una diversa etichetta, o disattivato col comando ONERR OFF. Questo disattiva la trappola e ogni altro errore sarà gestito dall'OPL che produrrà un opportuno messaggio.

Questo procedimento è illustrato nella figura 9.

Figure 9: The ONERR command

L'errore nella procedura proc1 (a=LOG(-1)) farà sì che il controllo venga passato al punto individuato da label::, dove sarà opportunamente gestito.

Comunque, se il comando ONERR OFF non è usato per disattivare questo comando, allora in ogni procedura chiamata da proc1 in questo caso proc3, un errore comporterà che il controllo torni sempre allo stesso punto.

Questo può essere o no quello che voi volete e quindi, se non volete che tutti gli errori passino il controllo allo stesso punto, dovete assicurarvi che ONERR label:: e ONERR OFF siano usati in maniera appropriata.

Un altro modo per gestire gli errori consiste nell'usare comando TRAP.

Esso può essere usato con uno qualunque dei comandi qui elencati:

APPEND   BACK CLOSE
COPY CREATE DELETE
ERASE EDIT FIRST
INPUT LAST NEXT
OPEN POSITION   RENAME
UPDATEUSE

Il comando TRAP precede immediatamente uno di questi comandi, separati da esso da uno spazio. Ecco un esempio:

TRAP INPUT a%

Il comando INPUT si comporterà nel solito modo, ma nel caso si presentasse un errore come risultato di quel comando, allora l'errore sarà soppresso o intrappolato e la successiva linea del programma sarà eseguita come se non si fosse verificato nessun errore.

Ciò potrebbe accadere, nell'esempio fatto se venisse battuta una stringa invece di un intero. Il comando permette al programma, in un caso del genere, di fornire un suo proprio messaggio di errore, permettendo all'utente di fare un altro tentativo. Se, nell'usare il comando INPUT senza TRAP, viene inserita una stringa dove ci si aspetta un numero, lo schermo avanzerà di una riga e apparirà un punto di domanda per richiedere un'immissione valida.

label:: PRINT "NUMERO"; TRAP INPUT a% IF ERR=226 PRINT "NON UN NUMERO" GOTO label:: ENDIF

In questo esempio, se viene battuta una stringa invece di un numero, l'istruzione TRAP permetterà ancora di eseguire la linea successiva. In questo caso l'istruzione IF troverebbe l'errore, presenterebbe un adeguato messaggio e tornerebbe alla linea che contiene la richiesta in modo che si possa fare un altro tentativo.

Questo esempio vi mostra anche la funzione ERR in azione. Questa funzione restituisce il numero dell'ultimo errore verificatosi nel programma, secondo la tabella presentata in seguito in questo capitolo.

L'ultimo comando che potete usare per intrappolare errori è RAISE. Questo è usato per creare errori artificialmente. Se state usando il comando ONERR per catturare errori e gestirli da voi, potreste, a un certo punto dello sviluppo del vostro programma, aver bisogno di controllare le vostre routines di gestione dell'errore. Il modo migliore per fare ciò è usare il comando RAISE.

Potete generare un errore che voi pensate possa verificarsi quando il programma viene usato e vedere se la routine di gestione dell'errore lo gestisce nel modo da voi previsto. RAISE, inoltre, interviene di sua iniziativa quando il programma è costituito da un numero di procedure che si chiamano in sequenza. Se la procedura attualmente in esecuzione era stata chiamata da un'altra procedura che a sua volta era stata chiamata da un'altra e così via, allora potreste voler tornare velocemente al livello più alto per eseguire un'operazione particolare.

Il metodo normale sarebbe quello di usare il comando RETURN per uscire, di volta in volta, da tutte le procedure.

Un metodo più veloce consiste nell'introdurre nella procedura a livello più alto l'istruzione ONERR: in seguito, generando un errore, anche a un livello più basso, il controllo del programma tornerà all'etichetta che segue l'istruzione ONERR anche se questa è in una procedura a livello molto più alto.

MESSAGGI D'ERRORE

Quando in un programma si verifica un errore, il numero dell'errore, che si ricava dalla sottostante tabella, è reso disponibile dalla funzione ERR. Esso può essere usato nel vostro programma in modo che quando si verifica l'errore, se esso fa parte di un certo intervallo di errori previsti, potete intrappolarlo e gestirlo all'interno del programma.

Per accedere a una di queste stringhe, si può usare la funzione ERR$, dando il numero appropriato d'errore.

Alternativamente, se un errore si verifica e non viene intrappolato, il programma si fermerà, comparirà un messaggio d'errore e l'OPL offrirà la possibilità di ritornare all'EDIT del menu PROG. Il cursore verrà posizionato o sull'istruzione che ha causato l'errore o vicino ad essa in modo che voi possiate correggere l'errore (ciò è possibile se è disponibile il sorgente della procedura. Vedi cap. 31 per ulteriori dettagli).

Ecco i messaggi di errore che possono presentarsi, ì loro codici e il loro significato:

255SENZA DIREZIONE
Compare solo quando si mandano in esecuzione routines in linguaggio macchina che accedono al buffer intorno.
254FUORI MEMORIA
O la memoria interna della macchina è tutta occupata da programmi, agende e archivi dati, o il programma corrente ha usato tutta la memoria disponibile.
253MAX EXP AMMESSO
Un numero ha superato il massimo esponente ammesso: ±99.
252STR NON NUMERICA
Una stringa non numerica è stata passata alla funzione VAL.
251DIVISO PER ZERO
E' stato fatto un tentativo di divisione per zero.
250ERR NUM STR
Ha luogo solo quando, si chiamano routines in linguaggio macchina del sistema operativo.
249STACK SUPERATO
Si presenta solo quando programmi in linguaggio macchina scritti dall'utilizzatore distruggono lo stack dell'Organiser.
248STACK SUPERATO
Come sopra.
247ERR FUNZ ARG
Un argomento di tipo non corretto è stato passato a una funzione o a una procedura di utente.
246NO PACK
Non esiste Datapak montato sul dispositivo richiamato da un'istruzione come CREATE, OPEN ecc., o un pack è stato tolto.
245ERR SCRIT PACK
L'Organiser non è in grado di scrivere i dati su uno dei Datapak. Provate a rimontarlo!
244PACK DI SOLO LET
È stato fatto un tentativo di scrivere su un Datapak usato dall'Organiser MK1, o un pack di programmi. Questi possono essere letti, ma non scritti.
243ERR NOME DISP
Per un dispositivo è stato usato un nome diverso da A, B o C.
242PACK CAMBIATO
Ha luogo quando si chiamano routines in linguaggio macchina del sistema operativo, o quando un pack viene cambiato durante un'operazione di COPIA.
241PACK NON VERGINE
Il Datapak deve essere riformattato perchè sono tuttora presenti dati residui.
240PACK SCONOSCIUTO
Un pack non supportato dall'MK2 dell'Organiser è stato inserito in uno dei dispositivi.
239PACK PIENO
È stato fatto un tentativo di scrivere su un Datapak già completo.
238FINE ARCHIVIO
Si presenta quando si tenta di leggere oltre la fine di un archivio dati.
237TIPO REC ERRATO
Si presenta solo quando vengono mandati in esecuzione programmi in linguaggio macchina.
236NOME ARCH ERRATO
È stato specificato un nome non corretto per un archivio (massimo 8 caratteri alfanumerici che iniziano con una lettera).
235ARCH ESISTENTE
È stato fatto un tentativo di creare un archivio o una procedura con un nome già esistente su quel dispositivo.
234ARCH NON TROVATO
E' stato fatto un tentativo di accedere a un archivio che non esiste su quello specifico dispositivo.
233DIRECTORY PIENA
Nessun dispositivo può contenere più di 110 archivi ed è stato fatto un tentativo di superare questo limite.
232PACK NON COPIABILE
È stato fatto un tentativo di copiare un pack protetto contro le copie.
231ERR RICH DISP
Compare solo quando l'utente richiama un dispositivo non accessibile du un programma in linguaggio macchina.
230DISP INESISTENTE
È stato fatto un tentativo di accedere a un dispositivo che non è installato, per esempio, una stampante. Quando nessuna stampante è collegata, il comando LPRINT produrrà questo errore.
229ERR CARICAMENTO
Un pack di programmi o una periferica sono stati rimossi durante le operazioni di verifica dall'Organiser, o il pack si è rovinato.
228ERR DI SINTASSI
È stato individuato un errore di sintassi durante la traduzione di una procedura.
227() ERRONEE
In un'espressione si è trovato un numero non corretto di parentesi: il numero di parentesi aperte non corrisponde a quello delle parentesi chiuse.
226ERR FUNZ ARG
Ad una funzione è stato fornito un numero o un argomento di tipo non corretto, per esempio:
LOG(-1), SIN(x,y) o LEN(a).
225ERR DI INDICE
Per una variabile a schiera è stato specificato un indice fuori dai limiti, per esempio a(0) o a(10) quando la schiera a() era stata dichiarata di 9 elementi.
224TIPO INCORRETTO
È stato assegnato un valore ad una variabile di un tipo errato, per esempio a$=12 o a="text" o a un parametro di procedura è stato assegnato un valore di tipo non corretto.
223NOME LUNGO
Il nome specificato per un archivio, 0 una procedura o una variabile supera il numero massimo di caratteri concessi: 8 caratteri compreso il qualificatore $ o %.
222ERR IDENTIF
È stato usato il nome di una variabile formato in modo non corretto. Per esempio: name$$.
221"" ERRONEE
Si presenta quando o sono state usate troppe virgolette per racchiudere un testo o ne è stata omessa una.
220STR LUNGA
E' stata prodotta una stringa che supera lo spazio assegnatole dai comandi GLOBAL e LOCAL. Per esempio:
LOCAL a$(10)
a$="123456789ABCDEF"
219ERR CARATTERE
Un carattere non riconosciuto, come ? o a, è stato inserito in un'espressione aritmetica.
218ERR NUMERO
Si è usato un numero in modo che esso non può essere riconosciuto. Per esempio 2.3.4.
217ERR NOME PROC
Il programma non ha come prima linea un nome di procedura valido.
216ERR DICHIARAZ
Una variabile è stata dichiarata in maniera non corretta. Per esempio:
GLOBAL name$(10,300)
215ERR MATRICE
È stata dichiarata una schiera con un numero errato di elementi. Per esempio:
GLOBAL name$(0,15).
214NOME DUPLICATO
Il nome della variabile assegnata esiste già nella procedura corrente.
213ERR STRUTTURA
Una struttura IF/ENDIF, WHILE/ENDWH o DO/UNTIL è stata annidata in maniera non corretta.
212STRUT COMPLESSA
All'interno di una procedura le strutture presentano un numero di annidamenti eccessivo. Non si possono annidare più di 8 strutture.
211NO ETICHETTA
Un'istruzione GOTO fa riferimento ad una etichetta che non esiste nella procedura corrente.
210NO VIRGOLA
È stata omessa una virgola dall'elenco di voci che dovrebbero essere separate da virgole.
209ERR NOME LOGICO
È stato specificato un nome logico non riconosciuto, per esempio non: A, B, C o D.
208ERR ASSEGNAZIONE
Sì è tentato di assegnare un valore a un parametro di procedura.
207ERR LISTA CAMPO
Ogni archivio deve contenere almeno uno e non più di 16 campi. L'errore si verifica quando si tenta di superare questi limiti.
206INTERRUZIONE
Durante l'esecuzione del programma è stato premuto il tasto ON/CLEAR che ha fermato il programma stesso. E' stato poi premuto il tasto A, abbandonando così il programma. L'uso del comando ESCAPE OFF evita che ciò accada.
205ERR ARG NUM
È stato passato ad una procedura un numero errato di argomenti.
204NO VAR ESTERNA
Si è incontrata una variabile che non è stata dichiarata: nè come variabile globale da una precedente procedura: nè come parametro della procedura corrente, nè come variabile globale o locale nella procedura corrente.
203NO PROCEDURA
E stata chiamata una procedura che non esiste su nessun dispositivo.
202FUNZ MENU LUNGA
La stringa fornita alla funzione MENU è troppo lunga e deve essere accorciata.
201CAMPO ERRONEO
Sì presenta quando si usa una variabile di campo che non si accorda con nessuna di quelle di nessun file logico.
200ERR LETTURA PACK
I dati in un Datapak non possono essere letti; il pack deve essere riformattare.
199ARCH IN USO
È stato fatto un tentativo di aprire un archivio già aperto, o di cancellare un archivio ancora aperto.
198REC TROPPO LUNGO
Nessun record può superare i 254 caratteri.
197ERR NOME PROC
Si presenta quando, nell'opzione NUOVO nel menu PROG, viene dato un nome di procedura scorretto.
196ARCH NON APERTO
Si è tentato di scrivere o di leggere un file non aperto.
195VAL NUM SUPERATO
Si è superato il valore massimo per un numero intero (-32768 a +32767).

ERRORI DI ESECUZIONE

Se durante l'esecuzione di una procedura si verifica un errore se questo non è intrappolato dalla procedura stessa, allora apparirà un messaggio di errore e vi sarà richiesto di premere il tasto space.

Se il programma era stato mandato in esecuzione dal menu PROG, avrete allora la possibilità di editare la procedura. Lo schermo mostrerà la richiesta EDITA S/N.

Se volete editare la procedura premete il tasto S, invece, se volete tornare al menu PROG premete il tasto N.

Questa opzione è disponibile solo nel caso che esista il sorgente della procedura.

Quando la procedura è stata editata e, quindi, l'errore non esiste più, premete il tasto MODE per tornare al menu TRAD/REGISTRA/ABBANDONA e operate una scelta.

Se abbandonate a questo punto, anche se avete introdotto modifiche nella procedura, queste saranno perse e la versione originale della procedura resterà ancora memorizzata sul dispositivo corrente.

ERRORI COMUNI

Tutti i linguaggi di programmazione sono molto pignoli per quanto riguarda l'uso dei comandi e delle funzioni e, in particolare, per quanto riguarda il modo in cui le istruzioni del programma sono scritte.

Queste devono rispettare la sintassi del linguaggio: i vari segni d'interpunzione, poi, sono fondamentali in un programma, e garantiscono la corretta interpretazione dì ciascuna parte di una linea di programma.

Un'area dove l'OPL richiede molta attenzione è quando si passano parametri a procedure e a funzioni, e quando si devono usare numeri che devono essere di un tipo particolare.

Segue ora un elenco di errori che si possono facilmente verificare e il formato corretto che dovrebbe essere usato.

In ogni caso, l'istruzione errata è marcata.

ERRORI DI PUNTEGGIATURA

Dimenticare i "due punti" (:) tra istruzioni su una linea che contiene più istruzioni:

NON CORRETTOCORRETTO
proc1:proc1:
a$="text" PRINT a$a$="text" :PRINT a$

Omettere i "due punti" (:) dopo il nome di una procedura:

NON CORRETTOCORRETTO
proc1:proc1:
GLOBAL a,b,cGLOBAL a,b,c
proc1proc1:

Omettere uno o più di uno dei "due punti" (:) dopo un'etichetta:

NON CORRETTOCORRETTO
proc1:proc1:
GOTO below:GOTO below::
below:below::

Omettere lo spazio davanti ai "due punti" (:) fra istruzioni su una linea che contiene più istruzioni:

NON CORRETTOCORRETTO
proc1:proc1:
a=a+b:PRINT aa=a+b :PRINT a

ERRORI DI PARAMETRI

Passare un numero intero o un'espressione intera a una procedura a virgola mobile chiamata proc2:(x). Ciò può accadere quando si chiama una procedura col calcolatore o tramite l'OPL:

1) Dal calcolatore:

NON CORRETTOCORRETTO
2*6+proc2:(3)2*6+proc2:(3.)

2) Da un'altra procedura:

NON CORRETTOCORRETTO
proc1:proc1:
proc2:(2/3)proc2:(2.0/3)

Passare un numero errato di parametri a una procedura; in questo caso la procedura proc3:(x,y)

NON CORRETTOCORRETTO
proc1:proc1:
proc3:(3.7)proc3:(3.7,2.5)

ERRORI DI DIMENSIONI DEGLI INTERI

L'OPL permette di assegnare a variabili intere solo valori compresi tra -32768 e +32767; quindi ogni espressione che superi questi limiti causerà un errore.

NON CORRETTOCORRETTO
proc1:proc1:
LOCAL a%LOCAL a
a%=100*2468a=100*2468

ERRORI DI STRUTTURA

Le strutture possibili offerte dall'OPL sono DO/UNTIL, WHILE/ENDWH e IF/ELSEIF/ELSE/ENDIF. Esse possono annidarsi l'una nell'altra fino a 8 livelli. Se tenterete di andare oltre, verrà segnalato un errore. Se le 3 strutture sono annidate in maniera non corretta, per esempio facendo corrispondere a un comando DO un comando WHILE, anche in questo caso verrà segnalato un errore.

NON CORRETTOCORRETTO
proc1:proc1:
DODO
WHILE a>2UNTIL a<=2

CICLI SENZA FINE

È possibile scrivere una procedura che contenga cicli senza fine dai quali non sia possibile uscire logicamente. Se è stato usato il comando ESCAPE OFF, allora il tasto ON/CLEAR non vi permetterà di uscire dal ciclo e, in questo caso, si può solo togliere le batterie dall'Organiser. (II tasto ON/CLEAR può essere normalmente usato come tasto d'emergenza per interrompere la procedura corrente, tranne quando è stato usato il tasto ESCAPE OFF. Vedi l'ultima parte del cap 24).

Togliere la batteria significa perdere tutti i dati della memoria interna della macchina; bisogna quindi, nei limiti del possibile, evitare di farlo.

Ecco una procedura che contiene un ciclo senza fine. NON INSERITELA!

proc: ESCAPE OFF here:: PRINT "Ciclo senza fine...."; GOTO here::

Questo esempio è molto semplice e non è probabile che voi facciate un errore così banale. Comunque, nell'usare il comando ONERR label:: è facile dimenticare che tutti gli errori faranno passare il controllo del programma all'ultima etichetta che è stata specificata con questo comando. Ciò può anche dare come esito un ciclo senza fine, quindi bisogna essere particolarmente attenti nell'usare il comando ONERR label:: assieme al comando ESCAPE OFF.


28 LA STAMPA DELLE PROCEDURE

Quando cominciate a scrivere le vostre procedure, potreste, di tanto in tanto, volerla stampare. Ciò può aiutarvi ad avere le idee più chiare sulla sequenza della procedura quando essa è lì, nero su bianco. È, inoltre, certamente più facile mostrare a qualcuno come è fatta una procedura dando un pezzo di carta che può essere portato a casa e studiato.

Per collegare una stampante al vostro Organiser avrete bisogno del RS232 Communication Link della Psion. Essa permette di collegare qualsiasi stampante seriale all'Organiser o può essere usata per dialogare con un altro computer (vedere Appendice F).

Se al vostro Organiser non è collegata nessuna stampante, allora, quando scegliete l'opzione LIST dal menu PROG, comparirà il messaggio ERR DISP

Premete allora il tasto SPACE per tornare al menu PROG.


29 IL DIRETTORIO DELLE PROCEDURE

L'opzione DIR nel menu PROG viene usata per leggere il direttorio delle procedure che sono memorizzate sul dispositivo corrente.

Scegliete DIR dal menu PROG nel solito modo. Lo schermo si pulirà e apparirà l'indicazione:

DIR A:  

Se è necessario, premete il tasto MODE una o più volte per passare sul dispositivo voluto, poi premete il tasto EXE

Se vi sono delle procedure memorizzate, la prima di queste sarà mostrata. Ogni volta che premete il tasto EXE, apparirà il nome della procedura successiva.

Dopo che è apparso il nome dell'ultima procedura, sullo schermo apparirà il messaggio FINE DATI.

Premete, infine, il tasto ON/CLEAR per ritornare al menu PROG


30 CANCELLAZIONE DI UNA PROCEDURA

L'opzione CANCELLA del menu PROG vi permette di eliminare procedure da qualsiasi dispositivo. Scegliete CANCELLA nel solito modo e sullo schermo apparirà:

CANCELLA A:  

Se necessario, premete il tasto MODE una o più volte per passare al dispositivo voluto. Battere, ora, il nome di una procedura che deve essere eliminata dal dispositivo corrente, per esempio PROC

Premete, poi, il tasto EXE e lo schermo apparirà così:

CANCELLA A:PROC  CANCELLA S/N

A questo punto, premete il tasto S per confermate che volete eliminare quella procedura, o il tasto N per cancellare l'istruzione.


31 COPIATURA DI PROCEDURE

L'opzione COPIA del menu PROG viene usata per copiare procedure da un dispositivo ad un altro.

Quando si sceglie COPIA dal menu nel solito modo, lo schermo apparirà così:

COPIA   SOLO OGGETTO S/N

Premete il tasto S se volete ricopiare solo la copia tradotta della procedura, cioè il file oggetto.

Premete N per copiare sia l'oggetto che il sorgente.

Se sono stati ricopiati entrambi, a copia avvenuta, la procedura potrà essere editata nel solito modo anche sul dispositivo di arrivo.

Se, invece, è stato copiato solo il file oggetto, allora quella copia non potrà essere editata.

È prudente, quindi, assicurarsi che le procedure siano state accuratamente controllate prima di fare copie dei loro file oggetto.

Il vantaggio di copiare solo il file oggetto è che la procedura occuperà solo circa metà dello spazio di memoria occupato dall'originale.

L'opzione COPIA opera nello stesso modo dell'opzione COPIA del menu principale con un'unica eccezione; se sul dispositivo di destinazione esiste già un archivio con lo stesso nome di quello che viene copiato, allora la versione preesistente verrà cancellata e sostituita.

Su nessun dispositivo vi possono essere più procedure con lo stesso nome.

Dopo che l'archivio o gli archivi sono stati copiati sul dispositivo di destinazione, lo schermo torna al menu PROG.


32 PROGRAMMI ESEMPIO

Questo capitolo presenta alcuni esempi di programmi scritti in OPL; essi non hanno lo scopo di dimostrare tutte le possibilità del linguaggio, ma intendono solo fornire alcuni suggerimenti circa l'uso più efficiente dei suoi comandi c delle sue funzioni.

Ciascuna procedura dovrà essere caricata separatamente poichè non è possibile avere due procedure distinte in un unico blocco.

PROGRAMMA STAT

Questa procedura opera in maniera analoga all'opzione INFO del menu a livello più alto. Tuttavia, essa fornisce anche il modello dell'Organiser che stato usando, le dimensioni della memoria e lo spazio ancora disponibile su ciascuno dei dispositivi installati.

stat: LOCAL a$(8),b%,c$(5),d$(6),e$(2),f% a$="Memory:" :c$="MAIN" d$="FREE:" PRINT "Model:"; f%=PEEKB($FFE8) IF f%=0 PRINT "CM" PRINT a$+"8K" ELSE PRINT "XP" PRINT a$; IF f%=1 PRINT "16K" ELSE PRINT "32K" ENDIF ENDIF :GET :b%=0 DO e$=CHR$(b%+%A)+":" IF EXIST(e$+c$) OPEN e$+c$,A,f$ PRINT d$;e$;SPACE CLOSE :GET ENDIF b%=b%+1 UNTIL b%=3

PROGRAMMA MUTUO

Questa procedura, che fa parte dell'ORGANISER II FINANCIAL PACK, determina i pagamenti mensili sulla base del capitale, del tasso d'interesse e del tipo di mutuo.

La procedura utilizza un'altra procedura, precisamente la routine di input q:

Questa routine può essere utilizzata in qualsiasi procedura che necessiti di dare all'utente un messaggio perchè inserisca un numero a virgola mobile.

La stringa contenente il messaggio viene passata alla routine come parametro; la routine, a sua volta, restituisce il numero battuto.

L'uso di una procedura generale di questo tipo evita l'uso ripetuto, in diverse parti del programma, di uno stesso blocco di istruzioni.

mortgage: LOCAL a%,loan,b,y,i,p ONERR l1:: CLS PRINT "EVALUATE MONTHLYMORTGAGE PAYMENT" PAUSE 30 LOAN=q:("ENTER AMOUNT OF LOAN"+CHR$(63)+" ") DO i=q:("INTEREST RATE % "+CHR$(63)+" ") UNTIL i>0 AND i<99 DO y=q:("ENTER TERM IN YEARS "+CHR$(63)+" ") UNTIL y>.5 AND y<100 a%=MENU("BUILDING-SOCIETY,BANK,OTHER") IF a%=0 :RETURN :ENDIF i=i/100 :b=1+11*(A%/2) p=loan*i/12/(1-((1+i/b)**(-b*y))) CLS : PRINT "MONTHLY PAYMENT",FIX$(p,2,-8) GET l1:: RETURN

Input Routine

q:(a$) LOCAL z ONERR l1:: l1:: CLS :PRINT a$,CHRS(16); INPUT z CLS RETURN(z)

PROGRAMMA APR

I tassi d'interesse per i prestiti o gli acquisti a rate possono essere calcolati sia come tassi mensili che come tassi annuali; non è sempre facile stabilire quale, fra questi due tipi di interesse, sia il più vantaggioso per un certo investimento o per un dato acquisto rateale.

La soluzione migliore consiste nel calcolare l'APR (Annual Percent Rate = Tasso Percentuale Annuale) per ciascuna soluzione e nel Confrontarli fra loro.

L'APR è una misura comparativa, su base annuale, dei tassi d'interesse che consente una loro standardizzazione.

Questa procedura, che fa parte del Finance Pack, vi consente di fare i calcoli facilmente e velocemente.

Il Finance Pack contiene non solo le procedure qui presentate, ma anche un sistema per la registrazione dei movimenti bancari, un promemoria ed una calcolatrice per calcolare il NPV (Net Present Value), l'IRR (Internal Rate of Return), gli interessi composti e i rendimenti di titoli e Buoni del Tesoro.

apr: LOCAL i,n% DO CLS :PRINT "ENTER PERIOD IN MONTHS? "; INPUT n% UNTIL n%>=1 AND n%<15 DO CLS : PRINT "INTEREST RATE % FOR PERIOD? "; INPUT i UNTIL i>0 AND i<20 i=(1+i/100)**(12/n%) i=(i-1)*100 CLS : PRINT "APR=";FIX$(i,2,-6) GET

PROGRAMMA MUTO

La procedura presentata qui di seguito può essere utilizzata per disattivare tutte le segnalazioni acustiche del vostro Organiser.

La procedura MUTO funziona come un interruttore in modo che essa può attivare e disattivare gli allarmi.

Essa non richiede nessun dato d'ingresso, ma è in grado di stabilire se gli allarmi sono o meno attivati e, quindi, di agire di conseguenza.

mine: PRINT "Sound now <"; IF PEEKB($A4)=0 POKEB $A4,1 PRINT "OFF>" ELSE PRINT "ON>" POKEB $A4,0 ENDIF PRINT "Press any key": GET

PROGRAMMA PASSWORD

La procedura PASSWORD (PAROLA D'ORDINE) può essere usata per garantire la segretezza dei dati registrati nel vostro Organiser.

Quando viene lanciata, la procedura inizia spegnendo la macchina; quando, poi, si preme il tasto ON/CLEAR, la macchina viene riaccesa, e la procedura riprende chiedendo la Parola d'Ordine. Se la Parola d'Ordine con cui si risponde non è quella corretta, allora la macchina viene nuovamente spenta.

Il comando ONERR è utilizzato per prevenire il blocco della procedura cosicchè, o si fornisce la parola di ordine o, per riprendere il controllo della macchina, è necessario togliere le batterie.

password: LOCAL a$(5) ONERR start:: start:: OFF CLS :PRINT "Enter password" INPUT a$ IF a$<>"Barry" GOTO start: ENDIF

Nota. Si raccomanda di non scegliere come parola d'ordine una parola o una serie di caratteri che abbiano un qualche collegamento con voi. Usare il vostro nome, magari riletto al contrario, non fornirebbe una notevole garanzia di sicurezza.

PROGRAMMA PRIMI

Questa procedura genera i primi 30 numeri primi e li visualizza sulla schermo.

prime: LOCAL prim%(31),j% LOCAL i%,flag%,k%,l%,m% flag%=0 i%=3 :j%=2 prim(1)=2 DO l%=1 :m%=1 WHILE l%<j% k%=prim%(l%) IF i%=k%*(i%/k%) m%=0 :BREAK ENDIF l%=l%+1 ENDWH IF m% prim%(j%)=i% j%=j%+1 IF flag% PRINT ","; ELSE PRINT "Primes:2,"; ENDIF flag%=1 PRINT l%; ENDIF i%=i%+1 UNTIL j%>=30 PRINT "FINISHED" GET

PROGRAMMA TASSE

Questo programma, che consiste delle seguenti 5 procedure: TAX:, TAXIN:, TAXOUT:, TAXCALC: e NEWTAX:, può essere usato per calcolare le tasse dovute sulla base delle entrate, dello stato civile, delle spese, degli emolumenti e degli interessi sui capitali.

Quando il programma viene usato per la prima volta, esso vi chiede di fornire il minimo imponibile per l'anno corrente: questo dato viene caricato in due files distinti che sono utilizzati per calcolare le tasse che dovrete pagare.

Tutte le 5 procedure sono necessarie; esse vanno caricate e tradotte separatamente.

Tax Top level

tax: GLOBAL inc,gross,cap,dr$(2),b%,c$(6),f$(8),tax c$="TAXALS" :b%=0 DO dr$=CHR$(b%+%A)+":" IF EXIST(dr$+c$) f$=dr$+c$ ENDIF b%=b%+1 UNTIL b%=3 IF f$="" PRINT "Files Dont Exist";CHRS(16) PAUSE 20 newtax: ELSE dr$=LEFT$(f$,2) ENDIF OPEN dr$+"RATES",A,thresh,rate OPEN f$,B,sing%,marr%,capg% taxin: CURSOR OFF :CLS :PRINT " COMPUTING" taxcalc: taxout: CLOSE

Tax Input

taxin: LOCAL an$(1),allow% CLS :USE B PRINT "Enter Gross";chrs(15);"Income: "; :INPUT gross CLS :an$="" WHILE NOT (an$="m" or an$="s") CLS :PRINT "Married/Single";CHRS(15);"(m/s): ";CHRS(63): ans=LOWER$(GET$) ENDWH IF an$="m" :allow%=B.marr% ELSE allow=B.sing% ENDIF inc=gross-allow% CLS :PRINT "Enter Allowable";CHR$(15);"Expenses:"; INPUT allow% inc=inc-allow% CLS :PRINT "Enter Taxable";chr$(15);"Perks: "; INPUT allow% inc=inc+allow% CLS PRINT"Enter capital";chrs(15):"Gains: "; INPUT cap RETURN

Tax Results

Taxout: LOCAL cgt CLS PRINT "Tax on Earned";chr$(15);"Income= ";FIX$(tax,2,8) GET CLS PRINT "Net Earned";chr$(15);"Income= ":FIX$((gross-tax),2,8) GET IF cap>B.capg% cgt=(cap-B.capg%)*0.30 CLS PRINT "Capital Gains";chr$(15);"Tax= ";FIX$(cgt,2,8) GET :CLS PRINT "Total Tax Bill";CHR$(15);"'";FIX$((tax+cgt),2.8) GET :CLS PRINT "Net Total Income";CHR$(15); PRINT "=";FIXS((gross+cap-tax-cgt),2,8) GET ENDIF RETURN

Tax Calculator

taxcalc: LOCAL i%,old FIRST WHILE NOT EOF IF inc>A.thresh :i%=POS :ENDIF NEXT EDWWH POSITION i% tax-(inc-A.thresh)*A.rate/100 old=A.thresh WHILE i%>1 i%=i%-1 POSITION i% tax=tax+(old-A.thresh)*A.rate/100 old=A.thresh ENDWH RETURN

Tax - New Files

newtax: LOCAL c%,i% i%=MENU("RAMFILE,PACKA,PACKB") IF i%=0 :RETURN :ENDIF dr$=CHR$(%A+i%-1)+":" f$=dr$+"RATES" TRAP CREATE f$,A,thresh,rate IF ERR <>0 :PRINT ERR$(ERR) PAUSE 60 :RETURN ENDIF PRINT "RATES data:" DO PRINT "Threshold:"; :INPUT A.thresh PRINT "Rate :"; :INPUT A.rate c%=c%+1 :APPEND UNTIL c%=6 :CLOSE f$=dr$+"TAXALS" TRAP CREATE f$,B,sing%,marr%,capg% IF ERR<>0 :PRINT ERR$(ERR) PAUSE 60 :RETURN ENDIF PRINT "TAXALS data?" PRINT "Single :" :INPUT B.sing% PRINT "Married :INPUT B.man% PRINT "Cap.Gains:"; :INPUT B.capg% APPEND :CLOSE

The data which must be entered into the files TAXALS and RATES are given in the tables below. These figures are valid tor the tax year 1986/87. The figures for each year are given in the annual budget.

RATES

THRESHOLD RATE (%) 0 30 17201 40 20201 45 25401 50 33301 55 40201 60

TAXALS

SINGLE 2335 MARRIED 3655 CAP. GAINS THRESHOLD 6300

PROGRAMMA GIOCO

Questo programma è un gioco che mostra l'uso dei grafici definiti dall'utente; esso consiste di 3 procedure: GAME:, IGAME: e UDG:.

La procedura principale GAME: chiama IGAME: e UDG: che creano i caratteri grafici usati durante il gioco.

Lo scopo del gioco è di evitare di essere catturato da pacman. Il vostro omino si può muovere e può saltare da un riga all'altra dello schermo per sfuggire all'inseguitore. Per passare alla riga inferiore, premere il tasto X, per passare a quella superiore, premere il tasto S

Alla fine del gioco, sullo schermo apparirà il punteggio ottenuto.

Per fare una pausa, premete il tasto ON/CLEAR una volta; per interrompere il gioco, dopo averlo fermato con ON/CLEAR, premete il tasto SPACE.

Game: Main Procedure

game: LOCAL a$(1).b$(1),c$(1),d$(1),e$(2),f$(1),g$(32) LOCAL a%,b%,c%,x%,y%,z%,sc%,b1%,f%,h$(1) igame: CURSOR OFF a$=CHR$(0) :b$=CHR$(1) c$=CHR$(2) :d$=CHR$(3) e$=CHR$(4)+CHR$(6) :f$=CHR$(5) g$=REPT$(CHR$(165),32) :h$=CHR$(7) b%=20 :c%=12 :x%=16 :y%=1 DO CLS :PRINT g$ :AT x%,y% :PRINT h$ a%=1 :c%=1+RND*2 DO AT a%,c% :PRINT a$ :BEEP b%,10*b% AT a%,c% :PRINT b$ :BEEP b%,10*b% AT a%,c% :PRINT c$ :BEEP b%,10*b% AT a%,c% :PRINT d$ :BEEP b%,10*b% AT a%,c% :PRINT e$ :BEEP b%,10*b% AT a%,c% :PRINT f$ :BEEP b%,10*b% AT a%,c% :PRINT " " :z%=KEY IF z% IF z%=%S AND y%=2 AT x%,y% :PRINT CHR$(165) y%=1 :AT x%,1 :PRINT h$ ENDIF IF z%=%X AND y%=1 AT x%,y% :PRINT CHR$(165) y%=2 :AT x%,2 :PRINT h$ ENDIF ENDIF a%=a%+1 IF a%=x% AND c%=y% f%-0 DO AT x%,y% :PRINT CHR$(170+f%) BEEP 10,100+f% f%=f%+1 : BEEP 10,100+f% UNTIL f%=30 b%=b%+5 : a%=16 :x%=x%-2 IF x%<1 :CLS :PRINT "GAME OVER" PRINT "SCORE:",sc% :PAUSE 40 WHILE KEY :GET :ENDWH GET :RETURN ENDIF ENDIF UNTIL a%=16 sc%=sc%+1 IF b%>12 :b%-b%-2 ELSEIF b%<6 IF b1% AND b% :b%-b%-1 :b1%=0 ELSE b1%=1 :ENDIF ELSE b%=b%-1 :ENDIF UNTIL c%=3

Game initialiser

igame: udg:(0,0,0,28,30,30,30,28,0) udg:(1,0,0,14,31,30,31,14,0) udg:(2,0,0,7,14,12,14,7,0) udg:(3,0,0,3,7,6,7,3,0) udg:(4,0,0,1,3,3,1,0,0) udg:(5,0,0,0,1,1,1,0,0) udg:(6,0,0,24,16,4,16.24,0) udg:(7,30,14,4,14,30,14,11,25)

Game: UDG's

udg:(x%,a%,b%,c%,d%,e%,f%,g%,h%) POKEB $180,64+x%*8 :POKEB $181,a% POKEB $181,b% :POKEB $181,c% POKEB $181,d% :POKEB $181,e% POKEB $181,f% :POKEB $181,g% POKEB $181,h%

PROGRAMMA SCHERMO

Questa procedura fa parte del FINANCIAL PACK che, come dice il nome, contiene programmi finanziari.

Due programmi del Finance Pack fanno uso di questa procedura, chiamata ROW: che crea sullo schermo un foglio elettronico costituito da una sola riga.

Il programma mostra come una procedura può prendere effettivamente il controllo dello schermo e della tastiera della macchina e rivela tutta la potenza e la flessibilità di gestione dello schermo dell'OPL.

Ogni volta che si preme un tasto, questo viene analizzato dalla procedura che, poi, agisce di conseguenza.

Il foglio elettronico occupa la riga inferiore dello schermo che mostra il contenuto delle prime tre celle, inizialmente vuote, mentre la riga superiore presenta il seguente messaggio:

use <> MODE=end

Come indicato dal messaggio, potete ora usare i tasti cursore per visualizzare ed editare il contenuto delle celle del foglio elettronico.

Con una singola pressione dei tasti SINISTRO e DESTRO potete spostarvi da una cella all'altra, oppure potete spostarvi velocemente tenendo i tasti premuti.

Per caricare numeri positivi (riscossioni), posizionatevi sulla cella desiderata e quindi battete il numero; per caricare numeri negativi (pagamenti), fate precedere al numero il segno meno. Ogni cella ha spazio per quattro cifre, cosicchè essa può registrare numeri fino a ±9999; questi numeri possono rappresentare lire, migliaia di lire, milioni di lire o qualsiasi altra cosa voi decidiate.

Caricate i numeri nelle celle e spostatevi verso destra o verso sinistra utilizzando i tasti cursore: il contenuto di ogni cella potrà poi essere letto o corretto. Quando vi spostate da una cella all'altra, sulla riga superiore dello schermo verrà visualizzata il numero della cella presentata.

row: LOCAL a%(99),m%,n%,j%,g%,z$(1),s$(3,5),p%,minus% CLS :KSTAT 4 z$=chr$(124) :n%=99 m%=1 :j%=1 :p%=0 :minus%=1 DO s$(i%)=NUMs(a%(j%),-5) IF LEFTS(s$(i%),1)=" " s$(j%)=z$+RIGHT$(s$(j%),4) ENDIF j%=j%+1 UNTIL j%=4 j%=1 REM - REDRAWS SCREEN AFTER EACH KEY FRESS DO AT 1,1 IF m%<>1 PRINT CHR$(14);z$,NUM$(m%+1-j%,-2),z$,NUM$(m%+2-j%,-2): PRINT " ";z$,NUM$(m%+3-j%,-2),z$ ELSE :PRINT " use ";CHR$(127);CHR$(126);" MODE=end" ENDIF AT 1,2 PRINT s$(1);s$(2);s$(3);z$ IF minus%=-1 AND p%=0 AT (5*j%-3),2 :PRINT " -": ENDIF AT 5*j%,2 CURSOR ON REM - WAITS AND DETECTS EACH KEY PRESS g%=GET REM - ESCAPE ALL CLEAR KEY PRESSED IF g%=1 or g%=2 CLS : RETURN REM - RIGHT ARROW PRESSED ELSEIF g%=6 IF j%=3 AND m%<n% m%=m%+1 :s$(1)=s$(2) ss(2)=s$(3) :s$(3)=NUM$(a%(m%),-5) IF LEFT$(s$(3),1)=" " s$(3)=z$+RIGHT$(s$(3),4) ENDIF ELSEIF j%<3 j%-j%+1 :m%=m%+1 ENDIF p%-0 minus%=1 REM - LEFT ARROW PRESSED ELSEIF g%=5 IF j%=1 AND m%>1 m%=m%-1 :s$(3)=s$(2) s$(2)=s$(1) :s$(1)=NUM$(a%(m%),-5) IF LEFT$(s$(1),1)=" " s$(1)=z$+RIGHT$(s$(1),4) ENDIF ELSEIF j%>1 j%=j%-1 :m%=m%-1 ENDIF p%=0 minus%=1 REM - EXECUTE PRESSED ELSEIF g%-13 p%=0 :minus%=1 REM - MINUS KEY PRESSED ELSEIF g%=%- p%=0 minus%=-1 AT (5*j%-3),2 PRINT "-"; REM - NON NUMERIC KEY PRESSED - DO NOTHING ELSEIF g%<48 OR g%>57 REM NUMERIC KEY - WRITE TO SCREEN AND ADD TO NUMBER ELSEIF p%<>4 IF p%=0 a%(m%)=0 ENDIF IF a%(m%)>0 AND minus%=-1 a%(m%)=-a%(m%) ENDIF a%(m%)=a%(m%)*10+minus%*(g%-48) p%=p%+1 s$(j%)=NUM$(a%(m%),-5) IF LEFT$(s$(j%),1)-" " s$(j%)=z$+RIGHT$(s$(j%),4) ENDIF ENDIF UNTIL 0


33 I COMANDI DELL'OPL

La maggior parte dei comandi dell'OPL richiedono uno o più argomenti; questi possono essere costanti o variabili, sia numeriche che a stringa.

In questo capitolo e nel seguente, dedicato alle funzioni dell'OPL, per specificare la sintassi dei vari comandi verrà usata la seguente convenzione:

<exp> espressione numerica
<exp%> espressione numerica intera nell'intervallo -32768 +32767
<exp$> espressione di stringa
<dev> dispositivo (A:, B: o C:)
<var> variabile (intera, reale o stringa)
<logfnam> nome di file logico (A, B, C o D)
<lista istruzioni> una o più istruzioni OPL su una o più righe della procedura. Sono ammesse istruzioni multiple; le singole istruzioni debbono essere separate da uno spazio seguito da un due punti (:).

Es.:

istruzione :istruzione :istruzione

Nel caso fosse necessario indicare più volte uno stesso tipo di istruzione, questo verrà riportato con un numero progressivo come segue:

<exp%1>,<exp%2>

APPEND
Sintassi:APPEND
I valori correnti sono aggiunti al file corrente come un nuovo record.
Vedi: ERASE, FIRST, NEXT, POSITION, POS, UPDATE
 
AT
Sintassi:AT <exp%1>,<exp%2>
Sposta il cursore sullo schermo nella posizione <exp%1>,<exp%2> essendo <exp%1> un valore compreso tra 1 e 16 che indica la posizione sulla riga e <exp%2> il numero di riga.
Vedi: PRINT, CURSOR, KSTAT
 
BEEP
Sintassi:BEEP <exp%1>,<exp%2>
Fa emettere al cicalino dell'Organiser una nota di frequenza 921600/(78+2* <exp%2>) Hz e di durata <exp%1> millisecondi.
 
BREAK
Sintassi:BREAK
Consente il controllo del programma e di interrompere un ciclo di DO/UNTIL o di WHILE/ENDWH e di riprendere l'esecuzione del programma a partire dalla prima istruzione dopo l'ultima istruzione del ciclo (UNTIL o ENDWH).
 
CLOSE
Sintassi:CLOSE
Chiude il file attualmente aperto.
Vedi: OPEN, CREATE, DELETE
 
CLS
Sintassi:CLS
Ripulisce lo schermo e porta il cursore nella prima posizione della riga superiore.
 
CONTINUE
Sintassi:DO
 <lista di istruzioni>
 IF <exp>
  CONTINUE
 ENDIF
 <lista di istruzioni>
UNTIL <exp>

Usato per passare il controllo del programma all'istruzione di controllo di un ciclo di DO/UNTIL o di WHILE/ENDWH. Nell'esempio riportato, sopra l'istruzione CONTINUE verrà eseguita solo se l'espressione che segue l'istruzione IF è logicamente vera. In questo caso, il controllo del programma verrà passato all'istruzione di controllo che viene dopo l'istruzione UNTIL.
 
COPY
Sintassi:COPY "<dev1>nomefile1","<dev2>nomefile2"
COPY "<dev1>nomefile1","<dev2>"
COPY "<dev1>","<dev2>"

Permette di copiare un archivio (file) completo da un dispositivo ad un altro. Nel primo esempio il file di nome nomefile1, allocato sul dispositivo <dev1> è copiato sul dispositivo <dev2> col nome nomefile2. Se sul dispositivo di destinazione è già presente un archivio con lo stesso nome (nomefile2), allora i records del file del primo dispositivo sono aggiunti al file esistente sul dispositivo di destinazione; in caso contrario, sul dispositivo di arrivo viene creato un file con quel nome e i records vi vengono copiati.

Nel secondo esempio, il file sul dispositivo di destinazione assume lo stesso nome (nomefile1) del file sul dispositivo di origine.

Nel terzo esempio, infine, tutti i files allocati sul dispositivo di origine sono copiati, mantenendo lo stesso nome, sul dispositivo di arrivo.

 
CREATE
Sintassi:CREATE "<dev>nomefile",<nomelog>,fldnm1,fldnm2
Crea sul dispositivo <dev> un file con il nome nomefile, il nome nomelog come file logico e contenente fino a 16 campi come specificato da fldnm1 e fldnm2. Il nome del file logico può essere: A, B, C 0 D. Quando viene creato, un file viene anche automaticamente Aperto (OPEN); fino a 4 files possono essere aperti contemporaneamente.
Vedi: OPEN, CLOSE, DELETE
 
CURSOR ON/OFF
Sintassi:CURSOR ON o CURSOR OFF
Accende o spegne il cursore sullo schermo. La condizione normale è CURSOR ON
Vedi: KSTAT
 
DELETE
Sintassi:DELETE "<dev>nomefile"
Elimina (cancella) dal dispositivo <dev> il file di nome nomefile. Prima di essere cancellato, il file deve essere chiuso.
Vedi: CREATE, OPEN, CLOSE, DELETE
 
DO/UNTIL
Sintassi:DO
 <lista istruzioni>
UNTIL <exp>

Il comando DO è utilizzato per indicare l'inizio di una lista di una o più istruzioni che termina con il comando UNTIL. Le istruzioni contenute nella lista saranno eseguite fino a che l'espressione che segue UNTIL non risulterà logicamente vera.
Vedi: WHILE/ENDWH, BREAK, CONTINUE
 
EDIT
Sintassi:EDIT <var$>
La stringa <var$> è presentata sullo schermo e può essere editata nel solito modo usando i tasti cursore e il tasto DEL. Ad operazione terminata, premendo il tasto EXE si restituisce la stringa corretta. Quando EXE viene premuto la stringa non è stata ancora modificata, essa viene restituita esattamente come era stata letta. Se durante l'operazione di edit viene premuto il tasto ON/CLEAR, la stringa viene completamente cancellata e su di essa può essere scritto un nuovo testo. Se però è stato usato anche il comando TRAP, il controllo viene restituito all'istruzione seguente nella procedura mentre viene attivata la condizione ESCAPE.
 
ERASE
Sintassi:ERASE
Cancella dal file corrente il record su cui è attualmente puntato. Per effetto di questo comando il record immediatamente successivo a quello cancellato diviene il record corrente. Nel caso che il record cancellato sia l'ultimo, un successivo comando di cancellazione restituirebbe un record nullo e renderebbe logicamente vera la condizione EOF
 
ESCAPE ON/OFF
Sintassi:ESCAPE ON / ESCAPE OFF
Il comando ESCAPE ON attiva il tasto ON/CLEAR da usare per bloccare un programma in esecuzione. La condizione normale è ESCAPE ON.

Il comando ESCAPE OFF produce l'effetto opposto, disattivando il tasto ESCAPE ON.

Nota. Se un programma entra in un ciclo che non presenta condizioni di uscita, e se è stato utilizzato il comando ESCAPE OFF, allora l'unico modo per uscire dal ciclo consiste nel togliere per un paio di minuti le batterie dell'Organiser: questo però comporta la perdita del programma e di tutti i dati registrati nella memoria RAM della macchina. Vedi: TRAP

 
FIRST
Sintassi:FIRST
Fa che il primo record del file diventi il record corrente.
Vedi: NEXT, POSITION, POS, BACK
 
GLOBAL
Sintassi:GLOBAL glob1%,glob2,glob3$(length),glob4(n).
Il comando GLOBAL viene utilizzato per definire variabili che saranno, così, utilizzabili nella procedura corrente e in tutte quelle di livello gerarchico inferiore.

Le variabili col nome che termina col segno % vengono dichiarate come variabili intere, quelle il cui nome termina con $ come variabili stringa, mentre tutte le altre sono dichiarate come variabili a virgola mobile. Analogamente, anche le variabili a schiera possono essere di ciascuno di questi tre tipi. I nomi di variabile possono essere lunghi sino a 8 caratteri, compreso il qualificatore (% e $), ma il primo deve essere un carattere alfabetico.

In una procedura possono essere presenti più istruzioni GLOBAL e LOCAL; esse devono, però, comparire in quest'ordine e precedere le altre istruzioni della procedura. Per i dettagli si veda il capitolo relativo alle variabili.
Vedi: LOCAL

 
GOTO
Sintassi:GOTO label::
Passa il controllo del programma alla linea la cui etichetta è label. L'etichetta deve essere presente nella procedura corrente ed il suo nome deve terminare con un doppio "due punti" (::). I nomi di etichetta possono essere lunghi sino a 8 caratteri esclusi i due punti.
 
IF/ELSEIF/ELSE/ENDIF
Sintassi:IF <exp>
 <lista istruzioni>
ELSEIF <exp>
 <lista istruzioni>
ELSE
 <lista istruzioni>
ENDIF

L'istruzione IF è seguita da un'espressione; se questa restituisce un valore logicamente vero (non zero), allora vengono eseguite le istruzioni che seguono; in caso contrario, esse vengono ignorate. L'istruzione ELSEIF non è obbligatoria, ma se è inclusa e se l'espressione <exp> è logicamente vera, allora le istruzioni di <lista istruzioni> vengono eseguite. Possono essere presenti più istruzioni ELSEIF. ciascuna con la propria lista di istruzioni. Se nessuna delle espressioni restituisce un valore vero, le istruzioni comprese tra ELSE e ENDIF vengono eseguite. L'istruzione ELSE è facoltativa.
 
INPUT
Sintassi:INPUT <var%>
INPUT <var>
INPUT <var$>
INPUT <logfile>.nomecampo

Permette l'introduzione di dati dalla tastiera durante l'esecuzione di un programma. Le variabili richiamate debbono essere state prima definite con un comando GLOBAL o LOCAL oppure essere nomi di campo del file corrente. Se si introduce una stringa, la lunghezza di questa non può essere maggiore di quanto definito coi comandi GLOBAL o LOCAL. Se durante l'operazione di input viene premuto il tasto ON/CLEAR, quanto è stato battuto sino a quel momento viene cancellato e può essere sostituito da altri dati; se però è stato utilizzato anche il comando TRAP, il controllo viene restituito all'istruzione seguente nella procedura mentre viene attivata la condizione ESCAPE.
Vedi: GLOBAL, LOCAL, TRAP
 
KSTAT
Sintassi:KSTAT <exp%>
Fissa lo stato della tastiera: modo SHIFT, modo CAPS, ecc. secondo la tabella seguente:
  1. Alfabetico - caratteri maiuscoli
  2. Alfabetico - caratteri minuscoli
  3. Numerico - caratteri maiuscoli
  4. Numerico - caratteri minuscoli

Vedi: CURSOR

 
LOCAL
Sintassi:LOCAL loc1%,loc2,loc3$(length),loc4(n)
Il comando viene usato per definire variabili utilizzabili solo nella procedura corrente. Altre procedure possono utilizzare gli stessi nomi per le loro variabili.
Vedi: GLOBAL
 
NEXT
Sintassi:NEXT
Fa diventare il prossimo record del file corrente record corrente. Se il comando è usato oltrepassando la fine del file, non viene segnalato alcun errore, ma il record corrente è un record nullo e la funzione EOF restituisce un valore logicamente vero.
Vedi: FIRST, BACK, ERASE, APPEND, UPDATE, POSITION, POS
 
OFF
Sintassi:OFF
Questo comando spegne l'Organiser, premendo il tasto ON/CLEAR, si riprende l'esecuzione del programma alla linea immediatamente successiva al comando OFF.
 
OPEN
Sintassi:OPEN "<dev>fname",<logfnam>,fldnm1,fldnm2
Apre un file presente sul dispositivo <dev>, col nome di file logico <logfnam> e con i nomi dei campi specificati da fldnm1 e fldnm2. È poi possibile accedere al file per mezzo del nome del file logico.
Vedi: CREATE, CLOSE, DELETE, USE.
 
ONERR
Sintassi:ONERR label:: / ONERR OFF
Nel caso che durante l'esecuzione di un programma si verifichi un errore, l'istruzione ONERR label:: trasferisce il controllo del programma all'istruzione individuata da quell'etichetta. L'istruzione ONERR OFF annulla l'effetto del comando ONERR attivato dell'istruzione ONERR label:: in modo che tutti gli errori che si verificano dopo l'istruzione ONERR OFF non saranno più gestiti.
 
PAUSE
Sintassi:PAUSE <exp%>
Se <exp%> è: 0 Attende che venga premuto un tasto. <0 Blocca il programma per <exp%> ventesimi di secondo o fino a che un tasto è premuto. >0 Blocca il programma per <exp%> ventesimi di secondo. Così, ad esempio, PAESE 100 tiene bloccato il programma per 5 secondi.

Nei primi due casi il tasto premuto viene registrato in una memoria di transito.

Sì consiglia di rimuovere questo carattere con l'istruzione GET come nell'esempio seguente:

<lista istruzioni> PAUSE 0 GET <lista istruzioni>

In questa procedura l'esecuzione non viene sospesa dall'istruzione GET perchè il tasto memorizzato con l'istruzione PAUSE 0 è utilizzato come input per l'istruzione GET.

 
POKEB
Sintassi:POKEB <exp%1>,<exp%2>
Scrive il numero intero <exp%2>, che deve essere compreso tra 0 e 255, nella locazione di memoria <exp%1>. Per accedere alle locazioni superiori a 32767 usare valori negativi o numeri in notazione esadecimale. Per esempio, $FFFF=-1 individua la locazione 65535.

Nota: Un uso distratto di questo comando può portare alla perdita di tutti i dati registrati nell'Organiser.
Vedi: POKEW, PEEKB, PEEKW

 
POKEW
Sintassi:POKEW <exp%1>,<exp%2>
Scrive l'intero <exp%2> in due locazioni di memoria successive, a partire dall'indirizzo <exp%1> con il byte più significativo all'indirizzo più basso.

Nota: Un uso distratto di questo comando può portare alla perdita di tutti i dati registrati nell'Organiser.
Vedi: POKEB, PEEKB, PEEKW

 
POSITION
Sintassi:POSITION <exp%>
Fa diventare il record numero <exp%> del file corrente record corrente. Se <exp%> è maggiore del numero di records presenti nel file, l'ultimo record è preso come record corrente.
Vedi: POS, FIRST, NEXT, ERASE, APPEND, UPDATE
 
PRINT / LPRINT
Sintassi:PRINT <exp>.<exp%>,<exp$>
Visualizza sullo schermo numeri o testi. Se gli argomenti, nell'istruzione PRINT, sono separati da virgole, sullo schermo essi appariranno separati da uno spazio; se invece nell'istruzione essi sono separati da punti e virgola, verranno visualizzati senza nessuna spaziatura. Un punto e virgola alla fine dell'istruzione fa si che il prossimo comando di stampa farà apparire l'argomento sulla stessa riga dell'istruzione precedente senza alcuna separazione, mentre se l'istruzione termina con una virgola, allora l'argomento della prossima istruzione di stampa visualizzerà l'argomento, ancora sulla stessa riga, ma separato da uno spazio. Negli altri casi il nuovo ordine di stampa userà la riga successiva.

Il comando LPRINT (disponibile solo quando un cavo Psion Organiser II RS232 è collegato alla porta posta sulla parte superiore dell'Organiser) opera esattamente come PRINT, con la sola differenza che l'uscita è inviata all'unità collegata al cavo.
Vedi: AT

 
RAISE
Sintassi:RAISE <exp%>
Genera artificialmente una condizione di errore, anche se l'errore non si è effettivamente verificano. Se, in precedenza, non è stata eseguita l'istruzione ONERR, allora viene visualizzato il messaggio relativo all'errore numero <exp%>.

I numeri di codifica dei possibili errori vanno da 195 a 255. Per l'elenco completo dei numeri d'errore e dei relativi messaggi, consultate il capitolo relativo alla gestione degli errori.
Vedi: ONERR, ERR, ERR$

 
RANDOMIZE
Sintassi:RANDOMIZE <exp>
Fornisce il seme per il generatore di numeri casuali, in modo che esso possa iniziare a generare una nuova sequenza di numeri. Se dovete utilizzare più volte la stessa sequenza di numeri casuali, fate uso del comando RANDOMIZE
 
REM
Sintassi:REM questo è un commento
Il comando REM individua gli eventuali commenti destinati a facilitare la comprensione di un programma.
L'Organiser ignora tutto quello che sulla linea segue il comando REM.
 
RENAME
Sintassi:RENAME "<dev>nomefile1","<dev>nomefile2"
Cambia al file presente sul dispositivo <dev> il nome dal nomefile1 in nomefile2.
 
RETURN
Sintassi:RETURN
RETURN <exp%>
RETURN <exp>
RETURN <exp$>

Usato da solo, il comando RETURN termina l'esecuzione di una procedura e restituisce il controllo al punto in cui questa era stata chiamata. L'uso di questo comando alla fine di una procedura non è obbligatorio. Il comando RETURN può essere usato anche per passare un valore al livello da cui la procedura è stata chiamata. L'eventuale valore da passare viene posto di seguito al comando RETURN.
 
STOP
Sintassi:STOP
Ferma l'esecuzione dell'OPL e riporta l'Organiser al punto dove il programma era stato lasciato: per esempio, al menu principale o all'opzione CALC del menu principale.
 
TRAP
Sintassi:TRAP FIRST
(APPEND/BACK/CLOSE/COPY/
CREATE/DELETE/ERASE/EDIT/
FIRST/INPUT/LAST/NEXT/OPEN/
POSITION/RENAME/UPDATE/USE)

Il comando TRAP può precedere ciascuno dei comandi della lista riportata sopra.

In questo caso, se l'esecuzione di uno di essi dà origine ad un errore, questo viene intrappolato e la successiva istruzione viene eseguita anche se l'errore dà normalmente luogo all'emissione di un messaggio.

 
UPDATE
Sintassi:UPDATE
Il comando UPDATE cancella dal file il record corrente, mentre i campi correnti sono aggiunti al file come un nuovo record. L'ultimo record, poi, diviene il record corrente.
Vedi: APPEND
 
USE
Sintassi:USE <logfnam>
Seleziona per l'uso il file col nome del file logico <logfnam>; questo deve essere stato precedentemente aperto con un comando OPEN o CREATE.
Vedi: OPEN, CLOSE, CREATE, DELETE
 
WHILE/ENDWH
Sintassi:WHILE <exp>
 <lista istruzioni>
ENDWH

Questa struttura è iniziata dal comando WHILE che precede un'espressione aritmetica.

La lista di istruzioni che segue e che deve terminare con l'istruzione ENDWH è ripetutamente eseguita sino a che l'espressione <exp> non risulta logicamente falsa (zero).
Vedi: DO/UNTIL


34 LE FUNZIONI DELL'OPL

Secondo la convenzione adottata in questo manuale, il tipo di una qualsiasi funzione è determinato dalla variabile a cui essa è assegnata. Così, una funzione che venga assegnata ad una stringa sarà una funzione stringa.

FUNZIONI NUMERICHE

ABS
Sintassi:a=ABS(<exp>)
Restituisce il valore assoluto di un numero. Ad esempio, ABS(-10) vale 10.
Vedi: IABS
 
ADDR
Sintassi:m%=ADDR(<var>)
Restituisce l'indirizzo della locazione di memoria in cui è stata caricata la variabile indicata tra parentesi. La variabile può essere anche una variabile a schiera, ad esempio: a%=ADDR(ARRAY()); in questo caso, non è necessario includere l'indice.
Vedi: USR, USR$
 
ASC
Sintassi:a%=ASC(<exp$>)
Restituisce il valore ASCII del primo carattere della stringa. In alternativa, se si vuole conoscere il codice ASCII di un dato carattere si può usare l'istruzione a%=%G. In questo esempio, l'istruzione restituisce il codice ASCII della lettera G.
 
ATAN
Sintassi:a=ATAN(<exp>)
Restituisce l'arcotangente, in radianti, del valore dell'espressione tra parentesi.
 
COS
Sintassi:c=COS(<exp>)
Restituisce il coseno dell'angolo, in radianti, pari al valore dell'espressione tra parentesi.
 
COUNT
Sintassi:c%=COUNT
Restituisce il numero di records contenuti nel file corrente.
Vedi: POS, POSITION
 
DAY
Sintassi:d%=DAY
Restituisce il giorno del mese (da 1 a 31).
Vedi: SECOND, MINUTE, HOUR, MONTH, YEAR, DATIM$
 
DEG
Sintassi:d=DEG(<exp>)
Restituisce, espressa in gradi, la misura di un angolo dato in radianti dall'espressione tra parentesi.
Vedi: RAD
 
DISP
Sintassi:d%=DISP(<exp%>,<exp$>)
<exp%> può assumere i valori -1, 0 e 1. Se <exp%> vale -1, allora <exp$> è ignorata e il record corrente viene visualizzato un campo per linea. I tasti cursore possono essere usati per spostarsi lungo il record.

Se <exp%> vale 1, allora <exp$> viene visualizzata secondo le modalità del caso precedente. Se <exp$> contiene dei caratteri di tabulazione (codice ASCII=9), questi dividono la stringa in campi così che questa può essere visualizzata su più linee.

Se <exp%> vale 0, allora <exp$> è ignorata e sullo schermo rimane l'ultimo record o l'ultima stringa visualizzata.

Dopo un'istruzione DISP con <exp%> uguale a 1 o a -1, e prima dell'uso della stessa istruzione con <exp%> uguale a 0, non deve essere richiamata nessuna istruzione o comando.

Per esempio, la procedura:

a%=DISP(1,a$) WHILE a%<>13 a%=DISP(0,"") ENDWH

visualizza a$ fino che non viene premuto il tasto EXE. Logicamente non vi è nessuna ragione per usare, tra le due DISP, una funzione o un comando che accedono allo schermo. Nel caso si faccia questo, si potranno ottenere risultati del tutto imprevedibili.

 
EOF
Sintassi:e%=EOF
Ogni istruzione di programma che cerchi di leggere oltre la fine di un file setta un flag interno per segnalare che è stata raggiunta la Fine Del File (EOF). Il flag, poi, può essere controllato. Ad esempio:

DO <lista istruzioni> UNTIL EOF

 
ERR
Sintassi:e%=ERR
Restituisce la codifica numerica dell'ultimo errore che si è prodotto. Per conoscere la codifica numerica dei vari errori, si veda il capitolo sui messaggi d'errore. I numeri di codifica sono compresi tra 0 e 255: lo o indica che non si è verificato alcun errore.
Vedi: ERR$, RAISE, ONERR
 
EXIST
Sintassi:e%=EXIST("<dev>nomefile")
Verifica l'esistenza sul dispositivo <dev> del file di nome nomefile; se questo esiste, la funzione restituisce un valore logicamente vero, altrimenti restituisce un valore logicamente falso.

Ad esempio:

IF EXIST("<dev>nomefile") <lista istruzioni> ENDIF

Vedi: DIR$

 
EXP
Sintassi:e=EXP(<exp>)
Restituisce il valore del numero e (2.71828) elevato al valore dell'espressione entro parentesi.
 
FIND
Sintassi:f%=FIND(<exp$>)
Ricerca nel file corrente la stringa data tra parentesi; se la trova restituisce il numero del record in cui la stringa compare, se non la trova restituisce il valore 0.

Se <exp$> è una stringa di lunghezza nulla, allora l'istruzione opera in maniera analoga a NEXT e fa diventare record corrente il record successivo.


Vedi: NEXT

 
FLT
Sintassi:f=FLT(<exp%>)
Converte il valore dell'espressione intera tra parentesi in un numero a virgola mobile.
 
FREE
Sintassi:f %=FREE
Ritorna il numero di bytes ancora disponibili nella memoria dell'Organiser.
Vedi: SPACE
 
GET
Sintassi:g%=GET
Rimane in attesa finchè non viene premuto un tasto e quindi ne restituisce il codice ASCII.
Vedi: GET$, KEY, KEY$, PAUSE
 
HOUR
Sintassi:h%=HOUR
Restituisce l'ora corrente prelevandola dall'orologio interno.
Vedi: SECOND, MINUTE, DAY, MONTH, YEAR, DATIM$
 
IABS
Sintassi:i%=IABS(<exp%>)
Restituisce il valore assoluto di un numero intero. Ad esempio: IABS(-10) = 10.
 
INT
Sintassi:i%=INT(<exp>)
Restituisce la parte intera del valore dell'espressione tra parentesi. I numeri negativi sono arrotondati per eccesso. Va usata solo se il valore restituito non supera i limiti fissati dall'OPL per gli interi.
Vedi: INTF
 
INTF
Sintassi:i=INTF(<exp>)
Si differenzia dalla funzione precedente in quanto il valore restituito è un numero a virgola mobile. Va usata quando il valore restituito supera i limiti fissati dall'OPL per i numeri interi.
Vedi: INT
 
KEY
Sintassi:k%=KEY
Restituisce il codice ASCII corrispondente all'eventuale tasto premuto. Se nessun tasto è stato premuto, allora il codice restituito è zero. Il comando non attende che venga premuto un tasto.
Vedi: PAUSE, GET, GET$, KEY$
 
LEN
Sintassi:l%=LEN(<exp$>)
Restituisce la lunghezza della stringa tra parentesi.
Vedi: LEFT$, RIGHT$, MID$, LOC, LOWER$, UPPER$, REPT$
 
LN
Sintassi:l%=LN(<exp>)
Restituisce il logaritmo naturale (in base e) del valore dell'espressione tra parentesi.
 
LOC
Sintassi:l%=LOC(<exp$1>,<exp$2>)
Restituisce la posizione della stringa <exp$2> nella stringa <exp$1>. Se <exp$2> non è contenuta in <exp$1>, allora la funzione restituisce il valore 0. Ad esempio:
LOC("STANDING","AND")
restituirebbe il valore 3 perchè la stringa "AND" è contenuta in "STANDING" a partire dal terzo carattere.
Vedi: LEFT$, RIGHT$, MID$, LEN, LOWER$, UPPER$, REPT$
 
LOG
Sintassi:l=LOG(<exp>)
Restituisce il logaritmo in base dieci del valore dell'espressione tra parentesi.
Vedi: LN
 
MENU
Sintassi:m%=MENU(menu$)
La stringa tra parentesi deve avere la struttura:
voce1,voce2,voce3...
ed è visualizzata sullo schermo allo stesso modo del menu principale. Permette, in tal modo, di fare una selezione nel modo usuale utilizzando i tasti cursore o la lettera iniziale della voce prescelta e restituisce il numero (1, 2,...) della scelta. Se è stato attivato il tasto ON/CLEAR, la funzione restituisce il valore 0.
 
MINUTE
Sintassi:m%=MINUTE
Fornisce il minuto (da 0 a 59) dell'ora corrente prelevandolo dall'orologio interno.
Vedi: SECOND, HOUR, DAY, MONTH, YEAR, DATIM$
 
MONTH
Sintassi:m%=MONTH
Fornisce il mese corrente (da 1 a 12) prelevandolo dall'orologio interno.
Vedi: SECOND, MINUTE, HOUR, DAY, YEAR, DATIM$
 
PEEKB
Sintassi:p%=PEEKB(<exp%>)
Restituisce il contenuto della locazione di memoria il cui indirizzo è fornito dalla espressione tra parentesi. Il valore restituito è un numero compreso tra 0 e 255.
Vedi: PEEKW, POKEB, POKEW.
 
PEEKW
Sintassi:p=PEEKW(<exp%>)
Restituisce il valore del numero intero memorizzato nei due bytes contigui di indirizzo, rispettivamente, <exp%> e <exp%>+1.
Vedi: PEEKB, POKEB, POKEW
 
PI
Sintassi:p=PI
Fornisce il valore di Pigreco (3.142...)
 
POS
Sintassi:p%=POS
Restituisce il numero del record corrente dell'archivio in uso.
Vedi: POSITION, FIRST, NEXT, ERASE, APPEND, UPDATE
 
RAD
Sintassi:r=RAD(<exp>)
Converte il valore dell'espressione <exp> da radianti in gradi.
Vedi: DEG
 
RECSIZE
Sintassi:r%=RECSIZE
Fornisce la lunghezza in bytes del record corrente. Poichè un record non può superare la lunghezza di 254 bytes, questa funzione può essere utilizzata per verificare se è possibile aggiungere dati ad un record senza superare tale limite.
 
RND
Sintassi:r=RND
Restituisce un numero casuale con valore compreso tra 0 (incluso) ed 1 (escluso).
Vedi: RANDOMIZE
 
SECOND
Sintassi:s%=SECOND
Restituisce i secondi (da 0 a 59) dell'ora corrente prelevandoli dall'orologio interno.
Vedi: MINUTE, HOUR, DAY, MONTH, YEAR, DATIM$
 
SIN
Sintassi:s=SIN(<exp>)
Restituisce il seno dell'angolo, il cui valore in radianti è dato dall'espressione tra parentesi.
 
SPACE
Sintassi:s=SPACE
Dà lo spazio, in bytes, ancora disponibile sul dispositivo corrente. Perchè la fruizione operi correttamente, è necessario che il dispositivo in questione contenga un archivio aperto.
Vedi: FREE
 
SQR
Sintassi:s=SQR(<exp>)
Restituisce la radice quadrata del valore dell'espressione tra parentesi.
 
TAN
Sintassi:t=TAN(<exp>)
Restituisce la tangente dell'angolo, il cui valore in radianti, è dato dall'espressione tra parentesi.
 
USR
Sintassi:u%=USR(<exp%1>,<exp%2>)
Il valore di <exp%1> e di <exp%2> sono passati, rispettivamente, ai registri D e PC del microprocessore HD6303X che, a sua volta, esegue il programma in linguaggio macchina che inizia all'indirizzo <exp%1> Alla fine della routine, il valore contenuto nel registro X è passato al programma chiamante come numero intero.

NOTA. Un uso non oculato di questa funzione può portare alla perdita di tutti i dati registrati nell'Organiser.
Vedi: USR$, ADDR

 
VAL
Sintassi:v=VAL(<exp$>)
Restituisce un numero a virgola mobile che è il valore numerico della stringa tra parentesi. Ad esempio, VAL("470.0") restituirebbe il numero 470.0.

Se la stringa contiene qualche carattere non numerico, allora viene segnalato un errore. Nella stringa è consentita la notazione scientifica: così VAL("1.3E10") restituirebbe il numero 1.3E10.

 
VIEW
Sintassi:VIEW(<exp%>,<exp$>)
Visualizza <exp$> sulla riga <exp%> (1 o 2) dello schermo. Se il testo supera i 16 caratteri, viene fatta scorrere automaticamente verso sinistra; il senso di scorrimento può essere cambiato usando i tasti cursore di destra o di sinistra.

Se si preme un qualsiasi altro tasto, lo scorrimento viene fermato e la funzione restituisce il codice ASCII del tasto premuto.

Se si richiama, poi, VIEW con una stringa di lunghezza nulla, allora riprende la visualizzazione che era stata interrotta.
Vedi: DISP

 
YEAR
Sintassi:y%=YEAR
Restituisce l'anno corrente (da 1900 a 1999) prelevandolo dall'orologio interno.
Vedi: SECOND, MINUTE, HOUR, DAY, HOUR, DATIM$

FUNZIONI A STRINGA

CHR$
Sintassi:a$=CHR$(<exp%>)
Restituisce il carattere ASCII che corrisponde al valore dell'espressione tra parentesi.
 
DATIM$
Sintassi:d$=DATIM$
Fornisce la data e l'ora prelevandole dall'orologio interno. Ad esempio: "LUN 17 FEB 1986 16:25:30"
Vedi: SECOND, MINUTE, HOUR, DAY, MONTH, YEAR
 
DIR$
Sintassi:d$=DIR$("<dev>") / DIR$("")
L'istruzione DIR(<dev>) visualizza il nome del primo archivio presente sul dispositivo indicato. Il nome del dispositivo deve essere posto tra parentesi, a loro volta messe tra virgolette.

Il successivo uso dell'istruzione con una stringa di lunghezza nulla farà comparire sullo schermo, in successione, i nomi degli altri archivi presenti sul dispositivo. Quando è stato visualizzato l'ultimo archivio, l'istruzione restituirà una stringa nulla.

 
ERR$
Sintassi:e$=ERR$(<exp%>)
Fornisce le descrizioni degli errori che possono verificarsi. Mentre l'istruzione ERR fornisce i codici degli errori, la istruzione ERR$ serve per ottenere la descrizione dell'errore quando se ne conosca il codice.

Se si usa un numero fuori dall'intervallo 195 - 255, verrà visualizzata la scritta: ERRORE

Vedi: ERR, ONERR, RAISE

 
FIX$
Sintassi:f$=FIX$(<exp>,<exp%1>,<exp%2>)
Restituisce una stringa che rappresenta il valore di <exp>, lunga <exp%2> caratteri e con <exp%1> cifre decimali. Se, inoltre, <exp%2> è negativa, allora la stringa restituita sarà allineata a destra. Ad es.:

FIX$(123456.127,2,9) = "123456.13" FIX$(1,2,-5) = " 1.00"

Se la stringa restituita è troppo corta per contenere il numero, essa sarà riempita di asterischi (*).
Vedi: GEN$, NUM$, SCI$

 
GEN$
Sintassi:g$=GEN$(<exp>,<exp%>)
Restituisce una stringa che rappresenta il valore di <exp> e lunga <exp%> caratteri. La funzione cerca di rappresentare <exp> dapprima come intero, se ciò non è possibile prova con una rappresentazione come numero in virgola mobile e, se neppure questo è possible, dà il numero in notizione scientifica. Se <exp%> è un numero negativo, allora la stringa restituita è allineata a destra.

Se la stringa restituita è troppo corta per contenere il numero essa sarà riempita di asterischi (*).

 
GET$
Sintassi:g$=GET$(<exp%>)
Attende che venga premuto un tasto, quindi restituisce una stringa contenente il carattere corrispondente al tasto premuto. La funzione riconosce le lettere maiuscole da quelle minuscole.
Vedi: GET, KEY, KEY$
 
HEX$
Sintassi:h$=HEXS(<exp%>)
Restituisce il valore dell'espressione tra parentesi in notazione esadecimale. Ad esempio: HEX$(255) restituirà "FF"
 
KEY$
Sintassi:k$=KEY$
Restituisce una stringa contenente il carattere corrispondente all'eventuale tasto premuto; se nessun tasto viene premuto, la funzione restituirà una stringa di lunghezza nulla. La funzione non entra in nessun stato attesa.
Vedi: KEY, GET, GET$
 
LEFT$
Sintassi:l$=LEFT$(<exp$>,<exp%>)
Restituisce i primi <exp%> caratteri di sinistra della stringa <exp$>.
Vedi: RIGHT$, MID$, LOC, LOWER$, UPPER$, LEN
 
LOWER$
Sintassi:l$=LOWER$(<exp$>)
Restituisce la stringa <exp$> dopo aver convertito tutte le maiuscole in minuscole.
Vedi: UPPER$, LEFT$, RIGHT$, MID$, LOC, LEN, REPT$
 
MID$
Sintassi:m$=MID$(<exp$>,<exp%1>,<exp%2>)
Restituisce una stringa che contiene <exp%2> caratteri della stringa <exp$>, a partire dal carattere che occupa la posizione <exp%1>.
Vedi: LEFT$, RIGHT$, LEN, LOWER$, UPPER$, LOC, REPT$
 
NUM$
Sintassi:n$=NUM$(<exp>,<exp%>)
Restituisce una stringa, lunga <exp%> caratteri, che rappresenta il numero a virgola mobile <exp>. Se la stringa è troppo corta per contenere il numero, allora essa viene riempita di asterischi (*).
Vedi: FIX$, GEN$, SCI$
 
RIGHT$
Sintassi:r$=RIGHT$(<exp$>,<exp%>)
Restituisce gli ultimi <exp%> caratteri di destra della stringa <exp$>.
Vedi: LEFT$, MID$, UPPER$, LOWER$, LOC, LEN, REPT$
 
REPT$
Sintassi:r$=REPT$(<exp$>,<exp%>)
Restituisce una stringa formata da <exp$> ripetuta <exp%> volte.
Vedi: LEFT$, RIGHT$, MID$, UPPER$, LOWER$, LOC, LEN
 
SCI$
Sintassi:s$=SCIS(<exp>,<exp%1>,<exp%2>)
Restituisce una stringa, lunga <exp%2> caratteri, che dà la rappresentazione in notazione scientifica, con <exp%1> decimali, di <exp>. Ad esempio:

SCI$(123456,2,7) = "1.23E05" SCI$(1,2,7) = "1.00E00" SCl$(123456789,2,-8) = " 1.23E08"

Se la stringa s$ è troppo corta per contenere il numero, allora essa viene riempita di asterischi (*).
Vedi: FIX$, GEN$, NUM$

 
UPPER$
Sintassi:u$=UPPER$(<exp$>)
Restituisce la stringa <exp$> dopo aver convertito tutte le minuscole in maiuscole.
Vedi: LEFT$, RIGHT$, MID$, UPPER$, LOWER$, LOC, LEN, REPT$
 
USR$
Sintassi:u$=USR$(<exp%1>,<exp%2>)
Il valore di <exp%1> e di <exp%2> sono passati, rispettivamente, ai registri D e PC del microprocessore HD6303X che, a sua volta, manda in esecuzione il programma in linguaggio macchina che inizia all'indirizzo <exp%1>. Alla fine di questo, il registro X deve contenere l'indirizzo di una stringa che verrà passata a u$. Nota. Un uso non oculato di questa funzione può portare alla perdita di tutti i dati registrati nell'Organiser.
Vedi: USR, ADDR

APPENDICE A
IL SET DI CARATTERI DELL'ORGANISER

La tabella della pagina seguente riporta il set di caratteri dell'Organiser. I caratteri di uso più frequente sono accessibili direttamente dalla tastiera nel solito modo; vi sono però molti altri caratteri, tra cui i caratteri accentati ed i caratteri greci, che non possono essere digitati direttamente.

CARATTERI DEFINITI DALL'UTENTE

I caratteri numerati da 0 a 7 sono caratteri definibili dall'utente: ciò significa che, quando accedete a questi caratteri per mezzo della funzione CHR$, voi potete definire lo schema di punti che devono apparire sullo schermo. Ogni carattere e definito per mezzo di una serie di 7 bytes che debbono essere caricate in specifiche locazioni della memoria centrale. I 5 bits meno significativi di ciascun byte sono utilizzati per definire la forma del carattere come mostra la Fig. 11.

Fig. 10
Il set di caratteri dell'Organiser

Fig. 11
Come definire il carattere £

I punti che formano il carattere, compresi quelli della prima riga, sono definiti dai bytes caricati nella memoria centrale a partire dalla locazione $181.

Il programma UDG, riportato di seguito, permette di definire questi caratteri. Quando viene mandato in esecuzione, esso permette di caricare lo schema del carattere da voi scelto nella memoria centrale dove esso rimarrà finchè non userete di nuovo il programma per definire un nuovo carattere. Ogni volta che si spegne la macchina il carattere caricato va perso.

UDG: LOCAL numb%,count%,byte%(8) start:: PRINT "CHAR NO."; INPUT numb% count%=1 DO PRINT "BYTE NO.";count% INPUT byte%(count%) count%=count%+1 UNTIL count%=8 PRINT "SAVING CHAR..." POKEB $180,64+(numb% AND 7)*8 count%=1 DO POKEB $181,byte%(count%) count%=count%+1 UNTIL count%=8

Nota L'ultima riga di ciascun carattere è lasciata volutamente vuota per far sì che, sullo schermo, il cursore appaia chiaramente distinto dal carattere.

I CARATTERI DI CONTROLLO

I caratteri i cui codici ASCII hanno valore compreso tra 8 e 16, valori estremi inclusi, hanno un uso particolare: essi non vengono visualizzati, ma possono essere utilizzati per eseguire particolari operazioni sullo schermo, come indicato qui di seguito:

CHR$(8) Muove il cursore di una posizione verso sinistra e cancella il carattere che vi si trova.
CHR$(9) Muove il cursore nella posizione più vicina e il cui valore di posizione sia un multiplo intero di 8.
CHR$(10)Sposta il cursore sulla linea seguente.
CHR$(11)Sposta il cursore sulla riga superiore dello schermo.
CHR$(12)Ripulisce lo schermo (analogo a CLS).
CHR$(13)Sposta il cursore all'inizio della riga corrente.
CHR$(14)Sposta il cursore all'inizio della riga superiore dello schermo dopo averla ripulita.
CHR$(15)Sposta il cursore all'inizio della riga inferiore dello schermo dopo averla ripulita.
CHR$(16)   Fa suonare il cicalino dell'Organiser.

IL SET DI CARATTERI DELL'ORGANISER

Quando si usano le funzioni GET e KEY, esse restituiscono un numero che rappresenta il codice ASCII del carattere richiesto.

Ai tasti riportati qui di seguito non corrisponde alcun codice ASCII, tuttavia essi possono essere ugualmente letti mediante le funzioni GET e KEY. La tabella che segue fornisce i valori che ad essi corrispondono:

1 ON/CLEAR
2 MODE
3 UP
4 DOWN
5 LEFT
6 RIGHT
7 SHIFT e DEL
8 DEL
13   EXE

APPENDICE B
IN CASO DI MAL FUNZIONAMENTO

LO SCHERMO NON SI ACCENDE

Se, dopo avere accesa la macchina, lo schermo rimane spento, provate ad eseguire le operazioni elencate qui di seguito:

  1. Regolate il contrasto agendo su tutto il campo di regolazione.
  2. Togliete la batteria e reinseritela facendo attenzione che questa sia inserita in maniera corretta.
  3. Inserite una batteria nuova.
  4. Togliete tutti i datapacks e riprovato con le operazioni indicate sopra.

LA TASTIERA NON RISPONDE

Se, con lo schermo acceso, i tasti premuti non hanno effetto, allora provate una delle operazioni seguenti:

  1. Assicuratevi che stiate cercando di scrivere più di 254 caratteri sulla stessa riga.
  2. Premete ripetutamente il tasto ON/CLEAR
  3. Togliete la batteria e reinseritela dopo uno o due minuti.

Nota Ricordatevi che in quest'ultimo caso tutti i dati registrati nell'Organiser andranno persi.


APPENDICE C
DATI TECNICI

Dimensioni (con custodia protettiva inserita):
Lunghezza 142.0 mm Larghezza 78.0 mm Altezza 29.3 mm.

Peso (come venduto):225 gr.

Schermo:
Schermo a cristalli liquidi a matrice di punti; due linee di sedici caratteri alfanumerici.

Tastiera:
Trentasei tasti, inclusi tasti funzione.

Microprocessore:
HD6303X

Memoria:

ROMModello CM32 Kbytes
Modello XP32 Kbytes
RAMModello CM8 Kbytes
Modello XP32 Kbytes
EPROMModello CM8/16/32/64 Kbytes
Modello XPsino a 128 Kbytes

Orologio:
Orologio in tempo reale a circuiti CMOS con quarzo a 36.864 Hz.

Datapaks:
Supporto fisico: EPROM (memoria a sola lettura, cancellabile e programmabile).

Durata di ritenzione: MTBF = 50 anni sino a 100°C.
Formattazione: 30 minuti col Psion Formatter.
Vita: fino a 100 formattazioni.
Capacità:

Datapak da 16K 16384 bytes
Datapak da 32K 32768 bytes
Datapak da 64K 65536 bytes
Datapak da 128K131072 bytes

È politica commerciale della PSION lo sviluppare sempre nuovi prodotti; piccoli cambiamenti introdotti possono non essere indicati in questo manuale.


APPENDICE D
PROGRAMMAZIONE IN LINGUAGGIO MACCHINA

L'Organiser usa come CPU (Central Processor Unit) il microprocessore HD6303X. Questo processore, di moderna concezione, può essere programmato direttamente mediante un suo specifico linguaggio detto linguaggio macchina o codice macchina.

I programmi scritti in linguaggio macchina vengono eseguiti molto più velocemente di quelli scritti in OPL, ma sono, però, anche assai più difficili da scrivere e da correggere. Inoltre, poichè un programma in linguaggio macchina prende il controllo di tutte le funzioni che la macchina può svolgere, anche un errore banale può portare alla distruzione di tutte le informazioni registrate nella memoria interna dell'Organiser.

Si suggerisce pertanto che, nel caso si vogliano fare prove col linguaggio macchina, tutte le informazioni presenti in memoria siano copiate su un datapack in modo da poterle recuperare in caso di "disastro".


APPENDICE E
MAPPA DELLA MEMORIA

Le locazioni di memoria riportate qui di seguito sono utilizzate dall'Organiser per memorizzare alcune variabili di sistema. È possibile accedere ad esse mediante i comandi: PEEKB, PEEKW, POKEB e POKEW.

INDIRIZZO STANDARD   FUNZIONE
$0069;$006A($04) Contatore scorrimento orizzontale.
$006B;$006C($0A) Contatore scorrimento verticale.
$0077 ($0E) Ritardo autoripetizione tastiera.
$0078 ($00) Contatore autoripetizione tastiera.
$007C non zeroSegnalatore autospegnimento: un valore zero disattiva l'autospegnimento.
$20CB;$20CC Contatore quadri: viene incrementato ogni 50 ms.
$20CD;$20CE   ($012C) Ritardo standard per lo autospegnimento.
$00A4 ($00) Un valore non nullo disattiva il cicalino.
MAPPA DELLA MEMORIA DELL'ORGANISER

APPENDICE F
PERIFERICHE

Per il vostro Organiser è disponibile un'ampia gamma di periferiche e di pacchetti di programmi. Le periferiche includono un Lettore di Schede Magnetiche, un Lettore di Codici a Barre ed un Cavo di Collegamento per l'interfaccia seriale RS232. I datapaks ed i pacchetti comprendono un pacchetto di programmi finanziari ed il Controllore Ortografico "The Concise Oxford Spelling Checker" (°).

Poichè la gamma dei prodotti viene costantemente aggiornata, per informazioni circa i prodotti disponibili, rivolgetevi alla PSICOM, Lainate (MI), distributrice esclusiva per l'Italia dei prodotti PSION

(°) "Concise Oxford Dictionary"
Copyright Oxford University Press


INDICE ANALITICO

A ABS, funzione Accensione ADDR, funzione AGENDA (2) APPEND, comando (2) APR Archivi di dati Archivi, ricopiatura ARCHIVIO MAIN ASC, funzione AT, comando ATAN, funzione AZZERA (2) B BACK, comando batterie batterie, alloggiamento BEEP, comando BREAK, comando C CALC (2) Campi, nomi dei Campi, qualificatori dei Campo, definizione CANCELLA (2) (3) (4) Cancellazione di un record (2) Caratteri definiti dall'utente Caratteri, controllo dei CERCA (2) CHR$, funzione (2) Cicli CLOSE, comando (2) CLS, comando (2) CONTINUE, comando COPY (2) COPY, comando (2) COS, funzione COUNT, funzione CREATE, comando (2) CURSOR, comando Cursore D DATAPAK (2) cambio formattazione nuovo pieno DATIM$ DAY, funzione DEC, funzione DELETE, comando (2) DIR (2) DIR$, funzione DISP, funzione Dispositivi (2) E EDIT, comando EDITARE EDITARE records EOF, funzione ERR$, funzione ERR, funzione Errori comuni Errori di esecuzione Errori, gestione degli Errori, messaggi di (2) ESCAPE ON/OFF, comando Espressioni logiche EXE, tasto EXIST, funzione EXP, funzione F FIRST, comando (2) FIX$, funzione FLT, funzione FREE, funzione G GEN, funzione GET$, funzione GET, funzione (2) GLOBAL, comando (2) (3) GOTO, comando (2) H HEX$, funzione HOUR, funzione (2) I IABS, funzione IF/ELSEIF/ELSE/ENDIF, comando (2) INFO (2) Input routine INPUT, comando INSERIRE (2) INT, funzione INTF, funzione K KEY, funzione KEY, funzione KSTAT, comando L LAST, comando LEFT$, funzione (2) LEN, funzione Linguaggio macchina LIST (2) LN, funzione LOC, funzione LOCAL, comando (2) LOG, funzione LOWER$, funzione Lunghezza massima M MENU Meno a livello più alto Menù principale Menu, cancellazione voci del MENU, funzione Menù, sostituzione voci del MID$, funzione (2) MINUTE, funzione (2) MONTH, funzione N NEXT, comando (2) Nome dei files logici Nomi archivi NUM$, funzione Numeri interi O OFF (2) OFF, comando ONERR, comando OPEN, comando (2) Operatori aritmetici Operatori aritmetici, precedenza degli Operatori di confronto Operatori logici OPL OPL, COMANDI APPEND AT BEEP BREAK CLOSE CLS CONTINUE COPY CREATE CURSOR DELETE DO/UNTIL EDIT ERASE ESCAPE ON/OFF FIRST GLOBAL GOTO IF/ELSEIF/ELSE/ENDIF INPUT KSTAT LOCAL NEXT OFF ONERR OPEN PAUSE POKEB POKEW POSITION PRINT/LPRINT RAISE RANDOMIZE REM RENAME RETURN STOP TRAP (2) UPDATE USE WHILE/ENDWH OPL, funzioni ABS ADDR ASC ATAN CHR$ COS COUNT DATIM$ DAY DEG DIR$ DISP EOF ERR$ ERR EXIST EXP FIND FIX$ FLT FREE GEN$ GET$ GET HEX$ HOUR IABS INT INTF KEY$ KEY LEFT$ LEN LN LOC LOG LOWER$ MENU MID$ MINUTE MONTH NUM$ PEEKB PEEKW POS RAD RECSIZE REPT$ RIGHT$ RND SCI$ SECOND SIN SPACE SQR TAN UPPER$ USR$ USR VAL VIEW YEAR ORA, impostazione ORARIO (2) P PAUSE, comando PEEKB, funzione PEEKW, funzione PI, funzione POKEB, comando POKEW comando POS, funzione (2) POSITION, comando (2) PRINT, comando PRINT/LPRINT, comando Procedura, mandare in esecuzione una Procedura, registrare una (2) Procedura, registrazione Procedura, tradurre una (2) Procedure (2) Procedure, interruzione delle Procedure, nomi delle (2) Procedure, parametri delle Procedure, qualificatori delle PROG COPIA (2) CANGELLA DIR (2) EDITA (2) LISTA (2) MENU NUOVO ABBANDONA MENU REGISTRA TRADUCI PARTE (2) Programma Programma Mutuo Programma, etichette PULISCE (2) Punto e virgola R RAD, funzione RAISE, comando (2) RANDOMIZE, comando Records Records, come editare i Records, cancellazione di (2) Records, considerazioni sui RECSIZE, funzione REGISTRA (2) Regolazione del contrasto (2) REM, comando RENAME, comando REPT$, funzione RETURN comando (2) RICERCA (2) (3) (4) Ricerca di un record (2) RICHIAMA (2) RIGHT$, funzione (2) RND, funzione S SALVA (2) Schermo (2) SCI$, funzione Scorrimento automatico SECOND, funzione SIN, funzione SPACE, funzione Spegnimento Spegnimento automatico (2) SQR, funzione STOP, comando Stringhe Stringhe, concatenazione Stringhe, scomposizione Strutture SVEGLIA (2) SVEGLIA MUTA Sveglie (2) T TAN, funzione Tasti cursore Tastiera (2) TRAP, comando (2) U UPDATE UPPER$, funzione USE, comando (2) USR$, funzione USR, funzione V VAL, funzione Variabili a schiera n schiera numeriche a stringa (2) n virgola mobile conversione conversione automatica dichiarazione global (2) (3) intere local nomi VIEW, funzione W WHILE/ENDWH comando (2) Y YEAR, funzione