30

Moi ça ne marche pas non plus avec wabbitemu (même en faisant File > New) sad

Enfin tant mieux, j'ai hâte de voir ton jeu smile

31

Merci smile

Sinon, je ne vois pas pourquoi ça ne marche pas chez toi... quand tu as les 2 caltos, appuies 2-3 fois sur Calculator > "connect virtual link cable" pour chaque calto (sans que un prgm soit lancé, sinon j'ai remarqué que ça ne marche pas forcément)

32

Ah ok enfaite il faut vraiment insister sur le "Connect virtual cable link" (même si les fenêtres affichent déjà "Wabbitemu (1)" et "Wabbitemu (2)") cheeky

Merci !

33

wink

J'ai encore quelques questions:
_Dans le prgm que tu m'a passé, tu avais mis "bcall _puts" et "call bell_connect", alors je me demande s'il y a ou non une différence entre call et bcall (je ne comprends d'ailleurs pas pourquoi ça marche pour la 83+ dans ce cas, vu que call c'est pour les 82stats/83 non?)
_J'ai vu que jp a été remplacé par bjump, mais qu'en est il de jr?
_Tu m'as dit qu'il y a plein de routines pratiques grâce à ion... où puis je en trouver une description?
Merci d'avance smile

34

bcall, bjump etc... sont utilisés pour appeler un "rom call" (cf http://www.mworld.fr/html/projects/calc/ti-82/tutoriel/progasm/guide/lesson22.html#tasks & http://www.mworld.fr/html/projects/calc/ti-82/tutoriel/progasm/guide/lesson8.html#romcall ). Voilà en gros la traduction de ces termes selon que tu utilises une 83 ou une 83+ :

#ifdef	TI83
#define	bcall	call
#define	bcallz	call z,
#define	bcallnz	call nz,
#define	bcallc	call c,
#define	bcallnc	call nc,
#define	bjump	jp
#endif
#ifdef	TI83P
#define	bcall	rst 28h\	.dw
#define	bcallz	jr nz,$+5\	rst 28h\	.dw
#define	bcallnz	jr z,$+5\	rst 28h\	.dw
#define	bcallc	jr nc,$+5\	rst 28h\	.dw
#define	bcallnc	jr c,$+5\	rst 28h\	.dw
#define	bjump	call 50h\	.dw
#endif

La liste des "rom call" (sortes de routines du TI OS donc) est plus ou moins exhaustive selon les fichiers includes (ion.inc est pratique car il s'occupe de régler les différences d'adresses selon le modèle de la TI, mais sinon il y a plus complet, même si c'est pas forcément utile, comme les "ultimate TI83 ou TI83P.inc" dispo sur le site de brandonw).

Il faut utiliser le call lorsqu'on appelle une routine de son propre programme (ou des fichiers inclus à la source, en l’occurrence bell.inc).
Tu m'as dit qu'il y a plein de routines pratiques grâce à ion... où puis je en trouver une description?

En anglais y'a Ion Guru. On peut sans doute aussi trouver des explications en français sur le net, j'vais voir si j'en trouve.

Rapidement, les plus utiles : ionPutSprite (j'l'utilise dans l'exemple avec les 2 bonhommes), ionLargeSprite, ionFastCopy voire ionRandom smile

edit : http://membres.multimania.fr/sylvaind/tutasm/tut16.htm#signet3

(Ah d'ailleurs, les routines d'Ion sont à appeler avec "call" smile)

35

ok merci smile
Donc en fait, ça reviens au même d utiliser call et bcall (pareil pour jp et bjump)
Je verrais le reste demain, encore merci pour ton aide =D

36

Pour les 83 oui, mais il vaut mieux garder la compatibilité avec les 83+.

37

^^ Effectivement (je m étais arrêté au #define bcall call, sans faire gaffe qu il n y a pas la même chose pour les 83+)

38

Une dernière question: sur le site du zero, j'ai vu qu'il existe des rom call pour tracer des rectangles sur les 83+, est ce qu'il en existe aussi pour la 82stats/83? Je ne les trouve ni dans ion.inc, ni dans ti83asm.inc (même si je connais leurs adresses pour les 83+)
Merci d'avance! smile

39

À ma connaissance non. C'est pour ça que j'utilise cette routine dans plusieurs de mes projets :
;=======================================;
; Rectangle Filling Routine Version 1.0 ;
; By Jason Kovacs & The TCPA - 10/11/99 ;
;=======================================;
; Input:  D = Top Left X Coordinate, E = Top Left Y Coordinate
;	 H = Bottom Right X Coord,  L = Bottom Right Y Coord
;	 C = Color of Lines (0-White, 1-Black, 2-XORed)
;
; Output: A Rectangle is drawn to the Graph Buffer with its border
;    and everything within it Filled in according to the value in
;    reg C which specifies the Color.
;
; Registers Affected: AF Destroyed; B=0 ; C, DE, HL Preserved.
;    The Index Registers and the Shadow Registers Aren't Used.

Rectangle_Filled:
	ld a,l
	sub e
	inc a
	ld b,a
	ld a,h
	sub d
	inc a   
	push de

Rect_Fill_Loop:
	push af
	call V_Line
	pop af
	inc d
	dec a
	jr nz, Rect_Fill_Loop
	pop de
	ret

;=======================================;
; Horizontal and Verticle Line Routines ;
; By Jason Kovacs & The TCPA - 10/11/99 ;
;=======================================;

; For H_Line and V_Line:
;
; Input:  B = Length of Line (Number of Pixels)
;	 C = Color of Line (0-White, 1-Black, 2-XORed)
;	 D = X Coordinate Start of the Line
;	 E = Y Coordinate Start of the Line
;
; Output: Lines are Drawn to the Graph Buffer, and the Starting
;    Byte and Pixel Mask are Automatically determined according
;    to the Input of the Coordinates in DE.
;
; Registers Affected:  All Registers are Preserved Except AF.

V_Line:
	push de
	push hl
	push bc
	ld a,d
	call Getpix
	pop bc
	push bc
	ld d,c
	ld c,a
	ld a,d
	ld de,12
	or a
	call z,V_White_Line
	dec a
	call z,V_Black_Line
	dec a
	call z,V_XORed_Line
	pop bc
	pop hl
	pop de
	ret

V_White_Line:
	ld a,c
	cpl
	ld c,a
	
V_White_Line_2:
	ld a,(hl)
	and c
	ld (hl),a
	add hl,de
	djnz V_White_Line_2
	xor a
	ret

V_Black_Line:
	ld a,(hl)
	or c
	ld (hl),a
	add hl,de
	djnz V_Black_Line
	xor a
	ret

V_XORed_Line:
	ld a,(hl)
	xor c
	ld (hl),a
	add hl,de
	djnz V_XORed_Line
	ret

Getpix:
	ld d,0
	ld h,d
	ld l,e
	add hl,de
	add hl,de
	add hl,hl
	add hl,hl
	ld de,plotsscreen
	add hl,de

Getbit:
	ld b,0
	ld c,a
	and %00000111
	srl c
	srl c
	srl c
	add hl,bc
	ld b,a
	inc b
	ld a,%00000001

GBLoop:
	rrca
	djnz GBLoop
	ret

40

Merci pour ton aide! smile

EDIT: La connextion virtuelle entre les caltos fait buguer le débogueur de wabbitemu mourn cry

41

À la limite si tu as des bugs persistants avec certaines parties de ton code, n'hésite pas à créer un nouveau sujet smile

42

En fait, l'émulateur fonctionne, mais pas quand le débogueur est en marche. Du coup, il suffit de placer le breakpoint, de fermer l'émulateur, d'aller jusqu'à l'endroit voulu, puis de parcourir le code avec "step" (en clair, c'est juste le bouton "run" qui déconne avec la connexion).

Sinon, j'ai encore 2 petites questions, et je te laisse tranquille (normalement wink )
_Je n'arrive pas à enlever le "done" qui s'affiche lorsque que je quitte ion (je pense que c'est parce que le shell remet les flags à leur état initial, mais c un peu embêtant), est ce que c'est possible?
_je voudrais afficher une valeur (de a) tout en haut à gauche de l'écran, en petit caractères, mais je ne sais pas comment faire (j'ai pensé à mettre a dans OP1, puis de l'afficher, mais je sais pas faire roll (peut être qu'il y a une romcall, mais je ne la connait pas)
A part peut être en faisant:

ld hl, nombre
bcall(_Mov9ToOP1)

nombre:
.db $00, $80, $00, $00, $00, $00, $00, $00, $00

Et en changeant les valeurs de nombre par rapport à a, mais ça me parait un peu tordu, et je risque d'utiliser pas mal d'octets pour un truc assez basic

Merci d'avance! smile

43

Je n'arrive pas à enlever le "done" qui s'affiche lorsque que je quitte ion (je pense que c'est parce que le shell remet les flags à leur état initial, mais c un peu embêtant), est ce que c'est possible?

C'est pas possible mais de toute façons c'est assez peu gênant, non ?
je voudrais afficher une valeur (de a) tout en haut à gauche de l'écran, en petit caractères, mais je ne sais pas comment faire (j'ai pensé à mettre a dans OP1, puis de l'afficher, mais je sais pas faire roll (peut être qu'il y a une romcall, mais je ne la connait pas)

Tu peux faire comme ça :
	ld hl,0
	ld (pencol),hl
	bcall _setxxop1
	bcall _dispop1a

Mais par contre ça doit détruire pas mal de registres...

44

ok merci ^^
pour les registres detruits, ce n est pas tres grave, vu que c est pour afficher un score, et que ce qui suit depend de la touche qui va être pressée smile
Pour le done, tant pis ^^
merci encore pour ton aide happy (maintenant je vais pouvoir me debrouiller)

45

Bonsoir:
Alors voilà: j'ai finis mon code, mais, si le jeu marche bien tant qu'il n'y a qu'une calto, dès que j'en met une 2ème, c'est la catas. Je pense que je n'utilise pas bien les routines de bell, si vous avez quelque chose à me suggérer, je vous en serais reconnaissant wink

Le problème se situe certainement (c'est même sûr) au niveau de GET_EVENT
Merci d'avance! smile

46

Pourquoi y'a-t-il un "push hl" sans "pop hl" proche alors que le programme peut quitter entre deux ?

Sinon ligne 380 tu as utilisé un bcall pour appeler "bell_swapBlock", or c'est un call qu'il faut utiliser.

Je ne sais pas si ça règle ton problème, je n'ai regardé que les grandes lignes et à part ça, ça me semble correct (il y a quelques optimisations par endroits mais ça reste très minime, par exemple ligne 203 le "jr CALC_COORD4" est inutile) smile

47

deeph (./46) :
Pourquoi y'a-t-il un "push hl" sans "pop hl" proche alors que le programme peut quitter entre deux ?

Je pense que tu veux parler de ces ligne:
	ld hl,EXIT 
	push hl 

Bah en fait, c'est fait exprès: l'adresse de EXIT est mise en haut du stack, puis dès que le prgm rencontre un ret, il va à l'adresse qu'il trouve en haut de la pile. Et là (sauf si une routine s'est lancée entre temps), il va à EXIT. smile Ca permet d'utiliser moins d'octets (un ret prend moins de place qu'un jp)
deeph (./46) :
Sinon ligne 380 tu as utilisé un bcall pour appeler "bell_swapBlock", or c'est un call qu'il faut utiliser.

Comme j'ai une TI 83, bcall = call, mais je corrige de suite (pour la portabilité)
Je vais tester, mais je ne pense pas que le pb vienne de là.

En tout cas, merci de te (ré)intéresser à mon problème happy

48

Ca ne marche toujours pas: j'ai même abouti à un "Ram cleared" eek
En fait, ça marche au début (la tête avance de 1 pour les 2, mais ça rame à mort), puis après, il y a juste la queue qui avance, du coup, à un moment, le serpent disparaît. A partir de là, il y a plein de bugs... cry

49

Ouais enfin fais gaffe avec la pile, ce genre de hack c'est un bon moyen de faire tout bugger tongue

Sinon quelques pistes pour optimiser un peu, quand tu as ça :
	call bell_sendLargeBlock
	ret
	[...]
	bcall _dispop1a
	ret

Autant faire :
	jp bell_sendLargeBlock
	[...]
	bjump _dispop1a

Ensuite ça :
	ld a,(my_event)
	bit 0,a
	call nz,GET_EVENT_SEND
	ld a,(his_event)
	bit 0,a
	call nz,GET_EVENT_RECV
GET_EVENT_SAV_HL = $+1
	ld hl,0
	push hl
	ret
	 
GET_EVENT_SEND:
	ld hl,obj_x		;On evoie les coordonnées du nv objectif
	ld bc,2
	call bell_sendLargeBlock
	ret

GET_EVENT_RECV:
	ld hl,obj_x		;On reçoit et on affiche le nouveau objectif
	ld bc,2
	call bell_recvLargeBlock

	ld a,(obj_x)
	ld b,a
	ld a,(obj_y)
	ld c,a
	ld d,2
	bcall _ipoint
	ret

Peut devenir ça :
	ld hl,obj_x
	ld bc,2
	ld a,(my_event)
	bit 0,a
	call nz,bell_sendLargeBlock
	ld a,(his_event)
	bit 0,a
	call nz,GET_EVENT_RECV
GET_EVENT_SAV_HL = $+1
	ld hl,0
	push hl
	ret

GET_EVENT_RECV:
	call bell_recvLargeBlock
	ld hl,(obj_x)
	ld b,h
	ld c,l
	ld d,2
	bjump _ipoint

(Pas testé par contre)

Pour le reste, je te conseil de mettre en commentaire certaines parties de ton code sans que ça gène le déroulement du programme, ça peut aider à trouver le problème...

J'ai pas trop le temps de regarder tout ça en détail pour le moment, désolé :/

50

Merci pour ta réponse et tes optimisations! smile
C'est pas grave que tu n'ai pas trop le temps: j'ai réussi à localiser le pb... enfin, je ne sais pas vraiment se que c'est, mais ça vient bien de GET_EVENT. Je vais tester quelques trucs, on verra bien ^^

EDIT: C'est bon ça marche! smile
En fait, j'ai du revoir toute la structure de GET_EVENT: ce sont les routines de bell qui le faisait buguer: il y en avait trop, du coup ça ramait, et ça buguait (même si je ne comprends pas bien pour quoi)
GET_EVENT:
	pop hl			;On échange les évènements
	ld (GET_EVENT_SAV_HL),hl
	ld hl,$0103
	ld (pencol),hl
	ld hl,my_x
	ld de,his_x
	ld b,8
	call bell_swapBlock
	ret nz

	ld a,(my_event)		;On teste les événements
	and %1100
	ld b,a
	ld a,(his_event)
	or b
	bit 3,a
	ret nz
	bit 1,a
	ret nz
	bit 2,a
	ld hl,S_PAUSE
	bcallnz _vputs
	bcallnz _getkey
	call nz,bell_sync
	ret nz

	ld a,(his_event) 
	bit 0,a 
	call nz,GET_EVENT_AFF
GET_EVENT_SAV_HL = $+1 
	ld hl,0 
	push hl 
	ret 
 
GET_EVENT_AFF: 	;On affiche le nouveau objectif
	ld de,obj_x
	ld hl,his_obj_x
	ld bc,2
	ldir

	ld hl,(obj_x)
	ld b,h 
	ld c,l 
	ld d,2 
	bjump _ipoint


Et j'ai changé les variables:
my_x 		=	savesscreen
my_y		=	savesscreen+1
my_last_x	=	savesscreen+2
my_last_y	=	savesscreen+3
my_score	=	savesscreen+4
my_event	=	savesscreen+5
obj_x		=	savesscreen+6
obj_y		=	savesscreen+7

his_x 		=	savesscreen+8
his_y		=	savesscreen+9
his_last_x	=	savesscreen+10
his_last_y	=	savesscreen+11
his_score	=	savesscreen+12
his_event	=	savesscreen+13
his_obj_x	=	savesscreen+14
his_obj_y	=	savesscreen+15

51

Tant mieux ! happy

J'ai hâte de voir le produit final smile

52

Merci! smile
J'ai bientôt fini, plus que quelques fioritures à faire, et c'est bon rotfl

53

Je ne sais rien du porte mini-jack mais j'ai aussi hâte de voir comment va terminer ton jeu smile

54

Merci!
Je poste un petit screen:

zsnake.gif

Comme vous le voyez, il ne me manque que 2-3 trucs (gestion du score à la fin de la partie par exemple), et c'est finis! smile

PS: la non-syncronisation vient de l'émulateur... (enfin, normalement grin )

55

Whoa ça a l'air terrible ! happy

C'est ton premier jeu en asm ?

En tout cas bravo, j'ai hâte de pouvoir tester smile

56

Wow c'est une intéressante idée pour un jeu Snake, il me ressemble un peu à Tron. A propos, je ne sais pas si tu veux que ça tarde un peu quand tu remplis le rectangle (si c'est comme une sorte d'effet spécial), mais il est possible de le remplir plus vite, presque instantanément, parce que les dimensions du rectangle ne vont jamais changer.

Tu l'as déjà joué avec tes amis ? grin

57

Merci!
Oui, c'est mon premier jeu en ASM smile
Je n'ai pas encore pu y jouer, vu que je n'ai pas le câble, mais un pote l'a, et il devrait bientôt me le passer, donc normalement d'ici une semaine, ça sera bon, je passerai les fichiers.
Pour le rectangle, ça fait un petit effet d'ouverture, je ne sais pas si je vais laisser comme ça où pas (je changerais sûrement plus tard, mais le problème, c'est que si c'est instantané, ça démarre trop vite : il faudrait faire démarrer à l'appui sur une touche, mais c'est pas facile à 2 joueurs)
Pour l'instant oui, ça ressemble à TRON, mais je compte faire une autre variante, qui sera complètement différente wink

58

C'est vraiment un excellent début alors (rien à voir avec mes premiers jeux cheeky) top

En tout cas continue comme ça, ça fait plaisir de voir qu'il y a toujours des programmeurs asm z80 dans le coin smile

59

Bouhouhou cry cry cry cry cry cry cry cry cry tripaf tripaf tripaf

On m'a finalement passé un câble, j'ai pu transférer ion et mon programme. Je lance ion après l'avoir installé, puis je démarre le jeu, jusque là, tout va bien.
Je démarre la partie avec un pote (tout fier de moi)
Et là eeek
_Sa calto quitte, et reviens à l'écran principal du jeu, me laissant en plan (bien sûr, coincé, et sans moyen de quitter)
_J'enlève les piles (petit Mem effacé au passage)
_On recommence tout... et là ça refait pareil mais en pire: des symboles bizarres se sont affichés par dessus le jeu sur ma calto quand la sienne a (re)quitté
_Une troisième fois, et là carrément Mem effacé direct.
Ce que je pige pas, c'est que ça marche impec sur émulateur, et que sur nos caltos, ça a bugué après l'"ouverture" ... mur

EDIT: Pourquoi ça marche sur l'émulateur et pas en vrai? cry

[IMG]http://imageshack.us/a/img196/8282/zsnake2.gif[/IMG]

60

C'est quoi vos modèles de TI ? C'est vraiment étrange, il faudrait tester avec plusieurs émulateurs :/