Inscription : 05 Août 2011, 14:38 Message(s) : 194
Ld a,2. ; sélection pen Call &bbde Ld de,0000 ; position plot x Ld hl,398 ; position plot y Call &bbc0 Ld de,0000 ; position draw x Ld hl,372. ; position draw y Call &bbf6 Ret
Maintenant je termine la routine qui ne marche toujours pas...
Quelqu'un ose-t-il découvrir pourquoi ?
Code :
; function plot mode 0 > ix = {x,y,col} fplot: ld ix,_point ld iy,tbl_col ld de,#C000 ; y = 199 ;ld a,(ix+01) ; a = y ld a,(ix+00) ; a = x push af sra a ; x/2 = byte screen (64 bytes) ld l,a xor a ld h,a add hl,de ; byte adress screen pop af bit 0,a ; left pixel ? jr nz,fplot_rg ld a,#55 ; yes left jp fplot_lf fplot_rg: ld a,#AA ; right pixel fplot_lf: ld (fplot_lr+01),a ld a,(hl) ; previous byte value fplot_lr: and #00 ; mask left or right ld a,(ix+02) ; a = col and #0F ; tbl_col range 0-15 ld (fplot_cl+02),a fplot_cl: or (iy+00) ; 00 = offset tbl_col ld (hl),a ; plot pixel ret
_point: db 0,199,12
tbl_col: db 0,2,8,10,32,34,40,42,128,130,136,138,160,162,168,170
La routine ci-dessus tente de peindre un pixel en fonction des données du pointeur "point :"
Routine:
1. Prenez la coordonnée x
2. Calculez à quel octet correspond cette coordonnée, #C000+offset.
3. C'est pair ou impair ?. Pair = masque #55. Impair = #AA.
4. Prenez le valeur qui se trouve dans l'octet calculé et applique le masque déterminé.
5. Prenez la couleur à peindre et recherchez dans la table des couleurs (0-15) la valeur qui lui est attribuée et effectuez une opération OR avec ce qui précède.
6. Le résultat est appliqué et le pixel aura été peint.
Mais comme je l'ai déjà dit, quelque chose ne va pas.
fplot: ld ix,_point ; point {x,y,cl} ld iy,tbl_cl ld a,(ix+02) ; a = col and #0F ; tbl_col range 0-15 sla a ld (fplot_cl+02),a ld a,(ix+01) ; a = y ld l,a xor a ld h,a add hl,hl ld de,lines ; adr_scr add hl,de ; offset + adr_scr = screen ld a,(hl) ; low byte screen ld e,a inc hl ld a,(hl) ; high byte screen ld d,a ld a,(ix+00) ; a = x push af sra a ld l,a xor a ld h,a add hl,de ; byte screen pop af bit 0,a ; left pixel ? jr nz,fplot_rg ld a,#55 ; yes left jp fplot_lf fplot_rg: ld a,(fplot_cl+02) inc a ld (fplot_cl+02),a ld a,#AA ; right pixel fplot_lf: ld (fplot_lr+01),a ld a,(hl) ; previous byte value fplot_lr: and #00 ; mask left or right fplot_cl: or (iy+00) ; 00 = offset tbl_col ld (hl),a ret
_point: db 0,0,12
tbl_cl: db 0,0,2,1,8,4,10,5,32,16,34,17,40,20,42,21,128,64,130,65,136,68,138,69,160,80,162,81,168,84,170,85
ld a,12 ld (_point+02),a ; couleur ld b,127 line_1: push bc ld a,127 sub b ld (_point+00),a ; x ld a,b ld (_point+01),a ; y call fplot pop bc djnz line_1
Vous n’êtes pas autorisé(e) à consulter les fichiers insérés à ce message.
Sans essayer de comprendre ce que fait exactement la routine, il y a quelque chose qui saute aux yeux, tu n'utilises pas les registres B et C. Du coup, on peut soit s'en servir pour dégager le registre IX qui est lent, soit par exemple se servir de ces registres pour stocker une valeur. Un 0 par exemple pour remplacer les séquences
XOR A LD H,A en LD H,C
Ca peut aussi servir à virer les séquences PUSH AF POP AF
en
LD C,A LD A,C
Il faut ensuite déterminer quel est le meilleur usage qu'on peut faire de ces deux registres. Un calculateur de NOP aide bien pour ce genre d'optimisation .
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité
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