Arg j'étais sûr que c'était ce genre d'erreur (avec ma manie de vouloir nommer les labels de manière explicite ça m'arrive souvent !

).
Merci beaucoup je vais pouvoir passer aux autres routines (même si je n'ai pas encore eu le temps de modifier
TL_delay())
edit : bon je n'arrive pas à calculer correctement le temps d'exécution des instructions... :/
Selon moi cette routine devrait prendre 341171.5 ns pour s'exécuter si hl=0 (290.5+255(788.5+539.5)+332+249+166*4+290.5*2+415; soit ~0.3 ms), mais j'ai l'impression que c'est bien plus long (beaucoup plus qu'1 ms) :
char __FASTCALL__ TL_delay(unsigned int delay){
#asm
; delay = ~0.3 ms (without interrupts !)
; 1 z80 T-state at 6 MHz = 41.5 ns
; 1 z80 cycle (= 4 T-states) at 6 MHz = 166 ns
TL_delay:
ld b,255 ; 7 T-states (290.5 ns)
TL_delay_loop:
sub a,(ix+0) ; 19 T-states (788.5 ns)
djnz TL_delay_loop ; 13 T-states (539.5 ns) if nz, else 8 T-states (332 ns)
dec hl ; 6 T-states (249 ns)
ld a,h ; 4 T-states (166 ns)
or a ; 4 T-states (166 ns)
jr nz,TL_delay ; 12 T-states (498 ns) if nz, else 7 T-states (290.5 ns)
ld a,l ; 4 T-states (166 ns)
or a ; 4 T-states (166 ns)
jr nz,TL_delay ; 12 T-states (498 ns) if nz, else 7 T-states (290.5 ns)
; ret ; 10 T-states (415 ns)
#endasm
}
C'est peut être dû au fait qu'un cycle ne prend peut être pas 166 ns à 6MHz (pourtant à 10 MHz ça en prend 100, et ça j'en suis sûr)
edit 2 : voilà un petit aperçu de la routine de sprite clippée :

C'est assez rapide et ça pourrait l'être encore plus, parce que là je redessine l'écran sans cesse

test.c
#pragma string name test
#include "..\devtest\ti83p.h"
#include "..\devtest\tilib.c"
extern char sprite[];
#asm
._sprite
sprite:
defb 0xdb,0x24
defb 0xc2,0x3d
defb 0x82,0x65
defb 0x01,0xda
defb 0x01,0xbe
defb 0x01,0xda
defb 0x9b,0x64
defb 0xdb,0x24
#endasm
char main(){
unsigned char i = 1;
unsigned char x = 0, y = 0;
while(TL_direct_input(DKEY_GROUP_2) != DKEY_CLEAR){
C_bcall(_cleargbuf);
TL_draw_rectangle_filled(3, 3, 20, 18, TL_BLACK);
TL_draw_line(4, 4, 13, 15, TL_XOR);
TL_large_clipped_sprite(x, y, 2, 8, sprite, TL_XOR);
TL_gbuf_to_lcd();
switch(TL_direct_input(DKEY_GROUP_1)){
case DKEY_UP:
y-=1;
break;
case DKEY_DOWN:
y+=1;
break;
case DKEY_LEFT:
x-=1;
break;
case DKEY_RIGHT:
x+=1;
break;
}
}
}
Maintenant il ne me reste plus qu'à y ajouter la possibilité de XOR/AND le sprite.