I miei computer, console e programmi retro
Basic
Compilatore Z80 VI
02/01/2023 17:10
Un'altra manciata di giorni e ho aggiunto gli Array, per il momento mono-dimesione.
Sia stringhe che numerici e i comandi per usarli sono ANEW, APUT e AGET.
Al momento ogni elemento di un array di numeri occupa due byte perché uso word ma
un array di stringhe occupa 256 byte estremamente esoso per un Amstrad CPC.
Sto pensando, in fase di creazione con ANEW, di poter dichiarare lo spazio massimo in byte
per elemento in maniera da ridurre il consumo di memoria.
Anche perché in questo esempio mi partono 2 interi KByte.
Come anche nel caso di PROC/FUNC il valore viene restituito tramite le variabili
globali _Value e _Value$ come succede per "it" in Livecode.

Sia stringhe che numerici e i comandi per usarli sono ANEW, APUT e AGET.
Al momento ogni elemento di un array di numeri occupa due byte perché uso word ma
un array di stringhe occupa 256 byte estremamente esoso per un Amstrad CPC.
Sto pensando, in fase di creazione con ANEW, di poter dichiarare lo spazio massimo in byte
per elemento in maniera da ridurre il consumo di memoria.
Anche perché in questo esempio mi partono 2 interi KByte.
Come anche nel caso di PROC/FUNC il valore viene restituito tramite le variabili
globali _Value e _Value$ come succede per "it" in Livecode.

Compilatore Z80 V
30/12/2022 12:25
Un'altra manciata di giorni e il compilatore cresce un'altro pochino.
Ora c'è la struttura di controllo IF/ELSE/ENDIF su più righe (alla faccia del Locomotive Basic) e
in più è possibile nidificarli. La parte più complicata, se posso dire così, è stato scrivere il codice Z80
per ogni tipo di confronto usando i salti jr ed ottimizzare il più possibile con le label.
Inoltre nel esempio uso il nuovo comando FUNC/ENDFUNC e il ciclo FOR/NEXT
Tanto per controllare che continua a funzionare tutto hahahahaha

Ora c'è la struttura di controllo IF/ELSE/ENDIF su più righe (alla faccia del Locomotive Basic) e
in più è possibile nidificarli. La parte più complicata, se posso dire così, è stato scrivere il codice Z80
per ogni tipo di confronto usando i salti jr ed ottimizzare il più possibile con le label.
Inoltre nel esempio uso il nuovo comando FUNC/ENDFUNC e il ciclo FOR/NEXT
Tanto per controllare che continua a funzionare tutto hahahahaha

