Index du forum




Un petit coup de main... Vous pouvez nous aider à mettre ce site à jour: n'hésitez pas à me contacter !!!

* Connexion   * Inscription

* FAQ
Nous sommes actuellement le 16 Juil 2025, 15:37

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Aide sur un code ASM

Modérateur: poulette73



Publier un nouveau sujet Répondre au sujet  Page 1 sur 1
 [ 2 message(s) ] 
  Aperçu avant impression Sujet précédent | Sujet suivant 
Auteur Message
stephbb75
 Sujet du message : Aide sur un code ASM
Message Publié : 23 Jan 2024, 23:50 
Hors-ligne
VIP
VIP

Inscription : 05 Avr 2012, 08:02
Message(s) : 185
Localisation : Sur terre, mais souvent dans les nuages !
Salut,

Je viens solliciter votre aide sur un code en ASM, je patauge dessus depuis plusieurs jours.
Je suis presque sur que c'est tout con, un gros truc que je ne vois pas !

Le code est fait pour tracer une ligne en utilisent l'algo de Bresenham.
Le code fonction très bien en mode 0.
Je tente de le faire fonctionner en mode 1 et la bas je bute :(

C'est la partie "Fast Plot for MODE 0" que je n'arrive pas a faire en mode 1
J'ai fait la même fonction toutes seul pour afficher un pixel en mode 1 et elle fonctionne très bien.
Par contre, la mettre dans se code cela ne fonctionne pas.
Je pense avoir faire une erreur dans un (ou plusieurs !) registres ou un truc du type.

Voici le code

Code :
   di
   ld(exith+1),sp  ; enregistrer SP pour restaurer à la sortie..

   ; on récupére les paramètres
   NOP
   NOP
   ld l,6(ix)
   ld h,7(ix)
   ld (x1),hl  ;x1

   ld e,4(ix)
   ld d,5(ix)
   ld (y1),de  ;y1

   ld l,2(ix)
   ld h,3(ix)
   ld (x2),hl  ;x2

   ld l,0(ix)
   ld h,1(ix)
   ld (y2),hl  ;y2
   NOP
   NOP

   ;   x1, y1 start point   0<x<159
   ;   x2, y2  end point    0<y<199

   or a
   sbc hl,de    ;  hl=y2-y1   
   bit 7,h
   jr z,gnp0
   xor a
   sub l
   ld l,a
   sbc a,a
   sub h
   ld h,a     ;  ABS hl
gnp0:
   ld (dy+1),hl      ; =ABS(DY)
   LD A,H
   CPL
   LD H,A
   LD A,L
   CPL
   LD L,A
   INC HL ; neg hl = -DY
   srl h
   rr l
   set 7,h ; keep negative HL
   ld(er+1),hl    ;  ER = -DY/2

   ex de,hl
   ld de,(y2+1)
   or a
   sbc hl,de   ; hl=y1-y2
   ld a,#34
   
   jr z,.+8
s0:
   ld a,#35  ; sy= DEC (HL) / if y1 - y2 <0  sy= INC (HL)
   ld (sy),a

   ld de,(x1+1)
   ld hl,(x2+1)
   or a
   sbc hl,de     ; hl=x2-x1
   bit 7,h
   jr z,gnp1
   xor a
   sub l
   ld l,a
   sbc a,a
   sub h
   ld h,a     ;  ABS hl
gnp1:
   ld sp,hl
   ld b,h
   ld c,l ; =ABS(DX) = BC = SP stack pointer !!!!!!

   ex de,hl
   ld de,(x2+1)
   or a
   sbc hl,de ;  HL=x1-x2
   ld a,#34
   
   jr c,.+4

s1:   
   
   ld a,#35  ; sx= DEC (HL) / if x1 - x2 <0  sx= INC (HL)
   ld (sx),a

   ld h,b
   ld l,c ;  HL=dx
   ld de,(dy+1)
   or a
   sbc hl,de    ; hl=dx-dy
   jr c,nex0    ; if dx-dy>0 (dx>dy)  [when nc]
   ld h,b
   ld l,c ; HL=dx
   srl h
   rr l
   ld (er+1),hl ; then er=dx/2

nex0:

DRLOOP:  ; main DRAWING loop
x1:
   ld de,#1
y1:
   ld hl,#1
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; c'est ici que je bloque !!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   ; Fast Plot for MODE 0 (ok fonctionne)
FPLOT_:
    LD A, L            ;A = Lowbyte Y
   AND #0x7
   LD H, A            ;= y MOD 8 to H
   XOR L            ;A = Bit 3..7 of Y
   LD L, A            ;= (Y\*8 to L
   LD C, A            ;store in C
   LD B, #0x60        ;B = &C0\2 = Highbyte Screenstart\2

   ADD HL, HL        ;HL * 2
   ADD HL, HL        ;HL * 4
   ADD HL, BC        ;+ BC = Startaddress
   ADD HL, HL        ;of the raster line

   ;Pour le mode 0
   SRL E            ;calculate X\2, because 2 pixel per byte, Carry is X MOD 2
   LD C, #0xAA            ;Bitmask for MODE 0 (10101010)

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; c'est la que je merde sur un truc !!!
; bien sur faut mettre le code pour le mode 0 en commentaire et dé-commenté celui ci
   ; Pour le mode 1
   ;LD A, E         ;octet bas de X dans A
   ;SRL D         ;calcule X\4, Car
   ;RR E         ;4 pixels par bit
   ;SRL E
   ;ADD HL, DE      ;+ HL = adresse du pixel à modifier
   ;LD C, #0x88      ;masque de bits pour le mode 1 (10001000)
   ;AND #3         ;A = X MOD 4 (00000011)

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; enfin je crois !
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    JR NC, NSHIFT_        ;-> = 0, no shift

SHIFT_:
     LD C, #0x55            ;other bitmask for right pixel (01010101)
NSHIFT_:
    ADD HL, DE        ;+ HL = Screenaddress
    LD A, (#0xB6A3)        ;get color mask
    XOR (HL)        ;XOR screenbyte
    AND C            ;AND bitmask
    XOR (HL)        ;XOR screenbyte
    LD (HL), a        ;new screenbyte

   ld hl,(x1+1)

; FIN Fast Plot for MODE 0


x2:
   ld de,#0
   or a
   sbc hl,de
   jr nz,nex1  ; CHECK if we reach the end???
   ld hl,(y1+1)
y2:
   ld de,#0
   or a
   sbc hl,de
   jr z,exith  ; if x1=x2 and y1=y2 then exit!!

nex1:
er:
   ld hl,#0
   ld b,h
   ld c,l     ; HL=ER=E2=BC
dy:
   ld de,#0   ; DE= DY
   add hl,sp    ; SP=DX
   bit #7,h
   jr nz,nex2    ; IF  E2+DX > 0  THEN ER = ER - DY
   ld h,b
   ld l,c
   or a
   sbc hl,de
   ld(er+1),hl  ; er = er -dy
   ld hl,(x1+1)
sx:
   .DB 0        ; X1 = X1 + SX

nex2:
   ld h,b
   ld l,c  ; HL=E2   DE=dy
   or a
   sbc   hl,de      ; IF E2 - DY < 0 THEN ER = ER + DX
   bit 7,h
   jr z,nex3
   ld hl,(er+1) 
   add hl,sp    ; SP=DX
   ld (er+1),hl         ; er = er+dx
   ld hl,(y1+1)
sy:
   .DB 0             ; Y1 = Y1 + SY

nex3:
   JP DRLOOP

exith:
   ld sp,#0
   ei


Si vous pouviez me débloquer.
Merci


Haut
 Profil  
 
marcel
 Sujet du message : Re: Aide sur un code ASM
Message Publié : 24 Jan 2024, 08:09 
Hors-ligne
Rulezzzz
Rulezzzz

Inscription : 26 Juil 2016, 13:06
Message(s) : 513
Localisation : Valence
La routine qui choisit le masque final ne gère toujours que deux cas alors que tu en auras 4, je te suggère d'utiliser une table contenant les 4 masques, plutôt que faire des tests

Il y a probablement d'autres soucis, si je te prends au pied de la lettre (rapport aux commentaires), il manque dans la routine mode 1 le calcul d'adresse

Tu peux déboguer le code en ajoutant un point d'arrêt et en traçant

Citer :
JR NC, NSHIFT_ ;-> = 0, no shift

SHIFT_:
LD C, #0x55 ;other bitmask for right pixel (01010101)
NSHIFT_:


Haut
 Profil  
 
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  Page 1 sur 1
 [ 2 message(s) ] 

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 10 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Aller vers :  
Powered by phpBB® Forum Software © phpBB Group
Traduit en français par Maël Soucaze.