Page 1 sur 1

Problème avec une routine pour tracer des lignes

Message non luPosté: 15 Juin 2017, 20:44
de Dark coco
Bonsoir, aujourd'hui j'ai eu un petit problème avec une routine qui permet de tracer des lignes que MMBC_Chris a eu la gentillesse de retranscrire en ti basic afin que moi même je la fasse en asm. Bon vous vous douté que si elle fonctionnait j'aurais pas écris ce message :) .

Bon voici, le code en ti basic (il fonctionne très bien):
Code: Tout sélectionner
EffDess
0→Xmin
0→Ymin
164→Ymax
264→Xmax
1→A
1→B
50→C
10→D
AxesNAff
Pt-Aff(A,B
Pt-Aff(C,D
abs(C-A)→E
­abs(D-B)→F
If A<C:1→X
If A>C:­1→X
If B<D:1→Y
If B>D:­1→Y
E+F→G
0→I
1→H
While H
Pt-Aff(A,B
If A=C et B=D
Goto E
2G→I
If I≥F:Then
G+F→G
A+X→A
End
If I≤E:Then
G+E→G
B+Y→B
End
End
Lbl E



Voici celui en asm:
Code: Tout sélectionner
;routine aff line
;aff point 1 et 2 pour test

   ld bc,(X1)
   ld a,(Y1)
   call Routine_aff_point
   ld (hl),$FF
   ld bc,(X1)
   ld a,(Y1)
   call Routine_aff_point
   ld (hl),$FF
   
;calcules des deltas   
   
   ld hl,(X2)         ;delta X
   ld bc,(X1)
   or a,a
   sbc hl,bc
   jp p,$+11         ;4+1+1+2+2+1   
      ex de,hl
      or a,a
      sbc hl,hl
      sbc hl,de
      inc hl
   ld (Delta_X),hl
   ld a,(Y1)         ;delta Y
   ld c,a
   ld a,(Y2)
   sub a,c
   jp m,$+6         ;4+1+1
      xor a,%11111111
      inc a
   ld (Delta_Y),a
   
;test sur la nature de la ligne

   ld hl,(X1)         ;vars x
   ld bc,(X1)
   or a,a
   sbc hl,bc
   jp p,$+8         ;4+1+2+1
      or a,a
      sbc hl,hl
      dec hl         ;-1 dans hl
      jr $+6         ;2+1+2+1
         or a,a
         sbc hl,hl
         inc hl      ;1 dans hl
   ld (Vars_X),hl      ;hl dans Vars_X
   
   ld a,(Y1)         ;vars Y
   ld c,a
   ld a,(Y2)
   sub a,c
   jp p,$+8         ;4+1+1+2
      xor a,a
      dec a         ;-1 dans a
      jr $+4         ;2+1+1
         xor a,a
         inc a      ;1 dans a
   ld (Vars_Y),a
   
;calcule de la variable G

   ld hl,(Delta_X)
   ld bc,(Delta_Y)
   add hl,bc         ;hl contient G
   
Boucle_aff_line:
   push hl            ;save hl soit G
   ld bc,(X1)
   ld a,(Y1)
   call Routine_aff_point      ;aff le point
   ld (hl),28         ;couleur du point
   
   ld a,(Y1)         ;teste si on reste ou non dans la boucle
   ld c,a
   ld a,(Y2)
   jr nz,$+16         ;2+4+5+1+2+2
      ld hl,(X1)
      ld bc,(X2)
      or a,a
      sbc hl,bc
      jr z,Fin_Boucle_aff_line
   pop hl
   push hl            ;save hl soit G
   add hl,hl         ;calcule de la variable I soit 2G
   pop de            ;G dans de
   push hl            ;save hl soit I
   
   ld bc,0            ;test si I=>F
   ld a,(Delta_Y)
   ld c,a
   sbc hl,bc
   jp m,$+21         ;4+1+1+1+4+5+1+4
      ex de,hl
      add hl,bc      ;G+F->G
      ex de,hl
      ld hl,(X1)
      ld bc,(Vars_X)
      add hl,bc      ;A+X->A
      ld (X1),hl
   pop bc            ;test si E=>I
   ld hl,(Delta_X)
   or a,a
   sbc hl,bc      
   jp m,$+26         ;4+1+5+1+1+4+1+4+1+4
      ex de,hl
      ld bc,(Delta_X)
      add hl,bc      ;G+E->G
      ex de,hl
      ld a,(Vars_Y)   
      ld c,a
      ld a,(Y1)
      add a,c         ;B+Y->B
      ld (Y1),a
   ex de,hl
   jr Boucle_aff_line
   
   
Fin_Boucle_aff_line:
   call _getkey
   
   ret
   
Routine_aff_point:         ;argument X=bc [1,320] et Y=a [1,240]
   ld hl,$D40000
   ld de,320
Boucle_aff_point:
   add hl,de
   dec a
   jr nz,Boucle_aff_point
   or a,a
   sbc hl,de
   add hl,bc
   dec hl
   ret


et enfin voici un scrn de ce qui se passe:

Image

Si vous avez une idée je suis à l'écoute. Car ça fais un petit moment que je suis dessus et le problème est assez compliquer :? .

Merci beaucoup

Re: Problème avec une routine pour tracer des lignes

Message non luPosté: 15 Juin 2017, 20:49
de clifward
bah ça a tracé une belle ligne rouge, quel est le problème ? :troll:

Re: Problème avec une routine pour tracer des lignes

Message non luPosté: 15 Juin 2017, 20:50
de MMBC
Le problème c'est ton intervention :troll:
(Je déconneuh)

Re: Problème avec une routine pour tracer des lignes

Message non luPosté: 15 Juin 2017, 20:51
de Dark coco
C'est que je ne voulais pas une droites qui trace l'axe des ordonnées :troll:

Re: Problème avec une routine pour tracer des lignes

Message non luPosté: 15 Juin 2017, 20:58
de MMBC
Pour ceux qui auraient pas compris le problème, il y a certes une magnifique ligne...
Mais pas celle espérée... D:

Re: Problème avec une routine pour tracer des lignes [Résolu

Message non luPosté: 03 Aoû 2017, 13:37
de MMBC
Bon, j'ai tout réécris depuis le début :P

Et ça marche :D

Voilà le code avec un example d'utilisation ;)

Code: Tout sélectionner
.nolist
#include "ti84pce.inc"
.list

   .assume ADL=1
   .org UserMem-2
   .db tExtTok,tAsm84CeCmp
   
   call _ClrLCDFull
   ld a, $27
   ld ($E30018), a
   
   ld hl, $0
   ld (mpLCDPalette), hl
   ld hl, $F5A4
   ld (mpLCDPalette+2), hl
   
   ld hl, 11 ; x0
   push hl
   ld hl, 51 ; x1
   push hl
   ld ix, 0
   add ix, sp
   ld a, 39 ; y0
   ld (ix+5), a
   ld a, 34 ; y1
   ld (ix+2), a
   ld a, 1 ; couleur
   call __Line_NoClip_ASM
   pop hl
   pop hl
   
   ld a, $2D
   ld ($E30018), a
   
   ret
   
__Line_NoClip_ASM:
   ; arg0: y1 (1byte) x1 (2bytes)
   ; arg2: y2 (1byte) x2 (2bytes)
   ; a = color
   ld (color), a
   ld ix, 3
   add ix, sp
   or a
   sbc hl, hl
   push hl
   pop bc
   ld l, (ix+0)
   ld h, (ix+1)
   ld c, (ix+3)
   ld b, (ix+4)
   ld a, c
   ld (x), a
   ld a, b
   ld (x+1), a
   ld a, 1
   sbc hl, bc
   jp p, +_
   sub a, 2
_:   ld (sx), a
   ex de, hl
   call _abs24de
   push hl
   or a
   sbc hl, hl
   push hl
   pop bc
   ld l, (ix+2)
   ld c, (ix+5)
   ld a, c
   ld (y), a
   ld a, 1
   sbc hl, bc
   jp p, +_
   sub a, 2
_:   ld (sy), a
   ex de, hl
   call _abs24de
   ex de, hl
   or a
   sbc hl, hl
   sbc hl, de
   pop de
   push de
   add hl, de
   ld (err), hl
   or a
   sbc hl, de
   push hl
_:
   ld hl, (x)
   ex.s de, hl
   ld a, (y)
   ld l, a
   ld h, 160
   mlt hl
   add hl, hl
   add hl, de
   ld bc, $D40000
   add hl, bc
color=$+1
   ld (hl), a
   
   
   ld de, (x)
   ld hl, (ix)
   or a, a
   sbc hl, de
   jp z, +_
   
   ld hl, (err)
   add hl, hl
   ld (e2), hl
   
   pop bc
   push bc
   or a, a
   sbc hl, bc
   jp m, e2dx
   ld hl, (err)
   add hl, bc
   ld (err), hl
   ld hl, (x)
   ex.s de, hl
   ex de, hl
   ld a, (sx)
   add a, 2
   ld e, a
   ld d, 0
   dec de
   dec de
   add hl, de
   ld a, l
   ld (x), a
   ld a, h
   ld (x+1), a

e2dx:
   pop bc
   pop de
   push de
   push bc
   ld hl, (e2)
   sbc hl, de
   jp p, eol
   ld hl, (err)
   add hl, de
   ld (err), hl
   ld a, (y)
   ld h, a
   ld a, (sy)
   add a, h
   ld (y), a
   
eol:
   jp -_
_:
   pop bc
   pop bc
   ret
sx:
   nop
sy:
   nop
x:
   nop
   nop
y:
   nop
err:
   nop
   nop
   nop
e2:
   nop
   nop
   nop

   nop
   nop
   nop

_abs24de:
   sbc hl, hl
   adc hl, de
   ret p
   or a, a
   sbc hl, hl
   sbc hl,de
   ret

Re: Problème avec une routine pour tracer des lignes

Message non luPosté: 03 Aoû 2017, 13:39
de PT_
Optimizations by: PT_ :troll:

Code: Tout sélectionner
   add hl, hl
   add hl, de
   ld bc, $D40000
   add hl, bc
color = $+1
   ld (hl), 0

Even more opts :D

Re: Problème avec une routine pour tracer des lignes

Message non luPosté: 03 Aoû 2017, 14:19
de grosged
Si cela peut vous être utile, j'avais , l'an dernier, commencé à optimiser une routine de tracé de ligne :
voir viewtopic.php?f=12&t=18225#p199676

(mais ça ne gérait qu'un cas de figure)

Re: Problème avec une routine pour tracer des lignes

Message non luPosté: 03 Aoû 2017, 14:20
de MMBC
grosged j'avais vu, mais moi je voulais une qui gère tout les cas :P