270 lines
6.3 KiB
NASM
270 lines
6.3 KiB
NASM
[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 |