Compilatore Z80 IV
10/12/2022 12:13
Credevo di scrivere molto più codice in Livecode per implementare due nuovi fondamentali comandi PROC/ENDPROC FUNC/ENDFUNC
Invece con una buona analisi, con un pugno di righe, ecco qui due istruzioni fondamentali:
case "PROC"
case "FUNC"
if gaProc[v_Token2]["Nome"] = v_Token2 then
xAbort "[ERROR] PROC/FUNC already declared"
else
put v_Token2 into gaProc[v_Token2]["Nome"] //Aggiungo il nome della procedura all'elenco
put 0 into gaProc[v_Token2]["NParametri"]
put true into gProcedura //Indica al output che si sta generando una procedura
xOutPut v_Token2&":" //Nome_procedura:
repeat for each item tVar in v_RestoTesto2
add 1 to gaProc[v_Token2]["NParametri"] //Incremento il numero di parametri
put (tVar) & comma after gaProc[v_Token2]["Parametri"] //Aggiungo
xSeNonEsisteCrea tVar,,True //Crea una variabile per ogni parametro esistente
end repeat
end if
break
case "ENDFUNC"
case "ENDPROC"
xOutPut "ret"
put false into gProcedura
break
Ovviamente poi nella fase di generazione del codice Z80 ci sono tutte le dichiarazioni delle variabili/parametri
distinguendo tra variabili testo e numeriche. Oltre alla valorizzazione della variabile di ritorno per le variabili.
Come da mia idea iniziale li dati di ritorno delle funzioni sarò contenuto nelle variabili globali _Value e _Value$
come succede per "it" in Livecode.
Invece con una buona analisi, con un pugno di righe, ecco qui due istruzioni fondamentali:
case "PROC"
case "FUNC"
if gaProc[v_Token2]["Nome"] = v_Token2 then
xAbort "[ERROR] PROC/FUNC already declared"
else
put v_Token2 into gaProc[v_Token2]["Nome"] //Aggiungo il nome della procedura all'elenco
put 0 into gaProc[v_Token2]["NParametri"]
put true into gProcedura //Indica al output che si sta generando una procedura
xOutPut v_Token2&":" //Nome_procedura:
repeat for each item tVar in v_RestoTesto2
add 1 to gaProc[v_Token2]["NParametri"] //Incremento il numero di parametri
put (tVar) & comma after gaProc[v_Token2]["Parametri"] //Aggiungo
xSeNonEsisteCrea tVar,,True //Crea una variabile per ogni parametro esistente
end repeat
end if
break
case "ENDFUNC"
case "ENDPROC"
xOutPut "ret"
put false into gProcedura
break
Ovviamente poi nella fase di generazione del codice Z80 ci sono tutte le dichiarazioni delle variabili/parametri
distinguendo tra variabili testo e numeriche. Oltre alla valorizzazione della variabile di ritorno per le variabili.
Come da mia idea iniziale li dati di ritorno delle funzioni sarò contenuto nelle variabili globali _Value e _Value$
come succede per "it" in Livecode.
Compilatore Z80 - III
02/12/2022 18:28
Da qualche giorno, nelle mie ore libere da impegni, ho ripreso il progetto del compilatore Z80.
Il nome provvisorio è NOBasicCompiler e l'unico target, per il momento, è l'Amstrad CPC.
Mancava però una procedura per salvare e ripristinare lo schermo.
Alle volte la semplicità è la strada migliore in 10 righe ecco qui le due funzioni:
_RestoreScreen: di"
ld hl,&4000"
ld de,&c000"
jr EsciSRScreen"
_SaveScreen: di"
ld hl, &c000"
ld de, &4000"
EsciSRScreen: ld bc,#4000"
ldir"
ret"
Certo manca ancora una gestione dell'area superiore ai 64KB nel caso dei modelli
6128, 6128Plus e con la presenza di espansione di memoria. Ma arriverà con il tempo.
E sopratutto mi "mangia" 16KB di memoria per salvare lo schermo, il che riduce lo
spazio dedicato al programma.
Il nome provvisorio è NOBasicCompiler e l'unico target, per il momento, è l'Amstrad CPC.
Mancava però una procedura per salvare e ripristinare lo schermo.
Alle volte la semplicità è la strada migliore in 10 righe ecco qui le due funzioni:
_RestoreScreen: di"
ld hl,&4000"
ld de,&c000"
jr EsciSRScreen"
_SaveScreen: di"
ld hl, &c000"
ld de, &4000"
EsciSRScreen: ld bc,#4000"
ldir"
ret"
Certo manca ancora una gestione dell'area superiore ai 64KB nel caso dei modelli
6128, 6128Plus e con la presenza di espansione di memoria. Ma arriverà con il tempo.
E sopratutto mi "mangia" 16KB di memoria per salvare lo schermo, il che riduce lo
spazio dedicato al programma.
Compilatore Z80 - II
20/09/2022 19:17
Oggi ho terminato di implementare alcuni comandi base del Basic nel NOBasic Compiler.
Funziona tutto, non credevo
Ora passo al progetto successivo e in futuro ottimizzerò il codice Z80
Funziona tutto, non credevo

Ora passo al progetto successivo e in futuro ottimizzerò il codice Z80

