+-----+--------+----------+-------------------------------+
| 002 | coding | An-Mojeg | an-mojeg@mail-developpeur.com |
+-----+--------+----------+-------------------------------+

Cration d'un systme d'exploitation (OS) - premire partie (disquette boot) -
##############################################################################

Introduction
------------
	Bon je prvient tout l'monde la construction d'un systme d'exploitation est extrmement ardue
donc va falloir vous accrocher, je ne compte pas construire un Windows NT version An-Mojeg ou bien un
nouveau linux je veux juste faire un petit truc tout simple.
	Le noyau que j'ai dcid de construire s'appellera HykOS, il ne tiendra seulement sur une seule
disquette et s'executera a partir de celle-ci.
	Je tien a prciser que des connaissances en ASM sont IMPERATIVES, huh vous avez aussi besoin 
d'un bon stock de disquettes :).

Thorie
-------
	Alors dj que se passe-t-il lorsque nous mettons une disquette quelconque dans le lecteur
puis que nous dmarrons la becane ... si c'est une disquette banale il nous envera chier avec un message
style "DISK ERROR REPLACE SYSTEM DISK ..." bref a lui va pas par contre quand il lance une disquette boot
l ya pas de problem ... ?
	Sachant que c'est le bios qui ragit a tout a analysons sont comportement lors de la prsence d'une
disquette dans le lecteur :

	- Il charge le secteur boot de la disquette (secteur 1, piste 0, tte 0)  l'adresse 07C00 jusqu'
07DFF, 512 bytes (un secteur, le secteur boot d'ailleur ;) ).

	- Ensuite il vrifie si  l'adresse 07DFE il trouve la combinaison 'magique' (celle qui dfinit une 
disquette comme tant une disquette boot ou pas) : AA55.
Donc pour qu'une disquette soit considre comme disquette boot il faut que sur son secteur boot il y figure
AA55  son offset 001FE.
					07C00 + 001FE = 07DFE !!!

	- Finalement le bios laisse la place au programme contenu dans le secteur boot en effectuant un jump 
sur l'adresse :
						0000:7C00

Pour info voil l'tat des registres aprs cette opration :
	Le registre DL contient 00 car il s'agit de la disquette (80h si il s'agisait du disque dur, h oui c
le mme principe que pour le disque dur).
	Le registre CS contient 00.
	Le registre IP contient 0x7C00 (l'adresse en mmoire du secteur).

Notre but
---------
	Faire en sorte que lorsque nous introduisons une disquette au dmarrage il figure un texte a l'cran.

Pratique
--------
	Let's go, comme vous vous en doutez on va pas coder notre ptit secteur boot en VB donc laisson la place
 l'ASM. On va quand mme d'abord commencer a se faciliter la vie en creant un ptit outils qui va me servir
a crire notre secteur sur le secteur 1, piste 0, tte 0 d'une disquette puissque si on copie-colle simplement
les donnes sous explorer il nous fait n'importe quoi donc faisont tout nous mme :).
	Voici le code source du programme d'ecriture (en Borland C++):

//------------------------------------------------------------------------------
//
//	Rawthat v0.1 - Permet d'crire le contenu d'un fichier sur le secteur
//	boot d'une disquette.
//		Veillez bien a entrer une disquette avant de lancer le prog.
//------------------------------------------------------------------------------
#include <bios.h>
#include <stdio.h>

#define secteur_size		512

#define CMD_W		3
#define CMD_V		4
#define DRIVE  	0
#define HEAD   	0
#define TRACK  	0
#define SECT   	1
#define NSECT  	1

void main (int argc, char *argv[])
{
	FILE *fin;
	char secteur[secteur_size] = "";

	if(argc!=2){
		printf("USAGE : rawthat [FICHIER A INSCRIRE]");
		return;
	}

	if((fin = fopen(argv[1],"r")) == NULL){
		printf("Veuillez fournir un nom de fichier existant.");
		return;
	}

	if(fread(&secteur,secteur_size - 1,NSECT,fin) != 1){
		printf("Impossible de lire a partir du fichier.");
		return;
	}

	printf("Ecriture du secteur ... ");

	if(biosdisk(CMD_W,DRIVE,HEAD,TRACK,SECT,NSECT,secteur) != 0x00){
		printf("Erreur lors de l'accs au disque.");
		return;
	}

	printf("OK.");

	fclose(fin);

	return;
}
//------------------------------------------------------------------------------

	Bon ben maintenant faut qu'on s'attaque a notre secteur boot, il va rappelons juste crire
une chane de caractres a l'cran, il vous faut quand mme savoir qu'aux moment de l'execution rien
n'est charg en mmoire a part notre prog donc tchao les intruptions dos qui facilite la vie de 
tout l'monde :) mais bonjour les belles interuptions BIOS !! Ici j'ai utilis l'assembleur qui convenait
mieu a la situation NASM qui est disponible a peu prs partout en free. Je vous explique pas  pas
ce que va faire le programme :

	-	tout d'abord il va initialiser les segments en 07C00 (data et stack(dbut de la pile 
et fin de la pile))
	-	il va ensuite nous afficher notre chane de caractres grace a 
l'interuption 0x10 fonction 0x0E :
			Entre :
				AH 	= 0Eh
				AL 	= Code ASCII du caractre
				BL 	= Couleur de premier plan du caractre (en mode graphique uniquement)
	-	puis il va nous faire une boucle sans fin pour faire patienter le systme et voil voil :)

Bon ben je crache tout de suite le code :

;-----------------------------------------------------------------------------------------------------
;	HykOS v0.1b - Secteur boot par An-Mojeg
;
;							Mails : an-mojeg@mail-developpeur.com
;-----------------------------------------------------------------------------------------------------
[BITS 16]
[ORG 0x0]
;--------------------------------------------------> Initialisation des segments
	mov	ax,0x07C0	; \
	mov	ds,ax		;  > ces trois oprations indiques la zone de mmoire ou se situe le seg de donnes	
	mov	es,ax		; /
	mov	ax,0x8000	; \
	mov	ss,ax		;  >	initialisation du stack (de la pile) segment de pile : 0x80000 et pointeur de pile 0xF000
	mov	sp, 0xf000	; /  	la pile commence donc en 0x8F000 et finit en 0x80000
;<------------------------------------------------------------------------------	
	jmp	start		; on saute directement au code
;----------------------------------------------------> Notre chane de caractre
	welcome		db		"Welcome to HykOS v0.1b by An-Mojeg",0
;<------------------------------------------------------------------------------

start:

;################################### AFFICHE LE MESSAGE
	mov	si,welcome

afficher:
	lodsb
	mov	ah, 0Eh
	push	ax
	int 	10h
	pop	ax
	cmp	al, 0
	jne	afficher
;######################################################

;####################################### BOUCLE INFINIE	
boucle:
	jmp	boucle
;######################################################

;rempli le reste du fichier (secteur) par des nops et finit par le Magic Offset
	times 510-($-$$) db 144
	dw 0xAA55
;-----------------------------------------------------------------------------------------------------
	A mon avis le code est assez explicite et n'as donc pas besoin de plus amples explications
(sinon mail).

Conclusion
----------
	Ben voil on  finit notre premier secteur c'est pas mal :) Reste plus qu'a faire le reste ...
le plus dur koi :). Si vous n'avez pas compris cet article relisez le plein de fois, cherchez de la docs
sur les points que vous ne comprenez pas et si le brouillard persiste mailez moi mais accrochez vous bien
pour bien attaquer la seconde partie de cette article.
	

An-Mojeg		[ an-mojeg@mail-developpeur.com ]