Cerca articoli...
Mini gallery
  • Eventi/brusaporto 2013
  • Eventi/brusaporto 2010
  • Eventi/brusaporto 2014
  • Eventi/fvb2011
  • Eventi/fvb2013
  • Eventi/viretro2014
  • Eventi/fvb2010
  • Eventi/brusaporto 2013
  • Hardware/ti994
  • Eventi/brusaporto 2013
Articoli piu' letti
Storico articoli
Mailing list
Nome
Email
Iscrizione
Cancellazione
YouTube Channel
Facebook
Usare gli SPRITE in TI-BASIC

USARE GLI SPRITE IN TI-BASIC

 Mercoledì, 17 Febbraio, 2021 00:00

   

Era il 1984, il TI-99/4A era bollente e già acceso da svariate ore. Proprio quando mi decisi a spegnerlo mi arriva sotto gli occhi la rivista di MC Microcomputer n.34 sul tavolo e accompagnata dalla frase - 'E' uscito oggi, l'ho preso così ti trascrivi un altro listato' - Io non avevo altro che la configurazione base con il registratore, no espansioni e no Extended Basic, solo TI-BASIC puro. Aprivo sempre le pagine della rivista speranzoso di poter trovare un nuovo listato di qualche gioco da aggiungere alla mia collection. Il gioco c'era ed io ero già felicissimo così, però ancora più fascinoso, era l'articolo... USARE LE SPRITE IN TI-BASIC!

 

gli Sprite? ma io avevo sempre saputo che gli sprites non si potessero utilizzare con il TI-BASIC del TI99, ci voleva l'Extended Basic per forza! Caspita, eppure il titolo dell'articolo era chiaro! ...

Esiste una storia celata dietro questo argomento che si è aggiornata fino ai giorni più recenti.
Tutto ebbe inizio nel 1984, grazie alla tecnica messa a punto da due fratelli che poi divennero molto famosi tra i possessori del TI-99/4A, Corrado e Riccardo Tesio (...vi dice nulla Morphy?)

Nei manuali del TI-99/4A veniva sempre spiegato che per usare gli sprite nei giochi ci si doveva procurare almeno il modulo dell'Extended Basic o quello Mini-Memory che fornivano istruzioni aggiuntive per permettere la gestione degli sprite nei giochi.

Corrado e Riccardo riuscirono invece, contro ogni aspettativa, a trovare il modo di ingannare l'interprete BASIC del computer e permettere di liberare gli sprite sul TI-99/4A in configurazione base, senza alcuna espansione e solo con il registratore a cassette.

Certo, con questo loro trick, gli sprite ottenuti non posseggono le stesse caratteristiche di quelli ottenuti ad esempio con l'utilizzo del modulo Extended Basic (il quale mette a disposizione dell'utente svariate istruzioni mirate proprio alla gestione degli sprite) ma comunque, in termini di TI-BASIC, gli sprite ottenuti con questo metodo permettono di fornire alcune singolari possibilità:

  • Non vengono influenzati da altri caratteri, come se fossero proprio su un altro piano/livello di schermo.
  • Possono essere posizionati in qualsiasi pixel della mappa 192x256 e possono essere spostati anche pixel per pixel evitando effetti di sfarfallio.
  • Si possono, quindi, sovrapporre caratteri in movimento ad uno sfondo senza che questo venga alterato dal movimento del carattere.

A livello procedurale (senza entrare troppo nel dettaglio tecnico) per abilitare la possibilità degli sprite in TI Basic, bisogna modificare la mappa di definizione caratteri (Sprite Attribute List) nella memoria del TI-99, sovrapponendola a quella dei caratteri definibili dall'utente, si agisce quindi in questo modo sui registri VDP.