Compilatore Z80
20/08/2022 17:15
Sono passati quasi due mesi da quando ho cominciato a scrivere questo compilatore e visto che il lavoro mi occupa gran parte della giornata e mi dedico solo poche ore alla settimana sta venendo proprio bene.
I registri dello Z80 sono favolosi, Federico Faggin è proprio un genio.
Sono ancora nella fase della scrittura brutale l'ottimizzazione arriverà più avanti.
Partendo dalla sintassi del Basic che ho scritto per l'interprete trasformo il codice in istruzioni Z80 poi compilo con Pasmo e creo il file .DSK direttamente usando iDisk.
Funziona alla grande ed è velocissimo.

I registri dello Z80 sono favolosi, Federico Faggin è proprio un genio.
Sono ancora nella fase della scrittura brutale l'ottimizzazione arriverà più avanti.
Partendo dalla sintassi del Basic che ho scritto per l'interprete trasformo il codice in istruzioni Z80 poi compilo con Pasmo e creo il file .DSK direttamente usando iDisk.
Funziona alla grande ed è velocissimo.

Interprete Basic
30/06/2022 18:19
Dopo molte prove e tentativi di ottimizzare l'interprete a velocità decenti ho deciso di sospendere il progetto.
Utilizzo ora molte delle funzioni scritte e in pratica tutto il tokenizer per un compilatore Z80 / Amstrad CPC
Ecco cosa vuol dire riciclare i byte usati
Utilizzo ora molte delle funzioni scritte e in pratica tutto il tokenizer per un compilatore Z80 / Amstrad CPC
Ecco cosa vuol dire riciclare i byte usati

SECONDS e riflessioni
18/06/2022 17:47
Nuovo giorno e una nuova funzione aggiunta. Mi sono reso conto che lo schermo virtuale è comodo perché mi permetterà più avanti di cambiare quattro funzioni e adattarlo a qualsiasi output ma al costo della lentezza. Infatti la funzione odierna è SECONDS() che restituisce i secondi passati dal 1 gennaio 1970 è stata scritta proprio con lo scopo di cronometrare il tempo impiegato. Ho avuto la triste conferma con questo codice:

se visualizzo il conto alla rovescia da 100 a 1 impiega ben 12 secondi ma se metto il REM davanti a LOCATE e PRINT allora il tempo è 0 secondi ;-O
Per il momento proseguo così e poi si vedrà

se visualizzo il conto alla rovescia da 100 a 1 impiega ben 12 secondi ma se metto il REM davanti a LOCATE e PRINT allora il tempo è 0 secondi ;-O
Per il momento proseguo così e poi si vedrà

For Next e altro
16/06/2022 19:12
Eccoci qui e un'altro poco di codice è stato scritto
Aggiunto i cicli For-Next nidificati con tanto di TO e DOWNTO oltre allo STEP.
Inoltre ho creato uno schermo virtuale per l'output di 80x50 caratteri con gestione del colore tramite comando INK
la paletta di 27 colori è stata ispirata dal Amstrad CPC
ovviamente
Dimenticavo i comandi CENTER e LOCATE per posizionare il testo.
Ho parecchie idee in stile CLIPPER ma per il momento procediamo un passo alla volta.



Aggiunto i cicli For-Next nidificati con tanto di TO e DOWNTO oltre allo STEP.
Inoltre ho creato uno schermo virtuale per l'output di 80x50 caratteri con gestione del colore tramite comando INK
la paletta di 27 colori è stata ispirata dal Amstrad CPC

Dimenticavo i comandi CENTER e LOCATE per posizionare il testo.
Ho parecchie idee in stile CLIPPER ma per il momento procediamo un passo alla volta.


