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/ |