Inscription : 05 Avr 2012, 08:02 Message(s) : 112 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
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_:
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 5 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