Purtroppo, nativamente, il TI-BASIC non fornisce alcuna istruzione diretta per fare questa cosa, e il trick scoperto permetteva di farlo tramite la tecnica di caricamento dei programmi da cassetta. Infatti tutti i programmi che solitamente vengono caricati in memoria tramite il registratore sono sempre preceduti da un lungo 'fischio' (header). Questo contiene alcune informazioni sulle dimensioni del programma che verrà caricato. E' proprio manipolando queste informazioni che i fratelli Tesio sono riusciti nel loro intento.

Svilupparono un piccolo programmino che era in grado di farci generare un falso header:

  10 REM *                  *
  20 REM * GENERATORE FILES *
  30 REM *                  *
  40 REM * PER MODIFICARE I *
  5O REM *                  *
  60 REM * REGISTRI DEL VDP *
  70 REM *                  *
  80 REM * <C> BY TESIOWARE *
  90 REM *                  *
 100 CALL CLEAR
 110 INPUT "REGISTRO(0-7),DATO(0-255)?  ":R,D
 120 A=18429-(256*R+D)
 130 X$=CHR$(0)
 140 OPEN #1:"CS1",OUTPUT,FIXED
 150 PRINT #1:X$&X$&X$&X$&X$&X$&CHR$(INT(A/256))&CHR$(A)

Questo ci permette di poter generare il falso programma che sarà utilizzato poi per modificare i registri VDP.
Grazie all'INPUT richiesto nella linea 110 si potrebbe scegliere di scrivere in ognuno degli 8 registri ma, in realtà, solo il 5 sarà davvero utilizzabile e, per spostare la mappa in corrispondenza dei caratteri compresi tra 145 e 159, il dato sarà 15 (ad esempio inserendo 14 si otterrebbe lo spostamento tra i caratteri 128 e 143), per quello che ci servirà quindi il valore da inserire alla richiesta sarà 5,15 e alla pressione del tasto ENTER, verrà data la possibilità di poter salvare il programma header 'falso' su cassetta tramite il registratore.

Riepilogando, i passi da fare per poter 'liberare' gli sprite in TI-BASIC saranno i seguenti:

  • Registrare il finto programma ottenuto mediante il generatore di record su una cassetta vuota;
  • Resettare la memoria Ram e puntatori premendo QUIT (FCTN + '=');
  • Ricaricare da cassetta il finto programma salvato al punto 1;
  • Una volta finito di caricare, in automatico, dopo alcuni istanti, lo schermo diventerà nero a righe, a quel punto si dovrà premere una lettera qualsiasi e quindi ENTER; una volta fatto dovrebbe tornare il cursore del TI-BASIC ma accompagnato da un messaggio di errore MEMORY FULL;
  • quindi digitare NEW ed ENTER per tornare allo standard TI-BASIC.

(Vedi video che mostra la procedura sopra descritta)

Da questo momento, anche se apparentemente sembra tutto normale, in realtà avremo la mappa caratteri spostata in corrispondenza ai caratteri 144...159 e da ora Sono usabili fino a 32 sprite (2 per ogni carattere).

Per richiamarli sarà possibile in questo modo:

 
  CALL CHAR(144,"Y1X1F1C1Y2X2F2C2")
  CALL CHAR(145,"Y3X3F3C3Y4X4F4C4")
 ecc...

dove: Y è la riga (0-191), X è la colonna (0-255), F è la forma (codice ASCII+96), C è il colore (codice BASIC meno 1). Tutti i valori vanno espressi in esadecimale.

Esempi:

   CALL CHAR(144,"D")
 cancella tutti gli sprite dallo schermo;

        CALL CHAR(145,"6080A10FD")
 posiziona una A bianca in mezzo allo schermo;

a questo punto, scrivendo qualcosa e premendo ripetutamente il tasto ENTER si potrà notare come le scritte scorreranno verso l'alto mentre lo sprite rimarrà fermo, proprio come se stessimo lavorando su un piano differente rispetto il primo piano.


