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:

Sans oublier ces 2 dernières lignes (lesquelles étaient hors-écran) :
- Code: Select all
:Ans+"FFFFFFFFFF
:Asm(prgmSPRITE
Voilà, c'est tout !

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: Select all
{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: Select all
{1,99,99:Asm(prgmSPRITE
Ce qui nous donne...

On souhaite obtenir un écran noir (effaçage rapide) , il nous suffit d'un double guillement:
- Code: Select all
"":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: Select all
.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