mam se kodzik boot loadera i chce go przerobić tak aby działał inaczej a mianowicie:
mam sobie 3 części tzn boot loader który już mam napisany i który ma ładować mały pliczek który już nie wszedł w skład bootloadera bo za dużo zajmował :( i ten boot ładuje taki pliczek który wyświetla tekst do pÓÓÓÓki nie załaduje pliku końcowego jak takie coś zrobic na podstawie tego??? :
[BITS 16]
[ORG 0000h]
jmp START
OEM_ID db "Water OS"
BytesPerSector dw 0x0200
SectorsPerCluster db 0x01
ReservedSectors dw 0x0001
TotalFATs db 0x02
MaxRootEntries dw 0x00E0
TotalSectorsSmall dw 0x0B40
MediaDescriptor db 0xF0
SectorsPerFAT dw 0x0009
SectorsPerTrack dw 0x0012
NumHeads dw 0x0002
HiddenSectors dd 0x00000000
TotalSectorsLarge dd 0x00000000
DriveNumber db 0x00
Flags db 0x00
Signature db 0x29
VolumeID dd 0xFFFFFFFF
VolumeLabel db "Water OS"
SystemID db "FAT12 "
START:
cli
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti
; wyswietl wiadomosc
mov si, msgLoading
call DisplayMessage
LOAD_ROOT:
; oblicz wielkosc root directory i zapisz w 'cx'
xor cx, cx
xor dx, dx
mov ax, 0x0020 ; 32 bajtowy opis katalogu
mul WORD [MaxRootEntries] ; liczba pozycji w katalogu glownym
div WORD [BytesPerSector] ; bajty na sektor
xchg ax, cx
; oblicz polozenie root directory i zapisz w 'ax'
mov al, BYTE [TotalFATs] ; liczba tablic FAT
mul WORD [SectorsPerFAT] ; liczba sektorow uzywanych przez tablice FAT
add ax, WORD [ReservedSectors]
mov WORD [datasector], ax
add WORD [datasector], cx
; odczytaj root directory do pamieci pod adres (07C0:0200)
mov bx, 0x0200
call ReadSectors
; przegladaj root directory w poszukiwaniu binary image
mov cx, WORD [MaxRootEntries]
mov di, 0x0200 ; adres pierwszego root entry
.LOOP:
push cx
mov cx, 0x000B ; nazwa ma 11 znakow
mov si, ImageName ; nazwa pliku do znalezienia
push di
rep cmpsb ; sprawdz
pop di
je LOAD_FAT
pop cx
add di, 0x0020 ; przestaw na nastepny directory entry
loop .LOOP
jmp FAILURE
LOAD_FAT:
; zapisz poczatkowy klaster boot image
mov si, msgCRLF
call DisplayMessage
mov dx, WORD [di + 0x001A]
mov WORD [cluster], dx ; pierwszy klaster pliku
; oblicz rozmiar tablicy FAT i zapisz w 'cx'
xor ax, ax
mov al, BYTE [TotalFATs] ; liczba tablic FAT
mul WORD [SectorsPerFAT] ; liczba sektorow uzywanych przez FAT
mov cx, ax
; oblicz polozenie FAT i zapisz w 'ax'
mov ax, WORD [ReservedSectors]
mov bx, 0x0200
call ReadSectors
mov ax, 0100h
mov es, ax
mov bx, 0000h
push bx
LOAD_IMAGE:
mov ax, WORD [cluster]
pop bx
call ClusterLBA
xor cx, cx
mov cl, BYTE [SectorsPerCluster]
call ReadSectors
push bx
;oblicz adres nastepnego klastra
mov ax, WORD [cluster]
mov cx, ax
mov dx, ax
shr dx, 0x0001
;divide by two
add cx, dx
mov bx, 0x0200
add bx, cx
mov dx, WORD [bx]
test ax, 0x0001
jnz .ODD_CLUSTER
.EVEN_CLUSTER:
and dx, 0000111111111111b
jmp .DONE
.ODD_CLUSTER:
shr dx, 0x0004
.DONE:
mov WORD [cluster], dx
cmp dx, 0x0FF0
jb LOAD_IMAGE
DONE:
mov si, msgCRLF
call DisplayMessage
push WORD 0x0100
push WORD 0x0000
retf
FAILURE:
mov si, msgFailure
call DisplayMessage
mov ah, 00h
int 16h
int 19h
DisplayMessage:
lodsb
or al, al
jz .DONE
mov ah, 0x0E
mov bh, 0x00
mov bl, 0x07
int 0x10
jmp DisplayMessage
.DONE:
ret
; odczytaj cx sektorow z dyskietki zaczynajac od ax pod adres bx
ReadSectors:
.MAIN
mov di, 0x0005
.SECTORLOOP
push ax
push bx
push cx
call LBACHS
mov ah, 0x02
mov al, 0x01
mov ch, BYTE [absoluteTrack]
mov cl, BYTE [absoluteSector]
mov dh, BYTE [absoluteHead]
mov dl, BYTE [DriveNumber]
int 0x13
jnc .SUCCESS
xor ax, ax
int 0x13
dec di
pop cx
pop bx
pop ax
jnz .SECTORLOOP
int 0x18
.SUCCESS
mov si, msgProgress
call DisplayMessage
pop cx
pop bx
pop ax
add bx, WORD [BytesPerSector]
inc ax
loop .MAIN
ret
; zamien numer klastra na adres w trybie lba
ClusterLBA:
sub ax, 0x0002
xor cx, cx
mov cl, BYTE [SectorsPerCluster]
mul cx
add ax, WORD [datasector]
ret
; zamien adres lba w ax na adres w formacie CHS
LBACHS:
xor dx, dx
div WORD [SectorsPerTrack]
inc dl
mov BYTE [absoluteSector], dl
xor dx, dx
div WORD [NumHeads]
mov BYTE [absoluteHead], dl
mov BYTE [absoluteTrack], al
ret
absoluteSector db 0x00
absoluteHead db 0x00
absoluteTrack db 0x00
datasector dw 0x0000
cluster dw 0x0000
ImageName db "WATEROS BIN"
msgLoading db 0x0D, 0x0A, "WaterOS Loadinggre34hg34hh43h34h43h43h", 0x0D, 0x0A, 0x00
msgCRLF db 0x0D, 0x0A, 0x00
msgProgress db ""
msgFailure db 0x0D, 0x0A, "Error: Press any key to reboot", 0x00
DW 0xAA55