Dobrý den,
tak nějak se mi nedaří dát dokupy VBR:
BITS 16
jmp short Boot
nop
OEMLabel db "SMA-BOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per sector
SectorsPerCluster db 1 ; Sectors per Cluster
ReservedForBoot dw 1 ; Reserved sectors for boot record
NumberOfDSPs db 2 ; Number of copies of the DSP
RootDirEntries dw 224 ; Number of entries in root dir
; (224 * 32 = 7168 = 14 sectors to read)
LogicalSectors dw 2880 ; Number of logical sectors
MediumByte db 0F0h ; Medium descriptor byte
SectorsPerDSP dw 9 ; Sectors per DSP
SectorsPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
HiddenSectors dd 0 ; Number of hidden sectors
LargeSectors dd 0 ; Number of LBA sectors
DriveNo dw 0 ; Drive No: 0
Signature db 41 ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP "
FileSystem db "DSP "
Boot:
mov ax, 07C0h ; Set up 4K of stack space above Buffer
add ax, 544 ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti ; Restore interrupts
cmp dl, 0 ; A few early BIOSes are reported to improperly set DL
je NoChange
mov [bootDev], dl ; Save boot device number
mov ah, 8h ; Get drive parameters
int 13h
jc FataldiskError
NoChange:
mov eax, 0
DiskOK:
mov si, Buffer ; Set ES:BX to point to our Buffer (see End of code)
mov bx, ds
mov es, bx
mov bx, si
mov ah, 2 ; Params for int 13h: read disk sectors
mov al, 14 ; And read 14 of them
pusha ; Prepare to enter loop
call SMA.Load
jc FataldiskError
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
mov di, 0
mov si, 0
jmp 7c00h
PrintString:
pusha
mov ah, 0Eh
.write:
lodsb
cmp al, 0
je .done
int 10h
jmp short .write
.done:
popa
ret
SMA.Load:
mov ah, 42h
mov si, .SMA.Load.Params
mov dl, 80h
int 13h
ret
.SMA.Load.Params:
dw 10h ; structure length
dw 38 ; sector count
dw 7c00h ; buffer address (offset)
dw 0 ; buffer address (segment)
dd 0 ; Secntor number (low 32 bits)
dd 2 ; Sector number (high 32 bits)
FataldiskError:
mov si, diskError
call PrintString
Reboot:
mov ax, 0
int 16h ; Wait for keystroke
mov ax, 0
int 19h
diskError db "Disk error! Press any key...", 0
bootDev db 0 ; Boot device number
times 510-($-$$) db 0 ; Pad remainder of boot sector with zeros
dw 0AA55h ; Boot signature (DO NOT CHANGE!)
Buffer: ; Disk Buffer begins (8k after this, stack starts)
Nechce se mi počítat hlavy, dráhy atd. Tak se snažím o "Extended Read Sectors From Drive". O co GO? Kernel je hned za VBR, takže pokud se do 42h počítá VBR, je kernel od 1. sektoru po 39. sektor. Pokud se VBR nepočítá, kernel by měl být mezi 0. a 38. sektorem. Takže první věc - počítá se VBR? Druhá věc - proč mi to nefunguje? Doufám, že je problém jen se zařízením, které netuším jak odhledat. Aktuálně bootuji ve VirtualBoxu z PLOP do USB. 80h v tomto případě znamená který disk? (virtuální/USB) Jestli je 80h, které jsem také zkoušel, pro disk, na kterém je onen VBR, tak tím jen líp. Jenže jak jsem psal - ani s 80h to nešlo.
Děkuji.
Děkuji.