1

Voilà, j'avais voulu me remettre à F-Zero ce soir, mais en essayant de recompiler (avec GCC sur PC), je me rends compte que ça marche plus ; et j'ai bien l'impression que ça vient d'un bug de ma version de GCC...

Mettez ça dans bug.c :
#define vs_tile 8
#define vs_ntiles 42
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef signed char s8;
typedef signed short s16;
typedef signed int s32;
extern int vs_xpos,vs_ypos;
extern const int vs_diff_corner[12];
extern const int vs_diff_line[12];
u8 *pixels;
int w,h;

typedef u8 vs_line[256];
vs_line _vscreen[256];
#define vscreen (_vscreen+128)


#ifndef nkop
extern int nkop;
#endif
void Mode7_UpdateVscreen(u32 xpos,u32 ypos) {

#if vs_tile==8
#define _put_tile(fx,fy) \
    do { \
	u32 *src = (u32 *)&((u8 *)pixels)[							\
		(n_ypos+(y^fy))*vs_tile*w+(n_xpos+(x^fx))*vs_tile				\
	];												\
	u32 *dst = (u32 *)&vscreen[(s8)((nkop+n_ypos+(y^fy))*vs_tile)][(u8)((n_xpos+(x^fx))*vs_tile)];	\
	for (int n=8;n--;src+=w/4,dst+=256/4)						\
		dst[0]=src[0], dst[1]=src[1];								\
    } while (0)
#endif

    int x,y;
    xpos>>=16; ypos>>=16;
    u16 n_xpos = (u32)(xpos+vs_tile/2)/vs_tile - vs_ntiles/2,
	n_ypos = (u32)(ypos+vs_tile/2)/vs_tile - vs_ntiles/2;
    s16 dx = n_xpos-vs_xpos, dy = n_ypos-vs_ypos;
    vs_xpos = n_xpos, vs_ypos = n_ypos;
    s16 fx = 0, fy = 0;
    if (dx>0)
	dx=-dx, fx=vs_ntiles-1;
    if (dy>0)
	dy=-dy, fy=vs_ntiles-1;
    dx=dy=42;
    if (dx==-1 && dy==-1) {
	const int *diff_ptr = vs_diff_corner;
	int n = 25; // number of lines in vs_diff_corner
	y = 0;
	while (n--) {
	    while ((x = *diff_ptr++)>=0)
		_put_tile(fx,fy);
	    y++;
	}
    } else if (!dx && dy==-1) {
	const int *diff_ptr = vs_diff_line;
	for (x=0;x<vs_ntiles;x++) {
	    y = *diff_ptr++;
	    _put_tile(0,fy);
	}
    } else if (dx==-1 && !dy) {
	const int *diff_ptr = vs_diff_line;
	for (y=0;y<vs_ntiles;y++) {
	    x = *diff_ptr++;
	    _put_tile(fx,0);
	}
    } else if (dx || dy)
	for (y=0;y<vs_ntiles;y++)
	    for (x=0;x<vs_ntiles;x++)
		_put_tile(0,0);
#undef _put_tile
}

puis dites-moi si vous voyez une différence entre le code généré par
gcc -O2 --std=c99 -S bug.c
et
gcc -O2 --std=c99 -Dnkop=0 -S bug.c

Dans les deux cas j'ai bien l'impression que c'est le même code buggé, alors que si on fait
gcc -O2 --std=c99 -Dnkop=42 -S bug.c
ou à peu près n'importe quelle valeur non nulle à la place de 42 le code est, cette fois-ci, correct... (et donc différent)


PS : pour les curieux, gcc --version me renvoie "gcc (GCC) 3.3.3 (cygwin special)"

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

2

Chez moi ça fonctionne correctement. gcc 3.3.5 (Debian 1:3.3.5-8)

3

Et visiblement les release 3.3.4 et 3.3.5 de gcc sont des release corrigeant des bugs, mais n'ajoutant aucun fonctionnalité. Il est possible que ton problème en fasse partie.

4

Et évidemment Cygwin n'a pas de package pour gcc 3.3.[45] vtff
Je suis passé à gcc 3.4.1, ça corrige le bug, mais c'est sans doute encore plus buggé neutral c'est chiant à compiler, gcc ?

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

5

euh c'est long surtout. tant que tu fais pas un cross compilateur il me semble que ça se passe relativement bien.

6

>Je suis passé à gcc 3.4.1, ça corrige le bug, mais c'est sans doute encore plus buggé
Pourquoi ?

>c'est chiant à compiler, gcc ?
tar zxf gcc-VERSION.tar.gz
cd gcc-VERSION
mkdir obj
cd obj
../configure --prefix=/local/

Mais avec cygwin et ses surcapactes avec les scripts tu en as pour 1 jour smile

7

PpHd :
>Je suis passé à gcc 3.4.1, ça corrige le bug, mais c'est sans doute encore plus buggé Pourquoi ?

Parce que c'est une version x.x.1 ? Ou alors gcc ne fournit pas de version stable et les bugs comme celui de ./1 sont inévitables, mais ce serait assez étonnant...
>c'est chiant à compiler, gcc ?
tar zxf gcc-VERSION.tar.gz
cd gcc-VERSION
mkdir obj
cd obj
../configure --prefix=/local/

Mais avec cygwin et ses surcapactes avec les scripts tu en as pour 1 jour smile

Et y a pas des milliards de packages différents, genre gcc-frobnication-tools qui doit avoir exactement la même version que gcc sous peine de bugs subtils ?

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

>Parce que c'est une version x.x.1 ? Ou alors gcc ne fournit pas de version stable et les bugs comme celui de ./1 sont inévitables, mais ce serait assez étonnant...
Pas forcement. M'enfin pourquoi pas 3.4.3 ?

>Et y a pas des milliards de packages différents, genre gcc-frobnication-tools qui doit avoir exactement la même version que gcc sous peine de bugs subtils ?
Non (il est tres flexible - si tu as les binutils ca sera mieux, mais il fait sans), mais tu peux limiter a compiler seulement le front-end C.

9

PpHd :
>Parce que c'est une version x.x.1 ? Ou alors gcc ne fournit pas de version stable et les bugs comme celui de ./1 sont inévitables, mais ce serait assez étonnant... Pas forcement. M'enfin pourquoi pas 3.4.3 ?

Parce que y a pas de package Cygwin pour tripaf
>Et y a pas des milliards de packages différents, genre gcc-frobnication-tools qui doit avoir exactement la même version que gcc sous peine de bugs subtils ?
Non (il est tres flexible - si tu as les binutils ca sera mieux, mais il fait sans), mais tu peux limiter a compiler seulement le front-end C.

OK, v voir smile

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

10

> Parce que y a pas de package Cygwin pour
cygwin = tripaf !