Il mio primo interprete
04/06/2022 17:17
Quasi tutti i programmatori della mia generazione, prima o poi si sono cimentati nello sviluppo di un interprete o in un compilatore. Oggi è stata la mia volta
In realtà qualche anno addietro avevo scritto un linguaggio script incluso in una applicazione che avevo sviluppato per un cliente ma questa volta è ispirato al buon vecchio linguaggio Basic. Linguaggio che tutti noi, quando abbiamo mosso i primi passi nell'uso dei nostri amati Home Computers ci siamo impegnati ad imparare, usare e abusarne
Sono alla versione 0.0.1, ho iniziato a scriverlo due ore fa. E' molto rigido e al momento mancano IF e cicli FOR ma funziona. Ho usato il buon vecchio LiveCode, linguaggio che amo, evoluzione del HyperTalk e in meno di 200 linee di codice funziona
Ecco una foto dello schermo dove per provarlo ho scritto il classico generatore dei numeri di Fibonacci.





MSXdev21 i premi
19/11/2021 19:22
Mi hanno scritto gli organizzatori del MSXdev21 inviandomi la lista dei premi tra cui scegliere il mio:
1 "Blast Annual 2020 vol2" magazine (print)
1 "Blast Annual 2020 vol2" magazine (print)
1 "Blast Annual 2020 vol2" magazine (print)
1 "Omega" MSX computer PCB
1 "Retro Annual 2021" Magazine
1 MSX custom "Dust Cover"
1 "MSXblog" t-shirt
1 "MSXblog" t-shirt
1 "MSXblog" t-shirt
e ovviamente ho scelto il PCB Omega
1 "Blast Annual 2020 vol2" magazine (print)
1 "Blast Annual 2020 vol2" magazine (print)
1 "Blast Annual 2020 vol2" magazine (print)
1 "Omega" MSX computer PCB
1 "Retro Annual 2021" Magazine
1 MSX custom "Dust Cover"
1 "MSXblog" t-shirt
1 "MSXblog" t-shirt
1 "MSXblog" t-shirt
e ovviamente ho scelto il PCB Omega

