CPC Rulez
https://cpcrulez.fr/forum/

Aide sur un code ASM
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=6968
Page 1 sur 1

Auteur :  stephbb75 [ 23 Jan 2024, 23:50 ]
Sujet du message :  Aide sur un code ASM

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

Auteur :  marcel [ 24 Jan 2024, 08:09 ]
Sujet du message :  Re: Aide sur un code ASM

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_:

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/