Tramite altre routines di programmazione si potrebbe fare in modo di far muovere o guidare gli sprite sullo schermo. Immaginate quanto i giochi in TI-BASIC sarebbero potuti cambiare se fosse stata usata questa tecnica?

Comunque, in caso si voglia approfondire questa tecnica ideata dai fratelli Tesioware, vi consiglio di andare a sfogliare i numeri 34 e 35 della rivista MC Microcomputer dove ci sono gli articoli originali dedicati:


Come avevo scritto all'inizio di questo articolo questa particolare scoperta fatta da Riccardo e Corrado ha avuto un seguito fino ad arrivare ai giorni attuali.

Ora che la community del TI-99/4A è forte a livello mondiale e la comunicazione (anche grazie ad Internet) è pressoché illimitata, l'uso degli sprite in TI BASIC ha incuriosito alcuni sviluppatori nel forum TI-99/4A su AtariAge.

Inutile dire che ne sono venute fuori delle cose fantascientifiche

Uno degli sviluppatori TOP che ancora è attivo oggi sul TI-99/4A, Harry Wilhelm (Senior_Falcon su AtariAge, suo anche il fantastico compilatore BASIC), dopo aver letto un post in cui avevo cercato di spiegare questa tecnica a molti ancora sconosciuta, sorpreso ed incuriosito, ha iniziato a studiarsela riuscendo a tirarne fuori una versione ancor più ottimizzata!

Accade così che dopo oltre 30 anni, la tecnica degli sprite in TI-BASIC ha un update!

Harry Wilhelm, dopo aver studiato la tecnica usata dai fratelli Tesioware, era riuscito già a creare un codice funzionante e alternativo per settare il registro in TI Basic ed attivare la funzionalità degli Sprite:

5 REM SETREG5
10 FOR I=1 TO 128
20 READ X
30 F$=F$&CHR$(X)
40 NEXT I
50 OPEN #1:F$
100 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,248
110 DATA 55,215,158,200,0,255,0,0,0,0,0,159,34,0,0,0,33,111,0,0,0,0,0,0
120 DATA 32,0,33,224,42,93,3,179,216,32,131,186, 131,212,215,224,131,189,215,224,131,188
130 DATA 215,224,131,191,215,224,131,190,4,224,131,196,216, 32,131,187,140,0,4,91,0,0,0,0,0,0,0,0
140 DATA 227,208,133,15,71,128,53,103,0,0,131,144,0,0,33,111
145 REM  224=magnify(1),227=magnify(4)

Nell'esempio riportato sopra, il programma imposta il registro VDP 5 in modo che i caratteri 144-159 definiscano gli sprite. Il primo numero nella riga 140 può definire il valore per l'impostazione di diversi ingrandimenti. 224=magnify(1); 225=magnify(2) 226=magnify(3); 227=magnify(4).
In questo caso, è stato impostato l'ingrandimento(2).

Già con questo nuovo metodo, non sarà più necessario caricare il 'falso header' da cassetta, come avveniva nel vecchio metodo Tesioware. Tra l'altro, questo codice lascia l'utilizzo dei floppy drive. Per avere maggiore memoria disponibile e lasciare quindi solo la cassetta (ad esempio per caricare il gioco Morphy) potremo modificare queste 2 linee di codice:

110 DATA 63,255,158,200,0,255,0,0,0,0,0,159,34,0,0,0,33,111,0,0,0,0,0,0
140 DATA 224,208,133,15,71,128,53,103,0,0,131,144,0,0,33,111

Il programma che segue, mette in pratica l'utilizzo degli sprite. Questi sono definiti con le dichiarazioni CALL CHAR a partire dal 144. Per esempio con l'istruzione: 10 CALL CHAR(144, "0000A1010020A202"), si creeranno 2 sprite; il primo alla riga 0 e alla colonna 0 usando il carattere A1 che è una "A" >41+>60 (offset di base)=>A1 e il colore >01 che equivale al nero. Il secondo sprite è alla riga 0 colonna 20 usando una "B" e il colore impostato su verde medio.

