[TUTO] Blitter

Bah, tout est dit non ?

[TUTO] Blitter

Messagede leglod » Mar 18 Nov 2008 20:57

Salut, qui veux m'aider a pondre un Tuto sur le Blitter ?

Il faut savoir qu'avec la fonction rc-copy un programme GFA passera par le Blitter si celui ci est present sur la machine et qu'il est activer!
Si on place l'executable dans le dossier Auto le blitter n'est pas activer , donc dans le GFA (version a verifier) y a une commande tout bete pour l'activer !
Xbios(64,x)
x=1 ON
x=2 OFF

Il peut etre utiliser void xbios ou ~xbios mais je ne me rappel plus a quoi ser le Void lol merci de me le rappeler !

Par la suite on parlera de la programmation direct du Blitter a grand coup de POKE , mais la j'ai aussi besoin d'aide pour etre le plus complet possible car depuis le temps j'ai pratiquement tout oublier et malgre les sources et tuto diverse il y a des chose a savoir surtotu si on utilise un Hardscroll horizontal sur STE !

Merci aussi de me corriger si j'ecrie des betises ;)

Edit 19/11/2008
J'ai trouver sur le net un exemple d'utilisation du Blitter pour afficher un bloc de 32x32 pris dans une image *.NEO !
Code: Tout sélectionner
'
' Sprite example with Blitter
' by ggn / Paradize
'
' Use at your own risk!
'
' *.NEO picture shall contain a 32x32 sprite in the upper left corner
'
FILESELECT "\*.neo","",f$
' f$="C:1.neo"
'
DIM x%(8032)
s%=V:x%(0)
BLOAD f$,s%
ADD s%,4
FOR i=0 TO 32
  a$=a$+CHR$(PEEK(s%+i))
NEXT i
~XBIOS(5,L:-1,L:-1,0)
~XBIOS(6,L:V:a$)
ADD s%,124
'
xb=XBIOS(2)
'
s_x_inc=&HFF8A20
s_y_inc=&HFF8A22
s_hw=&HFF8A24
s_lw=&HFF8A26
end_1=&HFF8A28
end_2=&HFF8A2A
end_3=&HFF8A2C
d_x_inc=&HFF8A2E
d_y_inc=&HFF8A30
d_hw=&HFF8A32
d_lw=&HFF8A34
x_cnt=&HFF8A36
y_cnt=&HFF8A38
hop=&HFF8A3A                    !Byte
op=&HFF8A3B                     ! >>
skew=&HFF8A3D                   ! >>
blit=&HFF8A3C
'
PBOX 0,0,50,50
SDPOKE x_cnt,3
SDPOKE s_x_inc,8
SDPOKE s_y_inc,144
SDPOKE d_x_inc,8
SDPOKE d_y_inc,144
'
' Create mask
'
SDPOKE end_1,&HFFFF !endmasks
SDPOKE end_2,&HFFFF
SDPOKE end_3,&HFFFF
SPOKE skew,0        !no shift
SPOKE hop,2         !hog mode
SPOKE op,15         !fill with 1s destination addr
SLPOKE s_hw,s%      !source - irrelevant
SLPOKE d_hw,s%+32   !dest - mask addr
SDPOKE y_cnt,32     !32 scan lines
SPOKE blit,192      !go baby go!
SPOKE op,4          !not src and dest - make mask ;)
FOR i=0 TO 6 STEP 2
  SLPOKE s_hw,s%+i
  SLPOKE d_hw,s%+32
  SDPOKE y_cnt,32
  SPOKE blit,192
NEXT i
DO
  VSYNC
  j=STICK(1)
  IF BTST(j,1) AND y1<169
    ADD y1,1
  ENDIF
  IF BTST(j,0) AND y1>0
    SUB y1,1
  ENDIF
  IF BTST(j,3) AND x1<289
    ADD x1,1
  ENDIF
  IF BTST(j,2) AND x1>0
    SUB x1,1
  ENDIF
  x=x1 MOD 16
  y=y1*160+(x1\16)*8
  SDPOKE end_1,SHR(&HFFFF,x)
  SDPOKE end_2,&HFFFF
  SDPOKE end_3,NOT SHR(&HFFFF,x)
  SPOKE skew,x
  SPOKE hop,2
  SPOKE op,1            !AND the mask
  FOR i=0 TO 6 STEP 2
    SLPOKE s_hw,s%+32
    SLPOKE d_hw,xb+i+y
    SDPOKE y_cnt,32
    SPOKE blit,192
  NEXT i
  SPOKE op,7            !OR the sprite data
  FOR i=0 TO 6 STEP 2
    SLPOKE s_hw,s%+i
    SLPOKE d_hw,xb+i+y
    SDPOKE y_cnt,32
    SPOKE blit,192
  NEXT i
