1
Bonjour tout le monde
Je cherche une routine pour afficher un sprite sans utiliser ion ou mirage OS (qui ont déjà des fonctions intégrées pour afficher des sprites apparemment)
au passage, j'utilise Oncalc compiler...
2
Tu vas avoir du mal si tu commence à programmer en ASM oncalc, essaye d'abord sur PC.

Sinon voilà la routine PutSprite d'Ion (donc t'as juste besoin de l'inclure dans ton code source) :

;-----> Draw a sprite
; b=size of sprite
; l=yc
; a=xc
; ix holds pointer
putSprite:
	ld	e,l
	ld	h,$00
	ld	d,h
	add	hl,de
	add	hl,de
	add	hl,hl
	add	hl,hl
	ld	e,a
	and	$07
	ld	c,a
	srl	e
	srl	e
	srl	e
	add	hl,de
	ld	de,gbuf
	add	hl,de
putSpriteLoop1:
sl1:	ld	d,(ix)
	ld	e,$00
	ld	a,c
	or	a
	jr	z,putSpriteSkip1
putSpriteLoop2:
	srl	d
	rr	e
	dec	a
	jr	nz,putSpriteLoop2
putSpriteSkip1:
	ld	a,(hl)
	xor	d
	ld	(hl),a
	inc	hl
	ld	a,(hl)
	xor	e
	ld	(hl),a
	ld	de,$0B
	add	hl,de
	inc	ix
	djnz	putSpriteLoop1
	ret


Et IonLargeSprite :

;-----> Draw a picture
;Input:	ix->sprite
;	a=x
;	l=y
;	b=height	(in pixels)
;	c=width		(in bytes, e.g. 2 would be 16)
;Output: nothing
; All registers are destroyed except bc', de', hl'
largeSprite:
	di
	ex	af,af'
	ld	a,c
	push	af
	ex	af,af'
	ld	e,l
	ld	h,$00
	ld	d,h
	add	hl,de
	add	hl,de
	add	hl,hl
	add	hl,hl
	ld	e,a
	and	$07
	ld	c,a
	srl	e
	srl	e
	srl	e
	add	hl,de
	ld	de,gbuf
	add	hl,de
largeSpriteLoop1:
	push	hl
largeSpriteLoop2:
	ld	d,(ix)
	ld	e,$00
	ld	a,c
	or	a
	jr	z,largeSpriteSkip1
largeSpriteLoop3:
	srl	d
	rr	e
	dec	a
	jr	nz,largeSpriteLoop3
largeSpriteSkip1:
	ld	a,(hl)
	xor	d
	ld	(hl),a
	inc	hl
	ld	a,(hl)
	xor	e
	ld	(hl),a
	inc	ix
	ex	af,af'
	dec	a
	push	af
	ex	af,af'
	pop	af
	jr	nz,largeSpriteLoop2
	pop	hl
	pop	af
	push	af
	ex	af,af'
	ld	de,$0C
	add	hl,de
	djnz	largeSpriteLoop1
	pop	af
	ret


Par contre j'ai remarquer que le routine oublie de relancer les interruptions, donc soit tu rajoute un 'ei' avant le 'ret' de la routine soit tu le rajoute après avoir appeler la routine dans ton code source.
3
ok mais je peux pas connecter ma TI au PC (j'emprunte celle d'un pote pour envoyer des programmes...) et puis je compte juste utiliser l'ASM "en complément" de mes programmes Basic

mais merci pour les routines je vais essayer ça ^^


EDIT : euh au fait size of sprite c'est l'hauteur du sprite en pixels ? bytes ?

par exemple pour afficher une croix à (15,15)
...
ld b,8           ;8 pixels de hauteur
ld l,15
ld a,15         ;coordonnées
ld ix,sprite   ;données
...
sprite:
.db 10000001b
.db 01000010b
.db 00100100b
.db 00011000b
.db 00011000b
.db 00100100b
.db 01000010b
.db 10000001b
...


c'est ça ? ou c'est
ld ix,(sprite)


(...) c'est pour l'adresse d'une variable non ?
4
C'est plutôt :

.nolist
ionPutSprite	=lVectors+6c		; Cf Ion.inc
[...]
.list
[...]

Start:
	[...]
	ld l,15			; CoorY
	ld a,15			; CoorX
	ld b,8
	ld ix,Sprite
	call ionPutSprite
	bcall(_grbufcpy)
	[...]
	ret

[routine]

.end
END
5
ok
mais c'est quoi 1Vectors+6c ?
est-ce que Oncalc compiler va accepter ça ?

6
Ah nan attend c'est pas bon si tu recopie la routine... Faut que je regarde ça (normalement c'était l'adresse de la routine).

Bah essaye :

.nolist 
ionPutSprite	=putSprite
[...] 
.list 
[...] 
 
Start: 
	[...] 
	ld l,15			; CoorY 
	ld a,15			; CoorX 
	ld b,8 
	ld ix,Sprite 
	call ionPutSprite 
	bcall(_grbufcpy) 
	[...] 
	ret 
 
[routine] 
 
.end 
END


Et non, faut convertir l'header avec Oncalc Compiler, mais pour ça faut lire le readme du programme.
7
nan il bloque à la routine, à la ligne
ld de,gbuf

8
C'est pareil que 'ld de,plotsscreen'.
9
merci ! ça marche à merveille ^^

mais j'ai une autre question :
une routine pour entrer, comme input en basic ?

(j'avais vu un lien quelque part dans ce forum...je le trouve plus...)
C'est un peu plus compliqué à faire, mais j'ai trouvé ça sur TIcalc : Routine InpuTXT.
merci beaucoup ^^
c'est tout pour l'instant ^^
Pour en revenir aux sprites, la routine "largesprite" écrite par Tijl Coosemans est meilleure que celle de l'auteur de ION, elle est plus petite et rapide et n'utilise pas les "shadow registers" (donc elle n'a pas besoin de désactiver les interruptions) : http://wikiti.denglend.net/index.php?title=Routines:Graphic:largesprite#Version_without_shadow_registers
ok.
mais au fait les sprites sont affichés en or ? en xor ? en and ?
	ld	a,c
	xor	(hl)
	ld	(hl),a
	inc	hl
	ld	a,d
	xor	(hl)
	ld	(hl),a


Ça se passer à cet endroit de la routine. Là c'est XOR, mais tu peux changer en AND ou en OR.
C'est un peu plus compliqué à faire, mais j'ai trouvé ça sur TIcalc : Routine InpuTXT.


Très bon choix ! boing
en changeant les xor en or/and ?
Ben oui selon tes besoins tu changes cette partie. MAis le Xor est plus pratique dans la plupart des cas.
hmm...je me posais une question
c'est possible de faire des niveaux de gris en asm nostub ?