Gegurion
Casse Couille
Franchement, je comprends rien a tout ça, mais je te souhaite bon courage, et surtout bonne merde ! :-D
Pour en faire du papier toilette?PunkDeLuxe a dit:Si tu es sur Bruxelles, te conseillerais de te procurer les cours de l'ESI en Operating System
Bonne merte quand mm![]()
%define BASE 0x100
%define KSIZE 24 ;Nombre de secteur de 512 octets à charger
[BITS 16]
[ORG 0x0]
jmp start
%include "fonctions.asm"
bootdrv: db 0
;Messages
msg_start db 'Starting...',10,13,0
msg_loadk db 'Loading Kernel ...',10,13,0
start:
mov [bootdrv], dl
;Initialisation des segments en 0x07C0
mov ax, 0x07C0
mov ds, ax
mov es, ax
;Stack en 0xFFFF
mov ax, 0x8000
mov ss, ax
mov sp, 0xF000
;On affiche un message
mov si, msg_start
call print
;load:
xor ax, ax
int 0x13
push es
mov ax, BASE
mov es, ax
mov bx, 0
mov ah, 2
mov al, KSIZE
mov ch, 0
mov cl, 2
mov dh, 0
mov dl, [bootdrv]
int 0x13
pop es
;Initialisation du pointeur sur la GDT
mov ax, gdtend
mov bx, gdt
sub ax, bx
mov word [gdtptr], ax
xor eax, eax
xor ebx, ebx
mov ax, ds
mov ecx, eax
shl ecx, 4
mov bx, gdt
add ecx, ebx
mov dword [gdtptr+2], ecx
;Passage en pmode (Mode protégé)
cli
lgdt [gdtptr]
mov eax, cr0
or ax, 1
mov cr0, eax
jmp next
next:
mov ax, 0x10
mov ds, ax
mov fs, ax
mov gs, ax
mov es, ax
mov ss, ax
mov esp, 0x9F000
;saut vers le Kernel
jmp dword 0x8:0x1000
hang:
jmp hang
gdt:
db 0,0,0,0,0,0,0,0
gdt_cs:
db 0xFF,0xFF,0x0,0x0,0x0,10011011b,11011111b,0x0
gdt_ds:
db 0xFF,0xFF,0x0,0x0,0x0,10010011b,11011111b,0x0
gdtend:
gdtptr:
dw 0
dd 0
;NOP jusqu'à 510
times 510-($-$$) db 0
dw 0xAA55
;===============
;Print
;===============
print: ;Fonction permettant l'affichage de message à l'écran
lodsb ;en utilisant l'interruption 10h
or al, al ;Si al = 0
jz done ;Done
mov ah, 0Eh
mov bx, 0007
int 0x10
jmp print
done:
ret
;===============
;/Print
;===============
extern void scrollup (unsigned int);
extern void print (char *);
extern void clrscr (void);
int main();
void _start (void)
{
main();
}
int main (void)
{
clrscr();
print("un message\n");
while(1);
}
#ifndef _CONIO_H_
#define _CONIO_H_
void scrollup (unsigned int);
void print (char*);
void clrscr (void);
#endif
#ifndef _SCREEN_H_
#define _SCREEN_H_
#define RAMSCREEN 0xB8000
#define SIZESCREEN 0xFA0
#define SCREENLIM 0xB8FA0
extern char kX;
extern char kY;
extern char kattr;
#endif
#include "../includes/screen.h"
char kX = 0;
char kY = 10;
char kattr = 0x07;
#include "../includes/screen.h"
#include "../includes/conio.h"
void print (char* string)
{
char* ptr;
unsigned char* video;
ptr = string;
while (*ptr != 0)
{
if (*ptr == 10) {
kX = 0;
kY++;
}
else {
video = (unsigned char*) (RAMSCREEN + 2 * kX + 160 * kY);
*video = *ptr;
*(video + 1) = kattr;
kX++;
if (kX > 79) {
kX = 0;
kY++;
}
}
ptr++;
if (kY > 24) {
scrollup (kY - 24);
}
}
}
#include "../includes/screen.h"
#include "../includes/conio.h"
void scrollup (unsigned int nline)
{
unsigned char* video;
unsigned char* tmp;
for (video=(unsigned char*)RAMSCREEN ; video<(unsigned char*)SCREENLIM ; video++)
{
tmp = (unsigned char*) (video + nline * 160);
if (tmp < (unsigned char*)SCREENLIM) {
*video = *tmp;
}
else {
*video = 0;
}
}
kY -= nline;
if (kY < 0) {
kY = 0;
}
}
#include "../includes/screen.h"
#include "../includes/conio.h"
void clrscr(void)
{
unsigned char* video;
for (video = (unsigned char*)RAMSCREEN; video < (unsigned char*)SCREENLIM; video++)
{
*video = 0x0;
}
kX = 0;
kY = 0;
}
mov eax, cr0
or ax, 1
mov cr0, eax
mov byte [0xB8000], 'H'
mov byte [0xB8001], 0x57
Comme documentationDieu Bisounours a dit:Pour en faire du papier toilette?