mirror of https://git.ia64.cc/perso/cos2000v2.git
Nicolas Hordé
17 years ago
32 changed files with 4722 additions and 0 deletions
After Width: | Height: | Size: 64 KiB |
@ -0,0 +1,167 @@
|
||||
## GNU LESSER GENERAL PUBLIC LICENSE |
||||
Version 3, 29 June 2007 |
||||
|
||||
![logo](https://www.gnu.org/graphics/lgplv3-with-text-154x68.png) |
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
||||
Everyone is permitted to copy and distribute verbatim copies |
||||
of this license document, but changing it is not allowed. |
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates |
||||
the terms and conditions of version 3 of the GNU General Public |
||||
License, supplemented by the additional permissions listed below. |
||||
|
||||
0. Additional Definitions. |
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser |
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU |
||||
General Public License. |
||||
|
||||
"The Library" refers to a covered work governed by this License, |
||||
other than an Application or a Combined Work as defined below. |
||||
|
||||
An "Application" is any work that makes use of an interface provided |
||||
by the Library, but which is not otherwise based on the Library. |
||||
Defining a subclass of a class defined by the Library is deemed a mode |
||||
of using an interface provided by the Library. |
||||
|
||||
A "Combined Work" is a work produced by combining or linking an |
||||
Application with the Library. The particular version of the Library |
||||
with which the Combined Work was made is also called the "Linked |
||||
Version". |
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the |
||||
Corresponding Source for the Combined Work, excluding any source code |
||||
for portions of the Combined Work that, considered in isolation, are |
||||
based on the Application, and not on the Linked Version. |
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the |
||||
object code and/or source code for the Application, including any data |
||||
and utility programs needed for reproducing the Combined Work from the |
||||
Application, but excluding the System Libraries of the Combined Work. |
||||
|
||||
1. Exception to Section 3 of the GNU GPL. |
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License |
||||
without being bound by section 3 of the GNU GPL. |
||||
|
||||
2. Conveying Modified Versions. |
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a |
||||
facility refers to a function or data to be supplied by an Application |
||||
that uses the facility (other than as an argument passed when the |
||||
facility is invoked), then you may convey a copy of the modified |
||||
version: |
||||
|
||||
a) under this License, provided that you make a good faith effort to |
||||
ensure that, in the event an Application does not supply the |
||||
function or data, the facility still operates, and performs |
||||
whatever part of its purpose remains meaningful, or |
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of |
||||
this License applicable to that copy. |
||||
|
||||
3. Object Code Incorporating Material from Library Header Files. |
||||
|
||||
The object code form of an Application may incorporate material from |
||||
a header file that is part of the Library. You may convey such object |
||||
code under terms of your choice, provided that, if the incorporated |
||||
material is not limited to numerical parameters, data structure |
||||
layouts and accessors, or small macros, inline functions and templates |
||||
(ten or fewer lines in length), you do both of the following: |
||||
|
||||
a) Give prominent notice with each copy of the object code that the |
||||
Library is used in it and that the Library and its use are |
||||
covered by this License. |
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license |
||||
document. |
||||
|
||||
4. Combined Works. |
||||
|
||||
You may convey a Combined Work under terms of your choice that, |
||||
taken together, effectively do not restrict modification of the |
||||
portions of the Library contained in the Combined Work and reverse |
||||
engineering for debugging such modifications, if you also do each of |
||||
the following: |
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that |
||||
the Library is used in it and that the Library and its use are |
||||
covered by this License. |
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license |
||||
document. |
||||
|
||||
c) For a Combined Work that displays copyright notices during |
||||
execution, include the copyright notice for the Library among |
||||
these notices, as well as a reference directing the user to the |
||||
copies of the GNU GPL and this license document. |
||||
|
||||
d) Do one of the following: |
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this |
||||
License, and the Corresponding Application Code in a form |
||||
suitable for, and under terms that permit, the user to |
||||
recombine or relink the Application with a modified version of |
||||
the Linked Version to produce a modified Combined Work, in the |
||||
manner specified by section 6 of the GNU GPL for conveying |
||||
Corresponding Source. |
||||
|
||||
1) Use a suitable shared library mechanism for linking with the |
||||
Library. A suitable mechanism is one that (a) uses at run time |
||||
a copy of the Library already present on the user's computer |
||||
system, and (b) will operate properly with a modified version |
||||
of the Library that is interface-compatible with the Linked |
||||
Version. |
||||
|
||||
e) Provide Installation Information, but only if you would otherwise |
||||
be required to provide such information under section 6 of the |
||||
GNU GPL, and only to the extent that such information is |
||||
necessary to install and execute a modified version of the |
||||
Combined Work produced by recombining or relinking the |
||||
Application with a modified version of the Linked Version. (If |
||||
you use option 4d0, the Installation Information must accompany |
||||
the Minimal Corresponding Source and Corresponding Application |
||||
Code. If you use option 4d1, you must provide the Installation |
||||
Information in the manner specified by section 6 of the GNU GPL |
||||
for conveying Corresponding Source.) |
||||
|
||||
5. Combined Libraries. |
||||
|
||||
You may place library facilities that are a work based on the |
||||
Library side by side in a single library together with other library |
||||
facilities that are not Applications and are not covered by this |
||||
License, and convey such a combined library under terms of your |
||||
choice, if you do both of the following: |
||||
|
||||
a) Accompany the combined library with a copy of the same work based |
||||
on the Library, uncombined with any other library facilities, |
||||
conveyed under the terms of this License. |
||||
|
||||
b) Give prominent notice with the combined library that part of it |
||||
is a work based on the Library, and explaining where to find the |
||||
accompanying uncombined form of the same work. |
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License. |
||||
|
||||
The Free Software Foundation may publish revised and/or new versions |
||||
of the GNU Lesser General Public License from time to time. Such new |
||||
versions will be similar in spirit to the present version, but may |
||||
differ in detail to address new problems or concerns. |
||||
|
||||
Each version is given a distinguishing version number. If the |
||||
Library as you received it specifies that a certain numbered version |
||||
of the GNU Lesser General Public License "or any later version" |
||||
applies to it, you have the option of following the terms and |
||||
conditions either of that published version or of any later version |
||||
published by the Free Software Foundation. If the Library as you |
||||
received it does not specify a version number of the GNU Lesser |
||||
General Public License, you may choose any version of the GNU Lesser |
||||
General Public License ever published by the Free Software Foundation. |
||||
|
||||
If the Library as you received it specifies that a proxy can decide |
||||
whether future versions of the GNU Lesser General Public License shall |
||||
apply, that proxy's public statement of acceptance of any version is |
||||
permanent authorization for you to choose that version for the |
||||
Library. |
@ -0,0 +1,60 @@
|
||||
![logo](https://github.com/dahut87/cos2000v2/raw/master/Graphisme/logo.png) |
||||
|
||||
## Présentation du projet |
||||
|
||||
### Qu'est ce que COS2000 ? |
||||
|
||||
COS2000 est un système d'exploitation minimaliste qui vise essentiellement un objectif pédagogique. |
||||
Il s'agit avant tout du travail d'un passionné de programmation système. |
||||
|
||||
Le système est développé essentiellement en langage C mais il comporte aussi un peu d'assembleur X86. |
||||
|
||||
#### Qu'est ce qu'un système d'exploitation ? |
||||
|
||||
Il s'agit du logiciel principal qui anime votre ordinateur. Il a pour fonctions principales : |
||||
|
||||
* Piloter des périphériques tels que souris, clavier, écran, imprimante...etc; |
||||
* Gérer des fichiers qui sont produit et exploités par des applications; |
||||
* Coordonner l'accès aux ressources par plusieurs utilisateurs; |
||||
* Détection et récupération des dysfonctionnements; |
||||
* Surveiller les performances et assurer une gestion optimale des ressources systèmes. |
||||
|
||||
Sans système d'exploitation votre ordinateur est inopérant: c'est une boite vide ! |
||||
|
||||
#### Comment utiliser COS2000 ? |
||||
|
||||
COS2000 n'a pas pour but d'être utilisé en production. Il s'agit d'un système en cours de |
||||
développement que vous pouvez néanmoins tester sur un ordinateur physique ou de préférence sur une machine virtuelle. |
||||
Il est nécessaire de compiler le système avant de démarrer celui-ci à partir d'un périphérique amovible (clé usb). |
||||
|
||||
#### Sur quel ordinateur fonctionne t'il ? |
||||
|
||||
COS2000 est compatible avec tout ordinateur compatible PC comprenant un processeur avec FPU intégré, |
||||
gestion de la mémoire paginée et mode protégé : Intel Pentium et supérieur. |
||||
|
||||
#### Ai-je le droit de le copier, de le modifier, de le réutiliser, de le vendre ? |
||||
|
||||
COS2000 est sous licence LGPL v3.0, en simplifiant un peu : |
||||
|
||||
* COPIER - OUI |
||||
* MODIFIER - OUI |
||||
* REUTILISER - OUI en citant l'auteur |
||||
* VENDRE - NON |
||||
|
||||
Les détails se trouvent dans le fichier `LICENSE.md` |
||||
|
||||
![logo](https://www.gnu.org/graphics/lgplv3-with-text-154x68.png) |
||||
|
||||
### En savoir plus... |
||||
|
||||
#### Historique du projet |
||||
* Version 2.2fr - C en mode protégé Reprise du projet |
||||
* Version 2.1fr - C en mode protégé Abandon du projet |
||||
* Version 2.0 - C en mode protégé VGA text+pmode |
||||
* Version 1.x - Assembleur en mode réel |
||||
|
||||
> “La connaissance s'acquiert par l'expérience, |
||||
> tout le reste n'est que de l'information.. |
||||
> |
||||
> ― Albert Einstein |
||||
> ― Mathématicien, Physicien |
@ -0,0 +1,274 @@
|
||||
[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 |
||||
|
||||
;Cpu_Message db "CPU test",0 |
||||
Boot_Message db "Booting ",0 |
||||
Finding_Message db "System ",0 |
||||
Loading_Message db "Loading ",0 |
||||
System_File db "SYSTEM SYS" |
||||
Is_Ok db "[ OK ]",0x0A,0x0D,0 |
||||
Is_Failed db "[Failed]",0x0A,0x0D,"Press a key",0x0A,0x0D,0 |
||||
The_Dot db '.',0 |
||||
|
||||
Boot_Error: |
||||
mov si,Is_Failed |
||||
call ShowString |
||||
mov ah,0 |
||||
int 0x16 |
||||
int 0x19 |
||||
|
||||
Boot_Ok: |
||||
mov al,[Stage] |
||||
cmp al,0 |
||||
jz No_Ok |
||||
mov si,Is_Ok |
||||
call ShowString |
||||
No_Ok: |
||||
xor ah,ah |
||||
mov si,ax |
||||
add si,Boot_Message ;Cpu_Message |
||||
call ShowString |
||||
add byte [Stage],0x09 |
||||
ret |
||||
|
||||
Stage db 0 |
||||
|
||||
Boot: |
||||
push cs |
||||
push cs |
||||
pop es |
||||
pop ds |
||||
mov [Boot_Drive],dl |
||||
cli |
||||
mov ax,0x9000 |
||||
mov ss,ax |
||||
mov sp,0xFFFF |
||||
sti |
||||
; call Detect_Cpu |
||||
; jc Boot_Error |
||||
call Boot_Ok |
||||
xor ax,ax |
||||
int 0x13 |
||||
jc Boot_Error |
||||
mov cx,[Reserved_Sectors] |
||||
add cx,[Sectors_Hidden] |
||||
adc cx,[Sectors_Hidden+2] |
||||
mov di,Fat_Buffer |
||||
call ReadSector |
||||
jc Boot_Error |
||||
xor ax,ax |
||||
mov al,[Fats_Number] |
||||
mov bx,[Sectors_Per_Fat] |
||||
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 |
||||
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,11 |
||||
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: |
||||
mov cx,[di+26] |
||||
mov ax,0x0071 |
||||
mov es,ax |
||||
push es |
||||
mov di,0x100 |
||||
push di |
||||
call Boot_Ok |
||||
mov si,The_Dot |
||||
Resume_Loading: |
||||
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 |
||||
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 |
||||
|
||||
;======================DETECTCPU====================== |
||||
;Detecte si le processeur est un 386 au mini |
||||
;-> |
||||
;<- Flag Carry si erreur |
||||
;===================================================== |
||||
;Detect_Cpu: |
||||
; push ax ; test if 8088/8086 is present (flag bits 12-15 will be set) |
||||
; xor ah,ah ; ah = 0 |
||||
; push ax ; copy ax into the flags |
||||
; popf ; with bits 12-15 clear |
||||
; pushf ; Read flags back into ax |
||||
; pop ax |
||||
; and ah,0xF0 ; check if bits 12-15 are set |
||||
; cmp ah,0xF0 |
||||
; je No_386 ; no 386 detected (8088/8086 present) |
||||
; ; check for a 286 (bits 12-15 are clear) |
||||
; mov ah,0xF0 ; set bits 12-15 |
||||
; push ax ; copy ax onto the flags |
||||
; popf |
||||
; pushf ; copy the flags into ax |
||||
; pop ax |
||||
; and ah,0xF0 ; check if bits 12-15 are clear |
||||
; jz No_386 ; no 386 detected (80286 present) |
||||
; clc |
||||
; ret |
||||
;No_386: |
||||
; stc |
||||
; ret |
||||
|
||||
times 510-($-$$) db ' ' |
||||
|
||||
dw 0xAA55 |
||||
|
||||
Buffer equ $ |
||||
Fat_Buffer equ $+512 |
||||
|
||||
section .bss |
||||
|
||||
;Buffer resb 512 |
||||
;Fat_Buffer resb 10000 |
@ -0,0 +1,270 @@
|
||||
[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 4 ;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 512 ;Taille du répertoire racine |
||||
Sectors_Per_Disk dw 2880 ;Nombre secteurs du volume si < 32 Mo |
||||
Media_Descriptor db 0xF8 ;Descripteur de média |
||||
Sectors_Per_Fat dw 207 ;Nombre secteurs/FAT |
||||
Sectors_Per_Track dw 18 ;Nombre secteurs/piste |
||||
Heads_Number dw 38 ;Nombre de tete de lecture/écriture |
||||
Sectors_Hidden dd 16 ;Nombre de secteurs cachés |
||||
Sectors_Per_Disk2 dd 39 ;Nombre secteurs du volume si > 32 Mo |
||||
Boot_Drive db 0x80 ;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 "FAT16 " ;Type de système de fichiers |
||||
|
||||
;Cpu_Message db "CPU test",0 |
||||
;Boot_Message db "Booting ",0 |
||||
;Finding_Message db "System ",0 |
||||
;Loading_Message db "Loading ",0 |
||||
System_File db "SYSTEM SYS" |
||||
Is_Ok db "[ OK ]",0x0A,0x0D,0 |
||||
Is_Failed db "[Failed]",0x0A,0x0D,"Press a key",0x0A,0x0D,0 |
||||
The_Dot db '.',0 |
||||
|
||||
Boot_Error: |
||||
mov si,Is_Failed |
||||
call ShowString |
||||
mov ah,0 |
||||
int 0x16 |
||||
int 0x19 |
||||
|
||||
Boot_Ok: |
||||
; mov al,[Stage] |
||||
; cmp al,0 |
||||
; jz No_Ok |
||||
mov si,Is_Ok |
||||
call ShowString |
||||
;No_Ok: |
||||
; xor ah,ah |
||||
; mov si,ax |
||||
; add si,Boot_Message ;Cpu_Message |
||||
; call ShowString |
||||
; add byte [Stage],0x09 |
||||
ret |
||||
; |
||||
;Stage db 0 |
||||
|
||||
Boot: |
||||
push cs |
||||
push cs |
||||
pop es |
||||
pop ds |
||||
mov [Boot_Drive],dl |
||||
cli |
||||
mov ax,0x9000 |
||||
mov ss,ax |
||||
mov sp,0xFFFF |
||||
sti |
||||
; call Detect_Cpu |
||||
; jc Boot_Error |
||||
; call Boot_Ok |
||||
xor ax,ax |
||||
int 0x13 |
||||
; jc Boot_Error |
||||
xor eax,eax |
||||
add ax,[Reserved_Sectors] |
||||
add ecx,eax |
||||
mov di,Fat_Buffer |
||||
call ReadSector |
||||
jc Boot_Error |
||||
xor eax,eax |
||||
mov al,[Fats_Number] |
||||
mov bx,[Sectors_Per_Fat] |
||||
mul bx |
||||
add ecx,eax |
||||
mov ax,32 |
||||
mul word [Fits_Number] |
||||
div word [Sectors_Size] |
||||
add eax,ecx |
||||
mov dword [Serial_Number],eax |
||||
xor dx,dx |
||||
; call Boot_Ok |
||||
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,11 |
||||
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 ecx |
||||
jmp Find_System |
||||
System_Found: |
||||
xor ecx,ecx |
||||
mov cx,[di+26] |
||||
mov ax,0x0071 |
||||
mov es,ax |
||||
push es |
||||
mov di,0x100 |
||||
push di |
||||
; call Boot_Ok |
||||
mov si,The_Dot |
||||
Resume_Loading: |
||||
cmp cx,0x0FFF0 |
||||
jae Finish_Loading |
||||
call ReadGroup |
||||
jc near Boot_Error |
||||
call ShowString |
||||
mov bx,cx |
||||
shl bx,1 |
||||
mov cx,[bx+Fat_Buffer] |
||||
jmp Resume_Loading |
||||
Finish_Loading: |
||||
call Boot_Ok |
||||
retf |
||||
|
||||
;====================READSECTOR======================= |
||||
;Lit le secteur logique LBA ECX et le met en es:di |
||||
;-> ECX (limité à 2^32 secteurs, soit 2 To avec secteur 512 octets) |
||||
;<- Flag Carry si erreur |
||||
;===================================================== |
||||
ReadSector: |
||||
pushad |
||||
mov ax, cx |
||||
ror ecx,16 |
||||
mov dx,cx |
||||
rol ecx,16 |
||||
cmp ecx,4128705 |
||||
ja Extended_CHS |
||||
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: |
||||
popad |
||||
ret |
||||
Extended_CHS: |
||||
mov si,ECHS_Block |
||||
mov byte [si+Sizes],0x10 |
||||
mov byte [si+Reserve],0x01 |
||||
mov byte [si+NumSectors],0x01 |
||||
mov [si+Adressseg],es |
||||
mov [si+Adressoff],di |
||||
mov [si+SectorLow],ax |
||||
mov [si+SectorHigh],dx |
||||
mov di,4 |
||||
mov dl,[Boot_Drive] |
||||
Read_AgainX: |
||||
mov ah, 42h |
||||
int 13h |
||||
jnc Read_Done |
||||
dec di |
||||
jnz Read_AgainX |
||||
|
||||
;======================READGROUP====================== |
||||
;lit le groupe cx en es:di et incr‚mente DI |
||||
;-> cx, es:di |
||||
;<- di, Flag Carry si erreur |
||||
;===================================================== |
||||
ReadGroup: |
||||
push ax |
||||
push cx |
||||
push dx |
||||
mov al,[Sectors_Per_Cluster] |
||||
sub cx,2 |
||||
xor ah,ah |
||||
mul cx |
||||
mov cx,dx |
||||
shl ecx,16 |
||||
mov cx,ax |
||||
add ecx,dword [Serial_Number] |
||||
mov al,[Sectors_Per_Cluster] |
||||
read: |
||||
call ReadSector |
||||
jc errors |
||||
inc ecx |
||||
add di,[Sectors_Size] |
||||
dec al |
||||
jnz read |
||||
clc |
||||
errors: |
||||
pop dx |
||||
pop cx |
||||
pop ax |
||||
ret |
||||
|
||||
;======================SHOWSTR======================== |
||||
;Affiche la chaine de caractère pointé par ds:si à l'écran |
||||
;-> DS, SI |
||||
;<- Flag Carry si erreur |
||||
;===================================================== |
||||
ShowString: |
||||
;push ax |
||||
;push bx |
||||
;push si |
||||
pusha |
||||
Next_Char: |
||||
lodsb |
||||
or al,al |
||||
jz End_Show |
||||
mov ah,0x0E |
||||
mov bx,0x07 |
||||
int 0x10 |
||||
jmp Next_Char |
||||
End_Show: |
||||
;pop si |
||||
;pop bx |
||||
;pop ax |
||||
popa |
||||
ret |
||||
|
||||
times 510-($-$$) db ' ' |
||||
|
||||
dw 0xAA55 |
||||
|
||||
ECHS_Block equ $ |
||||
Buffer equ $+26 |
||||
Fat_Buffer equ $+26+512 |
||||
|
||||
section .bss |
||||
|
||||
%include "echs.h" |
||||
|
||||
;ECHS_Block resb 24 |
||||
;Buffer resb 512 |
||||
;Fat_Buffer resb 10000 |
@ -0,0 +1,88 @@
|
||||
[BITS 16] |
||||
[ORG 0x100] |
||||
|
||||
section .text |
||||
|
||||
start: |
||||
mov ah,09 |
||||
mov dx,msg |
||||
int 0x21 |
||||
cmp byte [0x80],2 |
||||
jne near error |
||||
mov ax,0x3D02 |
||||
mov dx,name |
||||
int 0x21 |
||||
jc near error |
||||
mov bx,ax |
||||
mov ax,0x4202 |
||||
xor cx,cx |
||||
xor dx,dx |
||||
int 0x21 |
||||
jc error |
||||
cmp dx,0 |
||||
jne error |
||||
cmp ax,512 |
||||
jne error |
||||
mov ax,0x4200 |
||||
xor cx,cx |
||||
xor dx,dx |
||||
int 0x21 |
||||
jc error |
||||
mov ah,0x3F |
||||
mov cx,512 |
||||
mov dx,buffer2 |
||||
int 0x21 |
||||
jc error |
||||
cmp word [buffer2+510],0xAA55 |
||||
jne error |
||||
mov al,[0x82] |
||||
cmp al,'z' |
||||
ja error |
||||
cmp al,'a' |
||||
jb verif |
||||
sub al,'a'-'A' |
||||
verif: |
||||
cmp al,'Z' |
||||
ja error |
||||
cmp al,'A' |
||||
jb error |
||||
sub al,'A' |
||||
mov bp,ax |
||||
mov [segs],cs |
||||
mov cx,0xFFFF |
||||
mov bx,packet |
||||
int 0x25 |
||||
pop ax |
||||
mov si,buffer+3 |
||||
mov di,buffer2+3 |
||||
mov cx,59 |
||||
rep movsb |
||||
mov ax,bp |
||||
mov word [offs],buffer2 |
||||
mov cx,0xFFFF |
||||
mov bx,packet |
||||
int 0x26 |
||||
pop ax |
||||
jc error |
||||
mov ah,09 |
||||
mov dx,msgok |
||||
int 0x21 |
||||
ret |
||||
|
||||
error: |
||||
mov ah,09 |
||||
mov dx,msgerror |
||||
int 0x21 |
||||
ret |
||||
|
||||
|
||||
packet dd 0 |
||||
dw 1 |
||||
offs dw buffer |
||||
segs dw 0 |
||||
name db "boot.bin",0 |
||||
msg db 0x0D,0x0A,"CopyBoot V1.0 by nico",0x0D,0x0A,"Copyright 2002",0x0D,0x0A,'$' |
||||
msgok db "Installation of bootsector realized",0x0D,0x0A,'$' |
||||
msgerror db "Installation of bootsector failed",0x0D,0x0A,'$' |
||||
buffer equ $ |
||||
buffer2 equ $+512 |
@ -0,0 +1,217 @@
|
||||
[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 |
||||
|
||||
Loading_Ok db "Secteur en execution",0x0A,0x0D,0 |
||||
Reg_Names db "cs ",0 |
||||
db "ds ",0 |
||||
db "es ",0 |
||||
db "fs ",0 |
||||
db "gs ",0 |
||||
db "ss ",0 |
||||
db "eax",0 |
||||
db "ebx",0 |
||||
db "ecx",0 |
||||
db "edx",0 |
||||
db "esi",0 |
||||
db "edi",0 |
||||
db "esp",0 |
||||
db "ebp",0 |
||||
db "eip",0 |
||||
db "FLG",0 |
||||
db "cr0",0 |
||||
db "cr1",0 |
||||
db "cr2",0 |
||||
db "cr3",0 |
||||
|
||||
Return db 0x0A,0x0D,0 |
||||
|
||||
Numbers equ 20 |
||||
|
||||
boot: |
||||
mov [cs:segms],cs |
||||
mov [cs:segms+4],ds |
||||
mov [cs:segms+8],es |
||||
mov [cs:segms+12],fs |
||||
mov [cs:segms+16],gs |
||||
mov [cs:segms+20],ss |
||||
mov [cs:segms+24],eax |
||||
mov [cs:segms+28],ebx |
||||
mov [cs:segms+32],ecx |
||||
mov [cs:segms+36],edx |
||||
mov [cs:segms+40],esi |
||||
mov [cs:segms+44],edi |
||||
mov [cs:segms+48],esp |
||||
mov [cs:segms+52],ebp |
||||
IP: |
||||
mov word [cs:segms+56],IP |
||||
mov word [cs:segms+58],0 |
||||
pushfd |
||||
pop dword [cs:segms+60] |
||||
mov eax,cr0 |
||||
mov [cs:segms+64],eax |
||||
mov eax,cr0 |
||||
mov [cs:segms+68],eax |
||||
mov eax,cr2 |
||||
mov [cs:segms+72],eax |
||||
mov eax,cr3 |
||||
mov [cs:segms+76],eax |
||||
cli |
||||
mov ax,0x9000 |
||||
mov ss,ax |
||||
mov sp,0xFFFF |
||||
sti |
||||
push cs |
||||
push cs |
||||
pop es |
||||
pop ds |
||||
mov si,Loading_Ok |
||||
call ShowString |
||||
xor bx,bx |
||||
Show_All_Regs: |
||||
mov si,Reg_Names |
||||
shl bx,2 |
||||
add si,bx |
||||
call ShowString |
||||
mov al,":" |
||||
call ShowChar |
||||
mov si,segms |
||||
mov edx,[bx+si] |
||||
shr bx,2 |
||||
mov cx,32 |
||||
cmp bx,6 |
||||
jae Reg_Size_32 |
||||
mov cx,16 |
||||
Reg_Size_32: |
||||
call ShowHex |
||||
mov si,Return |
||||
call ShowString |
||||
inc bx |
||||
cmp bx,Numbers |
||||
jb Show_All_Regs |
||||
Halting_Cpu: |
||||
jmp Halting_Cpu |
||||
|
||||
;==================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 |
||||
mov ax,cx |
||||
shr ax,2 |
||||
sub cx,32 |
||||
neg cx |
||||
shl edx,cl |
||||
xchg ax,cx |
||||
Hex_Decompose: |
||||
rol edx,4 |
||||
mov bx,dx |
||||
and bx,0x0F |
||||
mov al,[cs:bx+Hex_Table] |
||||
call ShowChar |
||||
dec cl |
||||
jnz Hex_Decompose |
||||
pop edx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
Hex_Table db "0123456789ABCDEF" |
||||
|
||||
;===================CLS==================== |
||||
;Efface l"écran |
||||
;-> |
||||
;<- |
||||
;========================================== |
||||
Cls: |
||||
push ax |
||||
mov ax,0x0003 |
||||
int 0x10 |
||||
pop ax |
||||
ret |
||||
|
||||
;================SHOWCHAR================== |
||||
;Affiche un caractère pointé dans AL |
||||
;-> AL |
||||
;<- |
||||
;========================================== |
||||
ShowChar: |
||||
push ax |
||||
push bx |
||||
mov ah,0x0E |
||||
mov bx,0x07 |
||||
int 0x10 |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;===================SHOWSTR================ |
||||
;Affiche une chaine de caractère pointé par SI |
||||
;-> SI pointe une chaine |
||||
;<- |
||||
;========================================== |
||||
ShowString: |
||||
push ax |
||||
push bx |
||||
push si |
||||
cld |
||||
Show_Next_Char: |
||||
lodsb |
||||
or al,al |
||||
jz String_Showed |
||||
call ShowChar |
||||
jmp Show_Next_Char |
||||
String_Showed: |
||||
pop si |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;=================WAITKEY================= |
||||
;Attend l"appuie d"une touche et |
||||
;renvoie en AL la touche appuyée |
||||
;-> |
||||
;<- AL |
||||
;========================================= |
||||
WaitKey: |
||||
mov ax,0x00 |
||||
int 0x16 |
||||
ret |
||||
|
||||
times 510-($-$$) db ' ' |
||||
|
||||
dw 0xAA55 |
||||
|
||||
section .bss |
||||
|
||||
segms resb 10000 |
||||
|
@ -0,0 +1,10 @@
|
||||
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 |
@ -0,0 +1,24 @@
|
||||
all: makall |
||||
|
||||
makall: boot12.bin boot16.bin boottest.bin bootcp.com |
||||
sync
|
||||
|
||||
boot12.bin: |
||||
nasm -f bin -o boot12.bin boot12.asm
|
||||
|
||||
boot16.bin: |
||||
nasm -f bin -o boot16.bin boot16.asm
|
||||
|
||||
boottest.bin: |
||||
nasm -f bin -o boottest.bin boottest.asm
|
||||
|
||||
bootcp.com: |
||||
nasm -f bin -o bootcp.com bootcp.asm
|
||||
|
||||
clean: |
||||
rm -f *.o
|
||||
rm -f *.bin
|
||||
rm -f *.sys
|
||||
rm -f *.com
|
||||
|
||||
|
@ -0,0 +1,23 @@
|
||||
#include "types.h" |
||||
#define sti() __asm__ ("sti"::) |
||||
#define cli() __asm__ ("cli"::) |
||||
#define nop() __asm__ ("nop"::) |
||||
#define iret() __asm__ ("iret"::) |
||||
|
||||
#define outb(port,value) \ |
||||
asm volatile ("outb %%al,%%dx"::"d" (port), "a" (value)); |
||||
|
||||
#define outw(port,value) \ |
||||
asm volatile ("outb %%ax,%%dx"::"d" (port), "a" (value)); |
||||
|
||||
#define inb(port) ({ \ |
||||
u8 _v; \
|
||||
asm volatile ("inb %%dx,%%al" : "=a" (_v) : "d" (port)); \
|
||||
_v; \
|
||||
}) |
||||
|
||||
#define inw(port) ({ \ |
||||
u16 _v; \
|
||||
asm volatile ("inw %%dx,%%ax" : "=a" (_v) : "d"(port)); \
|
||||
_v; \
|
||||
}) |
@ -0,0 +1,3 @@
|
||||
#include "types.h" |
||||
|
||||
void memset(void *dst, u8 val, u16 count,u32 size); |
@ -0,0 +1,11 @@
|
||||
#ifndef I386_TYPE |
||||
#define I386_TYPE |
||||
typedef unsigned char u8; |
||||
typedef unsigned short u16; |
||||
typedef unsigned int u32; |
||||
typedef unsigned char uchar; |
||||
typedef int bool;
|
||||
#define true 1; |
||||
#define false 0; |
||||
#endif |
||||
|
@ -0,0 +1,10 @@
|
||||
#include "types.h" |
||||
|
||||
#define TEXTSCREEN 0xB8000 /* debut de la memoire video texte*/ |
||||
#define GRPHSCREEN 0xA0000 /* debut de la memoire video graphique*/ |
||||
|
||||
typedef u8 mode_def[64];
|
||||
|
||||
void print (u8* string); |
||||
void cls (void); |
||||
u16 setvmode(u8); |
@ -0,0 +1,375 @@
|
||||
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |
||||
;³ COS 2000 ³ |
||||
;³ http://www.multimania.com/cos2000 ³ |
||||
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ |
||||
;³ D I S K I M A G E ³ |
||||
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ |
||||
;³ Fonction : Programme permettant de r‚aliser des images dique dur d'³ |
||||
;³ une disquettes. ³ |
||||
;³ ³ |
||||
;³ Appel : Diskimge [Nom du fichier][/r][/s][/h] ³ |
||||
;³ /r restaure l'image /s sauve l'image /h aide ³ |
||||
;³ ³ |
||||
;³ Compilation : TASM boot /m4 /x ³ |
||||
;³ TLINK boot /t /x ³ |
||||
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ |
||||
;³ Programmeur : Nico ³ |
||||
;³ Con‡us le : 15/07/2001 ³ |
||||
;³ Modifi‚ le : 15/07/2001 ³ |
||||
;³ Site Web : http://www.multimania.com/cos2000 ³ |
||||
;³ Copyright : libre distribution ³ |
||||
;³ E-Mail : COS2000@multimania.com ³ |
||||
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |
||||
|
||||
;==========================Directive d'assemblages============================ |
||||
[BITS 16] ;Directive qui autorise la g‚n‚ration de code 16 bits |
||||
[ORG 0x100] ;Directive pour indiquer le d‚but du code |
||||
|
||||
section .text |
||||
|
||||
|
||||
;=============================Debut du programmes============================= |
||||
|
||||
start: ;Label du d‚but. |
||||
mov ah,0x09 |
||||
mov dx,msg ; |
||||
int 0x21 |
||||
mov ah,'r' |
||||
call Check |
||||
jnc restitute |
||||
mov ah,'s' |
||||
call Check |
||||
jnc save |
||||
help: |
||||
mov ah,0x09 |
||||
mov dx,helpmsg |
||||
int 0x21 |
||||
mov ax,0 |
||||
int 0x16 |
||||
ret |
||||
restitute: |
||||
mov ah,'n' |
||||
call Check |
||||
jnc nospl |
||||
mov ah,0x09 |
||||
mov dx,msg2 |
||||
int 21h |
||||
mov ax,0x00 |
||||
int 16h |
||||
nospl: |
||||
mov ah,0x09 |
||||
mov dx,res |
||||
int 0x21 |
||||
call OpenCmdLine |
||||
jc error |
||||
mov si,buffer |
||||
mov di,si |
||||
xor cx,cx |
||||
restoring: |
||||
call Read18432 |
||||
jc error |
||||
call WriteTrack ;Ecrit la piste CX sur les 2 tˆtes depuis ds:di |
||||
jc error |
||||
call ShowDot |
||||
inc cx |
||||
cmp cx,80 |
||||
jb restoring |
||||
mov ah,0x09 |
||||
mov dx,msgok |
||||
int 0x21 |
||||
ret |
||||
save: |
||||
mov ah,'n' |
||||
call Check |
||||
jnc nospl2 |
||||
mov ah,0x09 |
||||
mov dx,msg2 |
||||
int 0x21 |
||||
mov ax,0 |
||||
int 0x16 |
||||
nospl2: |
||||
mov ah,0x09 |
||||
mov dx,sav |
||||
int 0x21 |
||||
call CreateCmdLine |
||||
jc error |
||||
mov si,buffer |
||||
mov di,si |
||||
xor cx,cx |
||||
saving: |
||||
call ReadTrack ;Lit la piste CX sur 2 tˆte en es:di |
||||
jc error |
||||
call Write18432 |
||||
jc error |
||||
call ShowDot |
||||
inc cx |
||||
cmp cx,80 |
||||
jb saving |
||||
mov ah,09 |
||||
mov dx,msgok |
||||
int 0x21 |
||||
ret |
||||
error: |
||||
push cs |
||||
pop ds |
||||
call CloseCmdLine |
||||
mov ah,09 |
||||
mov dx,errormsg |
||||
int 0x21 |
||||
ret |
||||
|
||||
;Affiche un point |
||||
ShowDot: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
mov bx,cx |
||||
shr bx,4 |
||||
mov al,[bx+dot] |
||||
mov ah,0x0E |
||||
mov bx,0x07 |
||||
int 0x10 |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;Ecrit une piste CX 2 Tˆte, depuis le buffer DS:SI |
||||
ReadTrack: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push dx |
||||
push si |
||||
push es |
||||
push ds |
||||
pop es |
||||
xchg ch,cl |
||||
xor dx,dx |
||||
xor cl,cl |
||||
inc cl |
||||
mov bx,si |
||||
mov si,3 |
||||
retry: |
||||
mov ax,0x0212 |
||||
int 13h |
||||
jnc done |
||||
dec si |
||||
jnz retry |
||||
jmp dead |
||||
done: |
||||
add bx,9216 |
||||
inc dh |
||||
cmp dh,1 |
||||
je retry |
||||
dead: |
||||
pop es |
||||
pop si |
||||
pop dx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;Lit une piste CX sur deux tˆte dans le buffer ES:DI |
||||
WriteTrack: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push dx |
||||
push si |
||||
xchg ch,cl |
||||
xor dx,dx |
||||
xor cl,cl |
||||
inc cl |
||||
mov bx,di |
||||
mov si,3 |
||||
retry2: |
||||
mov ax,0x0312 |
||||
int 0x13 |
||||
jnc done2 |
||||
dec si |
||||
jnz retry2 |
||||
done2: |
||||
add bx,9216 |
||||
inc dh |
||||
cmp dh,1 |
||||
je retry2 |
||||
dead2: |
||||
pop si |
||||
pop dx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;Ecrit 18432 octets depuis DS:SI dans le fichier ouvert par OpenCmdline |
||||
Write18432: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push dx |
||||
mov ah,0x40 |
||||
mov cx,18432 |
||||
mov bx,[handle] |
||||
mov dx,si |
||||
int 0x21 |
||||
pop dx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;Lit 18432 octets vers ES:DI depuis le fichier ouvert par OpenCmdline |
||||
Read18432: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push dx |
||||
mov ah,0x3F |
||||
mov cx,18432 |
||||
mov bx,[handle] |
||||
mov dx,si |
||||
int 0x21 |
||||
pop dx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;Ouvre la ligne de commande |
||||
OpenCmdLine: |
||||
push ax |
||||
push bx |
||||
push dx |
||||
mov bl,[0x80] |
||||
xor bh,bh |
||||
add bx,0x80 |
||||
mov byte [bx],0 |
||||
mov ax,0x3D00 |
||||
mov dx,0x82 |
||||
int 0x21 |
||||
mov [handle],ax |
||||
pop dx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;Cr‚e un fichier du nom de la ligne de commande |
||||
CreateCmdLine: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push dx |
||||
mov bl,[0x80] |
||||
xor bh,bh |
||||
add bx,0x80 |
||||
mov byte [bx],0 |
||||
mov ah,0x3C |
||||
xor cx,cx |
||||
mov dx,0x82 |
||||
int 0x21 |
||||
mov [handle],ax |
||||
pop dx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;Ferme le fichier pr‚c‚damment ouvert avec OpenCmdline |
||||
CloseCmdLine: |
||||
push ax |
||||
push bx |
||||
mov bx,[handle] |
||||
mov ah,0x3E |
||||
int 0x21 |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;Recherche le commutateur AH dans la ligne de commande si existant retourne FC=True. |
||||
Check: |
||||
push ax |
||||
push cx |
||||
push di |
||||
mov di,0x80 |
||||
mov cl,[di] |
||||
cmp cl,0 |
||||
je notfound2 |
||||
xor ch,ch |
||||
mov al,'/' |
||||
search: |
||||
cmp cx,0 |
||||
je notfound |
||||
repne scasb |
||||
cmp [di],ah |
||||
jnz search |
||||
jmp okfound |
||||
notfound: |
||||
sub ah,'a'-'A' |
||||
mov di,0x80 |
||||
mov cl,[di] |
||||
search2: |
||||
cmp cx,0 |
||||
je notfound2 |
||||
repne scasb |
||||
cmp [di],ah |
||||
jnz search2 |
||||
okfound: |
||||
mov word [di-2],0 |
||||
clc |
||||
pop di |
||||
pop cx |
||||
pop ax |
||||
ret |
||||
notfound2: |
||||
stc |
||||
pop di |
||||
pop cx |
||||
pop ax |
||||
ret |
||||
|
||||
res db "Restauration en cours",0x0A,0x0D,0x0A,0x0D,'$' |
||||
sav db "Sauvegarde en cours",0x0A,0x0D,0x0A,0x0D,'$' |
||||
dot db " °±²Û" |
||||
handle dw 0 |
||||
msg db 0x0A,0x0D,"IFlop V1.0",0x0A,0x0D |
||||
db "Ecrit par Nico",0x0A,0x0D |
||||
db "http://www.multimania.com/cos2000",0Ah,0Dh |
||||
db "Copyright 2000",0Ah,0Dh,'$' |
||||
msg2 db "Ins‚rez une disquette de 1.44 Mo dans le lecteur et appuyez sur une touche...",0x0A,0x0D,'$' |
||||
errormsg db 0Ah,0Dh,"Une erreur est apparue lors de la copie !",0x0A,0x0D,'$' |
||||
msgok db 0Ah,0Dh,"La copie de l'image a ‚t‚ correctement r‚alis‚e",0x0A,0x0D,'$' |
||||
|
||||
SectorsPerTrack dw 18 ;Nombre de secteur par pistes. |
||||
HeadsPerDrive dw 2 ;Nombre de t‚tes par disque. |
||||
|
||||
helpmsg: |
||||
db "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" |
||||
db "³ COS 2000 ³" |
||||
db "³ http://www.multimania.com/cos2000 ³" |
||||
db "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´" |
||||
db "³ I F L O P ³" |
||||
db "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´" |
||||
db "³ Fonction : Programme permettant de r‚aliser des images disque dur ³" |
||||
db "³ d'une disquettes. ³" |
||||
db "³ ³" |
||||
db "³ Appel : Iflop [Nom du fichier][/r][/s][/h] ³" |
||||
db "³ /r restaure l'image /s sauve l'image /h aide ³" |
||||
db "³ ³" |
||||
db "³ Compilation : TASM boot /m4 /x ³" |
||||
db "³ TLINK boot /t /x ³" |
||||
db "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´" |
||||
db "³ Programmeur : Nico ³" |
||||
db "³ Con‡us le : 15/07/2001 ³" |
||||
db "³ Modifi‚ le : 15/07/2001 ³" |
||||
db "³ Site Web : http://www.multimania.com/cos2000 ³" |
||||
db "³ Copyright : libre distribution ³" |
||||
db "³ E-Mail : COS2000@multimania.com ³" |
||||
db "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ$" |
||||
|
||||
section .bss |
||||
|
||||
[org 0x5000] |
||||
|
||||
buffer resb 512 ;Allocation de 512 octets pour contenir le secteur lu. |
@ -0,0 +1,16 @@
|
||||
all: makall |
||||
|
||||
makall: iflop.com |
||||
|
||||
|
||||
iflop.com: |
||||
nasm -f bin -o iflop.com iflop.asm
|
||||
|
||||
clean: |
||||
rm -f *.o
|
||||
rm -f *.bin
|
||||
rm -f *.sys
|
||||
rm -f *.com
|
||||
|
||||
|
||||
|
@ -0,0 +1,19 @@
|
||||
all: makall |
||||
|
||||
makall: |
||||
sync
|
||||
|
||||
clean: |
||||
(cd iflop; make clean)
|
||||
(cd mbrol; make clean)
|
||||
|
||||
iflop/iflop.com: |
||||
(cd iflop; make)
|
||||
|
||||
mbrol/mbrol.com: |
||||
(cd mbrol; make)
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,10 @@
|
||||
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 |
@ -0,0 +1,897 @@
|
||||
[BITS 16] |
||||
[ORG 0x0100] |
||||
|
||||
section .text |
||||
|
||||
start: |
||||
push eax |
||||
push ebx |
||||
push edi |
||||
push ebp |
||||
mov di, disk |
||||
call detectdisk |
||||
call cls |
||||
mov si,di |
||||
mov di, thepart |
||||
call getdriveinfos |
||||
mov [numbers],cx |
||||
mov si,di |
||||
call showdriveinfos |
||||
mov al,3 |
||||
call selection |
||||
mov word [sel],0 |
||||
waitafter: |
||||
call waitkey |
||||
cmp ah,0x50 |
||||
jne tre1 |
||||
mov ax,[sel] |
||||
inc al |
||||
cmp ax,[numbers] |
||||
jz waitafter |
||||
mov [sel],ax |
||||
add al,3 |
||||
call selection |
||||
jmp waitafter |
||||
tre1: |
||||
cmp ah,0x48 |
||||
jne tre2 |
||||
mov ax,[sel] |
||||
cmp ax,0 |
||||
jz waitafter |
||||
dec al |
||||
mov [sel],ax |
||||
add al,3 |
||||
call selection |
||||
jmp waitafter |
||||
tre2: |
||||
cmp al,0x0D |
||||
jne waitafter |
||||
mov bx,[sel] |
||||
shl bx,6 |
||||
add bx,thepart |
||||
mov si,mmp |
||||
call showstr |
||||
mov si,bx |
||||
add si,28 |
||||
call showstr |
||||
mov bp,[bx+26] |
||||
call initdisk |
||||
xor ax,ax |
||||
mov es,ax |
||||
mov ds,ax |
||||
mov di,0x0600 |
||||
mov ecx,[cs:bx+16] |
||||
call readsector |
||||
mov di,0x7C00 |
||||
mov ecx,[cs:bx+22] |
||||
call readsector |
||||
mov dx,bp |
||||
mov si,[cs:bx+20] |
||||
add si,0x0600 |
||||
pop ebp |
||||
pop edi |
||||
pop ebx |
||||
pop eax |
||||
jmp 0x0000:0x7C00 |
||||
|
||||
;============================================================================= |
||||
|
||||
; DONNEES FIXES |
||||
|
||||
;============================================================================= |
||||
mmp db "Chargement du disque ",0 |
||||
msg db "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" |
||||
db "³ Letter:Name ³ Type ³ Boot ³ Statut ³ Size MByte ³ StartSector ³" |
||||
db "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄ´",0 |
||||
tab db "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0 |
||||
sep db " ³ ",0 |
||||
|
||||
partkind db 001h,"FAT12 ",0 |
||||
db 004h,"FAT16 ",0 |
||||
db 005h,"Extended ",0 |
||||
db 006h,"FAT16B ",0 |
||||
db 007h,"IFS ",0 |
||||
db 00Bh,"FAT32 ",0 |
||||
db 00Ch,"FAT32X ",0 |
||||
db 00Eh,"FAT16X ",0 |
||||
db 00Fh,"ExtendedX ",0 |
||||
db 081h,"Linux 1.4b",0 |
||||
db 082h,"Linux SWAP",0 |
||||
db 083h,"Linux EXT2",0 |
||||
db 011h,"FAT12 Hid ",0 |
||||
db 014h,"FAT16 Hid",0 |
||||
db 016h,"FAT16B Hid",0 |
||||
db 017h,"IFS Hid ",0 |
||||
db 01Bh,"FAT32 Hid ",0 |
||||
db 01Ch,"FAT32X Hid",0 |
||||
db 01Eh,"FAT16X Hid",0 |
||||
db 0FFh,"Unknowed ",0 |
||||
|
||||
noname db "Unknowed ","Unkowned ",0 |
||||
unknowed db "Movable ",0 |
||||
primary db "Primary ",0 |
||||
secondary db "Secondary",0 |
||||
yes db "Yes ",0 |
||||
no db "No ",0 |
||||
mo db " MB",0 |
||||
|
||||
;============================================================================= |
||||
|
||||
; ROUTINES PARTICULIERES |
||||
|
||||
;============================================================================= |
||||
;Affiche des infos sur le volume |
||||
showdriveinfos: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push edx |
||||
push si |
||||
mov si, msg |
||||
call showstr |
||||
mov bx,thepart |
||||
mov cx,[numbers] |
||||
showall: |
||||
mov al,'³' |
||||
call showchar |
||||
mov al,' ' |
||||
call showchar |
||||
mov al,[bx+51] |
||||
call showchar |
||||
mov al,':' |
||||
call showchar |
||||
mov si,bx |
||||
add si,28 |
||||
call showstr |
||||
mov si, sep |
||||
call showstr |
||||
mov al,[bx+4] |
||||
cmp al,0xFF |
||||
je useboot |
||||
mov si, partkind+1 |
||||
search: |
||||
cmp byte[si-1],0x0FF |
||||
je notboot |
||||
cmp [si-1],al |
||||
je notboot |
||||
add si,12 |
||||
jmp search |
||||
useboot: |
||||
mov si,bx |
||||
add si,40 |
||||
notboot: |
||||
call showstr |
||||
mov si, sep |
||||
call showstr |
||||
mov si, yes |
||||
cmp byte [bx],0x80 |
||||
je okboot |
||||
mov si, no |
||||
okboot: |
||||
call showstr |
||||
mov si, sep |
||||
call showstr |
||||
mov si, primary |
||||
cmp dword [bx+16],0 |
||||
je okprimary |
||||
mov si, secondary |
||||
okprimary: |
||||
cmp byte [bx+4],0x0FF |
||||
jne wasno |
||||
mov si, unknowed |
||||
wasno: |
||||
call showstr |
||||
mov si, sep |
||||
call showstr |
||||
mov edx,[bx+12] |
||||
shr edx,11 |
||||
call showint |
||||
mov si, mo |
||||
call showstr |
||||
mov si, sep |
||||
call showstr |
||||
mov edx,[bx+22] |
||||
call showint |
||||
mov al,' ' |
||||
call showchar |
||||
mov al,'³' |
||||
call showchar |
||||
add bx,64 |
||||
dec cx |
||||
jnz near showall |
||||
mov si, tab |
||||
call showstr |
||||
pop si |
||||
pop edx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;met en surlign‚e la ligne al et seulement al |
||||
selection: |
||||
push cx |
||||
mov ch,0x70 |
||||
call selectline |
||||
xchg al,[cs:old] |
||||
mov ch,0x07 |
||||
call selectline |
||||
pop cx |
||||
ret |
||||
|
||||
old db 20 |
||||
|
||||
;selectionne la ligne al de couleur ch |
||||
selectline: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push ds |
||||
mov bh,160 |
||||
mul bh |
||||
mov bx,ax |
||||
mov ax,0xB800 |
||||
mov ds,ax |
||||
inc bx |
||||
mov cl,80 |
||||
select: |
||||
mov [bx],ch |
||||
add bx,2 |
||||
dec cl |
||||
jnz select |
||||
pop ds |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;============================================================================= |
||||
|
||||
; ROUTINES UNIVERSELLES INSPIREE DE COS2000 |
||||
|
||||
;============================================================================= |
||||
|
||||
|
||||
;=========GETDRIVEINFOS============== |
||||
;Envoie en es:di les lecteurs logiques sur les volumes point‚ par ds:si |
||||
;-> BP, ES:DI |
||||
;<- CX leur nombre |
||||
;==================================== |
||||
getdriveinfos: |
||||
push ax |
||||
push bx |
||||
push dx |
||||
push si |
||||
push di |
||||
push bp |
||||
push di |
||||
xor bx,bx |
||||
show: |
||||
xor dh,dh |
||||
mov dl,[si] |
||||
inc si |
||||
cmp dl,0xFF |
||||
je endofshow |
||||
mov bp,dx |
||||
call initdisk |
||||
call IsMbr |
||||
je okmbr |
||||
call getvolume |
||||
inc bx |
||||
add di,64 |
||||
jmp show |
||||
okmbr: |
||||
call getpartitions |
||||
mov ax,cx |
||||
shl ax,6 |
||||
add di,ax |
||||
add bx,cx |
||||
jmp show |
||||
endofshow: |
||||
pop si |
||||
mov al,'C' |
||||
mov cx,bx |
||||
push cx |
||||
push si |
||||
checkp: |
||||
cmp byte [si+4],5 |
||||
je notprim |
||||
cmp byte [si+4],0x0F |
||||
je notprim |
||||
cmp byte [si+16],0 |
||||
jnz notprim |
||||
cmp byte [si+26],0x80 |
||||
jb notprim |
||||
mov [si+51],al |
||||
inc al |
||||
notprim: |
||||
add si,64 |
||||
dec cx |
||||
jnz checkp |
||||
pop si |
||||
pop cx |
||||
push cx |
||||
push si |
||||
checkl: |
||||
cmp byte [si+4],5 |
||||
je notext |
||||
cmp byte [si+4],0x0F |
||||
je notext |
||||
cmp byte [si+16],0x00 |
||||
jz notext |
||||
cmp byte [si+26],0x80 |
||||
jb notext |
||||
mov [si+51],al |
||||
inc al |
||||
notext: |
||||
add si,64 |
||||
dec cx |
||||
jnz checkl |
||||
pop si |
||||
pop cx |
||||
mov al,'A' |
||||
push cx |
||||
push si |
||||
checkn: |
||||
cmp byte [si+26],0x80 |
||||
jae notlec |
||||
mov [si+51],al |
||||
inc al |
||||
notlec: |
||||
add si,64 |
||||
dec cx |
||||
jnz checkn |
||||
pop si |
||||
pop cx |
||||
mov al,'*' |
||||
push cx |
||||
push si |
||||
checko: |
||||
cmp byte [si+4],5 |
||||
je ext2 |
||||
cmp byte [si+4],0x0F |
||||
jne notext2 |
||||
ext2: |
||||
mov [si+51],al |
||||
notext2: |
||||
add si,64 |
||||
dec cx |
||||
jnz checko |
||||
pop si |
||||
pop cx |
||||
pop bp |
||||
pop di |
||||
pop si |
||||
pop dx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;=============GETVOLUME============== |
||||
;Envoie en es:di les infos disque EBP |
||||
;-> BP, ES:DI |
||||
;<- |
||||
;==================================== |
||||
getvolume: |
||||
push ax |
||||
push ecx |
||||
push edx |
||||
push di |
||||
push di |
||||
mov cx,64 |
||||
mov al,0 |
||||
cld |
||||
rep stosb |
||||
pop di |
||||
mov byte [es:di+4],0xFF |
||||
mov ecx,0 |
||||
mov [di+26],bp |
||||
push di |
||||
add di,28 |
||||
call getbootinfos |
||||
pop di |
||||
mov [di+12],edx |
||||
pop di |
||||
pop edx |
||||
pop ecx |
||||
pop ax |
||||
ret |
||||
|
||||
;==========GETBOOTINFOS============== |
||||
;Envoie en es:di le nom du volume & le FS d'adresse LBA ECX sur disque EBP |
||||
;-> BP, ES:DI, ECX |
||||
;<- |
||||
;==================================== |
||||
getbootinfos: |
||||
push ax |
||||
push cx |
||||
push si |
||||
push di |
||||
push di |
||||
push es |
||||
push cs |
||||
pop es |
||||
mov di,buffer |
||||
mov si,di |
||||
call readsector |
||||
pop es |
||||
pop di |
||||
cmp byte [si+0x13],0 |
||||
je more32 |
||||
xor edx,edx |
||||
mov dx,[si+0x13] |
||||
jmp more16 |
||||
more32: |
||||
mov edx,[si+0x20] |
||||
more16: |
||||
cmp byte [si+0x42],0x29 |
||||
je fat32 |
||||
cmp byte [si+0x26],0x29 |
||||
je fat16 |
||||
unk: |
||||
mov si,noname |
||||
jmp rel |
||||
fat32: |
||||
add si,0x47 |
||||
jmp rel |
||||
fat16: |
||||
add si,0x2B |
||||
rel: |
||||
mov cx,11 |
||||
cld |
||||
rep movsb |
||||
mov al,0 |
||||
stosb |
||||
mov cx,8 |
||||
rep movsb |
||||
mov ax,' ' |
||||
stosw |
||||
mov al,0 |
||||
stosb |
||||
pop di |
||||
pop si |
||||
pop cx |
||||
pop ax |
||||
ret |
||||
|
||||
;==========GETPARTITION============== |
||||
;Envoie en es:di la liste des partitions du disque BP |
||||
;-> BP, ES:DI |
||||
;<- renvoie leur nombre en CX |
||||
;==================================== |
||||
getpartitions: |
||||
push eax |
||||
push ebx |
||||
push edx |
||||
push si |
||||
push di |
||||
mov ecx,0 |
||||
mov word [wheres],0 |
||||
mov [theprimary],ecx |
||||
againpart: |
||||
xor eax,eax |
||||
mov ebx,ecx |
||||
push di |
||||
mov di,partition |
||||
CALL readsector |
||||
mov si, di |
||||
pop di |
||||
add si,0x01BE |
||||
mov cl,4 |
||||
showevery: |
||||
cmp dword [si+NumSector],0x00000000 |
||||
je nothings |
||||
mov edx,[si+StartSector] |
||||
cmp byte [si+Kind],0x05 |
||||
je is |
||||
cmp byte [si+Kind],0x0F |
||||
jne isnot |
||||
is: |
||||
mov eax,[theprimary] |
||||
add eax,edx |
||||
cmp dword [theprimary],0 |
||||
jne nothings |
||||
isnot: |
||||
push ecx |
||||
push di |
||||
push si |
||||
mov cx,[wheres] |
||||
shl cx,6 |
||||
add di,cx |
||||
mov ecx,16/4 |
||||
rep movsd |
||||
pop si |
||||
mov [di],ebx |
||||
mov [di+4],si |
||||
sub word [di+4],partition |
||||
mov [di+6],ebx |
||||
add [di+6],edx |
||||
mov ecx,[di+6] |
||||
mov [di+10],bp |
||||
add di,12 |
||||
push edx |
||||
call getbootinfos |
||||
pop edx |
||||
pop di |
||||
pop ecx |
||||
inc word [wheres] |
||||
nothings: |
||||
add si,16 |
||||
dec cl |
||||
jnz showevery |
||||
mov ecx,eax |
||||
cmp dword [theprimary],0x00000000 |
||||
jne noth |
||||
mov [theprimary],eax |
||||
noth: |
||||
cmp ecx,0 |
||||
jnz near againpart |
||||
mov cx,[wheres] |
||||
pop di |
||||
pop si |
||||
pop edx |
||||
pop ebx |
||||
pop eax |
||||
ret |
||||
|
||||
;==============ISMBR================= |
||||
;Zero si Mbr sur le premier secteur du support BP |
||||
;-> BP |
||||
;<- |
||||
;==================================== |
||||
IsMbr: |
||||
push ax |
||||
push ecx |
||||
push di |
||||
push es |
||||
mov ecx,0 |
||||
mov di,buffer |
||||
push cs |
||||
pop es |
||||
call readsector |
||||
add di,0x01BE |
||||
mov cl,4 |
||||
isgood: |
||||
mov al,[cs:di] |
||||
and al,0x7F |
||||
cmp al,0 |
||||
jne noMbr |
||||
add di,16 |
||||
dec cl |
||||
jne isgood |
||||
cmp word [cs:di],0xAA55 |
||||
noMbr: |
||||
pop es |
||||
pop di |
||||
pop ecx |
||||
pop ax |
||||
ret |
||||
|
||||
;=============DETECTDISK============= |
||||
;Renvoie en ES:DI les disques d‚tect‚s fini par 0FFh |
||||
;-> ES:DI |
||||
;<- |
||||
;==================================== |
||||
detectdisk: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push dx |
||||
push si |
||||
push di |
||||
mov si,PossibleDisks |
||||
DetectAllDisk: |
||||
mov dl,[cs:si] |
||||
inc si |
||||
cmp dl,0xFF |
||||
je EndOfDetection |
||||
mov cl,4 |
||||
retry: |
||||
push cx |
||||
mov ax,0x0201 |
||||
mov cx,0x0101 |
||||
mov dh,0x00 |
||||
mov bx,buffer |
||||
int 0x13 |
||||
pop cx |
||||
jnc isdetected |
||||
dec cl |
||||
jnz retry |
||||
jmp DetectAllDisk |
||||
isdetected: |
||||
mov [es:di],dl |
||||
inc di |
||||
jmp DetectAllDisk |
||||
EndOfDetection: |
||||
mov byte [di],0xFF |
||||
pop di |
||||
pop si |
||||
pop dx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
PossibleDisks db 0x00,0x01,0x02,0x03,0x04,0x05,0x80,0x81,0x82,0x83,0x84,0x85,0xFF |
||||
|
||||
;=============INITDISK=============== |
||||
;Initialise le p‚riph‚rique BP pour une utilisation ult‚rieure |
||||
;-> BP |
||||
;<- |
||||
;==================================== |
||||
initdisk: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push dx |
||||
push di |
||||
push es |
||||
mov dx,bp |
||||
mov ah,8 |
||||
int 0x13 |
||||
and cx,0x3F |
||||
mov [cs:sectorspertrack],cx |
||||
mov cl,dh |
||||
inc cl |
||||
mov [cs:headsperdrive],cx |
||||
pop es |
||||
pop di |
||||
pop dx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;=============READSECTOR=============== |
||||
;Lit le secteur ECX du disque BP et le met en es:di |
||||
;-> |
||||
;<- |
||||
;====================================== |
||||
readsector: |
||||
push ax |
||||
push bx |
||||
push ecx |
||||
push dx |
||||
push si |
||||
mov ax,bp |
||||
mov [cs:temp],al |
||||
mov ax, cx |
||||
ror ecx, 16 |
||||
mov dx, cx |
||||
rol ecx,16 |
||||
cmp ecx,4128705 |
||||
ja extended |
||||
div word [cs:sectorspertrack] |
||||
inc dl |
||||
mov bl, dl |
||||
xor dx,dx |
||||
div word [cs:headsperdrive] |
||||
mov dh, [cs:temp] |
||||
xchg dl, dh |
||||
mov cx, ax |
||||
xchg cl, ch |
||||
shl cl, 6 |
||||
or cl, bl |
||||
mov bx, di |
||||
mov si, 4 |
||||
mov al, 1 |
||||
TryAgain: |
||||
mov ah, 2 |
||||
int 0x13 |
||||
jnc Done |
||||
dec si |
||||
jnz TryAgain |
||||
Done: |
||||
pop si |
||||
pop dx |
||||
pop ecx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
extended: |
||||
push di |
||||
push ds |
||||
push cs |
||||
pop ds |
||||
mov si,block |
||||
mov byte [si+Sizes],0x10 |
||||
mov byte [si+Reserve],0x01 |
||||
mov word [si+NumSectors],0x0001 |
||||
mov [si+Adressseg],es |
||||
mov [si+Adressoff],di |
||||
mov [si+SectorLow],ax |
||||
mov [si+SectorHigh],dx |
||||
mov di,4 |
||||
mov dl,[temp] |
||||
TryAgainX: |
||||
mov ah, 0x42 |
||||
int 0x13 |
||||
jnc DoneX |
||||
dec di |
||||
jnz TryAgainX |
||||
DoneX: |
||||
pop ds |
||||
pop di |
||||
pop si |
||||
pop dx |
||||
pop ecx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
headsperdrive dw 16 |
||||
sectorspertrack dw 38 |
||||
block times 24 db 0 |
||||
temp db 0 |
||||
|
||||
;============CLS============== |
||||
;Efface l'‚cran |
||||
;-> |
||||
;<- |
||||
;============================= |
||||
cls: |
||||
push ax |
||||
mov ax,0x0003 |
||||
int 0x10 |
||||
pop ax |
||||
ret |
||||
|
||||
;==========SHOWSTR============ |
||||
;Affiche une chaine de caractŠre point‚ par SI |
||||
;-> SI pointe une chaine |
||||
;<- |
||||
;============================= |
||||
showstr: |
||||
push ax |
||||
push bx |
||||
push si |
||||
cld |
||||
again: |
||||
lodsb |
||||
or al,al |
||||
jz fin |
||||
call showchar |
||||
jmp again |
||||
fin: |
||||
pop si |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;==========SHOWPASSTR============ |
||||
;Affiche une chaine de caractŠre point‚ par SI |
||||
;-> SI pointe une chaine |
||||
;<- |
||||
;============================= |
||||
showpasstr: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push si |
||||
mov cl,[si] |
||||
inc si |
||||
cld |
||||
again2: |
||||
lodsb |
||||
call showchar |
||||
dec cl |
||||
jnz again2 |
||||
fin2: |
||||
pop si |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;==========WAITKEY============= |
||||
;Attend l'appuie d'une toouche et |
||||
;renvoie en AL la touche appuyer |
||||
;-> |
||||
;<- AL |
||||
;============================== |
||||
waitkey: |
||||
mov ax,0 |
||||
int 0x16 |
||||
ret |
||||
|
||||
;==========SHOWCHAR============ |
||||
;Affiche un caractŠre point‚ dans AL |
||||
;-> AL |
||||
;<- |
||||
;============================== |
||||
showchar: |
||||
push ax |
||||
push bx |
||||
mov ah,0x0E |
||||
mov bx,0x07 |
||||
int 0x10 |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;==========SHOWINT============ |
||||
;Affiche un entier EDX apr‚s le curseur |
||||
;-> EDX un entier |
||||
;<- |
||||
;============================= |
||||
showint: |
||||
push eax |
||||
push bx |
||||
push cx |
||||
push edx |
||||
push esi |
||||
push di |
||||
push ds |
||||
push es |
||||
|
||||
push cs |
||||
push cs |
||||
pop ds |
||||
pop es |
||||
mov cx,10 |
||||
mov di, showbuffer |
||||
mov al,' ' |
||||
cld |
||||
rep stosb |
||||
xor cx,cx |
||||
mov eax, edx |
||||
mov esi, 10 |
||||
mov bx,di |
||||
mov byte [cs:di+1],0 |
||||
decint: |
||||
xor edx,edx |
||||
div esi |
||||
add dl,'0' |
||||
inc cx |
||||
mov [cs:bx],dl |
||||
dec bx |
||||
cmp ax, 0 |
||||
jne decint |
||||
showinteger: |
||||
mov si, showbuffer |
||||
call showstr |
||||
pop es |
||||
pop ds |
||||
pop di |
||||
pop esi |
||||
pop edx |
||||
pop cx |
||||
pop bx |
||||
pop eax |
||||
ret |
||||
|
||||
;============================================================================= |
||||
|
||||
; VARIABLES INITIALISEE |
||||
|
||||
;============================================================================= |
||||
|
||||
sel dw 0 |
||||
wheres dw 0 |
||||
numbers dw 0 |
||||
|
||||
;============================================================================= |
||||
|
||||
; VARIABLES NON INITIALISEE |
||||
|
||||
;============================================================================= |
||||
|
||||
theprimary equ $ |
||||
showbuffer equ $+1 |
||||
disk equ $+1+12 |
||||
partition equ $+1+12+26 |
||||
buffer equ $+1+12+26+512 |
||||
thepart equ $+1+12+26+512+512 |
||||
|
||||
section .bss |
||||
|
||||
%include "partition.h" |
||||
%include "echs.h" |
||||
|
||||
;theprimary resd 1 |
||||
;showbuffer resb 12 |
||||
;disk resb 26 |
||||
;partition resb 512 |
||||
;buffer resb 512 |
||||
;thepart resb 10000 |
||||
|
@ -0,0 +1,17 @@
|
||||
all: makall |
||||
|
||||
makall: mbrol.com |
||||
|
||||
mbrol.com: |
||||
nasm -f bin -o mbr.bin mbr.asm
|
||||
nasm -f bin -o loader.bin loader.asm
|
||||
sync
|
||||
nasm -f bin -o mbrol.com mbrol.asm
|
||||
|
||||
clean: |
||||
rm -f *.o
|
||||
rm -f *.bin
|
||||
rm -f *.sys
|
||||
rm -f *.com
|
||||
|
||||
|
@ -0,0 +1,214 @@
|
||||
[BITS 16] |
||||
[ORG 0x7C00] |
||||
|
||||
start: |
||||
jmp short falsereal ;vers debut programme |
||||
db "MBROL" ;Signature MBROL |
||||
falsereal: |
||||
cli ;inhibation interruptions |
||||
xor ax,ax |
||||
mov ss,ax ;Reloge pile en 0000h:9000h |
||||
mov sp,0x9000 |
||||
push ax |
||||
pop ds ;DS=0000h |
||||
add ah,0x10 |
||||
push ax |
||||
pop es ;ES=1000h |
||||
sti ;Reactivation des interruptions |
||||
cld |
||||
mov [sitemp],si ;sauvegarde si (adresse partition active) |
||||
mov di,0x7C00 |
||||
mov si,di |
||||
mov cx,512/4 |
||||
rep movsd ;On reloge le programme en 1000h:7C00h |
||||
push es |
||||
pop ds ;DS=1000h |
||||
jmp 0x1000:RealStart |
||||
|
||||
RealStart: |
||||
xor dh,dh |
||||
mov bp,dx ;R‚cupŠre en BP le nølecteur de d‚marrage |
||||
call initdisk ;Initialisation du p‚riph‚rique |
||||
;call cls ;Efface l'‚cran |
||||
mov si, msg |
||||
call showstr ;Affiche le splatch de boot |
||||
call getkey ;R‚cupŠre la touche press‚ par l'utilisateur |
||||
cmp al,' ' ;touche = espace |
||||
jne normal ;si autre touche on démarre normalement |
||||
mov si, msgmbrol |
||||
call showstr ;Message de chargement de Cos loader |
||||
xor ecx,ecx |
||||
inc ecx |
||||
mov di,0x0100 |
||||
readload: |
||||
inc ecx |
||||
call readsector ;Charge le secteur LBA ecx en es:di |
||||
add di,512 |
||||
cmp ecx,7 |
||||
jb readload ;Charge les secteurs LBA 2 … 6 en 1000h:0100h |
||||
|
||||
jmp 0x1000:0x0100 ;Execute Cos loader |
||||
;saut FAR vers 1000h:0100h |
||||
|
||||
normal: |
||||
mov si,msgnorm |
||||
call showstr ;Affiche le d‚marrage normal |
||||
mov ecx,1 |
||||
xor ax,ax |
||||
mov es,ax |
||||
mov ds,ax |
||||
mov di,0x7C00 ;Charge le secteur LBA 1 en 0000h:7C00h |
||||
call readsector ;qui est le MBR d'origine sauvegard‚ par MBROL |
||||
mov dx,bp ;Renvoie dans DL le lecteur de d‚marrage |
||||
mov si,[sitemp] ;restaure si (adresse de la partition) |
||||
jmp 0x0000:0x7C00 ;Une op‚ration normalement r‚alis‚e par le BIOS |
||||
;Saut vers le MBR en 0000h:7C00h |
||||
|
||||
temp db 0 |
||||
sitemp dw 0 |
||||
HeadsPerDrive dw 16 |
||||
SectorsPerTrack dw 38 |
||||
msg db "Cos2000 MBROL V1.0",0x0A,0x0D,"Press [SPACE] to execute Cos Loader",0x0A,0x0D,0 |
||||
point db '.',0 |
||||
msgmbrol db "Cos Loader is loading",0 |
||||
msgnorm db "Booting...",0 |
||||
|
||||
;=============INITDISK=============== |
||||
;Initialise le p‚riph‚rique BP pour une utilisation ult‚rieure |
||||
;-> BP |
||||
;<- |
||||
;==================================== |
||||
initdisk: |
||||
push ax |
||||
push bx |
||||
push cx |
||||
push dx |
||||
push di |
||||
push es |
||||
mov dx,bp |
||||
mov ah,8 |
||||
int 0x13 |
||||
and cx,111111b |
||||
mov [cs:SectorsPerTrack],cx |
||||
mov cl,dh |
||||
inc cl |
||||
mov [cs:HeadsPerDrive],cx |
||||
pop es |
||||
pop di |
||||
pop dx |
||||
pop cx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;=============READSECTOR (Fonction 01H)=============== |
||||
;Lit le secteur ECX du disque BP et le met en es:di |
||||
;-> AH=1 |
||||
;<- Flag Carry si erreur |
||||
;===================================================== |
||||
readsector: |
||||
push ax |
||||
push bx |
||||
push ecx |
||||
push dx |
||||
push si |
||||
mov ax,bp |
||||
mov [cs:temp],al |
||||
mov ax, cx |
||||
ror ecx, 16 |
||||
mov dx, cx |
||||
rol ecx,16 |
||||
div word [cs: SectorsPerTrack] |
||||
inc dl |
||||
mov bl, dl |
||||
xor dx,dx |
||||
div word [cs: HeadsPerDrive] |
||||
mov dh, [cs:temp] |
||||
xchg dl, dh |
||||
mov cx, ax |
||||
xchg cl, ch |
||||
shl cl, 6 |
||||
or cl, bl |
||||
mov bx, di |
||||
mov si, 4 |
||||
mov al, 1 |
||||
TryAgain: |
||||
mov ah, 2 |
||||
int 13h |
||||
push si |
||||
mov si,point |
||||
call showstr |
||||
pop si |
||||
jnc Done |
||||
dec si |
||||
jnz TryAgain |
||||
Done: |
||||
pop si |
||||
pop dx |
||||
pop ecx |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;============CLS============== |
||||
;Efface l'‚cran |
||||
;-> |
||||
;<- |
||||
;============================= |
||||
cls: |
||||
push ax |
||||
mov ax,0x0003 |
||||
int 0x10 |
||||
pop ax |
||||
ret |
||||
|
||||
;==========SHOWSTR============ |
||||
;Affiche une chaine de caractŠre point‚ par SI |
||||
;-> SI pointe une chaine |
||||
;<- |
||||
;============================= |
||||
showstr: |
||||
push ax |
||||
push bx |
||||
push si |
||||
again: |
||||
lodsb |
||||
or al,al |
||||
jz fin |
||||
CALL showchar |
||||
jmp again |
||||
fin: |
||||
pop si |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
;===========GETKEY============= |
||||
;N'Attend l'appuie d'une touche et |
||||
;renvoie en AL la touche appuyer |
||||
;-> |
||||
;<- AL |
||||
;============================== |
||||
getkey: |
||||
mov ah,0x01 |
||||
int 0x16 |
||||
ret |
||||
|
||||
;==========SHOWCHAR============ |
||||
;Affiche un caractŠre point‚ dans AL |
||||
;-> AL |
||||
;<- |
||||
;============================== |
||||
showchar: |
||||
push ax |
||||
push bx |
||||
mov ah,0x0E |
||||
mov bx,0x07 |
||||
int 0x10 |
||||
pop bx |
||||
pop ax |
||||
ret |
||||
|
||||
times 510-($-$$) db 0 |
||||
|
||||
dw 0xAA55 |
@ -0,0 +1,10 @@
|
||||
struc part
|
||||
Active resb 1 |
||||
StartH resb 1 |
||||
StartCS resw 1 |
||||
Kind resb 1 |
||||
EndH resb 1 |
||||
EndCS resw 1 |
||||
StartSector resd 1 |
||||
NumSector resd 1 |
||||
endstruc |
@ -0,0 +1,130 @@
|
||||
static u8 font8x8 [2048] = { |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
|
||||
0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
|
||||
0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0xD6, 0x10, 0x38,
|
||||
0x10, 0x38, 0x7C, 0xFE, 0xFE, 0x7C, 0x10, 0x38, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
|
||||
0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
|
||||
0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
|
||||
0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
|
||||
0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0, 0x18, 0xDB, 0x3C, 0xE7, 0xE7, 0x3C, 0xDB, 0x18,
|
||||
0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
|
||||
0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
|
||||
0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00, 0x3E, 0x61, 0x3C, 0x66, 0x66, 0x3C, 0x86, 0x7C,
|
||||
0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
|
||||
0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
|
||||
0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
|
||||
0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
|
||||
0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
|
||||
0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
|
||||
0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0x00, 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
|
||||
0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00,
|
||||
0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
|
||||
0x38, 0x6C, 0xC6, 0xD6, 0xC6, 0x6C, 0x38, 0x00, 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00,
|
||||
0x7C, 0xC6, 0x06, 0x1C, 0x30, 0x66, 0xFE, 0x00, 0x7C, 0xC6, 0x06, 0x3C, 0x06, 0xC6, 0x7C, 0x00,
|
||||
0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00, 0xFE, 0xC0, 0xC0, 0xFC, 0x06, 0xC6, 0x7C, 0x00,
|
||||
0x38, 0x60, 0xC0, 0xFC, 0xC6, 0xC6, 0x7C, 0x00, 0xFE, 0xC6, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
|
||||
0x7C, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, 0x7C, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0x78, 0x00,
|
||||
0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
|
||||
0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00,
|
||||
0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x7C, 0xC6, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
|
||||
0x7C, 0xC6, 0xDE, 0xDE, 0xDE, 0xC0, 0x78, 0x00, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00,
|
||||
0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
|
||||
0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
|
||||
0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
|
||||
0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00,
|
||||
0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
|
||||
0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
|
||||
0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
|
||||
0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xCE, 0x7C, 0x0E,
|
||||
0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00, 0x3C, 0x66, 0x30, 0x18, 0x0C, 0x66, 0x3C, 0x00,
|
||||
0x7E, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x3C, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
|
||||
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00,
|
||||
0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x3C, 0x00,
|
||||
0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00,
|
||||
0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00,
|
||||
0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
|
||||
0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
|
||||
0xE0, 0x60, 0x7C, 0x66, 0x66, 0x66, 0xDC, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x00,
|
||||
0x1C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00,
|
||||
0x3C, 0x66, 0x60, 0xF8, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
|
||||
0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
|
||||
0x06, 0x00, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
|
||||
0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xD6, 0xD6, 0x00,
|
||||
0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
|
||||
0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
|
||||
0x00, 0x00, 0xDC, 0x76, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x00,
|
||||
0x30, 0x30, 0xFC, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||
0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00,
|
||||
0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0xFC,
|
||||
0x00, 0x00, 0x7E, 0x4C, 0x18, 0x32, 0x7E, 0x00, 0x0E, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0E, 0x00,
|
||||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x70, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x70, 0x00,
|
||||
0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
|
||||
0x7C, 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x0C, 0x78, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||
0x0C, 0x18, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00, 0x7C, 0x82, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
|
||||
0xC6, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, 0x30, 0x18, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
|
||||
0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x7E, 0xC0, 0xC0, 0x7E, 0x0C, 0x38,
|
||||
0x7C, 0x82, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00,
|
||||
0x30, 0x18, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
|
||||
0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3C, 0x00,
|
||||
0xC6, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x38, 0x6C, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
|
||||
0x18, 0x30, 0xFE, 0xC0, 0xF8, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x7E, 0x12, 0xFE, 0x90, 0xFE, 0x00,
|
||||
0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00, 0x7C, 0x82, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
|
||||
0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x30, 0x18, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
|
||||
0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x60, 0x30, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||
0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0xFC, 0xC6, 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
|
||||
0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x02, 0x7C, 0xCE, 0xD6, 0xE6, 0x7C, 0x80,
|
||||
0x38, 0x6C, 0x64, 0xF0, 0x60, 0x66, 0xFC, 0x00, 0x3A, 0x6C, 0xCE, 0xD6, 0xE6, 0x6C, 0xB8, 0x00,
|
||||
0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0xD8, 0x70, 0x00,
|
||||
0x18, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, 0x0C, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3C, 0x00,
|
||||
0x0C, 0x18, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x18, 0x30, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||
0x76, 0xDC, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x00, 0x76, 0xDC, 0x00, 0xE6, 0xF6, 0xDE, 0xCE, 0x00,
|
||||
0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
|
||||
0x18, 0x00, 0x18, 0x18, 0x30, 0x63, 0x3E, 0x00, 0x7E, 0x81, 0xB9, 0xA5, 0xB9, 0xA5, 0x81, 0x7E,
|
||||
0x00, 0x00, 0x00, 0xFE, 0x06, 0x06, 0x00, 0x00, 0x63, 0xE6, 0x6C, 0x7E, 0x33, 0x66, 0xCC, 0x0F,
|
||||
0x63, 0xE6, 0x6C, 0x7A, 0x36, 0x6A, 0xDF, 0x06, 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
|
||||
0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
|
||||
0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
|
||||
0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
||||
0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x30, 0x60, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00,
|
||||
0x7C, 0x82, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00, 0x18, 0x0C, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00,
|
||||
0x7E, 0x81, 0x9D, 0xA1, 0xA1, 0x9D, 0x81, 0x7E, 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
|
||||
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
|
||||
0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
|
||||
0x66, 0x66, 0x3C, 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
|
||||
0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
|
||||
0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
|
||||
0x76, 0xDC, 0x7C, 0x06, 0x7E, 0xC6, 0x7E, 0x00, 0x76, 0xDC, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00,
|
||||
0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
|
||||
0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
|
||||
0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
|
||||
0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x00, 0xC6, 0x7C, 0xC6, 0xC6, 0x7C, 0xC6, 0x00,
|
||||
0x30, 0x7E, 0x0C, 0x7C, 0xCC, 0xCC, 0x78, 0x00, 0xF8, 0x6C, 0x66, 0xF6, 0x66, 0x6C, 0xF8, 0x00,
|
||||
0x7C, 0x82, 0xFE, 0xC0, 0xFC, 0xC0, 0xFE, 0x00, 0xC6, 0x00, 0xFE, 0xC0, 0xFC, 0xC0, 0xFE, 0x00,
|
||||
0x30, 0x18, 0xFE, 0xC0, 0xFC, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
|
||||
0x0C, 0x18, 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x3C, 0x42, 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00,
|
||||
0x66, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18,
|
||||
0x30, 0x18, 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
|
||||
0x30, 0x60, 0x38, 0x6C, 0xC6, 0x6C, 0x38, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xCC, 0xC6, 0xCC, 0x00,
|
||||
0x7C, 0x82, 0x38, 0x6C, 0xC6, 0x6C, 0x38, 0x00, 0x0C, 0x06, 0x38, 0x6C, 0xC6, 0x6C, 0x38, 0x00,
|
||||
0x76, 0xDC, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x76, 0xDC, 0x38, 0x6C, 0xC6, 0x6C, 0x38, 0x00,
|
||||
0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0xC0, 0xE0, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0xF0,
|
||||
0xF0, 0x60, 0x7C, 0x66, 0x7C, 0x60, 0xF0, 0x00, 0x18, 0x30, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
|
||||
0x7C, 0x82, 0x00, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x60, 0x30, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00,
|
||||
0x18, 0x30, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0xFC, 0x0C, 0x18, 0x66, 0x66, 0x3C, 0x18, 0x3C, 0x00,
|
||||
0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xE1, 0x32, 0xE4, 0x3A, 0xF6, 0x2A, 0x5F, 0x86,
|
||||
0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00, 0x3E, 0x61, 0x3C, 0x66, 0x66, 0x3C, 0x86, 0x7C,
|
||||
0x00, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C, 0x38,
|
||||
0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00,
|
||||
0x78, 0x0C, 0x38, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x18, 0x30, 0x7C, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
||||
}; |
@ -0,0 +1,17 @@
|
||||
FREEC=gcc -O2 -nostdinc -ffreestanding -fno-builtin -fomit-frame-pointer -Wall -I ../Include -c
|
||||
PARTIAL=-r
|
||||
OBJS= string.o vgatxt.o
|
||||
|
||||
all: makeall |
||||
|
||||
makeall: $(OBJS) |
||||
(sync;ld $(PARTIAL) -o libs.o $(OBJS))
|
||||
|
||||
vgatxt.o:vgatxt.c |
||||
$(FREEC) $^
|
||||
|
||||
string.o:string.c |
||||
$(FREEC) $^
|
||||
clean: |
||||
rm -f *.o
|
||||
|
@ -0,0 +1,118 @@
|
||||
#define maxgraphmode 5 |
||||
#define maxtextmode 5 |
||||
|
||||
static mode_def textmodes[maxtextmode] = { |
||||
|
||||
/*MODE 0, 40*25 16 couleurs */ |
||||
{ |
||||
0x67,0x00,0x03,0x08,0x03,0x00,0x02, |
||||
0x2D,0x27,0x28,0x90,0x2B,0x0A,0xBF,0x1F,0x00,0x4F,0x0D,0x0E,0x00,0x00,0x00,0x00, |
||||
0x9C,0x8E,0x8F,0x14,0x1F,0x96,0xB9,0xA3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
||||
0x0C,0x00,0x0F,0x08,0x00, |
||||
40,25 |
||||
}, |
||||
|
||||
/*MODE 1, 80*25 16 couleurs */ |
||||
{ |
||||
0x67,0x00,0x03,0x00,0x03,0x00,0x02, |
||||
0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x4F,0x0D,0x0E,0x00,0x00,0x00,0x00, |
||||
0x9C,0x0E,0x8F,0x28,0x1F,0x96,0xB9,0xA3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
||||
0x0C,0x00,0x0F,0x08,0x00, |
||||
80,25 |
||||
}, |
||||
|
||||
/*MODE 2, 80*50 16 couleurs */ |
||||
{ |
||||
0x63,0x00,0x03,0x01,0x03,0x01,0x02, |
||||
0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x47,0x06,0x07,0x00,0x00,0x00,0x00, |
||||
0x9C,0x8E,0x8F,0x28,0x1F,0x96,0xB9,0xA3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
||||
0xCF,0x00,0x0F,0x00,0x00, |
||||
80,50 |
||||
}, |
||||
|
||||
/*MODE 3, 100*50 16 couleurs */ |
||||
{ |
||||
0x67,0x00,0x03,0x01,0x03,0x01,0x02, |
||||
0x70,0x63,0x64,0x85,0x68,0x84,0xBF,0x1F,0x00,0x47,0x06,0x07,0x00,0x00,0x00,0x00, |
||||
0x9C,0x8E,0x8F,0x32,0x1F,0x96,0xB9,0xA3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
||||
0x0C,0x00,0x0F,0x00,0x00, |
||||
100,50
|
||||
}, |
||||
|
||||
/*MODE 4, 100*60 16 couleurs */ |
||||
{ |
||||
0xA7,0x00,0x03,0x01,0x03,0x01,0x02, |
||||
0x70,0x63,0x64,0x85,0x68,0x84,0xFF,0x1F,0x00,0x47,0x06,0x07,0x00,0x00,0x00,0x00, |
||||
0xE7,0x8E,0xDF,0x32,0x1F,0xDF,0xE5,0xA3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
||||
0x0C,0x00,0x0F,0x00,0x00, |
||||
100,60 |
||||
} |
||||
}; |
||||
|
||||
|
||||
static mode_def graphmodes[maxgraphmode] = { |
||||
/*MODE 80, 320*200 256 couleurs */
|
||||
{ |
||||
0x63,0x00,0x03,0x01,0x0F,0x00,0x06, |
||||
0x5F,0x4F,0x50,0x82,0x54,0x80,0xBF,0x1F,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x9C,0x0E,0x8F,0x28,0x00,0x96,0xB9,0xE3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, |
||||
0x41,0x00,0x0F,0x00,0x00, |
||||
40,25
|
||||
}, |
||||
|
||||
/*MODE 81, 320*400 256 couleurs */ |
||||
{ |
||||
0x63,0x00,0x03,0x01,0x0F,0x00,0x06, |
||||
0x5F,0x4F,0x50,0x82,0x54,0x80,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x9C,0x8E,0x8F,0x28,0x00,0x96,0xB9,0xE3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, |
||||
0x41,0x00,0x0F,0x00,0x00, |
||||
40,50 |
||||
}, |
||||
|
||||
/*MODE 82, 320*480 256 couleurs */ |
||||
{ |
||||
0xE3,0x00,0x03,0x01,0x0F,0x00,0x06, |
||||
0x5F,0x4F,0x50,0x82,0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0xEA,0xAC,0xDF,0x28,0x00,0xE7,0x06,0xE3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, |
||||
0x41,0x00,0x0F,0x00,0x00, |
||||
40,60 |
||||
}, |
||||
|
||||
/*MODE 83, 360*480 256 couleurs */ |
||||
{ |
||||
0xE7,0x00,0x03,0x01,0x0F,0x00,0x06, |
||||
0x6B,0x59,0x5A,0x8E,0x5E,0x8A,0x0D,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0xEA,0xAC,0xDF,0x2D,0x00,0xE7,0x06,0xE3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, |
||||
0x41,0x00,0x0F,0x00,0x00, |
||||
45,60 |
||||
}, |
||||
|
||||
/*MODE 84, 400*600 256 couleurs */ |
||||
{ |
||||
0xE7,0x00,0x03,0x01,0x0F,0x00,0x06, |
||||
0x74,0x63,0x64,0x97,0x68,0x95,0x86,0xF0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x5B,0x8D,0x57,0x32,0x00,0x60,0x80,0xE3,0xFF, |
||||
0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, |
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, |
||||
0x41,0x00,0x0F,0x00,0x00, |
||||
50,75 |
||||
} |
||||
}; |
@ -0,0 +1,11 @@
|
||||
#include "types.h" |
||||
|
||||
void memset(void *dst, u8 val, u16 count,u32 size) |
||||
{ |
||||
u8 *temp; |
||||
for(temp = (u8 *)dst; count != 0; count--)
|
||||
{ |
||||
temp+=size; |
||||
*temp = val; |
||||
} |
||||
} |
@ -0,0 +1,88 @@
|
||||
#include "vga.h" |
||||
#include "string.h" |
||||
#include "asm.h" |
||||
|
||||
#include "modes.c" |
||||
#include "8x8fnt.c" |
||||
|
||||
#define sequencer 0x3c4 |
||||
#define misc 0x3c2 |
||||
#define ccrt 0x3D4 |
||||
#define attribs 0x3c0 |
||||
#define graphics 0x3ce |
||||
#define state 0x3da |
||||
|
||||
|
||||
static u16 resX,resY,cursX,cursY; /* resolution x,y en caractères et position du curseur */ |
||||
static u16 pages,pagesize,activepage; /* nombre de pages disponibles et taille d'une page */ |
||||
static u8 vmode; /* mode en cours d'utilisation */ |
||||
static u16 basemem; /* debut de la mémoire vidéo */ |
||||
static bool scrolling,graphic; /* Activation du défilement, Flag du mode graphique */ |
||||
|
||||
|
||||
void print (u8* string) |
||||
{ |
||||
u8 *source,*screen;
|
||||
source = string; |
||||
screen = (u8 *)TEXTSCREEN; |
||||
while(*source!=0x00) |
||||
{
|
||||
*screen = *source;
|
||||
screen+=2; |
||||
source++; |
||||
} |
||||
} |
||||
|
||||
void cls (void) |
||||
{ |
||||
memset((u8 *)TEXTSCREEN,0x20,(80*25*2),2); |
||||
} |
||||
|
||||
|
||||
u16 setvmode(u8 choosedmode) |
||||
{ |
||||
u8 *def,i,mode; |
||||
|
||||
mode=choosedmode&0x7F; |
||||
if (choosedmode>0x7F) |
||||
{ |
||||
if (mode>maxgraphmode) return 1; /* mode inexistant */
|
||||
def=(u8 *)&graphmodes[mode]; |
||||
graphic=true; |
||||
} |
||||
else |
||||
{ |
||||
if (mode>maxtextmode) return 1; /* mode inexistant */
|
||||
def=(u8 *)&textmodes[mode]; |
||||
graphic=false; |
||||
} |
||||
outb(misc,*def++); |
||||
outb(state,*def++); |
||||
for(i=0;i<5;i++) |
||||
{ |
||||
outb(sequencer,i); |
||||
outb(sequencer+1,*def++);
|
||||
} |
||||
outb(ccrt,0x11); |
||||
outb(ccrt+1,0x0E); |
||||
for(i=0;i<25;i++) |
||||
{ |
||||
outb(ccrt,i); |
||||
outb(ccrt+1,*def++);
|
||||
} |
||||
for(i=0;i<9;i++) |
||||
{ |
||||
outb(graphics,i); |
||||
outb(graphics+1,*def++);
|
||||
} |
||||
inb(state);
|
||||
for(i=0;i<21;i++) |
||||
{ |
||||
inb(attribs); |
||||
outb(attribs,i); |
||||
outb(attribs,*def++);
|
||||
} |
||||
inb(state); |
||||
outb(attribs,0x20); |
||||
return 0; |
||||
} |
@ -0,0 +1,29 @@
|
||||
all: makall |
||||
|
||||
makall: boot/boot12.bin installer/mbrol.com lib/libs.o system/system.sys |
||||
sync
|
||||
|
||||
clean: |
||||
(cd system; make clean)
|
||||
(cd boot; make clean)
|
||||
(cd install; make clean)
|
||||
(cd lib;make clean)
|
||||
sync
|
||||
|
||||
backup: clean |
||||
(cd .. ; tar cf - cos | gzip -f - > backup.tar.gz)
|
||||
|
||||
allbackup: backup |
||||
(echo Inserez une disquette; sleep ; cp ../backup.tar.bz2 /dev/fd0)
|
||||
|
||||
system/system.sys: |
||||
(cd system; make)
|
||||
|
||||
boot/boot12.bin: |
||||
(cd boot; make)
|
||||
|
||||
installer/mbrol.com: |
||||
(cd install; make)
|
||||
|
||||
lib/libs.o: |
||||
(cd lib; make)
|
@ -0,0 +1,227 @@
|
||||
[BITS 16] |
||||
[ORG 0x100] |
||||
|
||||
SECTION .text |
||||
push cs |
||||
push cs |
||||
pop ds |
||||
pop es |
||||
call EnableA20 |
||||
mov si,msgpmode |
||||
call showstr |
||||
mov ax,cs |
||||
mov [RealCS],ax |
||||
lea ax,[Real] |
||||
mov [RealIP],ax |
||||
|
||||
xor eax,eax |
||||
mov ax,cs |
||||
shl eax,4 |
||||
mov [GDT.Entry1+2],ax |
||||
mov [GDT.Entry2+2],ax |
||||
mov [GDT.Entry4+2],ax |
||||
mov [GDT.Entry5+2],ax |
||||
shr eax,16 |
||||
mov [GDT.Entry1+4],al |
||||
mov [GDT.Entry2+4],al |
||||
mov [GDT.Entry4+4],al |
||||
mov [GDT.Entry5+4],al |
||||
|
||||
xor eax,eax |
||||
mov ax,cs |
||||
shl eax,4 |
||||
add eax,gdt0 |
||||
mov [GDTR.Address],eax |
||||
lgdt [GDTR] |
||||
|
||||
cli |
||||
;mov al,0xFF |
||||
;out 0x21,al |
||||
mov al,0x80 |
||||
out 0x70,al |
||||
|
||||
mov eax,cr0 |
||||
or al,1 |
||||
mov cr0,eax |
||||
|
||||
jmp SYS_CODE_SEL:GoPMode32 |
||||
|
||||
GoPMode32: |
||||
[BITS 32] |
||||
mov ax,SYS_DATA_SEL |
||||
mov ds,ax |
||||
mov ecx,50000/4 |
||||
cld |
||||
mov esi,kernel |
||||
mov edi,0x100000 |
||||
mov ax,ALL_DATA_SEL |
||||
mov es,ax |
||||
mov gs,ax |
||||
mov fs,ax |
||||
mov ss,ax |
||||
rep movsd |
||||
mov ds,ax |
||||
mov esp,0x3fffff |
||||
call KERNEL_SEL:0x100000 |
||||
jmp REAL_CODE_SEL:GoReal |
||||
|
||||
GoReal: |
||||
[BITS 16] |
||||
mov ax,REAL_DATA_SEL |
||||
mov ds,ax |
||||
mov es,ax |
||||
mov ss,ax |
||||
mov gs,ax |
||||
mov fs,ax |
||||
mov esp,0xffff |
||||
|
||||
mov eax,cr0 |
||||
and al,0xFE |
||||
mov cr0,eax |
||||
|
||||
jmp far [RealIP] |
||||
|
||||
Real: |
||||
jmp Real |
||||
|
||||
msgpmode db 'Pmode loader is loading',0 |
||||
|
||||
;======================SHOWSTR======================== |
||||
;Affiche la chaine de caractère pointé par ds:si à l'écran |
||||
;-> DS, SI |
||||
;<- Flag Carry si erreur |
||||
;===================================================== |
||||
showstr: |
||||
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 |
||||
|
||||
|
||||
;***********************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 |
||||
|
||||
section .data |
||||
|
||||
RealIP: dw 0 |
||||
RealCS: 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 0x40 ; 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 0x40 ; 32 bit |
||||
db 0 |
||||
|
||||
|
||||
ALL_DATA_SEL equ $-gdt0 ; 4meg data segment descriptor |
||||
|
||||
.Entry3: dw 0x03ff |
||||
dw 0x0 ; base |
||||
db 0x0 ; base |
||||
db 0x92 ; present, ring 0, data, expand-up, writable |
||||
db 0xcf ; 4k pages, 32 bit |
||||
db 0 |
||||
|
||||
|
||||
REAL_CODE_SEL equ $-gdt0 ; code segment descriptor for 16 bit mode |
||||
|
||||
.Entry4: dw 0xFFFF |
||||
dw 0x0 ; base |
||||
db 0x0 ; base |
||||
db 0x9A ; present, ring 0, code, non-conforming, readable |
||||
db 0x00 ; 16 bit |
||||
db 0 |
||||
|
||||
|
||||
REAL_DATA_SEL equ $-gdt0 ; data segment descriptor for 16 bit mode |
||||
|
||||
.Entry5: dw 0xFFFF |
||||
dw 0x0 ; base |
||||
db 0x0 ; base |
||||
db 0x92 ; present, ring 0, data, expand-up, writable |
||||
db 0x00 ; 16 bit |
||||
db 0 |
||||
|
||||
|
||||
KERNEL_SEL equ $-gdt0 ; 4meg code segment descriptor |
||||
|
||||
.Entry6: dw 0x03ff |
||||
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 |
||||
|
||||
kernel: |
||||
|
||||
SECTION .bss |
||||
|
@ -0,0 +1,31 @@
|
||||
FREEC=gcc -O2 -nostdinc -ffreestanding -fno-builtin -fomit-frame-pointer -Wall -I ../Include -c -o
|
||||
|
||||
|
||||
LINK=ld -Ttext 0x100000 -e __main -o
|
||||
|
||||
all: system.sys |
||||
sync
|
||||
|
||||
copy: |
||||
(cp system.sys /cygdrive/a)
|
||||
|
||||
copy2: |
||||
(cp system.sys /cygdrive/b)
|
||||
|
||||
system.sys: |
||||
nasm -f bin -o loader.bin loader.asm
|
||||
nasm -f elf -o system.o system.asm
|
||||
|
||||
$(FREEC) systemc.o system.c
|
||||
$(LINK) system.out systemc.o system.o ../lib/libs.o
|
||||
objcopy -O binary system.out system.bin
|
||||
cat loader.bin>system.sys
|
||||
cat system.bin>>system.sys
|
||||
|
||||
clean: |
||||
rm -f *.o
|
||||
rm -f *.out
|
||||
rm -f *.bin
|
||||
rm -f *.sys
|
||||
|
||||
|
Loading…
Reference in new issue