mirror of https://git.ia64.cc/perso/cos2000v1.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
4.4 KiB
216 lines
4.4 KiB
model tiny,stdcall |
|
p486 |
|
locals |
|
jumps |
|
codeseg |
|
option procalign:byte |
|
|
|
include "..\include\mem.h" |
|
include "..\include\fat.h" |
|
include "..\include\divers.h" |
|
|
|
org 7C00h |
|
|
|
jmp boot |
|
|
|
bootsec bootinfo <"COS2000A",512,1,1,2,224,2880,0F0h,9,18,2,0,0,0,0,0,29h,01020304h,"COS2000 ","FAT12 "> |
|
|
|
errorloading db " [Erreur]",0dh,0ah,0 |
|
okloading db "Recherche noyau ",0Dh,0ah," -" |
|
sys db "SYSTEME SYS",0 |
|
syst db " [ Ok ]",0dh,0ah,"Chargement ",0 |
|
dot db ".",0 |
|
|
|
|
|
|
|
errorboot: |
|
mov si,offset errorloading |
|
call showstr |
|
mov ah,0 |
|
int 16h |
|
int 19h |
|
|
|
boot: |
|
mov [bootsec.bootdrive],dl |
|
cli |
|
mov ax,09000h |
|
mov ss,ax |
|
mov sp,0FFFFh |
|
sti |
|
boot2: |
|
push cs |
|
push cs |
|
pop es |
|
pop ds |
|
xor ax,ax |
|
mov dl,[bootsec.bootdrive] |
|
int 13h |
|
jc errorboot |
|
mov si,offset okloading |
|
call showstr |
|
mov cx,[bootsec.reservedsectors] |
|
add cx,[bootsec.hiddensectorsh] |
|
adc cx,[bootsec.hiddensectorsl] |
|
push cx |
|
mov bx,[bootsec.sectorsperfat] |
|
mov di,offset bufferfat |
|
readfat: |
|
call readsector |
|
jc errorboot |
|
inc cx |
|
add di,[bootsec.sectorsize] |
|
dec bx |
|
jnz readfat |
|
pop cx |
|
xor ax,ax |
|
mov al,[bootsec.fatsperdrive] |
|
mov bx,[bootsec.sectorsperfat] |
|
mul bx |
|
add cx,ax |
|
mov ax,32 |
|
mul [bootsec.directorysize] |
|
div [bootsec.sectorsize] |
|
add ax,cx |
|
sub ax,2 |
|
mov [word ptr bootsec.reservedfornt],ax |
|
xor dx,dx |
|
checkroot: |
|
mov di,offset buffer |
|
call readsector |
|
jc errorboot |
|
xor bx,bx |
|
findnext: |
|
cmp [byte ptr di],0 |
|
je errorboot |
|
cmp [byte ptr di],0E5h |
|
je no |
|
cmp [byte ptr di],041h |
|
je no |
|
mov si,offset dot |
|
call showstr |
|
push di cx |
|
mov si,offset sys |
|
mov cx,11 |
|
rep cmpsb |
|
pop cx di |
|
je oksystem |
|
no: |
|
add di,32 |
|
add bx,32 |
|
inc dx |
|
cmp dx,[bootsec.directorysize] |
|
ja errorboot |
|
cmp bx,[bootsec.sectorsize] |
|
jb findnext |
|
inc cx |
|
jmp checkroot |
|
oksystem: |
|
mov si,offset syst |
|
call showstr |
|
mov cx,[di+26] |
|
mov ax,8000h |
|
mov es,ax |
|
push es |
|
mov di,0000h |
|
push 0010h |
|
mov si,offset dot |
|
xor ax,ax |
|
fatagain: |
|
cmp cx,0FF0h |
|
jae finishload |
|
push cx |
|
add cx,[word ptr bootsec.reservedfornt] |
|
call readsector |
|
pop cx |
|
jc errorboot |
|
inc ax |
|
call showstr |
|
add di,[bootsec.sectorsize] |
|
call getfat |
|
jnc fatagain |
|
finishload: |
|
retf |
|
|
|
;=============READSECTOR (Fonction 01H)=============== |
|
;Lit le secteur CX et le met en es:di |
|
;-> AH=1 |
|
;<- Flag Carry si erreur |
|
;===================================================== |
|
readsector: |
|
push ax bx cx dx si |
|
mov ax,cx |
|
xor dx,dx |
|
div [bootsec.sectorspertrack] |
|
inc dl |
|
mov bl,dl |
|
xor dx,dx |
|
div [bootsec.headsperdrive] |
|
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 |
|
mov dl,[bootsec.bootdrive] |
|
int 13h |
|
jnc done |
|
dec si |
|
jnz tryagain |
|
done: |
|
pop si dx cx bx ax |
|
ret |
|
|
|
|
|
getfat: |
|
push ax bx dx di |
|
mov di,offset bufferfat |
|
mov ax,cx |
|
mov bx,ax |
|
and bx,0000000000000001b |
|
shr ax,1 |
|
mov cx,3 |
|
mul cx |
|
add di,ax |
|
cmp bx,0h |
|
jnz evenfat |
|
oddfat: |
|
mov dx,[di] |
|
and dx,0FFFh |
|
mov cx,dx |
|
jmp endfat |
|
evenfat: |
|
mov dx,[di+1] |
|
and dx,0FFF0h |
|
shr dx,4 |
|
mov cx,dx |
|
endfat: |
|
pop di dx bx ax |
|
ret |
|
|
|
|
|
showstr: |
|
push ax bx si |
|
again: |
|
lodsb |
|
or al,al |
|
jz fin |
|
mov ah,0Eh |
|
mov bx,07h |
|
int 10h |
|
jmp again |
|
fin: |
|
pop si bx ax |
|
ret |
|
|
|
|
|
db 055h,0AAh |
|
|
|
endof: |
|
|
|
buffer equ offset endof+2048 |
|
bufferfat equ offset endof+4096 |
|
|
|
|