MSXdev21 risultati finali
20/10/2021 16:13
I risultati finali sono arrivati:
1 "Alien Attack" by Marcos Daniel Blanco, Daniel Simon (88/100)
2 "S.o.l.o." by Roolandoo (81/100)
3 "PAC-01" by ARC8 (80/100)
4 "Raven" by Micha Mulder (79/100)
5 "Fantastic Football" by Zoran Majcenić, Daniel Simon (76/100)
6 "Blockbuster" by Robosoft (73,1/100)
7 "No Back Down" by SoCal (73/100)
8 "Make Them Jump" by Robosoft (70/100)
9 "Make Them Fall" by Robosoft (69/100)
10 "Do The Same" by Eric Mendel (Ricco59) (68/100)
11 "Tortilla Sunrise (Conexion Tortilla)" by Tortilla Yonkers (67/100)
12 "FlyGuy" by Robosoft (65/100)
13 "Open Wide!" by Hakogame (63/100)
14 "Where Is it? The Quest For the 10th Island" by Eric Mendel (Ricco59) (61/100)
15 "Step" by Uninteresting (57/100)
16 "Arya" by André Baptista (55/100)
17 "Pitman" by Under4Mhz (54,2/100)
18 "Mahjong Solitaire" by Under4Mhz (54,1/100)
19 "Klondike Solitaire" by Under4Mhz (54/100)
20 "XOR2021" by Timmy (52/100)
21 "Square Ball" by Ray2Day MSX Software (49/100)
22 "Heart Stealer 2" by Timmy (48,2/100)
23 "Pippo la scopa ficcanaso" by Gamecast Entertainment (48,1/100)
24 "Logic Remastered" by Plattysoft (48/100)
25 "PickinX" by Amaury Carvalho (44/100)
26 "Monster On The Run" by Paolo Borzini (Neurox66) (39/100)
27 "Reflexion" by Jipe (38/100)
28 "SD Sniper" by Kirem (37/100)
29 "Tool Blocks" by Ray2Day MSX (35/100)
30 "Market Master" by Amaury Carvalho (33/100)
31 "Arm Wrestler" by SKSOFT (25/100)
32 "Bookworm" by Z80 ASMer (24/100)
33 "Break Bomb" by Gamecast Entertainment (0/100)
34 "Puzzybox" by Gamecast Entertainment (0/100)
Sono arrivato 26esimo su 34, non male come risultato
1 "Alien Attack" by Marcos Daniel Blanco, Daniel Simon (88/100)
2 "S.o.l.o." by Roolandoo (81/100)
3 "PAC-01" by ARC8 (80/100)
4 "Raven" by Micha Mulder (79/100)
5 "Fantastic Football" by Zoran Majcenić, Daniel Simon (76/100)
6 "Blockbuster" by Robosoft (73,1/100)
7 "No Back Down" by SoCal (73/100)
8 "Make Them Jump" by Robosoft (70/100)
9 "Make Them Fall" by Robosoft (69/100)
10 "Do The Same" by Eric Mendel (Ricco59) (68/100)
11 "Tortilla Sunrise (Conexion Tortilla)" by Tortilla Yonkers (67/100)
12 "FlyGuy" by Robosoft (65/100)
13 "Open Wide!" by Hakogame (63/100)
14 "Where Is it? The Quest For the 10th Island" by Eric Mendel (Ricco59) (61/100)
15 "Step" by Uninteresting (57/100)
16 "Arya" by André Baptista (55/100)
17 "Pitman" by Under4Mhz (54,2/100)
18 "Mahjong Solitaire" by Under4Mhz (54,1/100)
19 "Klondike Solitaire" by Under4Mhz (54/100)
20 "XOR2021" by Timmy (52/100)
21 "Square Ball" by Ray2Day MSX Software (49/100)
22 "Heart Stealer 2" by Timmy (48,2/100)
23 "Pippo la scopa ficcanaso" by Gamecast Entertainment (48,1/100)
24 "Logic Remastered" by Plattysoft (48/100)
25 "PickinX" by Amaury Carvalho (44/100)
26 "Monster On The Run" by Paolo Borzini (Neurox66) (39/100)
27 "Reflexion" by Jipe (38/100)
28 "SD Sniper" by Kirem (37/100)
29 "Tool Blocks" by Ray2Day MSX (35/100)
30 "Market Master" by Amaury Carvalho (33/100)
31 "Arm Wrestler" by SKSOFT (25/100)
32 "Bookworm" by Z80 ASMer (24/100)
33 "Break Bomb" by Gamecast Entertainment (0/100)
34 "Puzzybox" by Gamecast Entertainment (0/100)
Sono arrivato 26esimo su 34, non male come risultato

MSXDev21 Monster on the run 2
16/08/2021 11:06
Ora è ufficiale, Monster on the run è il gioco numero 23 nella lista dei pervenuti al MSXDev21.
questa è la scheda ufficiale su MSXDev dove potete provare online il gioco.
Prima di pubblicare il gioco è stato provo sulle mie macchine reali Philips NMS8245 e MSXVR
e su due emulatori che girano sul MAC CocoaMSX e OPENMSX.
questa è la scheda ufficiale su MSXDev dove potete provare online il gioco.
Prima di pubblicare il gioco è stato provo sulle mie macchine reali Philips NMS8245 e MSXVR
e su due emulatori che girano sul MAC CocoaMSX e OPENMSX.
MSXdev21 il mio gioco
11/08/2021 07:31
Oggi ho terminato le ultime modifiche al gioco con cui partecipo al MSXdev21. Inviato all'indirizzo email dell'evento e ora aspetto che mi contattino. Noi Italiani non siamo scaramantici però non si sa mai
parlerò del gioco appena sarà confermato l'ingresso.

