BAX-59 (BAsic X-compiler for TI-59)

UN CROSS-COMPILATORE da BASIC DARTMOUTH a TI-59 S.O.A.

A CROSS-COMPILER from BASIC DARTMOUTH to TI-59 A.O.S.


Su un vecchio numero di TI-PPC Notes* (e precisamente il V9N4P19 di Luglio/Agosto 1984 e qui sotto riportato) ho letto tre o quattro anni fa una piccola notizia che riportava la disponibilità, per chi avesse voluto, di avere una tesi di laurea di due studenti del "Naval Postgraduate School" di Monterey (California) che avevano implementato su un grande elaboratore IBM un cross-compilatore (scritto in Pascal) da Waterloo BASIC 2.0 a linguaggio SOA (AOS) della TI-59, con addirittura la possibilità di segmentare il programma su schede magnetiche se troppo lungo. Dopo una ricerca infruttuosa su Internet, casualmente ho trovato il PDF della tesi e l'ho scaricato: ho visto subito che non faceva al caso mio - troppo complesso: puntatori di puntatori e strutture dati pesantissime - e anche una riscrittura in Turbo Pascal non ha sortito effetto.

Ho così deciso di scrivere un compilatore ex novo (**), scegliendo bene il linguaggio "target": la scelta è caduta per motivi di semplicità sul Dartmouth BASIC (versione 1968 - con qualche piccola modifica) che, essendo appassionato di storia dell'informatica, stavo proprio studiando in quel periodo. Inoltre il prodotto doveva essere interfacciabile dall'esterno e quindi con il mio emulatore di TI-59

Il progetto BAX-59 (BAsic X-compiler for TI-59) è così partito ed il risultato finale è questo cross-compiler composto da due parti:

1) CC5.EXE è il cross-compiler vero e proprio: accetta in input un file .BAS e produce un file .SOA per, così dire, "grezzo";

2) OPT.EXE è un "ottimizzatore" che accetta in input il codice prodotto dal compilatore e produce un file .SOA migliorato in termini di occupazione di memoria rispetto al file precedente.

Lo schema qui sotto identifica il flusso dei dati di BAX-59.

  
Flusso dati di BAX-59

In pratica, come si può vedere, abbiamo tre passaggi - due per il cross-compiler e il terzo per l'ottimizzatore.

BAX-59, contrariamente al suo antenato omonimo, non ha la possibilità di segmentare il programma .SOA se troppo esteso per la capacità di memoria della TI-59: ma, almeno sul mio emulatore, il meccanismo del "CROM Emulator" consente di ovviare totalmente a questa mancanza, come spiegato sul manuale di utilizzo.

Due file batch (BAX59.BAT e BAX59-64.BAT) consentono di automatizzare il processo di compilazione.
 

LE CARATTERISTICHE DEL LINGUAGGIO


BAX-59 cerca di seguire il più possibile la sintassi del Dartmouth BASIC e le limitazioni riguardano essenzialmente gli array che possono essere al massimo solo bidimensionali e le funzioni definite dall'utente che possono avere al massimo due argomenti. Non sono neppure implementate le istruzioni MAT che avrebbe portato qualsiasi traduzione, anche minima, oltre la portata della TI-59. Inoltre la manipolazione delle stringhe non è, ovviamente, completa e le stringhe stesse sono state codificate seguendo il codice TI-59 & PC-100 e non quello ASCII.

Le parole chiave di BAX-59 sono le seguenti:



Un esempio di sessione con il sistema DTSS (emulato in Windows)

Nella cartella BAX59\PROG\ sono presenti anche circa una trentina di esempi con nome SAMPLExx che possono essere usati come guida per vedere come viene effettuata la traduzione.

Viene riportato come esempio il calcolo del massimo comun divisore (SAMPLE01.BAS) di due triple di numeri. Notate che ogni gruppo di istruzioni TI-59 SOA è commentata con il riferimento alla relativa linea BASIC che l'ha generata.

Listato BASIC Traduzione in SOA Commento
10 PRINT "A", "B", "C", "GCD"
15 FOR I = 1 TO 2
20 READ A, B, C
30 LET X = A
40 LET Y = B
50 GOSUB 200
60 LET X = G
70 LET Y = C
80 GOSUB 200
90 PRINT A, B, C, G
100 NEXT I
105 GOTO 999
110 DATA 60, 90, 120
120 DATA 38456, 64872, 98765
200 LET Q = INT(X/Y)
210 LET R = X - Q*Y
220 IF R = 0 THEN 300
230 LET X = Y
240 LET Y = R
250 GOTO 200
300 LET G = Y
310 RETURN
999 END

