tag:blogger.com,1999:blog-86206803765975409142024-03-14T05:21:58.159+01:00(remote) Dev Labs<small>Benvenuti in laboratorio.</small>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.comBlogger57125tag:blogger.com,1999:blog-8620680376597540914.post-18414970980951389262020-10-15T17:42:00.012+02:002020-10-16T10:16:28.309+02:00STM8-BASIC: il più piccolo computer con interprete basic (4/4)<p><b>Nota</b>: questo post fa parte di un articolo suddiviso in 4 sezioni:</p><ol><li><a href="http://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con.html"> di 4 ☑</a></li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_11.html"> di 4 ☑</a></li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_13.html"> di 4 ☑</a></li><li> di 4 ☑</li></ol><div><hr /><h2>Algoritmo</h2></div><div>Iniziamo ora a pensare come calcolare le due informazioni che ci servono per calcolare se la cellula sarà viva o morta nella prossima generazione:</div><div><ol style="text-align: left;"><li>stato della cellula nella generazione corrente</li><li>somma S delle cellule vive intorno ad essa</li></ol></div>
<h3><span><a name='more'></a></span>Stato della cellula corrente</h3><div>Riprendendo la notazione introdotta nel post precedente, supponiamo di avere il byte R che ospita la riga di cellule.</div><div>Se stiamo considerando il bit con indice N, un'operazione di AND bit a bit tra il byte R e 2<sup>N</sup> restituirà due possibili valori:</div><div> - 0 (se il bit con indice N è 0 su R)</div><div> - 2<sup>N</sup> (se il bit con indice N è 1 su R)</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-uQC-evkN1gM/X4hONBZ-UFI/AAAAAAAABRc/wHC_DTAKs4oVdPi6uQI3cmrnVB-I3mO6ACLcBGAsYHQ/s275/and_logico.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="77" data-original-width="275" src="https://1.bp.blogspot.com/-uQC-evkN1gM/X4hONBZ-UFI/AAAAAAAABRc/wHC_DTAKs4oVdPi6uQI3cmrnVB-I3mO6ACLcBGAsYHQ/s0/and_logico.png" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Nell'esempio in figura N=3, calcoliamo 2<sup>3</sup> e facciamo l'operazione <span style="font-family: courier;">(<span>R&8)</span></span>: in base al valore del bit X, otterremo 8 oppure 0.</div><div class="separator" style="clear: both; text-align: left;">Se vogliamo un risultato che sia 1 per cellula viva e 0 per cellula morta, l'operazione completa sarà:</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><span style="font-family: courier;"><b>bit<sub>N</sub> = (R&2<sup>N</sup>)/2<sup>N</sup></b></span></div>
<div style="text-align: left;"><br /></div><div style="text-align: left;">Questa informazione mi è utile anche al fine di stampare a video lo stato della cella, continuando nel ciclo fino alla fine del byte, quando dovrò andare a capo prima di iniziare il byte successivo.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><u>Nota implementativa</u>: in BASIC, l'operazione di divisione può essere sostituita con un'operazione di confronto: l'espressione <span style="font-family: courier; text-align: center;">(R&2</span><sup style="font-family: courier; text-align: center;">N</sup><span style="font-family: courier; text-align: center;">)=2</span><sup style="font-family: courier; text-align: center;">N</sup> restituisce 1 se i due membri dell'uguaglianza sono uguali, 0 altrimenti.</div><span></span><span><!--more--></span><h2 style="text-align: left;">Somma delle cellule vive</h2>
<div class="separator" style="clear: both; text-align: left;">Passiamo ora al calcolo delle cellule vive intorno al bit corrente.</div><div class="separator" style="clear: both; text-align: left;">Iniziamo con la premessa che ora dovremo gestire non il solo byte R ma anche il precedente ed il successivo sulla griglia; compreso questo, il discorso non si discosta molto da quanto visto prima.</div><div class="separator" style="clear: both; text-align: left;">Dovremo considerare non solo il bit in posizione N, ma anche il precedente ed il successivo.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-fnXnsic-kDU/X4hONPgltHI/AAAAAAAABRg/edA5lAPdyD8fyCAAdF7J9_97X5H_jKGaACLcBGAsYHQ/s211/byte_00.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="64" data-original-width="211" src="https://1.bp.blogspot.com/-fnXnsic-kDU/X4hONPgltHI/AAAAAAAABRg/edA5lAPdyD8fyCAAdF7J9_97X5H_jKGaACLcBGAsYHQ/s0/byte_00.png" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Usiamo le variabili di tipo byte offerte dal dispositivo per i nostri "moltiplicatori" e battezziamo:</div><div class="separator" style="clear: both; text-align: center;"><span style="font-family: courier;">O=2<sup>N+1</sup></span><span style="font-family: courier;"> P=2</span><sup style="font-family: courier;">N</sup><span style="font-family: courier;"> Q=2</span><sup style="font-family: courier;">N-1</sup></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Dovremo però gestire due casi limite: quando N=0, Q dovrà essere 128 (perché la griglia è illimitata lateralmente)</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-UK-NtoATflA/X4hONDTBLBI/AAAAAAAABRk/32MbMrl__444WL7bopCfwzPPUg-l7Tw3ACLcBGAsYHQ/s211/byte_01b.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="114" data-original-width="211" src="https://1.bp.blogspot.com/-UK-NtoATflA/X4hONDTBLBI/AAAAAAAABRk/32MbMrl__444WL7bopCfwzPPUg-l7Tw3ACLcBGAsYHQ/s0/byte_01b.png" /></a></div><div class="separator" style="clear: both; text-align: left;">Nel caso opposto, quanto N=7, O dovrà essere 1.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-GDgQi4rrQFc/X4hON0QgzVI/AAAAAAAABRo/xgPzseH0lL80cR0UOCPuHNI2thd9w8CLgCLcBGAsYHQ/s211/byte_02b.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="107" data-original-width="211" src="https://1.bp.blogspot.com/-GDgQi4rrQFc/X4hON0QgzVI/AAAAAAAABRo/xgPzseH0lL80cR0UOCPuHNI2thd9w8CLgCLcBGAsYHQ/s0/byte_02b.png" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">La somma delle cellule vive intorno al bit corrente comprende i contributi dati dai 3 byte:</div><div class="separator" style="clear: both; text-align: left;">per V= byte superiore, avremo un contributo pari a: </div><div class="separator" style="clear: both; text-align: center;"><span style="font-family: courier;"> (V&O)/O+(V&P)/P+(V&Q)/Q</span></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">per il byte R avremo un contributo:</div><div class="separator" style="clear: both; text-align: center;"> <span style="font-family: courier;">(R&O)/O+(R&Q)/Q</span></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">infine per V= byte inferiore (nuovamente) un contributo:</div><div class="separator" style="clear: both; text-align: center;"><span style="font-family: courier;"> (V&O)/O+(V&P)/P+(V&Q)/Q</span></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">La somma dei tre contributi sarà il risultato del calcolo voluto.</div>
<h3><span><!--more--></span>Mettiamo insieme i pezzi</h3><div class="separator" style="clear: both; text-align: left;">Con queste informazioni, vado a strutturare il programma BASIC come segue:</div><div class="separator" style="clear: both; text-align: left;"><br /></div>
<code>10 M020000000000082818000000 <i>'inizializzazione griglia 8+8x8+8
</i><br />20 CLR <i>'svuoto schermo</i>
<br />30 FOR A=$0200 TO A+7 <span> </span> <i>'inizio ciclo sui bytes in memoria</i>
<br /><span style="color: #6fa8dc;">40 P=0 <span> </span><span> </span><span> </span><span> </span><span> </span><i>'inizializzo moltiplicatore bit centrale</i>
<br />50 T=0<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><i>'inizializzo byte prossima generazione
</i><br />60 FOR N=0 TO 7 <span> </span><span> </span><span> </span><i>'inizio ciclo sui bit (0->7)
</i></span><br /><span style="color: #e06666;">70 GOSUB 1000 <span> </span><span> </span><span> </span><i>'subroutine di calcolo moltiplicatori
</i><br />80 V=PEEK A <span> </span><span> </span><span> </span><span> </span><i>'carico il byte superiore dalla RAM</i>
<br />90 S=(V&O)/O+(V&P)/P+(V&Q)/Q <i>'contributo del byte superiore</i> <br />100 V=PEEK A+1 <i>'carico il byte centrale dalla RAM </i><br />110 R=V <i>'copio il byte centrale su R</i>
<br />120 S=S+(R&O)/O+(R&Q)/Q <i>'contributo del byte centrale</i> <br />130 V=PEEK A+2 <i>'carico il byte inferiore dalla RAM</i><br />140 S=S+(V&O)/O+(V&P)/P+(V&Q)/Q <i>'contributo del byte inferiore</i> <br />150 U=(R&P)=P <i>'U=1 se attuale cella piena, 0 se vuota
</i><br />160 PRINT U; <i>'stampo 1 o 0</i>
<br />170 T=T+P*(S=3) <i>'aggiungo al byte T l'informazione se nella</i>
<br />180 T=T+P*(S=2)*U <i>'prossima generazione il bit N sarà 1 o 0</i>
<br /></span><span style="color: #6fa8dc;">190 NEXT N
<br />200 PRINT "" <i>'vado a capo</i>
<br />210 C=A+10
</span><br />220 ...</code></div><div><code>...<br />500 GOTO 20 <i>'torno all'inizio
</i><br /><span style="color: #ffe599;">1000 O=128*(N=0) <i>'subroutine aggiornamento moltiplicatori
</i><br />1010 O=O+P <i>'O = moltiplicatore bit a sx
</i><br />1020 P=1<<<n bit="" br="" centrale="" moltiplicatore="">N 'P = moltiplicatore bit centrale</n></span></code></div><div><code><span style="color: #ffe599;"><span><n bit="" br="" centrale="" moltiplicatore="">1030 </n></span><span style="font-family: monospace;">Q=(N=7) </span> <i>'Q = moltiplicatore bit a dx</i></span></code><div><code><span style="color: #ffe599;"><n bit="" br="" centrale="" moltiplicatore="">1040 Q=P*2+Q <br />1050 RETURN <i>'fine subroutine
</i></n></span></code></div><br />Il programma richiede alcune osservazioni:</div><div><ul style="text-align: left;"><li>Alla riga 10 c'è una istruzione, specifica del STM8 BASIC, che carica all'indirizzo $0200 i valori esadecimali che seguono, raggruppati per byte (due cifre esadecimali ogni byte). L'istruzione inizializza la matrice con un glider, come mostrato in una figura <a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_11.html">nel secondo post</a>. </li><li>Alla riga 1020 c'è l'operatore "<<" che rappresenta lo shift a sinistra dei bit dell'operando di sinistra, di tante posizioni quanto vale il secondo operando</li><li>Ho ritenuto opportuno calcolare, per ogni N, i moltiplicatori O,P e Q una sola volta ed utilizzarli per i tre byte. Il calcolo dei moltiplicatori viene fatto nella subroutine <span style="color: #ffe599;">evidenziata in giallo</span> alla riga 1000.</li><li>La stampa dello stato della cella corrente, poiché viene fatto da sinistra verso destra, farà apparire sullo schermo una griglia "allo specchio", dove il bit meno significativo viene stampato più a sinistra e quello più significativo a destra.</li><li>alle righe 170 e 180 si trova una moltiplicazione in cui un operando è un'operazione di confronto. Il significato di questa notazione è che se l'uguaglianza è verificata, l'operando vale 1; se non è verificata, vale 0. In particolare la riga 180 significa:<u> al valore T viene sommato P se S è uguale a 2 e se U è uguale ad 1</u>. Ricordiamo che U è lo stato della cellula corrente (1=viva, 0=morta) - si veda la riga 150.</li><li>Il programma non può essere inserito così sul dispositivo stm8: occorre eliminare completamente i commenti e riassegnare i numeri di riga in modo da ridurre al massimo i byte utilizzati.</li></ul></div>
<hr />
<h2>Bonus content</h2>
<h4>Esempio di esecuzione</h4><div><br /></div>
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="230" src="https://www.youtube.com/embed/KxvBW9Vu_FI" width="320" youtube-src-id="KxvBW9Vu_FI"></iframe></div><br /><div><br /></div>
<h4>Codice sorgente</h4>
<pre><code>1 M020000000000082818000000
2 CLR
3 FOR A=$0200 TO A+7
4 P=0
5 T=0
6 FOR N=0 TO 7
7 GOSUB 90
8 V=PEEK A
9 S=(V&O)/O+(V&P)/P+(V&Q)/Q
10 V=PEEK A+1
11 R=V
12 S=S+(V&O)/O+(V&Q)/Q
13 V=PEEK A+2
14 S=S+(V&O)/O+(V&P)/P+(V&Q)/Q
15 U=(R&P)=P
16 PRINT U;
17 T=T+P*(S=3)
18 T=T+P*(S=2)*U
19 NEXT N
20 PRINT ""
21 C=A+10
22 POKE C,T
23 NEXT A
24 FOR B=$0201 TO B+7
25 P=PEEK B+9
26 POKE B,P
27 NEXT B
28 P=PEEK $020A
29 POKE $0209,P
30 P=PEEK $0211
31 POKE $0200,P
32 SLEEP 1
33 GOTO 2
90 O=128*(N=0)
91 O=O+P
92 P=1<<N
93 Q=(N=7)
94 Q=P*2+Q
95 RETURN
</code></pre>
<br />
<h4>Oscillatore</h4>
<div>provate ad inizializzare la griglia con questa configurazione:</div>
<pre><code>1 M0200000000007E0000000000</code></pre>
<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-tZHMFjJvzuA/X4hq9uOv4hI/AAAAAAAABSE/-Q8sEWpe8swKZG_I_nLJH2RWleX553HLgCLcBGAsYHQ/s201/inizializzazione_griglia_2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="201" data-original-width="170" src="https://1.bp.blogspot.com/-tZHMFjJvzuA/X4hq9uOv4hI/AAAAAAAABSE/-Q8sEWpe8swKZG_I_nLJH2RWleX553HLgCLcBGAsYHQ/s0/inizializzazione_griglia_2.png" /></a></div>
<h4>Doppio glider</h4>
<div class="separator" style="clear: both; text-align: left;">provate ad inizializzare la griglia con questa configurazione:</div>
<pre><code>1 M02000020A06000020A060020</code></pre>
<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-2obnZfkVdZA/X4hq9pKyo1I/AAAAAAAABSA/GsJuoZ8AxnIzAAiv_ThILW-EXNzTgYOhwCLcBGAsYHQ/s201/inizializzazione_griglia_3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="201" data-original-width="170" src="https://1.bp.blogspot.com/-2obnZfkVdZA/X4hq9pKyo1I/AAAAAAAABSA/GsJuoZ8AxnIzAAiv_ThILW-EXNzTgYOhwCLcBGAsYHQ/s0/inizializzazione_griglia_3.png" /></a></div><br /><div><br /></div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-17350244109863880102020-10-13T18:42:00.016+02:002020-10-16T10:08:16.369+02:00STM8-BASIC: il più piccolo computer con interprete basic (3/4)<p><b>Nota</b>: questo post fa parte di un articolo suddiviso in 4 sezioni:</p><ol><li><a href="http://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con.html"> di 4 ☑</a></li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_11.html"> di 4 ☑</a></li><li> di 4 ☑</li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_15.html"> di 4</a></li></ol><div><hr /><h2 style="text-align: left;"> Allocare la nuova generazione</h2>
<p>abbiamo visto nel <a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_11.html">precedente post</a> la mappa di memoria in cui ospitare la generazione corrente delle nostre cellule.</p><p>Per ospitare la generazione successiva, utilizziamo gli 8 bytes immediatamente successivi della memoria.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-oUk6YU0tsCs/X4XQKLUqVeI/AAAAAAAABQ8/Gjd7MOj6Up8l-NbNmNTo228go8uMCSVZQCLcBGAsYHQ/s441/mappa_memoria2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="441" data-original-width="385" height="320" src="https://1.bp.blogspot.com/-oUk6YU0tsCs/X4XQKLUqVeI/AAAAAAAABQ8/Gjd7MOj6Up8l-NbNmNTo228go8uMCSVZQCLcBGAsYHQ/s320/mappa_memoria2.png" /></a></div><div><br /></div><h3>Il programma</h3><div>Vediamo quindi come passare dalla generazione corrente a quella futura:</div><div>dovremo fare una scansione di tutte le cellule della generazione corrente, per ogni cellula dovremo sapere se è viva o morta, e dovremo contare il numero di cellule vive intorno (chiamiamo questa somma S).</div><div>Con queste due informazioni stabiliremo lo stato della cellula nella prossima generazione:</div><div><ul style="text-align: left;"><li>cellula attualmente morta</li><ul><li>se S=3, nella prossima generazione la cellula sarà viva</li></ul><li>cellula attualmente viva:</li><ul><li>se S=3 oppure S=2, nella prossima generazione la cellula sarà viva</li></ul><li>in tutti gli altri casi, nella prossima generazione la cellula sarà morta.</li></ul></div><div>Per implementare questo algoritmo dovremo effettuare una scansione dei byte della generazione corrente, per ogni byte effettuare una scansione dei bit (ovvero delle cellule) - calcolare lo stato del bit per la prossima generazione ed infine memorizzare lo stato della nuova generazione nell'area di memoria preposta.</div><div><br /></div><div>La logica di massima del nostro programma BASIC sarà quindi:<div><ul style="text-align: left;"><li>(1) eseguiamo un ciclo sui byte della generazione corrente (dall'indirizzo $0201 a $0208) </li><ul><li><span style="color: #6fa8dc;">per ognuno di questi byte eseguiamo un ciclo sui bit (da 0 a 7) - chiamiamo R il byte corrente</span></li><ul><li><span style="color: #ea9999;">per ogni bit, calcoliamo la somma delle cellule vive intorno ad esso</span></li><li><span style="color: #ea9999;">stabiliamo quindi se il corrispondente bit della prossima generazione sarà 1 o 0 (cellula viva o meno)</span></li></ul><li><span style="color: #6fa8dc;">al termine del ciclo sui bit avremo calcolato un intero byte della prossima generazione, chiamiamo T questo byte</span></li><li><span style="color: #6fa8dc;">salviamo il byte T in un indirizzo 9 locazioni più avanti rispetto al corrispondente byte R (es: da $0203 a $0203+9 = $020C)</span></li></ul><li>al termine del ciclo sui byte, avremo le locazioni $020A-$0211 riempite con la nuova generazione</li><li>(2) copiamo la nuova generazione dalle locazioni [$020A-$0211] alle locazioni [$0201-$0208]</li><li>(3) copiamo il primo byte della nuova generazione da $020A a $0209</li><li>(4) copiamo l'ultimo byte della nuova generazione da $0211 a $0200</li><li>ricominciamo da capo.</li></ul><div>Ho evidenziato in colore <span style="color: #6fa8dc;">blu</span> le operazioni eseguite per ogni byte della generazione corrente, ed in colore <span style="color: #ea9999;">rosso</span><span style="color: red;"> </span>le operazioni eseguite per ogni bit del byte corrente.</div><div><br /></div><div>Per ogni byte preso in esame (ricordo che per calcolare la somma delle cellule vive dovrò tenere conto anche del byte precedente e del byte successivo) nella generazione corrente il programma calcolerà il corrispondente byte della generazione futura e lo salverà nell'opportuno indirizzo (9 locazioni più "in basso" nella mappa della memoria).</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-sjiZbtKJ7l4/X4XVSg5k1ZI/AAAAAAAABRI/GeTR_L21nNM3K7y-dJnopnsn8Ouzo0h4ACLcBGAsYHQ/s441/mappa_memoria2%2B-%2BCopia.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="441" data-original-width="385" height="320" src="https://1.bp.blogspot.com/-sjiZbtKJ7l4/X4XVSg5k1ZI/AAAAAAAABRI/GeTR_L21nNM3K7y-dJnopnsn8Ouzo0h4ACLcBGAsYHQ/s320/mappa_memoria2%2B-%2BCopia.png" /></a></div><br /><h2 style="text-align: left;"><span><a name='more'></a></span>Dalle idee al codice</h2><div>Proviamo ora a strutturare un programma BASIC su questa logica; in questa prima stesura trascuriamo i dettagli del calcolo della cellula per la nuova generazione (righe tra la 90 e la 140) .</div><br />
<div><code>
10 REM (1) <i>CICLO SUI BYTE IN RAM
</i><br />20 FOR A=$0201 TO A+7
<br /><span style="color: #6fa8dc;"><span>30 REM <i>INIZIALIZZO BYTE T DELLA PROSSIMA GENERAZIONE
</i><br />40 T=0 </span></span></code></div><div><code><span style="color: #6fa8dc;">50 REM CARICO IL BYTE R DELLA GENERAZIONE CORRENTE</span></code></div><div><code><span style="color: #6fa8dc;">60 R=PEEK A<br /><span>70 REM <i>CICLO SUI BIT DEL BYTE</i> R<br />80 FOR N=0 TO 7
</span></span><br /><span style="color: #ea9999;">90 REM <i>CALCOLO IL VALORE DELLA CELLA
</i><br />100 REM <i>CORRISPONDENTE AL BIT 2^N DEL BYTE T</i>
<br />... </span></code></div><div><code><span style="color: #ea9999;">140 REM FINE CALCOLO</span><br /><span style="color: #6fa8dc;"><span>150 NEXT N
</span><br /><span>160 REM C = <i>INDIRIZZO IN CUI DEVO SCRIVERE</i>
<br />170 REM <i>IL BYTE DELLA PROSSIMA GENERAZIONE</i>
<br />180 C=A+9
<br />190 POKE C,T</span>
</span><br />200 NEXT A
<br />210 REM (2) <i>COPIO LA NUOVA GENERAZIONE CALCOLATA</i>
<br />220 REM <i>DA $020A-$0211 A $0201-$0208</i>
<br />230 FOR B=$0201 TO B+7
<br />240 P=PEEK B+9
<br />250 POKE B,P
<br />260 NEXT B
<br />270 REM (3) <i>COPIO IL BYTE IN $020A SU $0209</i>
<br />280 P=PEEK $020A
<br />290 POKE $0209,P
<br />300 REM (4) <i>COPIO IL BYTE IN $0211 SU $0200
</i><br />310 P=PEEK $0211
<br />320 POKE $0200,P
<br />330 SLEEP 1
<br />340 GOTO 10
</code></div><div><br /></div><div>Questa è la struttura generale del programma, naturalmente mancano ancora le parti per:</div><div><ul style="text-align: left;"><li>stampare a video la generazione corrente</li><li>calcolare il byte T della generazione futura, che si traduce praticamente in</li><ul><li>calcolare la somma delle cellule vive intorno al bit n-esimo del byte corrente</li></ul></ul></div><div>Per ora è tutto, vedremo nell'ultimo post come effettuare il calcolo del byte della nuova generazione, e vedremo se riusciremo a fare stare il nostro programma nei 630 byte a disposizione.</div></div></div></div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-27263031352046689532020-10-11T21:51:00.016+02:002020-10-16T10:08:30.363+02:00STM8-BASIC: il più piccolo computer con interprete basic (2/4)<p><b>Nota</b>: questo post fa parte di un articolo suddiviso in 4 sezioni:</p><ol><li><a href="http://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con.html"> di 4 ☑</a></li><li> di 4 ☑</li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_13.html"> di 4</a></li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_15.html"> di 4</a></li></ol>
<div><hr /><h2 style="text-align: left;">Cosa?</h2>
<div>Abbiamo il <a href="http://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con.html">nostro computer</a>, collegato tramite terminale seriale, pronto ad eseguire i nostri programmi BASIC. </div><div>Bene, cosa vogliamo far eseguire al nostro interprete?</div><div>In onore di <a href="https://it.wikipedia.org/wiki/John_Conway" target="_blank">John Conway</a>, scomparso ad aprile di questo sciagurato 2020, ritengo opportuno programmare una variante della simulazione <a href="https://it.wikipedia.org/wiki/Gioco_della_vita" target="_blank">LIFE </a>in BASIC.</div><div><br /></div><div>Cosa dovremo fare, quindi? Elenchiamo i punti principali:</div><p style="text-align: left;"></p><ol style="text-align: left;"><li>stabilire come memorizzare la griglia che rappresenta la generazione corrente</li><li>definire un algoritmo che conti le cellule vive intorno ad una generica cella della griglia</li><li>calcolare la generazione successiva e memorizzarla</li></ol><p></p><div><br /></div><div>Date le limitazioni dell'interprete (abbiamo a disposizione una manciata di variabili numeriche, 256 byte di RAM e 630 byte per il programma) avremo una semplice griglia di 8x8 celle, ognuna delle quali potrà essere "viva" o "morta".</div>
<h2 style="text-align: left;"><span><a name='more'></a></span>Una variante...</h2><div>La griglia può essere allocata in 8 byte di RAM. Ogni byte ospiterà una riga della griglia, dove il simbolo 1 rappresenterà una cellula "viva" e lo 0 una cellula "morta".</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-D-aXPxqAnEo/X4NMYbdI14I/AAAAAAAABPY/VJvEV0DgLjkfE619c_TzsKY2wRvSOTC5gCLcBGAsYHQ/s334/griglia_00.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="241" data-original-width="334" src="https://1.bp.blogspot.com/-D-aXPxqAnEo/X4NMYbdI14I/AAAAAAAABPY/VJvEV0DgLjkfE619c_TzsKY2wRvSOTC5gCLcBGAsYHQ/s320/griglia_00.png" width="320" /></a></div><br /><div>Nella figura vediamo un esempio dei casi che dovremo gestire: durante il calcolo della nuova generazione, per stabilire il valore del bit con indice 3 del 3° byte, dovremo contare il numero di cellule "vive" presenti intorno al nostro bit.</div><div>Segnatamente, dovremo contare gli "1" presenti :</div><div><ul style="text-align: left;"><li>nel secondo byte (alle posizioni 2, 3 e 4)</li><li>nel terzo byte (alle posizioni 2 e 4)</li><li>nel quarto byte (alle posizioni 2, 3 e 4)</li></ul></div><div>Per rendere più interessante la simulazione, introduciamo una variante: consideriamo la griglia finita ma non limitata. Consideriamo cioè una griglia che si ripete infinitamente: sopra, sotto, a destra ed a sinistra.</div><div>Con questa variante, la somma delle cellule vicine deve essere opportunamente adeguata.</div>
<h3 style="text-align: left;">Esempio: calcolo per cella sul bordo laterale</h3><div>Vediamo il caso di una cella sul bordo destro della griglia.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-3gj0uRWOEAo/X4NUV1s7IgI/AAAAAAAABPk/hEFc6lVsEnYuEOPaPg1U_JeDGMagQQ_8gCLcBGAsYHQ/s334/griglia_01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="241" data-original-width="334" src="https://1.bp.blogspot.com/-3gj0uRWOEAo/X4NUV1s7IgI/AAAAAAAABPk/hEFc6lVsEnYuEOPaPg1U_JeDGMagQQ_8gCLcBGAsYHQ/s320/griglia_01.png" width="320" /></a></div><div><br /></div><div>Nella figura presentata, proviamo a fare il calcolo per il bit in posizione 0 del terzo byte. Dovremo considerare, oltre alle posizioni 0 ed 1 del 2° e del 4° byte ed alla posizione 1 del 3°, <u>anche le posizioni 7 del 1°, 2° e 3° byte</u>.</div>
<h3 style="text-align: left;">Esempio: calcolo per cella sul bordo inferiore</h3>
<div>In questo caso consideriamo una cella appartenente all'ottavo byte, alla posizione 2.</div><div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-dhL_0g1AE7k/X4NUYswjdHI/AAAAAAAABPo/od8vmPdKSiUx7gpRlT75tOyPor6_7qCwgCLcBGAsYHQ/s334/griglia_02.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="241" data-original-width="334" src="https://1.bp.blogspot.com/-dhL_0g1AE7k/X4NUYswjdHI/AAAAAAAABPo/od8vmPdKSiUx7gpRlT75tOyPor6_7qCwgCLcBGAsYHQ/s320/griglia_02.png" width="320" /></a></div><div><br /></div><div>Naturalmente considereremo le posizioni 1,2 e 3 del 7° byte, le posizioni 1 e 3 dell'8° byte.</div><div>Poiché la griglia è illimitata verticalmente, <u>dovremo considerare anche le celle appartenenti al 1° byte</u>.</div>
<h3 style="text-align: left;">Esempio: calcolo per cella in un angolo</h3><div>Nel caso di una cella posizionata in un angolo, vediamo in figura la posizione 7 del primo byte.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-GOplNvzHIIQ/X4NUYn59SKI/AAAAAAAABPs/wZBW8BVKbus5aMbQZI-_DPjMWkNsnLSjwCLcBGAsYHQ/s334/griglia_03.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="241" data-original-width="334" src="https://1.bp.blogspot.com/-GOplNvzHIIQ/X4NUYn59SKI/AAAAAAAABPs/wZBW8BVKbus5aMbQZI-_DPjMWkNsnLSjwCLcBGAsYHQ/s320/griglia_03.png" width="320" /></a></div><br /><div>Naturalmente la somma delle cellule "vive" conterà la posizione 6 del 1° byte e le posizioni 6 e 7 del 2° byte.</div><div>Per la non limitatezza della griglia, <u>dovremo contare anche la posizione 0 del 1° e 2° byte.</u></div><div>Il calcolo deve poi tenere conto dei "vicini" <u>che appartengono anche all'8° byte, alle posizioni 0, 6 e 7</u>. </div></div>
<h2 style="text-align: left;"><span><!--more--></span>Come?</h2><div>Una prima soluzione per aggirare la limitatezza verticale della griglia è di utilizzare due byte, in testa ed in coda alla griglia; nel byte in testa verrà replicato l'ottavo byte della griglia, nel byte in coda verrà replicato il contenuto del 1° byte.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-ypAcIJK9KhQ/X4Nft2qnn_I/AAAAAAAABQA/_CdgIifxgbAuTNyGzi1agvm--9q71UiigCLcBGAsYHQ/s383/inizializzazione_griglia.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="261" data-original-width="383" src="https://1.bp.blogspot.com/-ypAcIJK9KhQ/X4Nft2qnn_I/AAAAAAAABQA/_CdgIifxgbAuTNyGzi1agvm--9q71UiigCLcBGAsYHQ/s320/inizializzazione_griglia.png" width="320" /></a></div><div><br /></div><div>Usiamo gli indirizzi da $0201 a $0208 per la griglia della generazione corrente (nell'esempio in figura ho inserito un <a href="https://it.wikipedia.org/wiki/Navicella_(automa_cellulare)" target="_blank">glider</a>).</div><div>Copiamo l'ottavo byte della griglia (all'indirizzo $0208) nel byte all'indirizzo $0200.</div><div>Copiamo anche il primo byte della griglia (all'indirizzo $0201) nel byte all'indirizzo $0209. </div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-_NmchOU9f6w/X4Nft4EfedI/AAAAAAAABQE/6_H7Y_wjKGM5ulFKf_fNeeIG5cVmTlgEACLcBGAsYHQ/s385/mappa_memoria.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="241" data-original-width="385" src="https://1.bp.blogspot.com/-_NmchOU9f6w/X4Nft4EfedI/AAAAAAAABQE/6_H7Y_wjKGM5ulFKf_fNeeIG5cVmTlgEACLcBGAsYHQ/s320/mappa_memoria.png" width="320" /></a></div><div><br /></div>Questa è la mappa della RAM che ospita la generazione corrente della griglia, con il primo ed ultimo byte replicati in testa ed in coda.<div><br /></div><div>Per ora ci fermiamo qui, vedremo <a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_13.html">in seguito</a> come effettuare il calcolo della generazione successiva (e in quale zona di memoria depositarla).<br /><div><br /></div><div><br /></div></div></div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-44716672876653349562020-10-11T16:19:00.014+02:002023-09-19T12:18:13.892+02:00STM8-BASIC: il più piccolo computer con interprete basic (1/4)<p><b>Nota</b>: questo post fa parte di un articolo suddiviso in 4 sezioni:</p><ol><li> di 4 ☑</li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_11.html"> di 4</a></li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_13.html"> di 4</a></li><li><a href="https://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_15.html"> di 4</a></li></ol><div><hr /><h2 style="text-align: left;">Introduzione</h2><p>Poiché negli ultimi tempi ho sviluppato una certa <i><a href="https://it.wikipedia.org/wiki/Saudade" target="_blank">saudade </a></i>per la tecnologia dei primi anni '80 (in particolare gli interpreti BASIC), ho recentemente acquistato una scheda <a href="http://www.stm8basic.com/" target="_blank">STM8 BASIC</a>.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-uc5iuwE8zl4/X4MGD8DlnNI/AAAAAAAABOU/Lf7M7t9olRsNOiMKGtD-woB6SZtQjBcnwCLcBGAsYHQ/s2048/IMG_E3306.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1874" data-original-width="2048" height="255" src="https://1.bp.blogspot.com/-uc5iuwE8zl4/X4MGD8DlnNI/AAAAAAAABOU/Lf7M7t9olRsNOiMKGtD-woB6SZtQjBcnwCLcBGAsYHQ/w278-h255/IMG_E3306.JPG" width="278" /></a></div><div><br /></div>Il costo è irrisorio, la spedizione è stata rapida, ed in breve mi sono trovato tra le mani questo microcontrollore, di cui consiglio senza riserve l'acquisto.<p></p>Il dispositivo contiene un interprete BASIC, offre all'utente:<div><br /></div><div><ul style="text-align: left;"><li>256 bytes di RAM (volatile)</li><li>630 bytes di memoria non volatile per ospitare il programma BASIC.</li><li>Inoltre sono disponibili per l'utente:</li></ul></div><div><div><ul style="text-align: left;"><ul><li>6 variabili a 16 bit con segno (dalla A alla F)</li><li>6 variabili a 16 bit senza segno (dalla G alla L) </li><li>10 variabili ad 8 bit senza segno (dalla N alla W)</li><li>X e Z sono byte senza segno non volatili</li><li>Z è una variabile a 16 bit senza segno, il cui valore è uguale a X*256+Y. Ovviamente è non volatile come X ed Y, essendo sostanzialmente un altro modo di indirizzare quei due byte.</li></ul></ul><h2 style="text-align: left;"><span><a name='more'></a></span>Connessione al dispositivo</h2><div>Naturalmente la prima cosa da fare è collegare un terminale seriale al dispositivo in modo da poter interagire con l'interprete BASIC.</div><div>Per fare questo, occorre dotarsi di un convertitore USB/Seriale: io ho utilizzato una schedina del tipo FTDI (si possono acquistare online a costi ragionevoli).</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Wn-oVC4SxBw/X4MND9QY0tI/AAAAAAAABOg/irw-LVWh4VcVNU5cb3kiW06NPiBC2HCigCLcBGAsYHQ/s2004/IMG_E3310.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2004" data-original-width="1978" height="218" src="https://1.bp.blogspot.com/-Wn-oVC4SxBw/X4MND9QY0tI/AAAAAAAABOg/irw-LVWh4VcVNU5cb3kiW06NPiBC2HCigCLcBGAsYHQ/w215-h218/IMG_E3310.JPG" width="215" /></a></div><div><br /></div><u>Qui occorre fare attenzione</u>: la scheda SMT8 vuole i segnali seriali tra 0 e 3.3V, ma l'alimentazione Vcc a 5V. </div><div>Comprate un convertitore con il jumper che vi permetta di selezionare la tensione di uscita (3.3V - 5V) e <u>configuratela in modo che esca a 3.3V</u> - altrimenti causerete danni alla scheda STM8.</div><div><br /></div><div>Potete recuperare la tensione di alimentazione a 5V da uno dei piedini laterali, come nella figura seguente.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-4iIG_y5PQ68/X4MR-Vyo8EI/AAAAAAAABOs/YnjaqX2YsXIIUeo0hPaSKz7vHi4AsQdSQCLcBGAsYHQ/s800/serial.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="546" data-original-width="800" src="https://1.bp.blogspot.com/-4iIG_y5PQ68/X4MR-Vyo8EI/AAAAAAAABOs/YnjaqX2YsXIIUeo0hPaSKz7vHi4AsQdSQCLcBGAsYHQ/s320/serial.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: justify;">I cavi andranno collegati alla scheda secondo lo schema illustrato in calce.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-NfF8SfXIJ-s/X4MR-4oZ-4I/AAAAAAAABOw/Ytaeq6tVoZ8eeh3f_c9lTNVeMJ8sXyXlACLcBGAsYHQ/s800/stm8_conn.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="742" data-original-width="800" src="https://1.bp.blogspot.com/-NfF8SfXIJ-s/X4MR-4oZ-4I/AAAAAAAABOw/Ytaeq6tVoZ8eeh3f_c9lTNVeMJ8sXyXlACLcBGAsYHQ/s320/stm8_conn.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: justify;">A questo punto la connessione seriale è a posto; collegate un cavo USB, aprite un emulatore di terminale ed impostate i parametri, come da figura (io ho usato <a href="https://www.putty.org/" target="_blank">PuTTY</a>).</div><div class="separator" style="clear: both; text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: justify;"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Mu14-xel1sQ/X4MTjHUY3KI/AAAAAAAABPA/4_dPTBle6o4P_ePz9l3gNm6VANo3RypCQCLcBGAsYHQ/s453/putty_conf_01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="442" data-original-width="453" src="https://1.bp.blogspot.com/-Mu14-xel1sQ/X4MTjHUY3KI/AAAAAAAABPA/4_dPTBle6o4P_ePz9l3gNm6VANo3RypCQCLcBGAsYHQ/s320/putty_conf_01.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/--oIf8IaOq9U/X4MTjPQCB5I/AAAAAAAABO8/L93yC07LpjoC4QAe3qFJ5p78kujWCWLMQCLcBGAsYHQ/s453/putty_conf_00.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="442" data-original-width="453" src="https://1.bp.blogspot.com/--oIf8IaOq9U/X4MTjPQCB5I/AAAAAAAABO8/L93yC07LpjoC4QAe3qFJ5p78kujWCWLMQCLcBGAsYHQ/s320/putty_conf_00.png" width="320" /></a></div><br /></div>Se tutto è andato per il verso giusto, collegandovi alla scheda ed eseguendo il comando RST, dovreste vedere una schermata simile a questa.</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://lh3.googleusercontent.com/-0x87D48QqBg/X4QBEi9AdnI/AAAAAAAABQU/CHLFi5D-zx4AepZIuEkAme5dRfliHgh2ACLcBGAsYHQ/image.png" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="442" data-original-width="741" height="191" src="https://lh3.googleusercontent.com/-0x87D48QqBg/X4QBEi9AdnI/AAAAAAAABQU/CHLFi5D-zx4AepZIuEkAme5dRfliHgh2ACLcBGAsYHQ/image.png" width="320" /></a></div><br /><br /></div>Per adesso è tutto, <a href="http://mobiledevlabs.blogspot.com/2020/10/stm8-basic-il-piu-piccolo-computer-con_11.html">prossimamente </a>vedremo come programmare la scheda SMT8.<br /><div class="separator" style="clear: both; text-align: justify;"><br /></div><br /><div><br /><div><br /></div><p><br /></p></div></div></div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-74677890562098628022020-04-22T19:05:00.000+02:002020-04-24T10:06:49.124+02:00Pac-man clone per ZX SpectrumUn altro gioco per gli appassionati di retro-computing: ho provato a scrivere un pac-man utilizzando esclusivamente la grafica basata sui caratteri dello spectrum.<br />
La macchina ha un <a href="https://en.wikipedia.org/wiki/ZX_Spectrum_character_set" target="_blank">set di caratteri</a> (comprese le keyword del basic ed i caratteri di controllo) tra i quali un certo numero di caratteri definibili dall'utente, in particolare dal 144 al 164 (estremi inclusi).<br />
Come per il "Planet War Game", anche in questo caso ho usato il compilatore <a href="https://www.boriel.com/pages/the-zx-basic-compiler.html" target="_blank">ZX-Basic</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dzGyGnRdV8B_lFR71bdI1FuDns0JqGAO_VXTDaOKqHxnB8YgHogVaTPAQEEgxPV516j38g2mm_KymfmiYguyw' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<br />
<br />
Per provarlo, ecco il nastro 🖭: <a href="https://drive.google.com/open?id=1sCbuUpt3yW93C_XTw0A8VLqtDrdFRrha">cbpacman.tap</a>.<br />
<a name='more'></a>Update: il gioco è disponibile online all'URL: <a href="http://www.gldm.it/demo/cbpacman.html" target="_BLANK">http://www.gldm.it/demo/cbpacman.html</a>.gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-80703507836222615842020-03-29T11:16:00.002+02:002020-04-24T10:06:15.985+02:00Planet War Game per ZX Spectrum<h2>
Planet War Game per ZX Spectrum
</h2>
<div>
In questi giorni di lockdown ho ripreso il buon vecchio <a href="https://it.wikipedia.org/wiki/ZX_Spectrum" target="_blank">ZX Spectrum</a> e ho convertito il mio gioco <a href="http://jplanets.sourceforge.net/" target="_blank">JPlanets</a> (scritto nel 2000 come <a href="https://it.wikipedia.org/wiki/Java_applet" target="_blank">applet</a> java!!) in basic.<br />
<br />
Poichè il <a href="https://it.wikipedia.org/wiki/Sinclair_BASIC" target="_blank">basic interpretato</a> dello Spectrum non fornisce le performance necessarie, ho utilizzato il compilatore <a href="https://www.boriel.com/pages/the-zx-basic-compiler.html" target="_blank">ZX-Basic</a> per convertire il gioco.<br />
<br />
I limiti dell'hardware mi hanno obbligato ad utilizzare un solo pianeta; il calcolo della gravità newtoniana è l'operazione (in virgola mobile) più onerosa ed è sostanzialmente questo tempo che definisce la velocità di esecuzione del gioco.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-X_CR6h4tips/XoBi0FOTRHI/AAAAAAAABK8/WI8L-xl5IMgGLJhqGkHYz0Z3GzvIa9oTgCPcBGAYYCw/s1600/Play.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="481" data-original-width="642" height="239" src="https://1.bp.blogspot.com/-X_CR6h4tips/XoBi0FOTRHI/AAAAAAAABK8/WI8L-xl5IMgGLJhqGkHYz0Z3GzvIa9oTgCPcBGAYYCw/s320/Play.png" width="320" /></a></div>
<br />
Per aggiungere un po' di sfida, ho codificato un algoritmo che spara al giocatore, e lo colpisce tipicamente entro 5 o 6 turni.<br />
Quindi si può giocare anche da soli (l'originale JPlanets era un gioco esclusivamente per 2 giocatori).<br />
<br />
Per provarlo, ecco il file 🖭: <a href="https://drive.google.com/file/d/1Y8ajxGIrfWSrN_q78axdsNW4FLJ4RQ_i/view?usp=sharing">PlanetWar.tap</a>.<br />
<br />
Enjoy!<br />
<br /></div>
<div>
<a name='more'></a>Update: il gioco è disponibile online all'URL: <a href="http://www.gldm.it/demo/planetwar.html" target="_BLANK">http://www.gldm.it/demo/planetwar.html</a>.<br />
PS: ho testato il gioco su due veri Spectrum degli anni '80 😊. </div>
gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-70604136869598122232015-03-12T15:37:00.002+01:002015-03-12T15:37:11.042+01:00GLeDitor 2.5.4Ho appena rilasciato l'eseguibile ed il setup di GLeDitor 2.5.4.5.<br />
La principale novità è la funzione che permette di sostituire il terminatore di riga CR/LF (comune in DOS e Windows) con CR (MacOs fino alla v.9 + altri sistemi legacy) o LF (Unix, Linux, MacOS X).<br />
<hr />
<b>Link per GLeDitor 2.5.4</b><br />
<br />
<ul>
<li>Installer: <a href="https://sourceforge.net/projects/gleditor/files/ver.2_installer/GLeDitor_2.5.x_installer_Win32/GLeDitor_2.5.4_Setup_Win32.exe/download">download GLeDitor_2.5.4_Setup_Win32.exe</a></li>
<li>Eseguibile: <a href="https://sourceforge.net/projects/gleditor/files/ver.2_binary/GLeDitor_2.5.x_bin_Win32/GLeDitor_2.5.4_bin_Win32.zip/download">download GLeDitor_2.5.4_bin_Win32.zip</a></li>
<li>Pagina del progetto: <a href="http://gleditor.sf.net/">gleditor.sf.net</a></li>
</ul>
gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-59182042254506370502014-10-22T11:30:00.001+02:002014-11-14T17:59:12.494+01:0010 anni di GLeDitorIn occasione del rilascio della versione 2.5.3, mi sono accorto che GLeDitor ha già (almeno) 10 anni.<br />
Per festeggiare, ecco due screenshot: uno della prima versione rilasciata ed uno dell'ultima.<br />
Non così dissimili :-).<br />
<br />
<a href="http://sourceforge.net/projects/gleditor/files/latest/download?source=files" target="_blank">Link per scaricare la versione 2.5.3.</a><br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-xNCMgB06E_c/VEd3rTtXcjI/AAAAAAAAA1c/FvrmACkbaFU/s1600/Immagine_old.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="http://4.bp.blogspot.com/-xNCMgB06E_c/VEd3rTtXcjI/AAAAAAAAA1c/FvrmACkbaFU/s1600/Immagine_old.png" height="240" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">gleditor 1.0</td></tr>
</tbody></table>
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/--XYdNEvdNg8/VEd3rItcRaI/AAAAAAAAA1g/f7R0K6Js_WE/s1600/Immagine_new.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="http://3.bp.blogspot.com/--XYdNEvdNg8/VEd3rItcRaI/AAAAAAAAA1g/f7R0K6Js_WE/s1600/Immagine_new.png" height="204" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">gleditor 2.5</td></tr>
</tbody></table>
gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-5589888860140875302014-09-23T01:20:00.002+02:002014-09-23T01:20:23.680+02:00GLeDitor versione 2.5.0<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-KNfu9aEJ3fE/VCCuEFGehZI/AAAAAAAAA0s/z1WeAni9XfU/s1600/logo_BW.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://3.bp.blogspot.com/-KNfu9aEJ3fE/VCCuEFGehZI/AAAAAAAAA0s/z1WeAni9XfU/s1600/logo_BW.png" height="200" width="200" /></a></div>
E' disponibile su sourceforge.net il binario per Windows di <a href="https://sourceforge.net/projects/gleditor/files/latest/download?source=files" target="_blank">GLeDitor, versione 2.5.0</a>.<br />
Funzioni di interesse in questo rilascio:<br />
<ul>
<li>code snippet (personalizzabili)</li>
<li>tasti comment e de-comment contestuali al linguaggio scelto</li>
<li>alla selezione della sintassi xml o html compare la voce di menù Strumenti / Formatta html (o xml), che dovrebbe rendere più leggibile il codice a markup.</li>
<li>bug fixing minori</li>
</ul>
Pagina del progetto: <a href="https://sourceforge.net/projects/gleditor/">https://sourceforge.net/projects/gleditor/</a><br />
<br />
Scaricatelo :-)<br />
gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-65531369536091297502012-06-21T10:27:00.000+02:002012-06-21T10:30:13.705+02:00Bimbinfesta e FitStat International su App StoreApple ha approvato le nuove versioni delle mie App:<br />
<ul>
<li>
<a href="http://itunes.apple.com/it/app/bimbinfesta/id403977302?mt=8">Bimbinfesta</a> v.1.2</li>
<li>
<a href="http://itunes.apple.com/it/app/fitstat-international/id501187029?mt=8">FitStat International</a> v.1.1</li>
</ul>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-47119707806102908472012-06-13T19:32:00.003+02:002012-06-13T19:32:44.817+02:00Bimbinfesta UniversalHo inviato ad Apple un aggiornamento di Bimbinfesta per la revisione. Non ci sono contenuti nuovi, l'aggiornamento è unicamente dovuto al fatto che adesso l'app è <i>Universal</i>: su iPhone rimane com'era, mentre su iPad non verrà più eseguita in modalità compatibile, ma avrà il suo bel splitViewController.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-1shVYkTzTik/T9jOc-GchlI/AAAAAAAAAik/lqruTMgxLhI/s1600/Screenshot+2012.06.12+00.03.34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-1shVYkTzTik/T9jOc-GchlI/AAAAAAAAAik/lqruTMgxLhI/s320/Screenshot+2012.06.12+00.03.34.png" width="240" /></a>
<a href="http://4.bp.blogspot.com/-KRM19exOYkQ/T9jOeh_6wYI/AAAAAAAAAis/fuGMIaWifBY/s1600/Screenshot+2012.06.12+00.03.50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/-KRM19exOYkQ/T9jOeh_6wYI/AAAAAAAAAis/fuGMIaWifBY/s320/Screenshot+2012.06.12+00.03.50.png" width="320" /></a></div>
<br />gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-89585302135721810932012-06-09T03:08:00.002+02:002012-06-09T03:09:37.849+02:00Aggiornamento FitStat InternationalHo appena sottoposto alla Apple un aggiornamento per la mia app <a href="http://itunes.apple.com/it/app/fitstat-international/id501187029?mt=8" target="_blank">FitStat International</a>; tra le novità principali la suddivisione della massa magra in proteine, minerali ed acqua.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-1C_lbc_49h4/T9Khsm9Q6uI/AAAAAAAAAiE/OsUmPnA_XQo/s1600/Screenshot+2012.06.09+02.56.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-1C_lbc_49h4/T9Khsm9Q6uI/AAAAAAAAAiE/OsUmPnA_XQo/s200/Screenshot+2012.06.09+02.56.14.png" width="133" /></a><a href="http://1.bp.blogspot.com/-so2P2AUHr_Q/T9Khtkkvb7I/AAAAAAAAAiI/3FH9m7efEJA/s1600/Screenshot+2012.06.09+02.57.07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://1.bp.blogspot.com/-so2P2AUHr_Q/T9Khtkkvb7I/AAAAAAAAAiI/3FH9m7efEJA/s200/Screenshot+2012.06.09+02.57.07.png" width="133" /></a></div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-53299878979702794482012-04-23T21:54:00.003+02:002012-04-23T21:54:16.769+02:00Anteprima confezione Diet PlannerIl progetto Diet Planner è in fase avanzata di test... nell'attesa, ecco le prime immagini in anteprima della confezione.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-_V3jodLNS70/T5WyemYiawI/AAAAAAAAAhs/HnLHdYPKOLQ/s1600/dietro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-_V3jodLNS70/T5WyemYiawI/AAAAAAAAAhs/HnLHdYPKOLQ/s320/dietro.png" width="185" /></a><a href="http://3.bp.blogspot.com/-PEhKP0LpPDo/T5Wydh-yorI/AAAAAAAAAhk/j4UVP__gzmI/s1600/davanti2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-PEhKP0LpPDo/T5Wydh-yorI/AAAAAAAAAhk/j4UVP__gzmI/s320/davanti2.png" width="160" /></a></div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-28225783656831026692012-04-03T00:13:00.001+02:002012-04-03T00:13:12.028+02:00GUIzard (giochi di prestigio sullo Smartphone): In The End<a href="http://guizardgames.blogspot.com/2012/04/in-end.html?spref=bl">GUIzard (giochi di prestigio sullo Smartphone): In The End</a>: "GUIzard" è finalmente su iTunes. Alla fine Driss Chraibi aveva ragione.gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-81800274582607711312012-03-13T10:23:00.000+01:002012-03-13T10:23:08.521+01:00GUIzard gamesE' online il nuovo blog di Guido: <a href="http://guizardgames.blogspot.com">GUIzard games</a>, incentrato sui giochi di prestigio per iPhone e iPad.
Andate subito a fare una visita!gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-60193856100109504852012-03-03T00:39:00.000+01:002012-03-03T00:39:21.578+01:00Prontuario farmaceutico per iOSE' in fase di test la mia nuova applicazione per iPhone ed iPod touch; in anteprima ecco qualche screenshot:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/--Ic8TPsS9J8/T1FXRTfgCJI/AAAAAAAAAf8/cFK5S75qReU/s1600/Screenshot+2012.03.03+00.12.05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/--Ic8TPsS9J8/T1FXRTfgCJI/AAAAAAAAAf8/cFK5S75qReU/s200/Screenshot+2012.03.03+00.12.05.png" width="133" /></a><a href="http://4.bp.blogspot.com/-o5vF9hPoQtg/T1FXSoPXWNI/AAAAAAAAAgE/W3KVzp6TJoc/s1600/Screenshot+2012.03.03+00.12.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-o5vF9hPoQtg/T1FXSoPXWNI/AAAAAAAAAgE/W3KVzp6TJoc/s200/Screenshot+2012.03.03+00.12.22.png" width="133" /></a><a href="http://3.bp.blogspot.com/-nhaniaxVckI/T1FXXosTzhI/AAAAAAAAAgc/feG_dlO_IJk/s1600/Screenshot+2012.03.03+00.13.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-nhaniaxVckI/T1FXXosTzhI/AAAAAAAAAgc/feG_dlO_IJk/s200/Screenshot+2012.03.03+00.13.14.png" width="133" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-8dhbqNDb6ek/T1FXWTy2qMI/AAAAAAAAAgU/m7dZxvkCWqA/s1600/Screenshot+2012.03.03+00.12.52.png" imageanchor="1" style="clear: center; float: center; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://1.bp.blogspot.com/-8dhbqNDb6ek/T1FXWTy2qMI/AAAAAAAAAgU/m7dZxvkCWqA/s200/Screenshot+2012.03.03+00.12.52.png" width="133" /></a>
<a href="http://1.bp.blogspot.com/-TevsMe8ooPE/T1FXUYb9GiI/AAAAAAAAAgM/O_cPlZGIvgU/s1600/Screenshot+2012.03.03+00.12.38.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://1.bp.blogspot.com/-TevsMe8ooPE/T1FXUYb9GiI/AAAAAAAAAgM/O_cPlZGIvgU/s200/Screenshot+2012.03.03+00.12.38.png" width="133" /></a><a href="http://3.bp.blogspot.com/-GxXtvd2gImk/T1FXPa8LJoI/AAAAAAAAAf0/bFZUmqVXREA/s1600/Screenshot+2012.03.03+00.12.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-GxXtvd2gImk/T1FXPa8LJoI/AAAAAAAAAf0/bFZUmqVXREA/s200/Screenshot+2012.03.03+00.12.02.png" width="133" /></a></div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-57600755929258397152012-02-22T22:42:00.001+01:002012-02-22T22:42:39.842+01:00FitStat International per iOS<a href="http://2.bp.blogspot.com/-jy5fge7kZsQ/T0VhQIx0mXI/AAAAAAAAAfs/UzGsdIOldLg/s1600/FitStatEvolution@2x.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-jy5fge7kZsQ/T0VhQIx0mXI/AAAAAAAAAfs/UzGsdIOldLg/s1600/FitStatEvolution@2x.png" /></a>FitStat International è stata approvata dalla Apple, ed è sull'App Store a 0.79€ a questo indirizzo:<br />
<a href="http://itunes.apple.com/us/app/fitstat-international/id501187029?l=it&ls=1&mt=8">http://itunes.apple.com/us/app/fitstat-international/id501187029?l=it&ls=1&mt=8</a><br />
L'App è disponibile in inglese ed in italiano, in base alle impostazioni locali del vostro dispositivo.gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-91562427910719955542012-02-22T10:01:00.010+01:002012-02-22T14:27:31.027+01:00GUImble 1.0<div align="center"><a href="http://4.bp.blogspot.com/-1KfIHAt4jaU/T0SzfryfVtI/AAAAAAAAAF0/oxB_wnhYcpM/s1600/mzl.eyjaskcq.320x480-75.jpg"><img style="MARGIN: 0px 10px 10px 0px; WIDTH: 134px; FLOAT: left; HEIGHT: 200px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5711887584324441810" border="0" alt="" src="http://4.bp.blogspot.com/-1KfIHAt4jaU/T0SzfryfVtI/AAAAAAAAAF0/oxB_wnhYcpM/s200/mzl.eyjaskcq.320x480-75.jpg" /></a><br /></div><br /><div align="center">Appassionati di <span style="color:#cc0000;">Superenalotto</span><br /></div><br /><br /><div align="center">AND</div><br /><br /><div align="center">Possessori di un <span style="color:#009900;">iPhone</span><br /></div><br /><br /><div align="left">i vostri sogni saranno presto realizzati grazie alle vincite che vi farà realizzare la nuova applicazione da oggi disponibile sull'AppStore.<br /><br />Il <a href="http://itunes.apple.com/us/app/guimble/id498941693?l=it&ls=1&mt=8">GUImble</a> mette a disposizione 6 numeri da giocare al Superenalotto più il numero SuperStar.<br /><a href="http://1.bp.blogspot.com/-3FBwK9L7oXA/T0S2OtLEIYI/AAAAAAAAAGY/C7ps2kkPpN4/s1600/mzl.msuxnide.320x480-75.jpg"><img style="WIDTH: 134px; FLOAT: right; HEIGHT: 200px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5711890591173058946" border="0" alt="" src="http://1.bp.blogspot.com/-3FBwK9L7oXA/T0S2OtLEIYI/AAAAAAAAAGY/C7ps2kkPpN4/s200/mzl.msuxnide.320x480-75.jpg" /></a></div><br /><br /><div align="center">La vincita non è chiaramente assicurata,<br />però evita agli amici dei giocatori accaniti di dover<br />subìre l'annosa quanto FASTIDIOSA esclamazione:<br /><br />"WHEI GIACU DIMMI 6 NUMERI VA!".</div><br /><br /><div align="left">CIICK & CIAACK GUImble-->PUSH-->ET VOILA'.<br /><br />E se vinci ci vediamo al RISTORANTE!!!!!!!!</div>Uncledrivehttp://www.blogger.com/profile/04455739433166146306noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-74725542808108823292012-02-16T20:58:00.001+01:002012-02-16T20:58:19.399+01:00Blumy 1.2.1Apple ha appena approvato l'aggiornamento <a href="http://itunes.apple.com/it/app/blumy/id400531334?mt=8">Blumy 1.2.1</a> per iPhone, con la ricerca dei fiorai sulla mappa intorno alla tua posizione.gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-80038286157902053342012-02-16T00:59:00.001+01:002012-02-16T00:59:59.346+01:00FitStat International inviato all'App Store<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-udB40A1g1p0/TzxF5C5EQYI/AAAAAAAAAfg/TGnGYAnwN8o/s1600/iTunesArtwork.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-udB40A1g1p0/TzxF5C5EQYI/AAAAAAAAAfg/TGnGYAnwN8o/s200/iTunesArtwork.png" width="200" /></a></div>
Ho appena sottoposto ad Apple la mia nuova App FitStat International - che è la riscrittura di FitStat facendo uso di storyboard e localizzazione (inglese ed italiano).
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-fQnxJC5P9eU/TzxFw2oC0qI/AAAAAAAAAfY/e-hH2u6hoGA/s1600/005.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-fQnxJC5P9eU/TzxFw2oC0qI/AAAAAAAAAfY/e-hH2u6hoGA/s200/005.png" width="132" /></a>
<a href="http://4.bp.blogspot.com/-siIzO54c_6U/TzxFs0RxH7I/AAAAAAAAAfI/l-DwZLXzO8g/s1600/002.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-siIzO54c_6U/TzxFs0RxH7I/AAAAAAAAAfI/l-DwZLXzO8g/s200/002.png" width="132" /></a>
<a href="http://2.bp.blogspot.com/-GdutS_DukJE/TzxFt8Q4CzI/AAAAAAAAAfQ/ydWImXYFpM0/s1600/004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://2.bp.blogspot.com/-GdutS_DukJE/TzxFt8Q4CzI/AAAAAAAAAfQ/ydWImXYFpM0/s200/004.png" width="132" /></a> </div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-7462851139488332432012-02-15T01:21:00.001+01:002012-02-15T01:22:22.167+01:00FitStat iPhone v. 1.1.0<div class="separator" style="clear: both; text-align: center;">
<a href="http://a5.mzstatic.com/us/r1000/086/Purple/08/fb/2f/mzl.sqrvciag.320x480-75.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://a5.mzstatic.com/us/r1000/086/Purple/08/fb/2f/mzl.sqrvciag.320x480-75.jpg" width="213" /></a></div>
Apple ha appena approvato l'aggiornamento di FitStat per iPhone ed iPod touch.<br />
Le novità in questo rilascio:<br />
<span class="Apple-style-span" style="color: #898989; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;">1) ora c'è la possibilità di inserire numeri decimali</span><span class="Apple-style-span" style="color: #898989; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"><br /></span><span class="Apple-style-span" style="color: #898989; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;">2) sono state sostituite le immagini sui punti di repere delle pliche</span><br />
<span class="Apple-style-span" style="color: #898989; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;">3) da oggi FitStat è gratis in via definitiva</span><br />
<br />
<a href="http://itunes.apple.com/it/app/fitstat/id404889944?mt=8">http://itunes.apple.com/it/app/fitstat/id404889944?mt=8</a>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-76165704056514260892012-02-13T14:58:00.000+01:002012-02-13T14:58:03.495+01:00...sta per arrivareDiet Planner è quasi pronto per la fase di test.
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-rkV3kgG524g/TzkWsqw_OuI/AAAAAAAAAfA/t4WqnJ2GLL4/s1600/DietPlan.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-rkV3kgG524g/TzkWsqw_OuI/AAAAAAAAAfA/t4WqnJ2GLL4/s200/DietPlan.png" width="200" /></a></div>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-18920544715494724502012-02-11T22:46:00.001+01:002012-02-12T19:17:58.723+01:00Rilascio aggiornamento 5permilleÈ appena stato rilasciato un aggiornamento all'app 5permille per iOs.<br />
<a href="http://itunes.apple.com/it/app/5permille/id498857160?mt=8">http://itunes.apple.com/it/app/5permille/id498857160?mt=8</a>gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-49777451150021659832012-02-07T10:32:00.001+01:002012-02-07T10:57:10.831+01:00Bimbinfesta v. 1.1.1È disponibile in App Store l'aggiornamento per <a href="http://itunes.apple.com/it/app/bimbinfesta/id403977302?mt=8">Bimbinfesta</a>.gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0tag:blogger.com,1999:blog-8620680376597540914.post-82096319146351478892012-02-04T23:01:00.005+01:002012-02-13T14:58:32.247+01:00Aggiornamento 5permilleHo inviato ad Apple l'aggiornamento di <a href="http://itunes.apple.com/it/app/5permille/id498857160?mt=8" target="_blank">5permille</a>, con i seguenti miglioramenti:<br />
1) irrobustita la parte di interrogazione del database remoto<br />
2) introdotte 4 icone per rappresentare le tipologie di enti: A, B, C, E<br />
3) migliorata la grafica della tableview<br />
4) introdotta la possibilità di inviare per posta elettronica i dettagli dell'ente selezionato<br />
5) introdotta la geolocalizzazione dell'ente (basata sull'indirizzo)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-3MoJRjZsNoY/Ty2pTiEoBSI/AAAAAAAAAeg/O8TjMggcD9E/s1600/Screenshot+2012.02.02+00.22.38.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-3MoJRjZsNoY/Ty2pTiEoBSI/AAAAAAAAAeg/O8TjMggcD9E/s320/Screenshot+2012.02.02+00.22.38.png" width="211" /></a><a href="http://3.bp.blogspot.com/-7P08_ZABaD4/Ty2pUdWZTSI/AAAAAAAAAeo/rZELewgzstk/s1600/Screenshot+2012.02.02+00.25.41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-7P08_ZABaD4/Ty2pUdWZTSI/AAAAAAAAAeo/rZELewgzstk/s320/Screenshot+2012.02.02+00.25.41.png" width="212" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-kbB7GBwB3sQ/Ty2pVElXSGI/AAAAAAAAAew/RAR0rfbQy3w/s1600/Screenshot+2012.02.04+22.20.03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-kbB7GBwB3sQ/Ty2pVElXSGI/AAAAAAAAAew/RAR0rfbQy3w/s320/Screenshot+2012.02.04+22.20.03.png" width="212" /></a><a href="http://3.bp.blogspot.com/-eoCdDlEDEFc/Ty2pWgw6NXI/AAAAAAAAAe4/Ba2_wy09jEk/s1600/Screenshot+2012.02.04+22.20.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-eoCdDlEDEFc/Ty2pWgw6NXI/AAAAAAAAAe4/Ba2_wy09jEk/s320/Screenshot+2012.02.04+22.20.22.png" width="212" /></a></div>
<br />gldmhttp://www.blogger.com/profile/02125229608958016804noreply@blogger.com0