fix: suppression de la gestion de la disquette, ajout du déboguage avec Bochs, correction initialisation du FPU au démarrage, changement de modèle 3D
This commit is contained in:
parent
6fa1bd6c2e
commit
ed4e577086
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
|
@ -2,4 +2,5 @@
|
||||||
|
|
||||||
## Copies d'écran de COS2000
|
## Copies d'écran de COS2000
|
||||||
![screen](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/28-09-2018.png)
|
![screen](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/28-09-2018.png)
|
||||||
|
![screen](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/29-11-2018.png)
|
||||||
![screen](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/ansi.png)
|
![screen](https://github.com/dahut87/cos2000v2/raw/develop/Graphisme/screenshots/ansi.png)
|
||||||
|
|
256
boot/boot12.asm
256
boot/boot12.asm
|
@ -1,256 +0,0 @@
|
||||||
;/*******************************************************************************/
|
|
||||||
;/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
|
|
||||||
;/* */
|
|
||||||
|
|
||||||
[BITS 16]
|
|
||||||
[ORG 0x7C00]
|
|
||||||
|
|
||||||
section .text
|
|
||||||
|
|
||||||
start:
|
|
||||||
jmp near Boot
|
|
||||||
|
|
||||||
Disk_ID db "COS2000A" ;Fabricant + n° de série Formatage
|
|
||||||
Sectors_Size dw 512 ;Nombre d'octets/secteur
|
|
||||||
Sectors_Per_Cluster db 1 ;Nombre de secteurs/cluster
|
|
||||||
Reserved_Sectors dw 1 ;Nombre de secteurs réservé
|
|
||||||
Fats_Number db 2 ;Nombre de copies de la FAT
|
|
||||||
Fits_Number dw 224 ;Taille du répertoire racine
|
|
||||||
Sectors_Per_Disk dw 2880 ;Nombre secteurs du volume si < 32 Mo
|
|
||||||
Media_Descriptor db 0xF0 ;Descripteur de média
|
|
||||||
Sectors_Per_Fat dw 9 ;Nombre secteurs/FAT
|
|
||||||
Sectors_Per_Track dw 18 ;Nombre secteurs/piste
|
|
||||||
Heads_Number dw 2 ;Nombre de tete de lecture/écriture
|
|
||||||
Sectors_Hidden dd 0 ;Nombre de secteurs cachés
|
|
||||||
Sectors_Per_Disk2 dd 0 ;Nombre secteurs du volume si > 32 Mo
|
|
||||||
Boot_Drive db 0 ;Lecteur de démarrage
|
|
||||||
Reserved db 0 ;NA (pour NT seulement)
|
|
||||||
Extended_Boot_ID db 0x29 ;Signature Boot étendu 29h
|
|
||||||
Serial_Number dd 0x01020304 ;N° de série
|
|
||||||
Disk_Name db "COS2000 " ;Nom de volume
|
|
||||||
Fat_Type db "FAT12 " ;Type de système de fichiers
|
|
||||||
|
|
||||||
Boot_Message db "Cos2000",0
|
|
||||||
Entre_Message db "Fichier",0
|
|
||||||
Loading_Message db "Charger",0
|
|
||||||
System_File db "Al",0,"o",0,"a",0,"d",0,"e",0,0x0F,0,0x38,"r",0,".",0,"s",0,"y",0,"s",0,0,0,0,0,0xFF,0xFF,0xFF,0xFF
|
|
||||||
Is_Ok db " [ OK ]",0x0A,0x0D,0
|
|
||||||
Is_Failed db " [ERREUR]",0x0A,0x0D,0
|
|
||||||
The_Dot db '.',0
|
|
||||||
|
|
||||||
Boot_Error:
|
|
||||||
mov si,Is_Failed
|
|
||||||
call ShowString
|
|
||||||
xor ax,ax
|
|
||||||
int 0x16
|
|
||||||
int 0x19
|
|
||||||
|
|
||||||
Boot_Ok:
|
|
||||||
mov si,Is_Ok
|
|
||||||
call ShowString
|
|
||||||
ret
|
|
||||||
|
|
||||||
Boot:
|
|
||||||
push cs
|
|
||||||
push cs
|
|
||||||
pop es
|
|
||||||
pop ds
|
|
||||||
mov [Boot_Drive],dl
|
|
||||||
cli
|
|
||||||
mov ax,0x9000
|
|
||||||
mov ss,ax
|
|
||||||
mov sp,0xFFFF
|
|
||||||
sti
|
|
||||||
mov si,Boot_Message
|
|
||||||
call ShowString
|
|
||||||
; Initialisation du lecteur de disquette
|
|
||||||
xor ax,ax
|
|
||||||
int 0x13
|
|
||||||
jc Boot_Error
|
|
||||||
; Calcul de la position de la FAT12
|
|
||||||
mov cx,[Reserved_Sectors]
|
|
||||||
add cx,[Sectors_Hidden]
|
|
||||||
adc cx,[Sectors_Hidden+2]
|
|
||||||
mov bx,[Sectors_Per_Fat]
|
|
||||||
mov di,Fat_Buffer
|
|
||||||
push bx
|
|
||||||
push cx
|
|
||||||
; Lecture de la FAT en mémoire
|
|
||||||
readfat:
|
|
||||||
call ReadSector
|
|
||||||
jc Boot_Error
|
|
||||||
inc cx
|
|
||||||
add di,[Sectors_Size]
|
|
||||||
dec bx
|
|
||||||
jnz readfat
|
|
||||||
pop cx
|
|
||||||
pop bx
|
|
||||||
xor ax,ax
|
|
||||||
mov al,[Fats_Number]
|
|
||||||
mul bx
|
|
||||||
add cx,ax
|
|
||||||
mov ax,32
|
|
||||||
mul word [Fits_Number]
|
|
||||||
div word [Sectors_Size]
|
|
||||||
add ax,cx
|
|
||||||
sub ax,2
|
|
||||||
mov word [Serial_Number],ax
|
|
||||||
xor dx,dx
|
|
||||||
call Boot_Ok
|
|
||||||
mov si,Loading_Message
|
|
||||||
call ShowString
|
|
||||||
; Recherche du système dans les entrèes de répertoire
|
|
||||||
Find_System:
|
|
||||||
mov di,Buffer
|
|
||||||
call ReadSector
|
|
||||||
jc Near Boot_Error
|
|
||||||
xor bx,bx
|
|
||||||
Next_Root_Entrie:
|
|
||||||
cmp byte [di],0
|
|
||||||
je near Boot_Error
|
|
||||||
push di
|
|
||||||
push cx
|
|
||||||
mov si,System_File
|
|
||||||
mov cx,32
|
|
||||||
rep cmpsb
|
|
||||||
pop cx
|
|
||||||
pop di
|
|
||||||
je System_Found
|
|
||||||
add di,32
|
|
||||||
add bx,32
|
|
||||||
inc dx
|
|
||||||
cmp dx,[Fits_Number]
|
|
||||||
ja near Boot_Error
|
|
||||||
cmp bx,[Sectors_Size]
|
|
||||||
jb Next_Root_Entrie
|
|
||||||
inc cx
|
|
||||||
jmp Find_System
|
|
||||||
System_Found:
|
|
||||||
; Système trouvé
|
|
||||||
call Boot_Ok
|
|
||||||
mov si,Entre_Message
|
|
||||||
call ShowString
|
|
||||||
mov cx,[di+26+32]
|
|
||||||
mov ax,0x0080
|
|
||||||
mov es,ax
|
|
||||||
push es
|
|
||||||
mov di,0x0
|
|
||||||
push di
|
|
||||||
mov si,The_Dot
|
|
||||||
Resume_Loading:
|
|
||||||
; Chargement des secteur en mémoire à l'adresse 0080:0000
|
|
||||||
cmp cx,0x0FF0
|
|
||||||
jae Finish_Loading
|
|
||||||
push cx
|
|
||||||
add cx,word [Serial_Number]
|
|
||||||
call ReadSector
|
|
||||||
pop cx
|
|
||||||
jc near Boot_Error
|
|
||||||
call ShowString
|
|
||||||
add di,[Sectors_Size]
|
|
||||||
call NextFatGroup
|
|
||||||
jc near Boot_Error
|
|
||||||
jmp Resume_Loading
|
|
||||||
Finish_Loading:
|
|
||||||
call Boot_Ok
|
|
||||||
; Exécution du chargeur ELF
|
|
||||||
retf
|
|
||||||
|
|
||||||
;====================READSECTOR=======================
|
|
||||||
;Lit le secteur logique LBA CX et le met en es:di
|
|
||||||
;-> CX (limité à 65536 secteurs, soit 32 Mo avec secteur 512 octets)
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;=====================================================
|
|
||||||
ReadSector:
|
|
||||||
pusha
|
|
||||||
mov ax,cx
|
|
||||||
xor dx,dx
|
|
||||||
div word [Sectors_Per_Track]
|
|
||||||
inc dl
|
|
||||||
mov bl,dl
|
|
||||||
xor dx,dx
|
|
||||||
div word [Heads_Number]
|
|
||||||
mov dh, [Boot_Drive]
|
|
||||||
xchg dl,dh
|
|
||||||
mov cx,ax
|
|
||||||
xchg cl,ch
|
|
||||||
shl cl,6
|
|
||||||
or cl, bl
|
|
||||||
mov bx,di
|
|
||||||
mov si, 4
|
|
||||||
mov al, 1
|
|
||||||
Read_Again:
|
|
||||||
mov ah, 2
|
|
||||||
int 0x13
|
|
||||||
jnc Read_Done
|
|
||||||
dec si
|
|
||||||
jnz Read_Again
|
|
||||||
Read_Done:
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;===================NEXTFATGROUP======================
|
|
||||||
;Renvoie en CX le groupe qui succède dans la FAT le groupe CX
|
|
||||||
;-> CX
|
|
||||||
;<-
|
|
||||||
;=====================================================
|
|
||||||
NextFatGroup:
|
|
||||||
push bx
|
|
||||||
push dx
|
|
||||||
push di
|
|
||||||
mov ax,cx
|
|
||||||
mov bx,ax
|
|
||||||
and bx,0000000000000001b
|
|
||||||
shr ax,1
|
|
||||||
mov cx,3
|
|
||||||
mul cx
|
|
||||||
mov di,Fat_Buffer
|
|
||||||
add di,ax
|
|
||||||
cmp bx,0
|
|
||||||
jnz Even_Group
|
|
||||||
Odd_Group:
|
|
||||||
mov dx,[di]
|
|
||||||
and dx,0x0FFF
|
|
||||||
mov cx,dx
|
|
||||||
jmp Next_Group_Found
|
|
||||||
Even_Group:
|
|
||||||
mov dx,[di+1]
|
|
||||||
and dx,0xFFF0
|
|
||||||
shr dx,4
|
|
||||||
mov cx,dx
|
|
||||||
Next_Group_Found:
|
|
||||||
pop di
|
|
||||||
pop dx
|
|
||||||
pop bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
;======================SHOWSTR========================
|
|
||||||
;Affiche la chaine de caractère pointé par ds:si à l'écran
|
|
||||||
;-> DS, SI
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;=====================================================
|
|
||||||
ShowString:
|
|
||||||
pusha
|
|
||||||
Next_Char:
|
|
||||||
lodsb
|
|
||||||
or al,al
|
|
||||||
jz End_Show
|
|
||||||
mov ah,0x0E
|
|
||||||
mov bx,0x07
|
|
||||||
int 0x10
|
|
||||||
jmp Next_Char
|
|
||||||
End_Show:
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
times 510-($-$$) db ' '
|
|
||||||
|
|
||||||
dw 0xAA55
|
|
||||||
|
|
||||||
Buffer equ $
|
|
||||||
Fat_Buffer equ $+512
|
|
||||||
|
|
||||||
section .bss
|
|
||||||
|
|
||||||
;Buffer resb 512
|
|
||||||
;Fat_Buffer resb 10000
|
|
13
boot/echs.h
13
boot/echs.h
|
@ -1,13 +0,0 @@
|
||||||
;/*******************************************************************************/
|
|
||||||
;/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
|
|
||||||
;/* */
|
|
||||||
struc echs
|
|
||||||
Sizes resb 1
|
|
||||||
Reserve resb 1
|
|
||||||
NumSectors resw 1
|
|
||||||
Adressoff resw 1
|
|
||||||
Adressseg resw 1
|
|
||||||
SectorLow resw 1
|
|
||||||
SectorHigh resw 1
|
|
||||||
Dummy resq 1
|
|
||||||
endstuc
|
|
119
boot/elf.h
119
boot/elf.h
|
@ -1,119 +0,0 @@
|
||||||
;/*******************************************************************************/
|
|
||||||
;/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
|
|
||||||
;/* */
|
|
||||||
struc ELFheader
|
|
||||||
.Magic resb 1;"0x7F"
|
|
||||||
.MagicStr resb 3;"ELF"
|
|
||||||
.Computertype resb 1;1
|
|
||||||
.Endianness resb 1;1
|
|
||||||
.Original resb 1;1
|
|
||||||
.OS resb 1;0
|
|
||||||
.ABI resb 1;0
|
|
||||||
.Dummy resb 7;0
|
|
||||||
.Type resw 1;2
|
|
||||||
.Target resw 1;3
|
|
||||||
.Version resd 1;1
|
|
||||||
.Entrypoint resd 1
|
|
||||||
.Offsetprogram resd 1
|
|
||||||
.Offsetsection resd 1
|
|
||||||
.Flags resd 1
|
|
||||||
.SizeELFheader resw 1
|
|
||||||
.Sizeprogram resw 1
|
|
||||||
.Nbprogram resw 1
|
|
||||||
.Sizesection resw 1
|
|
||||||
.Nbsection resw 1
|
|
||||||
.Index resw 1
|
|
||||||
.end equ $
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
struc Program
|
|
||||||
.Type resd 1
|
|
||||||
.Offset resd 1
|
|
||||||
.Vadress resd 1
|
|
||||||
.PAdress resd 1
|
|
||||||
.Size resd 1
|
|
||||||
.Memsize resd 1
|
|
||||||
.Flags resd 1
|
|
||||||
.Align resd 1
|
|
||||||
.end equ $
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
struc Sections
|
|
||||||
.Name resd 1
|
|
||||||
.Type resd 1
|
|
||||||
.Flags resd 1
|
|
||||||
.Vadress resd 1
|
|
||||||
.Offset resd 1
|
|
||||||
.Size resd 1
|
|
||||||
.Link resd 1
|
|
||||||
.Info resd 1
|
|
||||||
.Align resd 1
|
|
||||||
.Entrysize resd 1
|
|
||||||
.end equ $
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
|
|
||||||
;type
|
|
||||||
PT_NULL equ 0
|
|
||||||
PT_LOAD equ 1
|
|
||||||
PT_DYNAMIC equ 2
|
|
||||||
PT_INTERP equ 3
|
|
||||||
PT_NOTE equ 4
|
|
||||||
PT_SHLIB equ 5
|
|
||||||
PT_PHDR equ 6
|
|
||||||
PT_TLS equ 7
|
|
||||||
PT_LOOS equ 0x60000000
|
|
||||||
PT_HIOS equ 0x6fffffff
|
|
||||||
PT_LOPROC equ 0x70000000
|
|
||||||
PT_HIPROC equ 0x7fffffff
|
|
||||||
|
|
||||||
;flags
|
|
||||||
PF_WRITE equ 0x1
|
|
||||||
PF_ALLOC equ 0x2
|
|
||||||
PF_X equ 0x1 ;Execute
|
|
||||||
PF_W equ 0x2 ;Write
|
|
||||||
PF_R equ 0x4 ;Read
|
|
||||||
PF_MASKOS equ 0x0ff00000 ;Unspecified
|
|
||||||
PF_MASKPROC equ 0xf0000000 ;Unspecified
|
|
||||||
|
|
||||||
;type
|
|
||||||
ST_EXIT equ 1
|
|
||||||
ST_NULL equ 0
|
|
||||||
ST_PROGBITS equ 1
|
|
||||||
ST_SYMTAB equ 2
|
|
||||||
ST_STRTAB equ 3
|
|
||||||
ST_RELA equ 4
|
|
||||||
ST_HASH equ 5
|
|
||||||
ST_DYNAMIC equ 6
|
|
||||||
ST_NOTE equ 7
|
|
||||||
ST_NOBITS equ 8
|
|
||||||
ST_REL equ 9
|
|
||||||
ST_SHLIB equ 10
|
|
||||||
ST_DYNSYM equ 11
|
|
||||||
ST_INIT_ARRAY equ 14
|
|
||||||
ST_FINI_ARRAY equ 15
|
|
||||||
ST_PREINIT_ARRAY equ 16
|
|
||||||
ST_GROUP equ 17
|
|
||||||
ST_SYMTAB_SHNDX equ 18
|
|
||||||
ST_LOOS equ 0x60000000
|
|
||||||
ST_HIOS equ 0x6fffffff
|
|
||||||
ST_LOPROC equ 0x70000000
|
|
||||||
ST_HIPROC equ 0x7fffffff
|
|
||||||
ST_LOUSER equ 0x80000000
|
|
||||||
ST_HIUSER equ 0xffffffff
|
|
||||||
|
|
||||||
;flags
|
|
||||||
SF_WRITE equ 0x1
|
|
||||||
SF_ALLOC equ 0x2
|
|
||||||
SF_EXECINSTR equ 0x4
|
|
||||||
SF_MERGE equ 0x10
|
|
||||||
SF_STRINGS equ 0x20
|
|
||||||
SF_INFO_LINK equ 0x40
|
|
||||||
SF_LINK_ORDER equ 0x80
|
|
||||||
SF_OS_NONCONFORMING equ 0x100
|
|
||||||
SF_GROUP equ 0x200
|
|
||||||
SF_TLS equ 0x400
|
|
||||||
SF_COMPRESSED equ 0x800
|
|
||||||
SF_MASKOS equ 0x0ff00000
|
|
||||||
SF_MASKPROC equ 0xf0000000
|
|
||||||
|
|
858
boot/loader.asm
858
boot/loader.asm
|
@ -1,858 +0,0 @@
|
||||||
;/*******************************************************************************/
|
|
||||||
;/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
|
|
||||||
;/* */
|
|
||||||
[BITS 16]
|
|
||||||
[ORG 0x0]
|
|
||||||
|
|
||||||
SECTION .text
|
|
||||||
push cs
|
|
||||||
push cs
|
|
||||||
pop ds
|
|
||||||
pop es
|
|
||||||
mov si,msg0
|
|
||||||
call showstr
|
|
||||||
;Projection de la FAT12 en mémoire
|
|
||||||
mov si,msg1
|
|
||||||
call showstr
|
|
||||||
call initfat
|
|
||||||
call ok
|
|
||||||
;Recherche du système
|
|
||||||
mov si,msg2
|
|
||||||
call showstr
|
|
||||||
mov si,System_File
|
|
||||||
call search
|
|
||||||
call ok
|
|
||||||
;Activation du BUS A20
|
|
||||||
mov si,msg3
|
|
||||||
call showstr
|
|
||||||
call EnableA20
|
|
||||||
call ok
|
|
||||||
;Chargement d'une GDT pour le mode FLAT REAL
|
|
||||||
mov si,msg4
|
|
||||||
call showstr
|
|
||||||
mov eax,cs
|
|
||||||
shl eax,4
|
|
||||||
mov [GDT.Entry1+2],ax
|
|
||||||
mov [GDT.Entry2+2],ax
|
|
||||||
shr eax,16
|
|
||||||
mov [GDT.Entry1+4],al
|
|
||||||
mov [GDT.Entry2+4],al
|
|
||||||
mov eax,cs
|
|
||||||
shl eax,4
|
|
||||||
add eax,gdt0
|
|
||||||
mov [GDTR.Address],eax
|
|
||||||
lgdt [GDTR]
|
|
||||||
call ok
|
|
||||||
;Passage en mode FLAT REAL
|
|
||||||
mov si,msg5
|
|
||||||
call showstr
|
|
||||||
cli
|
|
||||||
mov eax,cr0
|
|
||||||
or al,1
|
|
||||||
mov cr0,eax
|
|
||||||
jmp short $+2
|
|
||||||
mov bx,SYS_DATA_SEL
|
|
||||||
mov fs,bx
|
|
||||||
mov ds,bx
|
|
||||||
mov es,bx
|
|
||||||
mov gs,bx
|
|
||||||
and al,0FEh
|
|
||||||
mov cr0,eax
|
|
||||||
jmp short $+2
|
|
||||||
mov bx,cs
|
|
||||||
mov fs,bx
|
|
||||||
mov ds,bx
|
|
||||||
mov es,bx
|
|
||||||
mov gs,bx
|
|
||||||
sti
|
|
||||||
call ok
|
|
||||||
;Chargement du noyau en 0x30000
|
|
||||||
mov si,msg6
|
|
||||||
call showstr
|
|
||||||
mov ebx,0x300000
|
|
||||||
call load
|
|
||||||
call ok
|
|
||||||
;Chargement du fichier PE
|
|
||||||
mov si,msg7
|
|
||||||
call showstr
|
|
||||||
call initpe
|
|
||||||
call ok
|
|
||||||
|
|
||||||
;suite:
|
|
||||||
;mov cx,suite
|
|
||||||
;call debug
|
|
||||||
mov si,msg8
|
|
||||||
call showstr
|
|
||||||
cli
|
|
||||||
;Passage en mode protégé
|
|
||||||
mov al,0x80
|
|
||||||
out 0x70,al
|
|
||||||
mov eax,cr0
|
|
||||||
or al,1
|
|
||||||
mov cr0,eax
|
|
||||||
;Exécution du code 32 bits
|
|
||||||
jmp SYS_CODE_SEL:GoPMode32
|
|
||||||
|
|
||||||
|
|
||||||
Boot_Error:
|
|
||||||
mov si,error
|
|
||||||
call showstr
|
|
||||||
xor ax,ax
|
|
||||||
int 16h
|
|
||||||
jmp 0xFFFF:0x0
|
|
||||||
|
|
||||||
ok:
|
|
||||||
push si
|
|
||||||
push cx
|
|
||||||
mov cl,67
|
|
||||||
call eol
|
|
||||||
mov si,okay
|
|
||||||
call showstr
|
|
||||||
pop cx
|
|
||||||
pop si
|
|
||||||
ret
|
|
||||||
|
|
||||||
;======================INITPE========================
|
|
||||||
;Initialise le PE de l'adresse EBX
|
|
||||||
;->
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;=====================================================
|
|
||||||
initpe:
|
|
||||||
pusha
|
|
||||||
push es
|
|
||||||
xor ax,ax
|
|
||||||
mov es,ax
|
|
||||||
mov [begin],ebx
|
|
||||||
cmp word [es:ebx+ELFheader.Magic],0x457F ; bien l'entete .elf ?
|
|
||||||
jne near errorelf
|
|
||||||
cmp word [es:ebx+ELFheader.Magic+2],"LF" ; bien l'entete .elf ?
|
|
||||||
jne near errorelf
|
|
||||||
cmp byte [es:ebx+ELFheader.Computertype],0x1 ; type ok ?
|
|
||||||
jne near errorelf
|
|
||||||
cmp byte [es:ebx+ELFheader.Endianness],0x1 ; type ok ?
|
|
||||||
jne near errorelf
|
|
||||||
cmp byte [es:ebx+ELFheader.Original],0x1 ; type ok ?
|
|
||||||
jne near errorelf
|
|
||||||
cmp byte [es:ebx+ELFheader.OS],0x0 ; type ok ?
|
|
||||||
jne near errorelf
|
|
||||||
cmp byte [es:ebx+ELFheader.ABI],0x0 ; type ok ?
|
|
||||||
jne near errorelf
|
|
||||||
cmp byte [es:ebx+ELFheader.Dummy],0x0 ; type ok ?
|
|
||||||
jne near errorelf
|
|
||||||
mov si,info1
|
|
||||||
call showstr
|
|
||||||
mov esi,[es:ebx+ELFheader.Entrypoint]
|
|
||||||
mov [entriepoint],esi
|
|
||||||
mov esi,[es:ebx+ELFheader.Offsetprogram]
|
|
||||||
add esi,ebx
|
|
||||||
mov [offsetheader],esi
|
|
||||||
mov esi,[es:ebx+ELFheader.Offsetsection]
|
|
||||||
add esi,ebx
|
|
||||||
mov [offsetsection],esi
|
|
||||||
mov cx,[es:ebx+ELFheader.Nbprogram]
|
|
||||||
mov [cs:nbprogram],cx
|
|
||||||
mov cx,[es:ebx+ELFheader.Nbsection]
|
|
||||||
mov [cs:nbsection],cx
|
|
||||||
xor eax,eax
|
|
||||||
mov ax,[es:ebx+ELFheader.Index]
|
|
||||||
xor edx,edx
|
|
||||||
mov dx,[es:ebx+ELFheader.Sizesection]
|
|
||||||
mul edx
|
|
||||||
add eax,esi
|
|
||||||
mov eax,[es:eax+Sections.Offset]
|
|
||||||
add eax,ebx
|
|
||||||
mov [cs:symbol],eax
|
|
||||||
xor eax,eax
|
|
||||||
add ax,[es:ebx+ELFheader.Sizesection]
|
|
||||||
add esi,eax
|
|
||||||
sections:
|
|
||||||
mov edi,esi
|
|
||||||
cmp dword [es:edi+Sections.Type],0x00
|
|
||||||
jz nothing
|
|
||||||
mov esi,info2
|
|
||||||
call showstr
|
|
||||||
push ds
|
|
||||||
push es
|
|
||||||
pop ds
|
|
||||||
mov esi,[es:edi+Sections.Name]
|
|
||||||
add esi,[cs:symbol]
|
|
||||||
call showstr
|
|
||||||
pop ds
|
|
||||||
mov esi,info3
|
|
||||||
call showstr
|
|
||||||
mov edx,[es:edi+Sections.Offset]
|
|
||||||
push cx
|
|
||||||
mov cx,32
|
|
||||||
call ShowHex
|
|
||||||
pop cx
|
|
||||||
mov esi,info4
|
|
||||||
call showstr
|
|
||||||
mov edx,[es:edi+Sections.Size]
|
|
||||||
push cx
|
|
||||||
mov cx,32
|
|
||||||
call ShowHex
|
|
||||||
pop cx
|
|
||||||
mov esi,info5
|
|
||||||
call showstr
|
|
||||||
mov edx,[es:edi+Sections.Vadress]
|
|
||||||
push cx
|
|
||||||
mov cx,32
|
|
||||||
call ShowHex
|
|
||||||
pop cx
|
|
||||||
and dword [es:edi+Sections.Flags],SF_ALLOC
|
|
||||||
jne itsok
|
|
||||||
mov esi,info6
|
|
||||||
call showstr
|
|
||||||
jmp itsok2
|
|
||||||
itsok:
|
|
||||||
mov esi,info10
|
|
||||||
call showstr
|
|
||||||
call copy2mem
|
|
||||||
cmp dword [es:edi+Sections.Type],ST_NOBITS
|
|
||||||
jne itsok2
|
|
||||||
mov esi,info9
|
|
||||||
call showstr
|
|
||||||
mov esi,info10
|
|
||||||
call showstr
|
|
||||||
call zero2mem
|
|
||||||
itsok2:
|
|
||||||
push cx
|
|
||||||
xor cx,cx
|
|
||||||
mov edx,[es:edi+Sections.Align]
|
|
||||||
mov esi,info8
|
|
||||||
call showstr
|
|
||||||
nextpower:
|
|
||||||
cmp edx,0
|
|
||||||
je powerok
|
|
||||||
cmp edx,1
|
|
||||||
je powerok
|
|
||||||
cmp cx,32
|
|
||||||
je powerok
|
|
||||||
inc cx
|
|
||||||
shr edx,1
|
|
||||||
jnc nextpower
|
|
||||||
powerok:
|
|
||||||
mov edx,ecx
|
|
||||||
mov cx,4
|
|
||||||
call ShowHex
|
|
||||||
pop cx
|
|
||||||
call showrtn
|
|
||||||
mov esi,edi
|
|
||||||
nothing:
|
|
||||||
add esi,eax
|
|
||||||
dec cx
|
|
||||||
jnz sections
|
|
||||||
mov esi,info7
|
|
||||||
call showstr
|
|
||||||
mov edx,[cs:entriepoint]
|
|
||||||
mov cx,32
|
|
||||||
call ShowHex
|
|
||||||
clc
|
|
||||||
pop es
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
errorelf:
|
|
||||||
stc
|
|
||||||
pop es
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;==========DEBUG===========
|
|
||||||
;CX adresse
|
|
||||||
;->CX
|
|
||||||
;<-
|
|
||||||
;==========================
|
|
||||||
debug:
|
|
||||||
mov esi,info11
|
|
||||||
call showstr
|
|
||||||
xor edx,edx
|
|
||||||
mov dx,cs
|
|
||||||
shl edx,4
|
|
||||||
add edx,ecx
|
|
||||||
mov cx,32
|
|
||||||
call ShowHex
|
|
||||||
infini:
|
|
||||||
jmp infini
|
|
||||||
|
|
||||||
;==========COPY2MEM===========
|
|
||||||
;Copie de es:esi vers es:edi
|
|
||||||
;->ES:ESI ES:EDI CX
|
|
||||||
;<- Flag
|
|
||||||
;=============================
|
|
||||||
copy2mem:
|
|
||||||
push eax
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
push ecx
|
|
||||||
mov esi,[es:edi+Sections.Offset]
|
|
||||||
add esi,[cs:begin]
|
|
||||||
mov ecx,[es:edi+Sections.Size]
|
|
||||||
shr ecx,2
|
|
||||||
inc ecx
|
|
||||||
mov edi,[es:edi+Sections.Vadress]
|
|
||||||
copietomem:
|
|
||||||
mov eax,[es:esi]
|
|
||||||
mov [es:edi],eax
|
|
||||||
add edi,4
|
|
||||||
add esi,4
|
|
||||||
dec ecx
|
|
||||||
jnz copietomem
|
|
||||||
pop ecx
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
pop eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
;==========ZERO2MEM===========
|
|
||||||
;Remise à zero de es:edi
|
|
||||||
;->ES:EDI CX
|
|
||||||
;<- Flag
|
|
||||||
;=============================
|
|
||||||
zero2mem:
|
|
||||||
push eax
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
push ecx
|
|
||||||
mov esi,[es:edi+Sections.Offset]
|
|
||||||
add esi,[cs:begin]
|
|
||||||
mov ecx,[es:edi+Sections.Size]
|
|
||||||
shr ecx,2
|
|
||||||
inc ecx
|
|
||||||
mov edi,[es:edi+Sections.Vadress]
|
|
||||||
mov eax,0
|
|
||||||
zerotomem:
|
|
||||||
mov [es:edi],eax
|
|
||||||
add edi,4
|
|
||||||
dec ecx
|
|
||||||
jnz zerotomem
|
|
||||||
pop ecx
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
pop eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
begin dd 0
|
|
||||||
entriepoint dd 0
|
|
||||||
offsetheader dd 0
|
|
||||||
offsetsection dd 0
|
|
||||||
nbprogram dw 0
|
|
||||||
nbsection dw 0
|
|
||||||
symbol dd 0
|
|
||||||
|
|
||||||
;==========SHOWHEX===========
|
|
||||||
;Affiche un nombre hexadécimal EDX de taille CX aprés le curseur
|
|
||||||
;-> EDX un entier, CX la taille
|
|
||||||
;<-
|
|
||||||
;============================
|
|
||||||
ShowHex:
|
|
||||||
push ax
|
|
||||||
push bx
|
|
||||||
push cx
|
|
||||||
push edx
|
|
||||||
push si
|
|
||||||
mov ax,cx
|
|
||||||
shr ax,2
|
|
||||||
sub cx,32
|
|
||||||
neg cx
|
|
||||||
shl edx,cl
|
|
||||||
xor cx,cx
|
|
||||||
inc cx
|
|
||||||
Hexaize:
|
|
||||||
rol edx,4
|
|
||||||
mov bx,dx
|
|
||||||
and bx,0fh
|
|
||||||
mov si,ax
|
|
||||||
mov al,[cs:bx+Tab]
|
|
||||||
xor bx,bx
|
|
||||||
mov ah,0x09
|
|
||||||
mov bl,[cs:thecolor]
|
|
||||||
int 0x10
|
|
||||||
mov ah,0x0E
|
|
||||||
int 0x10
|
|
||||||
mov ax,si
|
|
||||||
dec al
|
|
||||||
jnz Hexaize
|
|
||||||
pop si
|
|
||||||
pop edx
|
|
||||||
pop cx
|
|
||||||
pop bx
|
|
||||||
pop ax
|
|
||||||
ret
|
|
||||||
Tab db '0123456789ABCDEF'
|
|
||||||
|
|
||||||
;============EOL=============
|
|
||||||
;Va en colonne CX
|
|
||||||
;->
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;============================
|
|
||||||
eol:
|
|
||||||
pusha
|
|
||||||
mov bp,cx
|
|
||||||
mov ah,03
|
|
||||||
xor bx,bx
|
|
||||||
int 10h
|
|
||||||
mov ah,02
|
|
||||||
mov cx,bp
|
|
||||||
mov dl,cl
|
|
||||||
int 10h
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;============LOAD==============
|
|
||||||
;Charge le groupe en mémoire en EBX pour le groupe CX
|
|
||||||
;-> CX
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;==============================
|
|
||||||
load:
|
|
||||||
push ax
|
|
||||||
push ebx
|
|
||||||
push ecx
|
|
||||||
push edx
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
push fs
|
|
||||||
xor edx,edx
|
|
||||||
xor ax,ax
|
|
||||||
mov fs,ax
|
|
||||||
mov si,The_Dot
|
|
||||||
mov dx,[Sectors_Size]
|
|
||||||
Resume_Loading:
|
|
||||||
cmp cx,0x0FF0
|
|
||||||
jae Finish_Loading
|
|
||||||
push cx
|
|
||||||
add cx,word [data]
|
|
||||||
mov edi,Buffer
|
|
||||||
call ReadSector
|
|
||||||
pop cx
|
|
||||||
jc near Boot_Error
|
|
||||||
call showstr
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
push cx
|
|
||||||
mov esi,Buffer
|
|
||||||
mov cx,dx
|
|
||||||
shr cx,2
|
|
||||||
copie:
|
|
||||||
mov eax,[ds:esi]
|
|
||||||
mov [fs:ebx],eax
|
|
||||||
add ebx,4
|
|
||||||
add esi,4
|
|
||||||
dec cx
|
|
||||||
jnz copie
|
|
||||||
pop cx
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
add ebx,edx
|
|
||||||
call NextFatGroup
|
|
||||||
jc near Boot_Error
|
|
||||||
jmp Resume_Loading
|
|
||||||
Finish_Loading:
|
|
||||||
pop fs
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
pop ebx
|
|
||||||
pop ax
|
|
||||||
ret
|
|
||||||
|
|
||||||
;===========INITFAT=============
|
|
||||||
;Initialise les variables de la fat
|
|
||||||
;->
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;===============================
|
|
||||||
initfat:
|
|
||||||
pusha
|
|
||||||
push ds
|
|
||||||
xor ax,ax
|
|
||||||
mov ds,ax
|
|
||||||
mov si,0x7C0B
|
|
||||||
mov di,bootsector
|
|
||||||
mov cx, 512
|
|
||||||
rep movsb
|
|
||||||
pop ds
|
|
||||||
mov cx,[Reserved_Sectors]
|
|
||||||
add cx,[Sectors_Hidden]
|
|
||||||
adc cx,[Sectors_Hidden+2]
|
|
||||||
mov bx,[Sectors_Per_Fat]
|
|
||||||
mov di,Fat_Buffer
|
|
||||||
push bx
|
|
||||||
push cx
|
|
||||||
readfat:
|
|
||||||
call ReadSector
|
|
||||||
jc Boot_Error
|
|
||||||
inc cx
|
|
||||||
add di,[Sectors_Size]
|
|
||||||
dec bx
|
|
||||||
jnz readfat
|
|
||||||
pop cx
|
|
||||||
pop bx
|
|
||||||
xor ax,ax
|
|
||||||
mov al,[Fats_Number]
|
|
||||||
mul bx
|
|
||||||
add cx,ax
|
|
||||||
mov [entries],cx
|
|
||||||
mov ax,32
|
|
||||||
mul word [Fits_Number]
|
|
||||||
div word [Sectors_Size]
|
|
||||||
add cx,ax
|
|
||||||
sub cx,2
|
|
||||||
mov word [data],cx
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;===========SEARCH============
|
|
||||||
;Recherche le groupe d'un fichier
|
|
||||||
;-> si nom du fichier
|
|
||||||
;<- Flag Carry si erreur CX
|
|
||||||
;=============================
|
|
||||||
search:
|
|
||||||
push bx
|
|
||||||
push dx
|
|
||||||
push di
|
|
||||||
mov cx,[entries]
|
|
||||||
mov di,Buffer
|
|
||||||
call ReadSector
|
|
||||||
jc Boot_Error
|
|
||||||
xor bx,bx
|
|
||||||
Next_Root_Entrie:
|
|
||||||
cmp byte [di],0
|
|
||||||
je Boot_Error
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
push cx
|
|
||||||
mov cx,32
|
|
||||||
rep cmpsb
|
|
||||||
pop cx
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
je Found
|
|
||||||
add di,32
|
|
||||||
add bx,32
|
|
||||||
inc dx
|
|
||||||
cmp dx,[Fits_Number]
|
|
||||||
ja Boot_Error
|
|
||||||
cmp bx,[Sectors_Size]
|
|
||||||
jb Next_Root_Entrie
|
|
||||||
inc cx
|
|
||||||
Found:
|
|
||||||
mov cx,[di+26+32]
|
|
||||||
pop di
|
|
||||||
pop dx
|
|
||||||
pop bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
;============SHOWRTN============
|
|
||||||
;Affiche la chaine de caractère return
|
|
||||||
;->
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;===============================
|
|
||||||
showrtn:
|
|
||||||
push ds
|
|
||||||
push ax
|
|
||||||
push esi
|
|
||||||
mov esi,return
|
|
||||||
mov ax,cs
|
|
||||||
mov ds,ax
|
|
||||||
call showstr
|
|
||||||
pop esi
|
|
||||||
pop ax
|
|
||||||
pop ds
|
|
||||||
ret
|
|
||||||
|
|
||||||
;==============SHOWSTR=============
|
|
||||||
;Affiche la chaine de caractère pointé par ds:esi à l'écran
|
|
||||||
;-> DS, ESI
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;==================================
|
|
||||||
showstr:
|
|
||||||
pushad
|
|
||||||
xor bh,bh
|
|
||||||
nextchar:
|
|
||||||
mov al,[ds:esi]
|
|
||||||
inc esi
|
|
||||||
or al,al
|
|
||||||
jz endshow
|
|
||||||
cmp al,' '
|
|
||||||
jb justchar
|
|
||||||
cmp al,'#'
|
|
||||||
jne nocolor
|
|
||||||
mov al,[ds:esi]
|
|
||||||
inc esi
|
|
||||||
sub al,'0'
|
|
||||||
shl al,3
|
|
||||||
mov [cs:thecolor],al
|
|
||||||
shr al,2
|
|
||||||
add [cs:thecolor],al
|
|
||||||
mov al,[ds:esi]
|
|
||||||
inc esi
|
|
||||||
sub al,'0'
|
|
||||||
add [cs:thecolor],al
|
|
||||||
jmp nextchar
|
|
||||||
nocolor:
|
|
||||||
cmp al,'@'
|
|
||||||
jne nocolor2
|
|
||||||
mov al,[ds:esi]
|
|
||||||
inc esi
|
|
||||||
sub al,'0'
|
|
||||||
shl al,3
|
|
||||||
mov cl,al
|
|
||||||
shr al,2
|
|
||||||
add cl,al
|
|
||||||
mov al,[ds:esi]
|
|
||||||
inc esi
|
|
||||||
sub cl,'0'
|
|
||||||
add cl,al
|
|
||||||
call eol
|
|
||||||
jmp nextchar
|
|
||||||
nocolor2:
|
|
||||||
xor bx,bx
|
|
||||||
mov ah,0x09
|
|
||||||
mov bl,[cs:thecolor]
|
|
||||||
xor cx,cx
|
|
||||||
inc cx
|
|
||||||
int 0x10
|
|
||||||
justchar:
|
|
||||||
mov ah,0x0E
|
|
||||||
int 0x10
|
|
||||||
jmp nextchar
|
|
||||||
endshow:
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
|
|
||||||
;==========READSECTOR============
|
|
||||||
;Lit le secteur logique LBA CX et le met en es:di
|
|
||||||
;-> CX (limité à 65536 secteurs, soit 32 Mo avec secteur 512 octets)
|
|
||||||
;<- Flag Carry si erreur
|
|
||||||
;================================
|
|
||||||
ReadSector:
|
|
||||||
pusha
|
|
||||||
mov ax,cx
|
|
||||||
xor dx,dx
|
|
||||||
div word [Sectors_Per_Track]
|
|
||||||
inc dl
|
|
||||||
mov bl,dl
|
|
||||||
xor dx,dx
|
|
||||||
div word [Heads_Number]
|
|
||||||
mov dh, [Boot_Drive]
|
|
||||||
xchg dl,dh
|
|
||||||
mov cx,ax
|
|
||||||
xchg cl,ch
|
|
||||||
shl cl,6
|
|
||||||
or cl, bl
|
|
||||||
mov bx,di
|
|
||||||
mov si, 4
|
|
||||||
mov al, 1
|
|
||||||
Read_Again:
|
|
||||||
mov ah, 2
|
|
||||||
int 0x13
|
|
||||||
jnc Read_Done
|
|
||||||
dec si
|
|
||||||
jnz Read_Again
|
|
||||||
Read_Done:
|
|
||||||
popa
|
|
||||||
ret
|
|
||||||
|
|
||||||
;============NEXTFATGROUP===========
|
|
||||||
;Renvoie en CX le groupe qui succède dans la FAT le groupe CX
|
|
||||||
;-> CX
|
|
||||||
;<- CX
|
|
||||||
;===================================
|
|
||||||
NextFatGroup:
|
|
||||||
push bx
|
|
||||||
push dx
|
|
||||||
push di
|
|
||||||
mov ax,cx
|
|
||||||
mov bx,ax
|
|
||||||
and bx,0000000000000001b
|
|
||||||
shr ax,1
|
|
||||||
mov cx,3
|
|
||||||
mul cx
|
|
||||||
mov di,Fat_Buffer
|
|
||||||
add di,ax
|
|
||||||
cmp bx,0
|
|
||||||
jnz Even_Group
|
|
||||||
Odd_Group:
|
|
||||||
mov dx,[di]
|
|
||||||
and dx,0x0FFF
|
|
||||||
mov cx,dx
|
|
||||||
jmp Next_Group_Found
|
|
||||||
Even_Group:
|
|
||||||
mov dx,[di+1]
|
|
||||||
and dx,0xFFF0
|
|
||||||
shr dx,4
|
|
||||||
mov cx,dx
|
|
||||||
Next_Group_Found:
|
|
||||||
pop di
|
|
||||||
pop dx
|
|
||||||
pop bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
;============EnableA20============
|
|
||||||
;->
|
|
||||||
;<-
|
|
||||||
;Ouvre l'autoroute A20
|
|
||||||
;=================================
|
|
||||||
EnableA20:
|
|
||||||
cli
|
|
||||||
call ClearKeybBuffer
|
|
||||||
call WaitKeybCommand
|
|
||||||
mov al,0xd1
|
|
||||||
out 0x64,al
|
|
||||||
call WaitKeybCommand
|
|
||||||
mov al,0xdf
|
|
||||||
out 0x60,al
|
|
||||||
call WaitKeybCommand
|
|
||||||
jmp A20Enabled
|
|
||||||
WaitKeybCommand:
|
|
||||||
in al,0x64
|
|
||||||
test al,0x02
|
|
||||||
jnz WaitKeybCommand
|
|
||||||
ret
|
|
||||||
ClearKeybBuffer:
|
|
||||||
in al,0x64
|
|
||||||
test al,0x01
|
|
||||||
jnz ReadKeyb
|
|
||||||
ret
|
|
||||||
ReadKeyb:
|
|
||||||
in al,0x60
|
|
||||||
jmp ClearKeybBuffer
|
|
||||||
A20Enabled:
|
|
||||||
sti
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
;=================================
|
|
||||||
;CODE 32 bits mode protégé
|
|
||||||
;=================================
|
|
||||||
GoPMode32:
|
|
||||||
[BITS 32]
|
|
||||||
;Initialisation des selecteurs
|
|
||||||
mov ax,ALL_DATA_SEL
|
|
||||||
mov es,ax
|
|
||||||
mov gs,ax
|
|
||||||
mov fs,ax
|
|
||||||
mov ss,ax
|
|
||||||
mov ds,ax
|
|
||||||
mov esp,0x3fffff
|
|
||||||
push KERNEL_SEL
|
|
||||||
push dword [cs:entriepoint]
|
|
||||||
;Execution du système
|
|
||||||
retf
|
|
||||||
|
|
||||||
section .data
|
|
||||||
|
|
||||||
thecolor db 0x07
|
|
||||||
msg0 db '#12@20-=< Lancement du Chargeur ELF >=-',0x0A,0x0D,0x0A,0x0D,0
|
|
||||||
msg1 db '#07Initialisation de la FAT',0
|
|
||||||
msg2 db '#07Recherche du systeme',0
|
|
||||||
msg3 db '#07Activation adressage 24 bits',0
|
|
||||||
msg4 db '#07Chargement des descripteurs',0
|
|
||||||
msg5 db '#07Passage en mode Flat real',0
|
|
||||||
msg6 db '#07Chargement du systeme',0
|
|
||||||
msg7 db '#07Mise en place format ELF',0
|
|
||||||
msg8 db '#07Passage en mode protege',0
|
|
||||||
|
|
||||||
|
|
||||||
info1 db 0x0A,0x0D,'Format ELF i386 reconnu, #08Sections :',0x0A,0x0D,0
|
|
||||||
info2 db ' ',0
|
|
||||||
info3 db '@12 | ',0
|
|
||||||
info4 db ' - ',0
|
|
||||||
info5 db ' -> ',0
|
|
||||||
info6 db '@35#12NON ALLOUE #08',0
|
|
||||||
info7 db 'Point entree en ',0
|
|
||||||
info8 db '@48 2**',0
|
|
||||||
info9 db '@15#12 VIDE #08',0
|
|
||||||
info10 db '@70MEM',0
|
|
||||||
info11 db 0x0A,0x0D,'#12Arret debug en ',0
|
|
||||||
|
|
||||||
return db 0x0A,0x0D,0
|
|
||||||
|
|
||||||
okay db ' #15[ #10OK #15]',0x0A,0x0D,0
|
|
||||||
error db ' #15[#12Erreur#15]',0x0A,0x0D,0x0A,0x0D,' <Appuyez une touche pour redemarrer>',0
|
|
||||||
The_Dot db '.',0
|
|
||||||
System_File db "As",0,"y",0,"s",0,"t",0,"e",0,0x0F,0,0xB8,"m",0,".",0,"s",0,"y",0,"s",0,0,0,0,0,0xFF,0xFF,0xFF,0xFF
|
|
||||||
entries dw 0
|
|
||||||
data dw 0
|
|
||||||
xy dw 0
|
|
||||||
|
|
||||||
GDTR:
|
|
||||||
.Size: dw GDT_END
|
|
||||||
.Address: dd 0
|
|
||||||
|
|
||||||
gdt0 equ $ ; null entry
|
|
||||||
GDT:
|
|
||||||
.Entry0: dw 0 ; limit 15:0
|
|
||||||
dw 0 ; base 15:0
|
|
||||||
db 0 ; base 23:16
|
|
||||||
db 0 ; type
|
|
||||||
db 0 ; limit 19:16, flags
|
|
||||||
db 0 ; base 31:24
|
|
||||||
|
|
||||||
|
|
||||||
SYS_CODE_SEL equ $-gdt0 ; code segment descriptor
|
|
||||||
|
|
||||||
.Entry1: dw 0xFFFF
|
|
||||||
dw 0x0 ; base
|
|
||||||
db 0x0 ; base
|
|
||||||
db 0x9A ; present, ring 0, code, non-conforming, readable
|
|
||||||
db 0xCF ; 32 bit
|
|
||||||
db 0
|
|
||||||
|
|
||||||
|
|
||||||
SYS_DATA_SEL equ $-gdt0 ; data segment descriptor
|
|
||||||
|
|
||||||
.Entry2: dw 0xFFFF
|
|
||||||
dw 0x0 ; base
|
|
||||||
db 0x0 ; base
|
|
||||||
db 0x92 ; present, ring 0, data, expand-up, writable
|
|
||||||
db 0xCF ; 32 bit
|
|
||||||
db 0
|
|
||||||
|
|
||||||
|
|
||||||
ALL_DATA_SEL equ $-gdt0 ; 4meg data segment descriptor
|
|
||||||
|
|
||||||
.Entry3: dw 0xFFFF
|
|
||||||
dw 0x0 ; base
|
|
||||||
db 0x0 ; base
|
|
||||||
db 0x92 ; present, ring 0, data, expand-up, writable
|
|
||||||
db 0xCF ; 4k pages, 32 bit
|
|
||||||
db 0
|
|
||||||
|
|
||||||
|
|
||||||
KERNEL_SEL equ $-gdt0 ; 4g code segment descriptor
|
|
||||||
|
|
||||||
.Entry4: dw 0xffff
|
|
||||||
dw 0x0 ; base
|
|
||||||
db 0x0 ; base
|
|
||||||
db 0x9A ; present, ring 0, code, non-conforming, readable
|
|
||||||
db 0xCF ; 4k pages, 32 bit
|
|
||||||
db 0
|
|
||||||
|
|
||||||
GDT_END equ $-gdt0 -1
|
|
||||||
|
|
||||||
bootsector equ $
|
|
||||||
Sectors_Size dw 0 ;Nombre d'octets/secteur
|
|
||||||
Sectors_Per_Cluster db 0 ;Nombre de secteurs/cluster
|
|
||||||
Reserved_Sectors dw 0 ;Nombre de secteurs réservé
|
|
||||||
Fats_Number db 0 ;Nombre de copies de la FAT
|
|
||||||
Fits_Number dw 0 ;Taille du répertoire racine
|
|
||||||
Sectors_Per_Disk dw 0 ;Nombre secteurs du volume si < 32 Mo
|
|
||||||
Media_Descriptor db 0 ;Descripteur de média
|
|
||||||
Sectors_Per_Fat dw 0 ;Nombre secteurs/FAT
|
|
||||||
Sectors_Per_Track dw 0 ;Nombre secteurs/piste
|
|
||||||
Heads_Number dw 0 ;Nombre de tete de lecture/écriture
|
|
||||||
Sectors_Hidden dd 0 ;Nombre de secteurs cachés
|
|
||||||
Sectors_Per_Disk2 dd 0 ;Nombre secteurs du volume si > 32 Mo
|
|
||||||
Boot_Drive db 0 ;Lecteur de démarrage
|
|
||||||
Reserved db 0 ;NA (pour NT seulement)
|
|
||||||
Extended_Boot_ID db 0 ;Signature Boot étendu 29h
|
|
||||||
|
|
||||||
Buffer equ $
|
|
||||||
Fat_Buffer equ $+512
|
|
||||||
|
|
||||||
SECTION .bss
|
|
||||||
|
|
||||||
%include "elf.h"
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
CC=nasm -f bin -o
|
|
||||||
|
|
||||||
all: makall
|
|
||||||
|
|
||||||
makall: boot12.bin loader.sys
|
|
||||||
|
|
||||||
boot12.bin: boot12.asm
|
|
||||||
$(CC) $@ $^
|
|
||||||
|
|
||||||
loader.sys: loader.asm
|
|
||||||
$(CC) $@ $^
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o
|
|
||||||
rm -f *.bin
|
|
||||||
rm -f *.sys
|
|
||||||
rm -f *.com
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
megs: 1024
|
||||||
|
romimage: file="/usr/share/bochs/BIOS-bochs-latest", address=0x00000
|
||||||
|
vgaromimage: file="/usr/share/bochs/VGABIOS-lgpl-latest"
|
||||||
|
boot: c
|
||||||
|
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
|
||||||
|
ata0-master: type=disk, mode=flat, translation=auto, path="./final/harddisk.img.final", cylinders=0, heads=0, spt=0, biosdetect=auto, model="Generic 1234"
|
||||||
|
cpu: count=1, ips=20000000
|
||||||
|
mouse: enabled=1
|
|
@ -144,6 +144,9 @@
|
||||||
|
|
||||||
#define ror(addr) \
|
#define ror(addr) \
|
||||||
asm volatile ("rorb $0x1,%0":"=m" (addr):);
|
asm volatile ("rorb $0x1,%0":"=m" (addr):);
|
||||||
|
|
||||||
|
#define finit() \
|
||||||
|
asm volatile ("finit"::);
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
#define outb(port,value) \
|
#define outb(port,value) \
|
||||||
|
|
32776
lib/3D/man.c
32776
lib/3D/man.c
File diff suppressed because it is too large
Load Diff
|
@ -436,8 +436,6 @@ int test3d()
|
||||||
print("Mode graphique necessaire afin de lancer ce programme\r\n");
|
print("Mode graphique necessaire afin de lancer ce programme\r\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
line(-100,-50,1800,200,egatorgb(4));
|
|
||||||
waitascii();
|
|
||||||
model3d model;
|
model3d model;
|
||||||
float factor=100.0f;
|
float factor=100.0f;
|
||||||
type3D type=TYPE3D_POINTS;
|
type3D type=TYPE3D_POINTS;
|
||||||
|
|
|
@ -652,7 +652,7 @@ void showchar(u16 coordx, u16 coordy, u8 thechar, u8 attrib)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
writepxl(currentfont->width*coordx + x, currentfont->height*coordy + y, color);
|
writepxl(currentfont->width*coordx + x + 1, currentfont->height*coordy + y, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
24
makefile
24
makefile
|
@ -1,4 +1,4 @@
|
||||||
all: bits32 bits64 floppy harddisk uefi
|
all: bits32 bits64 harddisk uefi
|
||||||
sync
|
sync
|
||||||
|
|
||||||
bits32: ARCH=bits32
|
bits32: ARCH=bits32
|
||||||
|
@ -9,25 +9,21 @@ bits64: ARCH=bits64
|
||||||
bits64: lib/libs.o system/system.sys
|
bits64: lib/libs.o system/system.sys
|
||||||
sync
|
sync
|
||||||
|
|
||||||
floppy: boot/boot12.bin final/floppy.img.final
|
|
||||||
|
|
||||||
harddisk: final/harddisk.img.final
|
harddisk: final/harddisk.img.final
|
||||||
|
|
||||||
uefi: final/harddiskuefi.img.final
|
uefi: final/harddiskuefi.img.final
|
||||||
|
|
||||||
install:
|
install:
|
||||||
(sudo apt-get install nasm gcc qemu fusefat fuseext2 cgdb ovmf bsdmainutils tar bsdmainutils indent binutils)
|
(sudo apt-get install nasm gcc qemu fusefat fuseext2 cgdb ovmf bsdmainutils tar bsdmainutils indent binutils bochs bochs-x bochsbios)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
(cd system; make clean)
|
(cd system; make clean)
|
||||||
(cd boot; make clean)
|
|
||||||
(cd lib;make clean)
|
(cd lib;make clean)
|
||||||
(cd final;make clean)
|
(cd final;make clean)
|
||||||
sync
|
sync
|
||||||
|
|
||||||
littleclean:
|
littleclean:
|
||||||
(cd system; make clean)
|
(cd system; make clean)
|
||||||
(cd boot; make clean)
|
|
||||||
(cd lib;make clean)
|
(cd lib;make clean)
|
||||||
(cd final;make littleclean)
|
(cd final;make littleclean)
|
||||||
sync
|
sync
|
||||||
|
@ -48,9 +44,7 @@ retest: littleclean test
|
||||||
|
|
||||||
retest64: littleclean test64
|
retest64: littleclean test64
|
||||||
|
|
||||||
floppytest: bits32 floppy qemu-floppy
|
testbochs: bits32 harddisk bochs-debug
|
||||||
|
|
||||||
refloppytest: littleclean floppytest
|
|
||||||
|
|
||||||
view:
|
view:
|
||||||
(hexdump -C ./final/harddisk.img.final|head -c10000)
|
(hexdump -C ./final/harddisk.img.final|head -c10000)
|
||||||
|
@ -75,6 +69,9 @@ debug-system: bits32 harddisk qemu-debug
|
||||||
debug-system64: bits64 uefi qemu-debug64
|
debug-system64: bits64 uefi qemu-debug64
|
||||||
(sleep 2;cgdb -x ./debug/system.txt)
|
(sleep 2;cgdb -x ./debug/system.txt)
|
||||||
|
|
||||||
|
bochs-debug:
|
||||||
|
(killall bochs-debug;bochs -f ./debug/config.bochs)
|
||||||
|
|
||||||
qemu-debug:
|
qemu-debug:
|
||||||
(killall qemu-system-i386;qemu-system-i386 -m 1G -drive format=raw,file=./final/harddisk.img.final -s -S &)
|
(killall qemu-system-i386;qemu-system-i386 -m 1G -drive format=raw,file=./final/harddisk.img.final -s -S &)
|
||||||
|
|
||||||
|
@ -87,18 +84,9 @@ qemu:
|
||||||
qemu64:
|
qemu64:
|
||||||
(killall qemu-system-x86_64;qemu-system-x86_64 -m 5G -drive format=raw,file=./final/harddiskuefi.img.final --bios /usr/share/qemu/OVMF.fd --enable-kvm -cpu host -s &)
|
(killall qemu-system-x86_64;qemu-system-x86_64 -m 5G -drive format=raw,file=./final/harddiskuefi.img.final --bios /usr/share/qemu/OVMF.fd --enable-kvm -cpu host -s &)
|
||||||
|
|
||||||
qemu-floppy:
|
|
||||||
(killall qemu-system-i386;qemu-system-i386 -m 1G -fda ./final/floppy.img.final --enable-kvm -cpu host -s &)
|
|
||||||
|
|
||||||
system/system.sys:
|
system/system.sys:
|
||||||
(cd system; VESA=$(VESA) make)
|
(cd system; VESA=$(VESA) make)
|
||||||
|
|
||||||
boot/boot12.bin:
|
|
||||||
(cd boot; make)
|
|
||||||
|
|
||||||
final/floppy.img.final:
|
|
||||||
(cd final; make floppy.img.final)
|
|
||||||
|
|
||||||
final/harddisk.img.final:
|
final/harddisk.img.final:
|
||||||
(cd final; make harddisk.img.final)
|
(cd final; make harddisk.img.final)
|
||||||
|
|
||||||
|
|
|
@ -99,8 +99,9 @@ int main(u32 magic, u32 addr)
|
||||||
warning();
|
warning();
|
||||||
else
|
else
|
||||||
ok();
|
ok();
|
||||||
printf(" -Installation des appels systemes utilisateur");
|
printf(" -Installation des appels systemes utilisateur et du FPU");
|
||||||
initsyscall();
|
initsyscall();
|
||||||
|
finit();
|
||||||
ok();
|
ok();
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
|
|
Loading…
Reference in New Issue