Bonjour,
Je suis en train de faire le tuto Pépin OS, et je bute sur un truc...
kernel.c :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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 C : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
J'ai l'impression que c'est le linkage qui ne va pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Quelqu'un pourrait m'éclairer svp ?
Partager