6Fermer8
deephLe 18/08/2013 à 18:58
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 ! fou).

Merci beaucoup je vais pouvoir passer aux autres routines (même si je n'ai pas encore eu le temps de modifier TL_delay()) top

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) fou

edit 2 : voilà un petit aperçu de la routine de sprite clippée :

6fCH

C'est assez rapide et ça pourrait l'être encore plus, parce que là je redessine l'écran sans cesse tongue
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.