LOOP UNTIL MOUSEK OR INKEY$<>""
Dernière édition par leglod le Mer 19 Nov 2008 22:02, édité 1 fois.
Avatar de l’utilisateur
leglod
 
Messages: 182
Inscription: Jeu 6 Nov 2008 22:33
Localisation: Montpellier (34) sud France

Re: [TUTO] Blitter

Messagede ColdFire » Mer 19 Nov 2008 00:57

Le VOID (~) remplace une variable ou la fonction PRINT quant il y a une valeur de renvoyée par la fonction et qu'en l'occurrence on n'en a pas besoin.

Par exemple :

PRINT INP(2) >> Attend l'appuie sur une touche et imprime à l'écran sa valeur ASCII.
~INP(2) >> Attend l'appuie sur une touche sans tenir compte de la valeur renvoyée.


Voilà à quoi sert le VOID ;)



ColdFire
«On commence par dire: cela est impossible pour se dispenser de le tenter, et cela devient impossible, en effet, parce qu'on ne le tente pas.» Charles Fourier
Avatar de l’utilisateur
ColdFire
 
Messages: 24
Inscription: Mer 5 Nov 2008 23:58

Re: [TUTO] Blitter

Messagede Rajah » Mer 19 Nov 2008 09:22

Le void provient d'autres langages (le C en particulier) : c'est pour utiliser une FUNCTION qui retourne toujours une valeur (contrairement à une PROCEDURE), mais dont on se fout de la valeur de retour.
Au lieu de faire dummy%=XBIOS(machin), qui coûte le temps de l'affectation à la variable dummy%, on lui dit de la mettre dans VOID ou ~ : c'est beaucoup plus rapide, cela revient à dire "je m'en branle de ta valeur de retour, tu la jettes".

épicétou.
Rajah
 

Re: [TUTO] Blitter

Messagede tomchi » Jeu 20 Nov 2008 08:26

Ouais, j'avais essayé ce code de ggn, bien content de trouver des sources gfa pour le blitter.
De mémoire, il me semble que sa routine ne sauve pas de fond, donc ok si tu bouges le sprite sur un fond vide, et je crois que j'avais bataillé un peu sur le passage où il crée le masque ....


@Leglod: Très bonne idée de vouloir faire un tuto sur l'utilisation du hardware du STE : Blitter et hardscroll. J'ai déplacé ton post ici, parce qu'il y avait plus de questions dans ton posts que d'élements sur le Blitter.
Par contre STP ! Un tuto se doit d'être clair et explicatif etc ... Si c'est juste pour balancer 2 tips et 3 sources, ya d'autres rubriques pour ça ... :twisted:

Pas obligé non plus de faire tout le tuto dans un seul thread: tu/on peut faire comme shadow, cad diviser en plusieurs parties dont on fera un index qui sera posté en annonce :D

Commence par un joli post bien lèché d'introduction au STE, dans le genre une traduction de http://atari-ste.anvil-soft.com/html/devdocu1.htm . Pose des bases, instaure des règles que tu suivra tout au long de ton tuto pour faciliter sa compréhension par les autres . Par exemple, perso au début de mes programmes qui utilisent le blitter, je crée une variable pour chaque adresse des registres du blitter : il est plus simple de se rappeler/comprendre par ex ce que fera CARD{xcount%} plutôt que CARD{$FFFF8A36} ...
Avatar de l’utilisateur
tomchi
Administrateur du site
 
Messages: 342
Inscription: Mer 15 Oct 2008 20:51

Re: [TUTO] Blitter

Messagede leglod » Jeu 20 Nov 2008 09:11

Ouep je sais que j'ai foutu un peut le bordel, mais comme les trucs me revienne en tete petit a petit , j'ai voulu dans un premier temps cree les topics pour les completer et le ameliorer au fur et a mesure !

Pour le Blitter a l'epoque j'avais fini par comprendre en partie comment il fonctionner, d'ailleur un de mes jeux l'utilise beaucoup avec sauvegarde du fond et restitution pour les sprites avec masque et tout le bordel en plus sur un scroll hard du ste sur 4 ecran, mine de rien c'est un poil plus compliquer qu'un bete sprite de 32x32 sur un fond normal, mais le listing plus haut est sympa car c'est une bonne base de depart !

