cos2000v2/boot/boottest.asm

218 lines
5.1 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 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