LBL E' 12 STO 12
1 SUM 12 6 0 ST* 12
1 SUM 12 9 0 ST* 12
1 SUM 12 1 2 0 ST* 12
1 SUM 12 3 8 4 5 6 ST* 12
1 SUM 12 6 4 8 7 2 ST* 12
1 SUM 12 9 8 7 6 5 ST* 12
12 STO 12
RTN
LBL PRT 1 8 STO 01 RTN
LBL ADV ( ( ( LOG INT + 1 ) / 2 + . 5 ) INT * 2 ) RTN

{BASIC line #10}
LBL A
1 3 OP 1 OP 05
1 4 OP 1 OP 05
1 5 OP 1 OP 05
2 2 1 5 1 6 OP 1 OP 05

{BASIC line #15}
1 STO 3

{BASIC line #20}
LBL B
1 SUM 12 RC* 12 STO 4
1 SUM 12 RC* 12 STO 5
1 SUM 12 RC* 12 STO 6

{BASIC line #30}
RCL 4  STO 7

{BASIC line #40}
RCL 5  STO 8

{BASIC line #50}
C

{BASIC line #60}
RCL 9  STO 7

{BASIC line #70}
RCL 6  STO 8

{BASIC line #80}
C

{BASIC line #90}
 RCL 4  PRT
 RCL 5  PRT
 RCL 6  PRT
 RCL 9  PRT

{BASIC line #100}
OP 23 RCL 3 X:T 3 GE B

{BASIC line #105}
GTO E

{BASIC line #110}
NOP

{BASIC line #120}
NOP

{BASIC line #200}
LBL C
( ( RCL 7 / RCL 8 ) INT ) STO 10

{BASIC line #210}
( RCL 7 - RCL 10 * RCL 8 ) STO 11

{BASIC line #220}
CP RCL 11 EQ D

{BASIC line #230}
RCL 8  STO 7

{BASIC line #240}
( RCL 11 ) STO 8

{BASIC line #250}
GTO C

{BASIC line #300}
LBL D
RCL 8 STO 9

{BASIC line #310}
RTN

{BASIC line #999}
LBL E
R/S
 

memorizza i DATA della linea 120








istruzioni di libreria - solo per eventuali array e funzioni


inizio traduzione vera e propria







ciclo FOR (corpo del ciclo ripetuto 2 volte)




READ: variabili A, B e C in R04,R05 e R06



prima calcola M.C.D tra A e B: li  assegna a X e Y - in pratica un passaggio parametri esplicito in ingresso per la SUB




esegue SUB per calcolo effettivo

la SUB restituisce G=MCD(A,B)

seconda parte: calcola MCD tra G e C col solito passaggio parametri

stampa il risultato





fa il NEXT I


vai a fine programma


DATA già memorizzati (vedi inizio)





SUB calcolo MCD con l'algoritmo di Euclide


























fine programma
 

Al termine della compilazione vengono stampate le istruzioni per l'esecuzione (sull'emulatore o sulla TI-59 reale .......):

            BAX-59 versione 5 (anche a 32/64 bit).


BAX-59 è scritto, al solito, in Quick Basic 4.5 (ma con una lieve modifica è compilabile anche con Basic PDS 7.1) e quindi è a 16 bit: contrariamente alla mia abitudine tutti i messaggi del cross-compiler e i documenti relativi sono in inglese. Da Novembre 2015 è disponibile pure la versione a 32/64 bit compilata sotto QB64.

La nuova versione numero 5 di BAX-59 (finalmente con un manuale d'uso) introduce parecchie novità rispetto alla precedente versione 4 tra cui la fase di ottimizzazione che ora produce direttamente il file .SOA pronto per l'importazione nel mio emulatore di TI-59.

Nel link per il download sotto riportato è la release 5 del cross-compiler sia nella versione a 16 bit che in quella a 32/64 bit, senza il codice sorgente.

    Download BAX59 compiler (5.0) (compreso il manuale - user's guide included)

BAX-59 has all messages and documentation in English.
(source code is NOT included)

NOTE

(**) In rete ho trovato altri due prodotti "concorrenti" di BAX-59 entrambi francesi ma che presentano dei decisi punti deboli: il primo è una specie di Macro-Assembler mascherato da linguaggio ad alto livello (ma perché imparare un Macro Assembler per programmare di nuovo in Assembler - quello della TI-59?) con un'ottima documentazione, il secondo, più interessante, propone un linguaggio ad alto livello, simile al C chiamato T, ed un codice sorgente da far compilare sulla propria piattaforma: non riuscito ad ottenere un eseguibile ed ogni contatto con l'autore è andato a vuoto. Bel sito dal punto di vista grafico ma manca qualsiasi documentazione utile, quindi in conclusione una completa delusione. Per chi fosse interessato basta cercare su Google "TI 59 COMPILER" per avere più informazioni su questi prodotti.

(*) TI-PPC Notes è lo splendido bollettino pubblicato da un gruppo di utenti, situato vicino a Washington, delle calcolatrici Texas Instruments tra il 1980 e il 1991: da www.rskey.org ho potuto scaricare tutte le annate, le ho stampate e rilegate.