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

BASIC: plot x,y,couleur
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=6923
Page 1 sur 1

Auteur :  z80_1327 [ 04 Nov 2023, 21:49 ]
Sujet du message :  BASIC: plot x,y,couleur

Je souhaite connaître le code assembleur de l'instruction BASIC "plot x,y,couleur"

Surtout à cause de la façon dont il répartit les pixels dans le même octet d'écran.

Y a-t-il quelqu'un qui connaît le code ?

Merci.

Auteur :  hERMOL [ 04 Nov 2023, 21:54 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

Salut z80_1327,

Il y a pas mal d'articles sur le site, je te conseille de jeter un oeil sur ces liens :adrt:
https://cpcrulez.fr/coding_menu-RAM.htm
https://cpcrulez.fr/coding_ANTIBUG-01-s ... _ecran.htm
...

Auteur :  velus [ 05 Nov 2023, 12:13 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

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

En basic ça serait
plot 0,398
Draw 0,372,2

Auteur :  z80_1327 [ 05 Nov 2023, 22:05 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

Merci pour les contributions.

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

Auteur :  velus [ 06 Nov 2023, 14:44 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

Qu'est-ce que tu veux faire ?

Auteur :  z80_1327 [ 06 Nov 2023, 20:34 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

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.

Je vais relire > https://cpcrulez.fr/coding_ANTIBUG-01-s ... _ecran.htm

Auteur :  velus [ 07 Nov 2023, 03:52 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

Elle semble bien marcher. Un pixel s'affiche au dessus !

Auteur :  z80_1327 [ 08 Nov 2023, 23:01 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

Maintenant et terminé !!!

La routine consomme 96 cycles d'horloge.

peut-être que ça peut être accéléré ...

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

Auteur :  z80_1327 [ 09 Nov 2023, 19:48 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

Je joins une image de la fonction :)

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

Auteur :  markerror [ 10 Nov 2023, 21:12 ]
Sujet du message :  Re: BASIC: plot x,y,couleur

Bonsoir,

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 :-).

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