1 CALL SCREEN(16)
2 CALL CLEAR
10 CALL CHAR(144,"0000A1010020A202")
11 CALL CHAR(145,"0040A3030060A404")
12 CALL CHAR(146,"2000A5052020A606")
13 CALL CHAR(147,"2040A7072060A808")
14 CALL CHAR(148,"4000A9094020AA0A")
15 CALL CHAR(149,"4040AB0B4060AC0C")
16 CALL CHAR(150,"6000AD0D6020AE0E")
17 CALL CHAR(151,"6040AF016060B002")
18 CALL CHAR(152,"8000B1038020B204")
19 CALL CHAR(153,"8040B3058060B406")
20 CALL CHAR(154,"A000B507A020B608")
21 CALL CHAR(155,"A040B709A060B80A")
22 CALL CHAR(156,"D0")
100 X=X+1
110 PRINT TAB(16);SQR(X)
120 GOTO 100
32 Sprite + Testo
Video dimostrativo


Una volta interrotta la dimostrazione (CTRL+4 sul TI99 reale oppure ALT+4 in emulazione su PC Windows), per pulire lo schermo dagli sprite, usate il già visto CALL CHAR(144, "D0").

L'utente 'notwhoyouthink' su Atariage, preso dall'entusiasmo di provare questa 'nuova' metodica di programmazione sul TI99, ha sviluppato qualche demo che voglio mostrarvi qui di seguito. E' incredibile che tipo di potenzialità avremmo potuto avere in TI-BASIC puro con il TI-99 utilizzando questa tecnica:

 Parsec Sprite Demo

ParsecStart  -  ParsecProg

Mario Sprite Demo

MarioStart  -  MarioProg
Walk Sprite Demo

WalkStart  -  WalkProg

Non è già incredibile così?

Harry Wilhelm, però non si è fermato e, dopo alcune altre ore di studio, è riuscito ad integrare i due step di caricamento in uno unico. Le linee di programma che abilitano gli sprites e il programma che li userà, si troveranno quindi in un unico codice! Non ci sarà più bisogno di caricare ed eseguire la prima parte che imposta gli sprites e poi caricare ed eseguire il secondo programma per usare gli sprites.

L'unica regola sarà quella di dover definire il carattere 159 prima di attivare gli sprites.

Qui di seguito, potrete visionare quattro ulteriori demo sviluppate da Harry Wilhelm che mostrano alcuni esempi di utilizzo degli sprites in TI BASIC in un unico codice. Potrete anche provarli voi stessi su emulatore o macchina reale oppure semplicemente gustarvi i video cliccando sull'immagine corrispondente.

In questo esempio, viene mostrato come possono coesistere contemporaneamente quattro sprites in movimento automatico ,15 set di caratteri e 15 colori!  

4 Sprite Demo AIO
Download
Sorgenti e Descrizione completa (Eng)

