π
<-
Chat plein-écran
[^]

Sprite10x10 pour Basic [TI83PCE]

Assembleur, Axe, C/C++, ICE...

Sprite10x10 pour Basic [TI83PCE]

Message non lude grosged » 01 Mai 2016, 18:29

Hé bien , je vous expose un mini-projet qui me trottait dans la tête depuis un bon moment:
pouvoir afficher des sprites depuis le Basic, et (pourquoi pas?) pouvoir les définir depuis le Basic!
Je vous avoue que j'ai dû faire pas mal de concessions!
N'ayant qu'1 KiloOctets de disponible pour y loger les Datas (en $e30800 : cursor image Ram),
et opérant en mode graphique 16bpp (étant donné qu'on reste en Basic, on n'a pas trop le choix) je me suis alors restreint au format 10 pixels sur 10, afin de pouvoir stocker jusqu'à 5 sprites.
J'ai eu l'idée d'ajouter un 6ème sprite (non modifiable) , le sprite d'effaçage n° 0.
J'ai aussi inclu la possibilité d'effacer entièrement l'écran (en noir).
à noter que par souci de commodité, j'ai décidé d'opter pour une palette de 16 couleurs.
Ainsi, il nous est facile de définir , dans nos programmes Basic, pixel-par-pixel, chacuns des 5 sprites (en utilisant la notation hexadécimale: 0123456789ABCDEF)

Voici, par exemple, comment définir le sprite n°1:

Image
Sans oublier ces 2 dernières lignes (lesquelles étaient hors-écran) :
Code: Tout sélectionner
:Ans+"FFFFFFFFFF
:Asm(prgmSPRITE

Voilà, c'est tout ! :D
Vous remarquerez qu'en entête, les 3 caractères suivant le n° de sprite peuvent être des espaces, ou 3 virgules, ou ce que vous voulez : ils ne sont là que pour pouvoir ajuster la 1ère ligne aux suivantes ;)

Maintenant , vous voulez l'afficher ? Rien de plus simple :
Code: Tout sélectionner
{n°de sprite , coord.X , Coord.Y ...suivi , bien entendu, d' Asm(prgmSPRITE

(Merci à Mateo & PT pour l'astuce du Ans stocké sous forme de liste ;) )
N° de sprite de 0 à 5 (le sprite n° 0 , non redéfinissable, permet d'effacer)
Coord.X de 0 à 309
Coord.Y de 0 à 229

On veut, par exemple, afficher le sprite n°1 en coordonnées 99,99 :
Code: Tout sélectionner
{1,99,99:Asm(prgmSPRITE

Ce qui nous donne...
Image


On souhaite obtenir un écran noir (effaçage rapide) , il nous suffit d'un double guillement:
Code: Tout sélectionner
"":Asm(prgmSPRITE


Voilà pour le moment! Un peu plus tard, je vous parlerai aussi des 16 couleurs de la palette.
(elles sont pour l'instant fixes, mais , pourquoi pas , à l'avenir, prévoir une fonction de définition? ;) )

N'hésitez pas à faire des suggestions, commentaires, rapports d'éventuel bug.. ;)

Ah , j'oubliais ! La routine est téléchargeable ici : archives_voir.php?id=510643
Pour les curieux, voici le code source:
Code: Tout sélectionner
.nolist
#include "ti84pce.inc"
.list
.org userMem-2
.db tExtTok,tAsm84CeCmp
.assume ADL=1

SPRITE: call    _RclAns
        dec     a
        jr      z,AffSpr
DefSpr: call    _RclVarSym
        ld      a,(de)
        or      a,a
        jr      z,ClrScr
        inc     de
        inc     de
        ld      a,(de)
        sub     a,49
        ret     c
        cp      a,5
        ret     nc
        ld      b,200
        ld      c,a
        mlt     bc
        ld      hl,$e30800
        add     hl,bc
        inc     de
        inc     de
        inc     de
        ld      bc,$6430
        ld      ix,DatCol
CodHex: inc     de
        ld      a,(de)
        sub     a,c
        cp      a,17
        jr      c,bon
        sub    a,7
bon:    add     a,a
        ld      (OffsC+2),a
        inc     a
        ld      (OffsD+2),a
OffsC:  ld      a,(ix+0)
        ld      (hl),a
        inc     hl
OffsD:  ld      a,(ix+0)
        ld      (hl),a
        inc     hl       
        djnz    CodHex
        ret
ClrScr: ld      hl,$e40000
        ld      de,$d40000
        ld      bc,153600
        ldir
        ret
AffSpr: push    de
        push    de
        ld      hl,3
        call    _GetLToOP1
        call    _ConvOP1
        ld      d,160
        mlt     de
        ld      hl,$350000
        add     hl,de
        add     hl,hl
        add     hl,hl
        pop     de
        push    hl
        ld      hl,2
        call    _GetLToOP1
        call    _ConvOP1
        pop     hl
        add     hl,de
        add     hl,de           ; now, HL=addr on screen
        pop     de
        push    hl
        sbc     hl,hl
        inc     l
        call    _GetLToOP1
        call    _ConvOP1
        jr      z,Spr0ef
        ld      d,200
        mlt     de
        ld      hl,$e30800-200
        add     hl,de
Spr0bk: pop     de              ; =addr on screen
        ld      bc,20
        ld      a,c
        ld      (SvOlSp+1),sp
        di
        ld      sp,620
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
        ex      de,hl
        add     hl,sp
        ex      de,hl
        ld      c,a
        ldir
SvOlSp: ld      sp,0
        ret
Spr0ef: ld      hl,$e40000
        jr      Spr0bk
DatCol: .db $00,$00,$10,$10,$18,$18,$04,$04,$4b,$4b,$07,$07,$7f,$7f,$60,$60
        .db $70,$70,$84,$84,$b5,$b5,$f7,$f7,$e0,$e0,$f8,$f8,$e7,$e7,$ff,$ff
Dernière édition par grosged le 01 Mai 2016, 19:29, édité 2 fois.
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 30.2%
 
Messages: 770
Images: 75
Inscription: 14 Sep 2011, 12:29
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude Clément.7 » 01 Mai 2016, 18:56

Impressionnant ! Par contre la question qui me titille est : Est-ce que les performances tiennent le coup ?
Toujours plus loin, toujours plus haut, toujours plus geek !
Créateur du projet Haskier : Jouer ! Sujet sur OpenClassrooms
Programmez en UnderBasic ! https://tiplanet.org/forum/viewtopic.php?t=19009&p=207260
Avatar de l’utilisateur
Clément.7
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Prochain niv.: 29.5%
 
Messages: 348
Inscription: 12 Juin 2013, 15:02
Localisation: Près de Nantes
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: IUT Informatique en 2017-2019
GitHub: ClementNerma

En ligne

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude Epharius » 01 Mai 2016, 19:37

Enfin, il l'a fait !

J'ai téléchargé le programme et ça rend bien ! Seul problème : le sprite est malheureusement un peu petit pour être vraiment utilisable. On a des pixels assez fins. Alors que sur monochrome 10 pixels est énorme, ici on ne peut pas en faire grand chose.

J'ai fait un programme qui déplace le sprite 10 par 10 (sinon, c'est un peu lent, mais c'est la faute au basic), cependant, j'ai trouvé dommage que l'"effaçage" soit en noir, et non en blanc. Disons que la plupart des jeux ne seront pas pas en noir à mon avis, il vaut mieux soit mettre en blanc, soit proposer à l'utilisateur grâce à 0=noir et 1=blanc (pas forcement ces nombres là, mais c'est l'idée).

Bon, j'ai exposé les défauts mais en dehors de ça, c'est super bien ;)
Ensuite, permettre à l'utilisateur de définir sa palette au début, serait en effet très utile et permettrait plus de liberté. Et quant à la peur de "DCE le fera" (si j'ai bien compris) : de deux choses l'une :
- je n'ai pas vraiment envie d'installer un programme aussi lourd juste pour jouer avec les sprites en basic x)
- ça oblige les utilisateurs à installer eux aussi DCE, là il leur suffit de télécharger juste prgmSPRITE

Bref, bon courage pour la suite =D
Le projet Geometry Dash est terminé ! N'hésitez pas à aller jeter un coup d’œil au topic du projet ! Vous pouvez le télécharger ici.

Unis par la flèche sacrée de cupidon :favorite:
Image
Avatar de l’utilisateur
EphariusPremium
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 7.1%
 
Messages: 1110
Images: 4
Inscription: 08 Déc 2014, 17:38
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
Classe: Ensimag
GitHub: MathisLav

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude grosged » 01 Mai 2016, 19:52

ça me paraît correct...pour du Basic :)
On pourraît peut-être encore améliorer le temps d'exécution:
-au niveau de l'asm, implanter la routine d'affichage directement en zone "cursor image ram"
histoire de booster son exécution (mais alors, on sacrifierai un sprite , puisqu' actuellement n'y restent que 20 octets de libre)
-au niveau du Basic, simplifier encore la transmission des paramètres : 1 seul valeur dans Ans , regroupant à la fois n°de sprite+X+Y (au lieu de la liste dans Ans, plus lourde à gérer) simplifierait/accélèrerai la routine ASM.

EDIT:
Merci pour tes encouragements & suggestions, Epharius !
re-EDIT: trouver un moyen sûr et permanent d'allouer de la ram (afin de passer en 12x12...16x16)
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 30.2%
 
Messages: 770
Images: 75
Inscription: 14 Sep 2011, 12:29
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude Wistaro » 01 Mai 2016, 21:36

Excellent ! Les 5 sprites sont modifiables? J'ai pas trop compris cette partie..
Nouveau sur le site, Anonymous ? Avant de poster sur le chat et sur le forum, n'oublie pas de lire les règles. En cas de problème, tu peux m'envoyer un message, je réponds rapidement.

Liens utiles:
Image
Découvre mes programmes et mon site!
Avatar de l’utilisateur
WistaroSuper Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 88%
 
Messages: 3158
Images: 37
Inscription: 25 Fév 2013, 16:21
Localisation: Toulouse
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: Ingénieur en électronique
YouTube: Wistaro
Twitter/X: Wistaro
GitHub: Wistaro

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude grosged » 02 Mai 2016, 17:24

oui, oui :)
Une version améliorée de la routine est en cours...
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 30.2%
 
