Réponse acceptée !
salut,
j'ai reussi a loger le tout dans un secteur CD ( 2048 octets ) afin de lancer un loader directement en 32bits. Le code mbr peut tres bien lire les 3 secteurs suivants et le tour est joué ou bien charger un loader intermediaire.
sinon, la fonction 89H de l'interruption 15H permet le passage en PMODE par le BIOS par contre, tu dois quand meme specifier une GDT de 64 octets. La taille minimale de la GDT etant 8*4 = 32 octets, y'a peut etre une perte quand meme.
voila ce que j'ai de + petit pour le passage en pmode. La partie ldr32 doit pouvoir etre enlevée du code mbr, il te reste plus que ldr16 et la table GDT a prévoire ce qui doit faire moins de 64 octets en tout.
;****************************************************************************** align 4 GDT: dd 0 db 0 dw DESC_NUL db 0
FLAT_CODE0 EQU $-GDT gdt_01: dw -1 dw 0 db 0 dw DESC_C32+0x0F00 db 0
FLAT_DATA0 EQU $-GDT gdt_02: dw -1 dw 0 db 0 dw DESC_D32+0x0F00 db 0 gdt_03: dd 0,0 GDT_size EQU $-GDT GDTR: dw GDT_size-1 dd GDT IDTR dw 0 dd 0 ;****************************************************************************** [BITS 32] ldr32: mov ax,FLAT_DATA0 mov ss,ax mov ds,ax mov es,ax movzx eax,word [(SEG_PRIDESC*16)+VD_PRIMARY.appuse+TOM.exseg] movzx edx,word [(SEG_PRIDESC*16)+VD_PRIMARY.appuse+TOM.exoff] lea eax,[eax+eax] lea eax,[edx+eax*8] mov esp,eax jmp dword [eax] ;****************************************************************************** [BITS 16] ldr16: cli in al,0x70 or al,0x80 out 0x70,al lgdt [GDTR] lidt [IDTR] mov eax,cr0 or al,1 mov cr0,eax jmp FLAT_CODE0:ldr32
@++
|