Problème variable globales
Bonjour,
Je suis en train de faire le tuto Pépin OS, et je bute sur un truc...
kernel.c :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| extern void scrollup(unsigned int);
extern void print(char *);
extern char kY;
extern char kX;
extern char kattr;
void _start(void)
{
kY = 10;
kX = 10;
kattr = 15;
print("un message\n");
kattr = 0x4E;
print("un autre message\n");
//scrollup(2);
while (1);
} |
screen.c :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include "types.h"
#define RAMSCREEN 0xB8000 /* début de la mémoire vidéo */
#define SIZESCREEN 0xFA0 /* 4000, nombres d'octets d'une page texte */
#define SCREENLIM 0xB8FA0
// extern char kX;
// extern char kY;
char kX = 20; /* position courante du curseur à l'écran */
char kY = 17;
char kattr = 0x0F; /* attributs vidéo des caractères à afficher */
/*
* 'scrollup' scrolle l'écran (la console mappée en ram) vers le haut
* de n lignes (de 0 a 25).
*/
void scrollup(unsigned int n)
{
unsigned char *video, *tmp;
for (video = (unsigned char *) RAMSCREEN;
video < (unsigned char *) SCREENLIM; video += 2) {
tmp = (unsigned char *) (video + n * 160);
if (tmp < (unsigned char *) SCREENLIM) {
*video = *tmp;
*(video + 1) = *(tmp + 1);
} else {
*video = 0;
*(video + 1) = 0x07;
}
}
kY -= n;
if (kY < 0)
kY = 0;
}
void putcar(uchar c)
{
unsigned char *video;
int i;
if (c == 10) { /* CR-NL */
kX = 0;
kY++;
} else if (c == 9) { /* TAB */
kX = kX + 8 - (kX % 8);
} else if (c == 13) { /* CR */
kX = 0;
} else { /* autres caractères */
video = (unsigned char *) (RAMSCREEN + 2 * kX + 160 * kY);
*video = c;
*(video + 1) = kattr;
kX++;
if (kX > 79) {
kX = 0;
kY++;
}
}
if (kY > 24)
scrollup(kY - 24);
}
/*
* 'print' affiche à l'écran, à la position courante du curseur, une chaîne
* de caractères terminée par \0.
*/
void print(char *string)
{
while (*string != 0) { /* tant que le caractère est différent de 0x0 */
putcar(*string);
string++;
}
} |
J'ai beau changer les valeurs de kX, kY et kattr dans kernel.c, c'est comme si la fonction putchar (de screen.c) considérait qu'elles sont toujours à zéro...
C'est peut être ma façon de compiler / linker qui ne vas pas ?
Je compile comme ça :
Code:
1 2 3 4 5
| rm *.o floppyA.img
gcc -m32 -c screen.c
gcc -m32 -c kernel.c
ld -m elf_i386 -Ttext 1000 kernel.o screen.o -o kernel
cat bootsect kernel /dev/zero | dd of=floppyA.img bs=512 count=2880 |
J'ai l'impression que c'est le linkage qui ne va pas...
Quelqu'un pourrait m'éclairer svp ?