Messages: 770
Images: 75
Inscription: 14 Sep 2011, 12:29
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude Ti64CLi++ » 02 Mai 2016, 18:19

Super.
Cela serait nettement mieux si tu pouvais définir les couleurs, et la couleur d’effaçage comme l'a précisé Epharius ;)
Sinon, très bon programme :bj:
Image
Avatar de l’utilisateur
Ti64CLi++Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 32.3%
 
Messages: 3441
Images: 75
Inscription: 04 Juil 2014, 14:40
Localisation: Clermont-Ferrand 63
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes
GitHub: Ti64CLi

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude DoOmnimaga » 03 Mai 2016, 05:55

Salut, si cet outil permet l'affichage de sprites à partir de donnée de sprites stockée dans un programme comme je peux probablement constater, alors ce serait très utile pour les programmeurs TI-BASIC.

Par contre, une suggestion que j'ai serait de permettre l'affichage et le stockage de plusieurs sprites avec une seule commande Asm(prgmSPRITE . La commande Asm() est lente d'exécution car la TI doit chercher dans la VAT pour trouver le programme ASM et le copier dans la SafeRAM je crois. Si par exemple tu permettais la syntaxe {sprite1,x,y,sprite2,x,y,sprite3,x,y,sprite4,x,y,sprite5,x,y , alors tu pourrais permettre d'afficher 33 sprites en même temps si, par exemple, 255 éléments étaient permis à la fois comme avec CE Textlib.

Avec cette habilité de chaining je crois que beaucoup de gens sur CodeWalrus serait content, vu la quantité de gens là-bas qui sont intéressés par le Basic étendu. :P J'utilise déja les sprites avec CE Textlib mais ce n'est pas nécéssairement le truc le plus éfficace. :P


Et comme deuxième suggestion: affichage des sprites zoomés. Par exemple, il y aurait 4 arguments et le 4ème définirait si tu veux afficher le sprite 2 fois plus gros, 3 fois plus gros, etc. Ce serait pratique.
Image Image Image Now active at https://discord.gg/cuZcfcF (CodeWalrus server)
Avatar de l’utilisateur
DoOmnimagaPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 8.1%
 
Messages: 683
Images: 25
Inscription: 21 Fév 2012, 12:04
Localisation: Quebec, Canada
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: 11eme annee scolaire termine
YouTube: DJOmnimaga
Twitter/X: DJOmnimaga
Facebook: djomnimaga

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude grosged » 03 Mai 2016, 15:57

C'est vrai que la commande Asm( n'est pas très rapide!
C'est une bonne idée le fait de combiner plusieurs sprite à afficher en une seule requête :)
Dans la prochaine version, la routine d'affichage sera relogée en mémoire $e30800 (Cursor Image Ram) ainsi , lors d'un Asm(prgmSPRITE, la TI cherchera dans la VAT un programme très court de 6 octets seulement: 2 octets d'entête, suivis d'un simple "JP $e30800" (afin de rediriger vers la zone mémoire $e30800). Au fait, connais-tu un moyen de faire baisser ce temps de recherche dans la VAT ? Peut-être en fonction du nom du programme?..de l'ordre de création (tout 1er crée, trouvé tout de suite?)
Par contre, l'effet zoom ,avec un 4ème paramètre , ça risque ( en chaining) de faire de longues lignes de commande . On pourrait garder cette idée de zoom, mais en 2nde routine complémentaire (sans chaining) qu'on pourrait appeler...ZSPRITE .... ou SPRITEXL par exemple
Avec Epharius, on est actuellement en train de regarder comment optimiser ces lectures de paramètres ... ;)
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 30.2%
 
Messages: 770
Images: 75
Inscription: 14 Sep 2011, 12:29
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Sprite10x10 pour Basic [TI83PCE]

Message non lude TheMachine02 » 03 Mai 2016, 18:44

Normalement le VAT est trié par ordre alphabétique, donc le programme se nommant A devrait être trouvé en premier. Par contre, la taille du programme, ça change rien, la VAT contient juste un pointeur vers le programme.
Avatar de l’utilisateur
TheMachine02Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 29.4%
 
Messages: 341
Images: 0
Inscription: 16 Jan 2013, 18:27
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
Classe: Médecine

Suivante

Retourner vers Langages alternatifs

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 17 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1661 utilisateurs:
>1643 invités
>13 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)