Posté le 14/10/2007 à 20:29 Membre depuis le 14/10/2007, 1 message
Bonjour, je vien de me mettre a l'assembleur ,


le but de programme est de faire bouger un point,
je ne vois pas du tout d'où pourai venir le probleme.

.NOLIST
#define end .end
#define END .end
#define equ .equ
#define EQU .equ
#include "ti83plus.inc"

.LIST
.org 9327h
call _clrLCDFull
ld b,47
ld c,47
ld d,1
call _IPoint
call _runIndicOff
GetKey:
call _getKey

cp kLeft
jp z,Left
cp kRight
jp z,Right
cp kUp
jp z,Up
cp kDown
jp z,Down
cp kClear
jp z,Quit
jp GetKey
Left:
ld d,0
call _IPoint
dec b
jp Draw
Right:
ld d,0
call _IPoint
inc b
jp Draw
Up:
ld d,0
call _IPoint
inc c
jp Draw
Down:
ld d,0
call _IPoint
dec c
jp Draw
Draw:
ld d,1

call _IPoint
jp GetKey
Quit:
ret
.end
END


quand je l'execute sur vti, je marque asm(prgmgetkey error : invalide


J'aimerai donc que vous me donniez des conseils pour que mon programme fonctionne

Merci d'avance
@6+
Posté le 15/10/2007 à 19:33 Membre depuis le 01/12/2005, 413 messages
Tes touches ne sont pas definies, c'est à dire que dans l'header tu dois mettre :


#DEFINE kLeft 02h
#DEFINE kRight 01h
#DEFINE kUp 03h
#DEFINE kDown 04h ;tous ces codes sont en hexadécimal
#DEFINE kEnter 05h ;pour les touches de la TI
#DEFINE kClear 09h

Essaie voir.
Posté le 15/10/2007 à 20:38 Membre depuis le 15/03/2005, 3470 messages
Essaye plutôt ça :

.NOLIST
#define		end		.end
#define		END		.end
#define		equ		.equ
#define		EQU		.equ
; Définition de quelques variables qui seront plus pratique pour stocker tes registres
#define		CoorX		8265h	; C'est le Saferam1 sous Ion, c'est juste une partie de la ram dans laquelle tu peux stocker des trucs sans trop de problème.
#define		CoorY		8265h+1	; Idem mais dans l'octet d'après.
#define		kLeft		02h	;\
#define		kRight		01h	; \
#define		kUp		03h	;  \ Ce sont toutes les touches que tu vas utiliser dans ton programme
#define		kDown		04h	;  / avec la rom call '_getKey'.
#define		kEnter		05h	; /
#define		kClear		09h	;/

#include "ti83plus.inc"

.LIST
.org 9327h
	call _clrLCDFull
	call _runIndicOff	; Vaut mieu mettre ça avant, car ça se pourrai que cette rom call détruise tes registres
	ld a,47
	ld (CoorX),a		; On stocke 47 dans la variable CoorX qui est la coordonnée X
	ld (CoorY),a		; Idem mais avec CoorY
	ld d,1
	call _IPoint
	call Draw		; En appelant ta routine 'Draw' avec un call ça permet de pouvoir l'appeler de n'importe où dans ton code puisque ça arretera de l'appeler lorsqu'il rencontrera un 'ret' au lieu de devoir quitter ta routine avec un 'jp'.

GetKey:
	call _getKey

	cp kLeft
	call z,Left		; Tu peux appeler ça avec un 'call' puisque la routine 'Draw' se finit par un 'ret'.

	cp kRight
	call z,Right

	cp kUp
	call z,Up

	cp kDown
	call z,Down

	cp kClear
	jp z,Quit

	jr GetKey

Left:
	call ld_var
	ld d,0
	call _IPoint
	ld a,(CoorX)
	dec a
	ld (CoorX),a
	jr Draw		; Utilise un 'jr' plutot qu'un 'jp', le label n'est pas trop loins dans le code.

Right:
	call ld_var
	ld d,0
	call _IPoint
	ld a,(CoorX)
	inc a
	ld (CoorX),a
	jr Draw

Up:
	call ld_var
	ld d,0
	call _IPoint
	ld a,(CoorY)
	inc a
	ld (CoorY),a
	jr Draw

Down:
	call ld_var
	ld d,0
	call _IPoint
	ld a,(CoorY)
	dec a
	ld (CoorY),a

;	jp Draw (c'est pas la peine de mettre ça ici, le label est juste après)

Draw:
	ld d,1
	call _IPoint
	ret

ld_var:
	ld a,(CoorX)
	ld b,a
	ld a,(CoorY)
	ld c,a
	ret

Quit:
	call _clrLCDFull
	call _grbufclr		; Efface le graph buffer, qui est une 'copie' de l'écran dans la mémoire.
	ret

.end
END 


Bon voilà, je sais pas si ça va marcher mais essaye toujours et puis si t'as des questions n'hésite pas smile
Posté le 22/10/2007 à 09:25 Membre depuis le 12/02/2007, 75 messages
Je crois que j'ai trouvé ton erreur ; ta TI, c'est une TI 83 ou une 83+?
PArce que tu as écrit .org 9327h ; pour une ti 83 ,c'est correct, mais pour une TI 83+ c'est .org 9D95h qu'il faut marquer!
Ca doit pas venir des touches, ton problème ; tu as inclus ti83plus.inc,dans lequel les touches sont définies ;
Il y a encore une autre possibilité, mais ca m'étonnerai ; tu as mis l'instruction AsmPrgm au bébut de ton prgm?