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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| ;-------------------------------------------- Code en Mode Réel -------------------------------------------------------;
use16
mov ax, 7C0h ;\
mov ds, ax ; \
mov es, ax ; > Initialisation des segments
mov fs, ax ; /
mov gs, ax ;/
mov ax, 0B800h
mov es, ax
cli ;\
mov bx, 6000h ; \
mov sp, 0FFFFh ; > Création de la pile
mov ss, bx ; /
sti ;/
mov ax, 0003h ;Passage en mode texte 80*25
int 10h ;16 couleurs
mov word [es:0], 0F52h ;'R'
mov word [es:2], 0F4Dh ;'M'
;---------------------------------------- Passage en Mode Protégé -----------------------------------------------------;
mov eax, (7C0h*16)+GDT_Begin ;Adresse linéaire de la GDT
mov dword [GDT_Pointer+2], eax
; mov ax, 2401h ;Positionner la Gate A20
; int 15h
cli
lgdt [ds:GDT_Pointer] ;Chargement de la GDT
mov ebx, cr0
or ebx, 00000001h ;Passage en Mode Protégé
mov cr0, ebx
db 66h
db 0EAh
dd 7C00h+PM_Activate
dw 8
use32
PM_Activate:
mov ax, 16 ;Second Descripteur
mov bx, 24 ;Troisième Descripteur
mov cx, 32 ;Quatrième descripteur (mémoire texte)
mov ds, ax ;\
mov gs, ax ; > Initialisation des selecteurs de segment
mov fs, ax ;/
mov es, cx
mov ss, bx ;Initialisation de la seconde pile
mov esp, 0FFFFFFFFh
mov byte [es:0], 'P' ;Remplace le 'R' par un 'P'
push ax bx es ;Un test pour le segment de pile
pop es bx ax
fin:
jmp fin ;Boucle infinie
;**********************************************************************************************************************;
;************************************************** D O N N E E S *****************************************************;
;**********************************************************************************************************************;
use16
struc seg_descriptor Lim0_15, Adr0_15, Adr16_23, Flags, Lim16_19, Adr24_31
{ ;\
.Limite_0_15 dw Lim0_15 ; \
.Adresse_0_15 dw Adr0_15 ; \
.Adresse_16_23 db Adr16_23 ; > Structure des descripteur
.Flags db Flags ; /
.Lim_16_19__Flags db Lim16_19 ; /
.Adresse_24_31 db Adr24_31 ;/
}
GDT_Begin:
Null_Seg_Desc seg_descriptor 00000h, 0000h, 00h, 00000000b, 00000000b, 00h ;
Code_Seg_Desc seg_descriptor 0FFFFh, 0000h, 00h, 10011000b, 11001111b, 00h ;Descripteurs de
Data_Seg_Desc seg_descriptor 0FFFFh, 0000h, 00h, 10010010b, 11001111b, 00h ;Segments
Stack_Seg_Desc seg_descriptor 0FFFFh, 0000h, 06h, 10010110b, 01001111b, 00h ; -> Pile (expand down)
Text_Seg_Desc seg_descriptor 16000 , 8000h, 0Bh, 10010010b, 01000000b, 00h ;Mémoire texte
Graph_Seg_Desc seg_descriptor 5000 , 0000h, 0Ah, 10010010b, 11000000b, 00h ;Mémoire graphique
;(usage futur)
GDT_Limit equ $-GDT_Begin
GDT_Pointer: dw GDT_Limit
dd 0
;----------------------------------------------------------------------------------------------------------------------;
;-------- Remplissage --------;
;----------------------------------------------------------------------------------------------------------------------;
Remplissage:
times 510-Remplissage db 0 ;Remplissage
dw 0AA55h ;du secteur |
Partager