Partendo poi dal metodo dei 32 sprites fissi visto precedentemente, Harry è riuscito ad ottenere in un primo momento una demo di 3 sprite in movimento automatico (che funzionava, tra l'altro, con il metodo dei 2 passaggi di caricamento) per poi arrivare, dopo un bel po di studio e tentativi, ad un altro upgrade di questa strabiliante tecnica con l'integrazione dei due passaggi in uno solo e fino a 4 sprites in movimento!
il tutto usando il semplice TI BASIC standard!

All'interno del download troverete i sorgenti e la descrizione su come ci è riuscito.

 -X-X-X-X-X-X-X-X-X-

Qui è stata modificata la demo con Mario di 'Notwhoyouthink' ma integrato in un unico programma.
 

Mario Demo AIO
Download
Sorgenti e Descrizione completa (Eng)

  -X-X-X-X-X-X-X-X-X-

Sempre riprendendo la demo Walk di "Notwhoyouthink", questa ora si presenta interattiva implementato anche il salto alla pressione di un qualsiasi tasto durante la camminata.

 

Walk Demo AIO
Download
Sorgenti e Descrizione completa (Eng)

Harry, non contento del solo movimento automatico degli sprite senza possibilità di interazione, non trovandolo molto utile, ha fatto altre prove ed usando la Demo Walk dell'omino in marcia sviluppata da 'Notwhoyouthink' ha impostato il movimento aggiornando manualmente la tabella degli sprite (CALL COLOR(1...) e CALL COLOR(2,...)). La subroutine che aggiorna la colonna cerca la pressione di un tasto e se la trova fa saltare l'omino in avanti. Con questo esempio il movimento degli sprite già diventa più utile nonostante non sia presente la possibilità di usare CALL LOCATE dell'XB.

  -X-X-X-X-X-X-X-X-X-

Come ultima dimostrazione abbiamo addirittura un minigioco usando gli Sprite! Il tutto si muove in modo fluido che davvero tutto sembra tranne puro TI-BASIC!  sbalorditivo...

 

Missile DEMO AIO
Download
Sorgenti e Descrizione completa (Eng)

Una semplice demo giocabile che usa sprites in movimento, premendo qualsiasi tasto si lancia un missile e si può colpire l'UFO che passa. Non c'è l'istruzione CALL COINC in TI-BASIC, quindi come si fa a determinare se il missile colpisce l'UFO?

Il missile parte sempre dalla stessa posizione e si lancia con la stessa velocità. Poi, contando il numero di cicli prima che il tasto venga premuto, si può determinare al momento del lancio se l'UFO sarà intercettato. Se l'UFO non viene colpito allora si lascia che il missile finisca fuori dallo schermo, al contrario se viene colpito i due sprite si bloccano, vengono cancellati e viene mostrata l'esplosione. Mostrare il missile in movimento serve in realtà solo ad  avere un riscontro visivo sullo schermo.
Tutto questo viene calcolato usando TI99 a 60hz. Su TI99 a 50hz si perdono le coincidenze.

Non è certo un gioco innovativo, ma mostra alcune delle possibilità che questa tecnica può fornire, magari anche per un possibile gioco di bowling ad esempio.

  -X-X-X-X-X-X-X-X-X-

E così concludiamo quest'avventura aggiornata nel mondo degli sprite in TI BASIC :)
Spero di essere riuscito ad illustrarvi tutto in modo esaustivo e semplificato.
Questo è cosa potevamo avere su un TI-99/4A in configurazione base rispetto a quello che invece ci avevano raccontato alla TI.
I fratelli Tesio con i loro articoli e il loro gioco più famoso Morphy, avevano tentato di aprirci un mondo e far diffondere questa tecnica già nel 1984 ma, purtroppo, solo oggi con internet e le geniali menti nei vari gruppi internazionali si è riusciti davvero a completare, spolpare ed affinare questo trucco anche grazie alla preparazione immensa e all'impegno di Harry Wilhelm.

 


Vuoi commentare l'articolo?
 Nome
 Email
Il tuo commento
Verifica

I vostri commenti ...

1

Donazione

Per sostenere il nostro Club puoi effettuare una donazione.

... e riceverai un nostro Gadget inviandoci il tuo indirizzo!

Google translate
Materiale TI99?

Vuoi aiutarmi preservare la storia del TI-99 ?

Se possiedi Materiale Italiano e non che riguarda il TI-99 e che vorresti condividere nella nostra Community... contattami e potermo inserirlo nel nostro Database Globale

Hot Links

TI-99 RELEATED

RETROCOMPUTING altro...

Copyright © 2013-2020 by TI99 I.U.C. - Tutti i diritti riservati - All rights reserved - Loghi e marchi sono di proprieta' dei rispettivi proprietari.
E' vietata la riproduzione integrale o parziale di contenuti o documenti previa autorizzazione.
Copyright   |    Privacy