Vývoj operačného systému/Bootloader po druhé - práca s diskovými jednotkami: Rozdiel medzi revíziami

Smazaný obsah Přidaný obsah
Riadok 265:
.fatal: ;informuj o výskyte chyby
</syntaxhighlight>
Kódové ukážky uvedené nižšie budú funkčne zanedbávať AH ako návratovú hodnotu v prípade chyby.
===Funkcie 02 a 03===
Úložné zariadenia ani BIOS neposkytujú možnosť kopírovania sektorov z jedného miesta na druhé<ref name="its_not_really_possible">Vo všeobecnosti taká operácia v oblasti pamäte nie je možná vôbec (teda ak nerátame rôzne čipy schopné podržať informácie kým sa spracujú)</ref>. Preto je nutné využiť na tento účel funkcie ktoré poskytujú (čítanie 02 a zápis 03) a dáta dočasne ukladať v pamäti RAM.
 
V nasledujúcom kóde sú informácie o zdroji a cieli kopírovania uložené v pamäti a do funkcie sa dodáva len ich adresa (+ počet sektorov na kopírovanie, rátajúc s tým že jeden sektor má 512 bajtov). Štruktúra zdroja a cieľa v pamäti pre tento prípad vyzerá asi takto<ref name="whats_real_bro_qm">V skutočnosti existuje majú rôzne kompilátory rôzne možnosti poskytujúce rýchlo tvorbu a návrh štruktúr, no takto je to možno aj prehľadnejšie.</ref>:
{| class="wikitable"
|-
! Odsadenie (od zač. štruktúry) !! Veľkosť (v bajtoch) !! Použitie !! Zodpovedajúci register
|-
| 0 || 1 || BIOSové označenie zariadenia, umožňuje kopírovať z/do rozdielnych zariadení || DL
|-
| 1 || 1 || Hlava (''head'') z CHS adresy || DH
|-
| 2 || 2 || [0:5] = sektor z CHS adresy, [6:15] = stopy/cylinder z CHS adresy || CX
|}
<syntaxhighlight lang="asm">
BITS 16
;VSTUP: [ES:SI] = štruktúra pre zdrojové zariadenie, [ES:DI] = štruktúra pre cieľové zariadenie
; ES:BX = pamäť pre buffer, AL = počet sektorov na čítanie (nemal by byť prekročený limit segmentu)
kopiruj:
mov dl, byte [es:di] ;načítaj číslo cieľového zariadenia
call reset ;procedúra reštartujúca zariadenie a overujúca stavový kód poslednej operácie
mov dx, word [es:si] ;načítaj číslo zdrojového zariadenia + 'hlavu' začiatku
call reset ;reštartuj
mov cx, word [es:si+2]
mov ah, 02
int 0x13
jc .error
mov dx, word [es:di]
mov cx, word [es:di+2]
int 0x13
jc .error
jmp .end
.error:
mov si, chyba
call vypis
.end:
ret
chyba: db "Vyskytla sa chyba pri kopirovani, skontrolujte register AH", 0x0D, 0x0A, 0
</syntaxhighlight>
===Funkcia 04===
Ukážka kód vytvorená pre túto funkciu využije štruktúru uvedenú vyššie a poslúži ako nástroj na overovanie zdroja a destinácie pred kopírovaním. Funkcia prijíma adresy štruktúr a počet sektorov na kontrolu.
<syntaxhighlight lang="asm">
;VSTUP: [ES:SI] = štruktúra pre zdrojové zariadenie, [ES:DI] = štruktúra pre cieľové zariadenie
; ES:BX = pamäť pre buffer, vlastne ani nie potrebný parameter, AL = počet sektorov na overenie
kontrola:
mov dx, word [es:si]
mov cx, word [es:si+2]
mov ah, 04
int 0x13
jc .error
mov dx, word [es:di]
mov cx, word [es:di+2]
mov ah, 04
int 0x13
jc .error
jmp .end
.error:
mov si, chyba
call vypis
.end:
ret
chyba: db "Vyskytla sa chyba pri kontrole, pouzite register AH na diagnostiku", 0x0D, 0x0A, 0
</syntaxhighlight>
===Funkcia 08===
Tento kód získa informácie o zariadení a vráti ich<ref name="sure_no_error">v prípade že sa nevyskytne chyba</ref> v štruktúre vytvorenej v ukážke pre funkcie 02 a 03.
<syntaxhighlight lang="asm">
;VSTUP: DS:DI = štruktúra pre zariadenie,
; DL = BIOSové označenie zariadenia
;VÝSTUP:[DS:DI] = štruktúra pre zariadenie,
; BL = BIOSové označenie typu diskety
ziskaj_parametre:
mov ah, 08
int 0x13
jc .error
mov word [ds:di], dx
mov word [ds:di+2], cx
jmp .end
.error:
mov si, chyba
call vypis
.end:
ret
chyba: db "Vyskytla sa chyba pri ziskavani parametrov, overte hodnotu AH", 0x0D, 0x0A, 0
</syntaxhighlight>
Na základe vzorcov uvedených vo vyššej časti článku a pripomienok v tabuľke môžete vypočítať veľkosť zariadenia v bajtoch.
 
===Poznámky===
<references />