LambdaSpeak FS
06/08/2021 10:51
Per i possessori, ovviamente felici
, di un Amstrad CPC la scheda Lambda Speak III è una grande espansione con molte caratteristiche.
Purtroppo molto costosa ma a questo proposito Stefan di Future Soft ha deciso di costruire una nuova scheda partendo appunto dal progetto di Michael Wessel
creando la LambdaSpeak FS. Ovviamente le differenze ci sono, nella nuova scheda manca il chip SPO256 sostituito dalla schedina Click2Spech e non è stata inserita la ROM.
Queste modifiche fanno si che con meno di 60€ si può avere questa splendida scheda che funziona alla grande.
Sto scrivendo questo messaggio ascoltando gli MP3 con il mio CPC 6128 Plus a cui è collegato la scheda LSFS.
Mi è arrivata proprio oggi e non sono riuscito a resistere da provarla subito.
Assieme alla scheda c'è un SD con i file disk sopracitati e un floppy da 3" con gli stessi file
I comandi RSX sono veramente molti e premettono da Basic di avere il pieno controllo della scheda.
Ottima la presenza del sensore termico e del orologio e con semplici comandi è possibile consultare i valori.
Con questa semplice riga in Basic si ottiene la temperatura dalla scheda:
10 t%=0 : |GETTEMP,@t%: print t%

Alcune delle caratteristiche salienti:
LambdaSpeak FS (2021)
- Sintesi vocale perfetta (inglese e spagnolo!) (Peccato manchi l'Italiano)
- Lettore MP3 con scheda SD
- Orologio in tempo reale (OS nativo, CP/M)
- Lettore di campioni PCM
- 81 nuovi comandi RSX
- Software anche per CP/M
- Emulazione di:
* sintetizzatore vocale SSA-1
* sintetizzatore vocale dk'tronics
* Amdrum Drumkit
* Modalità Epson e DECtalk
- Sensore termico
- Porta seriale (fino a 625000 Baud)
- Opzione MIDI IN e OUT
- Tre file DSK pieni di software
- Espansione RSX
- Sexy Lisa che parla
- Prodatrons Digitrakker
- Trasferimento XMODEM
- Connettore MX4
Qui il post di presentazione della scheda su CPCWiki

Purtroppo molto costosa ma a questo proposito Stefan di Future Soft ha deciso di costruire una nuova scheda partendo appunto dal progetto di Michael Wessel
creando la LambdaSpeak FS. Ovviamente le differenze ci sono, nella nuova scheda manca il chip SPO256 sostituito dalla schedina Click2Spech e non è stata inserita la ROM.
Queste modifiche fanno si che con meno di 60€ si può avere questa splendida scheda che funziona alla grande.
Sto scrivendo questo messaggio ascoltando gli MP3 con il mio CPC 6128 Plus a cui è collegato la scheda LSFS.
Mi è arrivata proprio oggi e non sono riuscito a resistere da provarla subito.
Assieme alla scheda c'è un SD con i file disk sopracitati e un floppy da 3" con gli stessi file

I comandi RSX sono veramente molti e premettono da Basic di avere il pieno controllo della scheda.
Ottima la presenza del sensore termico e del orologio e con semplici comandi è possibile consultare i valori.
Con questa semplice riga in Basic si ottiene la temperatura dalla scheda:
10 t%=0 : |GETTEMP,@t%: print t%

Alcune delle caratteristiche salienti:
LambdaSpeak FS (2021)
- Sintesi vocale perfetta (inglese e spagnolo!) (Peccato manchi l'Italiano)
- Lettore MP3 con scheda SD
- Orologio in tempo reale (OS nativo, CP/M)
- Lettore di campioni PCM
- 81 nuovi comandi RSX
- Software anche per CP/M
- Emulazione di:
* sintetizzatore vocale SSA-1
* sintetizzatore vocale dk'tronics
* Amdrum Drumkit
* Modalità Epson e DECtalk
- Sensore termico
- Porta seriale (fino a 625000 Baud)
- Opzione MIDI IN e OUT
- Tre file DSK pieni di software
- Espansione RSX
- Sexy Lisa che parla
- Prodatrons Digitrakker
- Trasferimento XMODEM
- Connettore MX4
Qui il post di presentazione della scheda su CPCWiki