Par contre on me la dis mais je ne comprend toujours pas a quoi sers ou plutot comment on se sert du half-tone et a quoi sers le endmask ? Ca veut pas rentrer :mrgreen:
Avatar de l’utilisateur
leglod
 
Messages: 182
Inscription: Jeu 6 Nov 2008 22:33
Localisation: Montpellier (34) sud France

Re: [TUTO] Blitter

Messagede sporniket » Mer 26 Nov 2008 23:14

Petite précision sur la différence entre VOID et ~, tiré de mon manuel (GFA Basic 3.0 de micro application) : VOID effectue une conversion de la valeur en nombre réel, alors que ~ ne le fait pas.

Autrement dit, si la fonction dont on veut ignorer le résultat est un entier, il vaut mieux utiliser ~, car VOID fera une conversion superflue. (Par contre le manuel est muet sur la situation inverse : si on utilise ~ avec une fonction qui renvoie un nombre en virgule flottante, y a-t-il conversion en entier ?)

Pour la routine de ggn/Paradize, je déduis de la foule de M. Spoke qu'on utilise directement les registres systèmes, non ?
----
Fonte Sporniket Nostalgie Sans v9.08
Sporniket

Busy coding... lib gfx−60% ; streams−34%
Avatar de l’utilisateur
sporniket
 
Messages: 112
Inscription: Dim 23 Nov 2008 23:00
Localisation: paris

Re: [TUTO] Blitter

Messagede leglod » Jeu 27 Nov 2008 09:08

Interessent, un petit benchmark pour voir si ~ est plus rapide que le VOID !
Avatar de l’utilisateur
leglod
 
Messages: 182
Inscription: Jeu 6 Nov 2008 22:33
Localisation: Montpellier (34) sud France

Re: [TUTO] Blitter

Messagede sporniket » Sam 29 Nov 2008 01:42

J'ai pris le temps de faire le benchmark, en piece jointe. Le benchmark compare d'une part void et ~ pour l'appel d'une fonction retournant un entier (clause de compilation "$F%" en premiere ligne de la fonction), d'autre part les meme void et ~ pur l'appel d'une fonction renvoyant un flottant (0.5).

Le nombre d'iteration est très gros pour que les temps soient mesurables sur mon portable sous aranym.

Voici les resultats que j'obtiens:
[INFO ] [29.11.2008 01:24:10] ================================

[INFO ] [29.11.2008 01:24:10] == DEBUT DE PROGRAMME ==

[INFO ] [29.11.2008 01:24:10] ================================

[INFO ] [29.11.2008 01:24:30] Temps de la boucle = 354

[INFO ] [29.11.2008 01:24:30] Temps de void @fonction_int = 286

[INFO ] [29.11.2008 01:24:30] Temps de ~@fonction_int = 274

[INFO ] [29.11.2008 01:24:30] Temps de void @fonction_flt = 318

[INFO ] [29.11.2008 01:24:30] Temps de ~@fonction_flt = 1066

[INFO ] [29.11.2008 01:24:30] --------------------------------

[INFO ] [29.11.2008 01:24:30] -- FIN --

[INFO ] [29.11.2008 01:24:30] --------------------------------



Pour une fonction entière, le gain de temps existe mais n'est pas non plus énorme (5% sur mon test), par contre la différence pour une fonction flottante est importante.

edit:orthographe
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
----
Fonte Sporniket Nostalgie Sans v9.08
Sporniket

Busy coding... lib gfx−60% ; streams−34%
Avatar de l’utilisateur
sporniket
 
Messages: 112
Inscription: Dim 23 Nov 2008 23:00
Localisation: paris

Re: [TUTO] Blitter

Messagede Strider » Dim 15 Mar 2009 22:36

Leglod : puisqu'on parle d'optimisation, je t'encourage à remplacer SPOKE, SDPOKE et SLPOKE par des équivalents plus rapides (BYTE, WORD, LONG). Bien sur, il faut passer en superviseur avant.
Strider
 
Messages: 25
Inscription: Sam 18 Oct 2008 16:22

Re: [TUTO] Blitter

Messagede leglod » Dim 15 Mar 2009 23:50

Surtout en faisant des spoke ! :lol:
Avatar de l’utilisateur
leglod
 
Messages: 182
Inscription: Jeu 6 Nov 2008 22:33
Localisation: Montpellier (34) sud France

Suivante

Retourner vers Questions/aide

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron