MBASIC è una versione del Microsoft BASIC sviluppata da Microsoft per i sistemi operativi CP/M. L'MBASIC era uno dei 2 linguaggi BASIC contenuti nel pacchetto software offerto da Osborne Computer Corporation insieme ai suoi Osborne 1, Osborne Executive e Osborne Vixen.
L'MBASIC versione 5 richiedeva un sistema CP/M con almeno 28 kB di memoria RAM libera ed almeno un'unità floppy. A differenza del BASIC-80, la versione per computer con CPU 8080/Z80 dell'Altair BASIC che Microsoft distribuiva personalizzato per lo specifico hardware del sistema su cui doveva poi girare, l'MBASIC si appoggiava direttamente al sistema CP/M, sfruttandone le chiamate di sistema per la gestione delle operazioni di input/output, ed era in questo modo indipendente dall'hardware sottostante.
L'MBASIC non usava tutti i servizi del CP/M ma solo la console, la gestione della stampante e l'accesso ai floppy: il linguaggio non supportava la modalità grafica, i colori, i joystick, il mouse, le reti locali, il suono o gli orologi in tempo reale. Inoltre l'MBASIC non supportava le aree utente messe a disposizione dal CP/M per l'organizzazione dei file sul disco. Siccome il CP/M era un sistema pensato per computer mono-utente, anche l'MBASIC non supportava nessuna forma di multitasking come ad esempio il blocco dei file. Nonostante queste limitazioni, l'MBASIC era considerato comunque un BASIC potente e funzionale.
L'MBASIC era un linguaggio interpretato: il codice sorgente veniva salvato in memoria in forma di token, ossia con le parole chiave del BASIC convertite in un singolo byte per risparmiare memoria. Ogni riga di testo inserita a video che iniziava con un numero veniva considerata come linea di codice e salvata in RAM, tutto il resto era considerato come un comando diretto ed eseguito immediatamente.
Il programma salvato in memoria poteva essere stampato a video oppure salvato su disco, sia nella forma compressa in token sia come testo ASCII. I numeri di riga erano utilizzati dalle istruzioni GOTO e GOSUB per le operazioni di salto. L'editor forniva solo funzionalità base, e conveniva salvare il sorgente in formato ASCII per poi modificarlo con un editor di testo vero e proprio.
Uno dei punti di forza dell'MBASIC erano i suoi messaggi di errore in formato testuale, che aiutavano nell'individuazione degli errori di sintassi e di esecuzione. L'MBASIC aveva anche la funzione TRACE
che visualizzava i numeri di riga man mano che venivano eseguiti dall'interprete, utile per ricercare eventuali errori logici nel programma (ad esempio: cicli infiniti).
Il programma, le variabili ed il buffer del disco dell'MBASIC condividevano con il CP/M la stessa memoria del sistema su cui giravano: su un sistema con 64 kB di RAM (il massimo indirizzabile da un processore ad 8 bit quale l'8080 o lo Z80) avviando l'interprete, che consumava 28 kB, restavano meno di 32 kB per il programma ed i suoi dati. Per questo motivo i programmatori non usavano inserire commenti nel codice, operazione fattibile con la parola chiave REM
, dato che essi venivano memorizzati in formato ASCII, consumando 1 byte per carattere.
Per permettere di eseguire programmi molto grandi, le ultime versioni dell'MBASIC introdussero le istruzioni CHAIN
e MERGE
: la prima passava l'esecuzione ad un altro programma mentre la seconda caricava un programma unendolo a quello presente in memoria. Non c'era però il supporto all'esecuzione di programmi da terminale (l'istruzione SHELL
presente in altri dialetti del BASIC), che permetteva di passare temporaneamente il controllo ad un comando del terminale per implementare funzioni del sistema operativo non supportate dall'MBASIC.
I dati potevano essere letti o salvati su disco sia come file sequenziali, delimitati alla fine di ogni riga con la coppia di caratteri CR/LF ("carriage return"/"line feed") tipica del CP/M, sia come file ad accesso causale con campi di dimensione prefissata, che potevano essere utilizzati anche per implementare una rudimentale forma di database. I numeri in virgola mobile venivano salvati in formato MBF (Microsoft Binary Format), una codifica proprietaria che Microsoft usava in tutti i suoi BASIC che offriva una rappresentazione più precisa rispetto all'IEEE 754 normalmente adottato dagli altri dialetti BASIC ma incompatibile con esso. I dati salvati in formato MBF potevano perciò essere letti solo su un computer che usava un BASIC Microsoft.
L'MBASIC supportava i seguenti tipi di dato:
Gli operatori sulle stringhe includevano la selezione di parti delle stesse, la concatenazione, l'assegnamento, ed i test di uguaglianza.
I vettori potevano avere fino a 7 dimensioni ma nessuna funzione od operatore poteva operare su di essi: ad esempio, non si potevano eseguire operazioni di assegnamento. A differenza di altri dialetti BASIC di quel periodo, l'MBASIC non supportava le operazioni sulle matrici ed i numeri complessi né un tipo di dato decimale (BCD).
Tutte le operazioni in virgola mobile erano eseguite via software dato che quasi nessun sistema CP/M aveva un coprocessore matematico: per questo motivo le funzioni matematiche precostituite quali il seno, il coseno, la tangente, il logaritmo naturale, la funzione esponenziale, la radice quadrata, davano solo risultati in singola precisione.
L'MBASIC fornva anche un generatore di numeri pseudo-casuali, a cui l'utente poteva fornire un "seme" usato per ottenere una sequenza di numeri utili per i giochi o le simulazioni.
L'MBASIC consentiva l'uso della parola chiave LET
per la dichiarazione delle variabili, anche se il suo uso non era obbligatorio. A differenza dei primi dialetti BASIC, l'MBASIC non limitava l'uso dei nomi delle variabili a 2 soli caratteri ma permetteva di usarne fino a 40 (MBASIC 5), consentendo così ai programmatori di usare nomi più indicativi del valore che conservavano.
Nell'MBASIC il flusso del programma era gestito tramite le strutture di controllo IF...THEN...ELSE
e WHILE...WEND
e le istruzioni di salto GOTO
e GOSUB
. All'assenza dell'istruzione CASE
, per la scelta fra più di 2 opzioni, si sopperiva con l'istruzione di salto multiplo ON...GOTO
. Le sub-routine non aveva parametri e tutte le variabili erano globali. L'MBASIC non metteva a disposizione strumenti per la programmazione strutturata ed era facile scrivere "spaghetti code".
Come per tutti gli altri dialetti BASIC dei computer ad 8 bit dei primi anni ottanta, anche nell'MBASIC le funzioni PEEK e POKE rivestivano un ruolo importante dato che permettevano di leggere e scrivere direttamente nella memoria dell'elaboratore. Data l'assenza di sistemi di protezione della memoria, il programmatore poteva accedere direttamente al sistema operativo od a funzioni normalmente non permesse dai comandi a disposizione: ad esempio, con una POKE
in un sistema CP/M, se il suo BIOS supportava questa funzione, si poteva passare il terminale sulla porta seriale; nei computer con un orologio in tempo reale, una serie di PEEK
permetteva di leggerne l'orario.
L'MBASIC permetteva all'utente di definire delle funzioni che potevano essere poi richiamate da un programma: queste funzioni erano di solito salvate in un'area riservata della memoria oppure inserite tramite POKE
in costanti di tipo stringa come una serie di istruzioni in linguaggio macchina.
Erano inoltre disponibili le istruzioni INP
e OUT
per leggere e scrivere direttamente nelle porte di I/O dell'8080: grazie a ciò si poteva controllare direttamente una periferica. Su alcuni computer CP/M, come il diffuso Osborne 1, tutte le istruzioni di I/O erano però riservate dal sistema.
Programmi in MBASIC che usavano PEEK
, POKE
o le funzioni scritte in linguaggio macchina non erano però eseguibili su macchine differenti da quelle per cui erano stati scritti.
Microsoft mise in commercio anche un compilatore BASIC per il CP/M denominato BASCOM, che aveva una sintassi simile a quella dell'MBASIC tanto che un programma sviluppato in MBASIC poteva essere compilato con il BASCOM: il software compilato non solo occupava meno memoria grazie alle ridotte dimensioni dell'eseguibile rispetto ad un sorgente in BASIC, mettendo quindi a disposizione dell'utente più memoria libera per i dati delle proprie applicazioni, ma risultava mediamente dalle 8 alle 10 più veloce dell'originale.
Tutte le chiamate alle funzioni del CP/M che erano integrate nell'MBASIC furono convertite per i sistemi PC-DOS/MS-DOS e rese disponibili nei BASIC che Microsoft sviluppò per i PC IBM, il BASICA ed il GW-BASIC. I token usati per rappresentare le parole chiave del linguaggio erano però differenti per cui per trasportare un programma MBASIC in BASICA/GW-BASIC l'utente doveva salvare il listato in testo ASCII.