On commence par ce point qui est quand même fondamentale je pense, d'abord parce que 512 octets (boot sector) pour tout mettre et puis aussi parce que ca peut aussi servir a lancer vos programmes qui tourneront sur votre OS.
Voici un code chargeant un kernel en mémoire et le lançant
On fait un jmp dword parce que l'on renseigne le segment et l'offset puisque que le kernel n'est pas dans le même segment que le boot sector => 32bits.
%define BASE 0x100
%define KSIZE 2 ; Nombre de secteurs de 512 octets a charger
[BITS 16]
[ORG 0x0]
mov [bootdrv], dl ; Recuperation de l'unite de boot
; Initialisation des segments en 0x07C0
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov ax, 0x8000 ; Stack en 0xFFFF
mov ss, ax
mov sp, 0xf000
; Charger le noyau
xor ax, ax
int 0x13
push es
mov ax, BASE ; L'int 13h charge le(s) secteur(s) en es:bx
mov es, ax
mov bx, 0
mov ah, 2 ; Fonction de lecture
mov al, KSIZE
mov ch, 0 ; Numéro de piste
mov cl, 2 ; Numéro du secteur de départ pour la lecture
mov dh, 0 ; Numéro de face
mov dl, [bootdrv] ; Numéro du lecteur
int 13h
pop es
; Saut vers le kernel
jmp dword BASE:0
times 510-($-$$) db 0
dw 0xAA55
| Numéro | Mode | Résolution | Addr départ |
| 00h | texte | 40*25*2 | B8000h |
| 01h | texte | 40*25*16 | B8000h |
| 02h | texte | 80*25*2 | B8000h |
| 03h | texte | 80*25*16 | B8000h |
| 04h | graph | 320*200*4 | B8000h |
| 05h | graph | 320*200*4 | B8000h |
| 06h | graph | 640*200*2 | B8000h |
| 07h | graph | ? | ? |
| 08h | graph (pcjunior) | 160*200*16 | ? |
| 09h | graph (pcjunior) | 320*200*16 | ? |
| 0Ah | graph (pcjunior) | 640*200*4 | B8000h |
| 0Dh | graph (EGA) | 320*200*16 | B8000h ? |
| 0Eh | graph (EGA) | 640*200*16 | A0000h |
| 0Fh | graph (EGA) | 640*250*2 | A0000h |
| 10h | graph (EGA) | 640*350*16 | A0000h |
| 11h | graph (MCGA) | 640*480*2 | A0000h |
| 12h | graph (VGA) | 640*480*16 | A0000h |
| 13h | graph (MCGA) | 320*200*256 | A0000h |
Nous verrons ici les modes 03h et 13h
Les données sont stockées en 0xB800:0x0 comme suit
mov ax, 0003h
int 10h
call screeclean
; Fonction qui rempli l'écran en bleu
screenclean:
push bx
mov bx, 0B800h ; Emplacement mémoire
mov es, bx
mov ah, 20h ; Couleur de fond 2(bleu) et couleur caractere 0(noir)
xor bx, bx ; On commence en 0xB800:0x00
.scdebut:
cmp bx, 4000 ; 80 (horizontal) *25 (vertical) *2 (caractere + couleurs) = 4000 octets
jz .scfin
mov al, ' ' ; Le caractere
mov [es:bx], ax ; Ecriture de ah (caractere) et al (couleurs)
add bx,2 ; On recule de deux octets
jmp .scdebut ; Et c'est reparti
.scfin:
pop bx
ret
Les données sont stockées en 0xA000:0x0. L'équation pour l'adresse d'un point est :
A000h:((320*Y)+X) : bien que les parenthèses sont inutiles autour de la multiplication elle peuvent vous aidez à compredre, elle symbolise le nombre de pixels des lignes precedentes et le +X est le nb de pixels restant sur la ligne du point.
mov ax, 0013h
int 10h
call writepoint
; Ecrit un point sur l'écran en (10;10)
writepoint:
mov ax, 0A000h
mov es, ax
mov bx, 3210
mov [es:bx], 2C ; Le point est de couleur 2C
ret
Pour toutes questions le forum est à votre disposition !
Vous pouvez retrouver cet article sur Informatips.