QuestionCopyright.org

Cvičenie 01

Cieľom cvičenia je vyskúšať si základné ovládanie textu a grafiky pomocou prerušenia 0x10 a priamym zápisom do grafickej pamäte. Pre mnohých ide pravdepodobne o prvý kontakt s jazykom C a assemblerom, takže odporúčam venovať zadaniam z tohoto cvičenia zvýšenú pozornosť. Ak ich zvládnete, ďalšie cvičenia už budú omnoho jednoduchšie. Mnohé užitočné informácie nájdete na podstránke Informácie ku cvičeniam 1, 2, 3 a 4.

Odovzdávanie úloh pre párnotýždňových (cvičenie 21.09.2010) - 11.10.2010 23:59:59
Odovzdávanie úloh pre nepárnotýždňových (cvičenie 28.09.2010) - 18.10.2010 23:59:59

Zadania

CV01_01 (1 bod)
Zadanie V textovom režime 80x25 znakov vypíšte abecedu do 10 riadkov tak, aby riadky mali rôzne farby pozadia aj písma. Písať začnite od 3. stĺpca a 5. riadku. Na nastavenie pozície kurzora a samotný výpis nepoužívajte žiadne funkcie jazyka C, ale urobte to priamo cez prerušenie 0x10. Taktiež je dôležité zabezpečiť, aby písmena neblikali, ale riadne fungovali farby pozadia väčšie ako 7.
Funkcie žiadne
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv01/cv01_01.exe
Vzor Priklad 1
Komentár Bodky vo vzorovom výstupe si nevšímajte. Sú tam len pre ilustráciu a ľahšie rozoznanie sĺpcov a riadkov.
/**
*Procedura ugr_asm_blinking(uint8_t enabled)
*
*Povolenie blikania textu v konzole.
*Ak je povolene, po nastaveni najvyssieho bitu pre textovy atribut bude text blikat.
*Ak nie je, tak na farbu pozadia su pouzite vsetky 4 bity (teda moze byt od 0 do 15)
*AX = 0x1003
*BL ... blikanie (0 - nie, 1 - ano)
*BH ... vzdy nula
*/
void ugr_asm_blinking(uint8_t enabled)
{
  asm{
    mov ax,0x1003
    mov bl,enabled
    mov bh,0x00
    int 0x10
  }
}
CV01_02 (1 bod)
Zadanie V grafickom režime 320x200 8bit nakreslite obrys obdĺžnika rozmerov 80x50 pixelov (stĺpce x riadky). Na zapnutie grafického režimu a samotné vykreslovanie nepoužívajte žiadne funkcie jazyka C, ale urobte to priamo cez prerušenie 0x10.
Funkcie žiadne
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv01/cv01_02.exe
Vzor Priklad 2
Komentár Aby sa grafický režim hneď nevypol, môžete použiť funkciu getch(), ktorá počká na stlačenie klávesy.
CV01_03 (1 bod)
Zadanie V grafickom režime 320x200 8bit nakreslite obdĺžnik rozmerov 256x50 pixelov tak, aby každý stĺpec mal inú farbu. Na zapnutie grafického režimu použite prerušenie 0x10. Na samotné vykreslovanie nepoužívajte žiadne funkcie jazyka C in prerušenia, ale priamy zápis do grafickej pamäte.
Funkcie žiadne
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv01/cv01_03.exe
Vzor Priklad 3
Komentár Grafická pamäť je prístupná na absolútnej adrese 0xA0000000L. Získate ju napríklad zadefinovaním uint8_t far *obrazovka = (uint8_t far *) 0xA0000000L; K pamäti následne pristupujete ako k obyčajnému poľu o veľkosti 64000 bajtov (po riadkoch, každý obsahuje 320 pixelov a je ich dokopy 200).
CV01_04 (1 bod)
Zadanie V grafickom režime 320x200 8bit nakreslite obdĺžnik rozmerov 64x128 pixelov, pričom po stĺpcoch bude plynulý prechod medzi dvoma farbami (napr. od čiernej k bielej). Na zapnutie grafického režimu použite prerušenie 0x10. Na samotné vykreslovanie použite buď prerušenie Ox10 alebo priamy prístup do pamäte. Na nastavenie palety použite prerušenie 0x10.
Funkcie žiadne
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv01/cv01_04.exe
Vzor Priklad 4
Komentár Pár slov k paletám nájdete na podstránke Informácie ku cvičeniam 1, 2, 3 a 4.
CV01_05 (1 bod)
Zadanie V grafickom režime 320x200 8bit nakreslite obdĺžnik rozmerov 64x128 pixelov, pričom po stĺpcoch bude plynulý prechod medzi dvoma farbami (napr. od žltej k modrej). Následne tento prechod animujte (viď. ukážkový exe súbor). Pri animácii ale nesmiete prekresľovať žiadne pixely. Efekt musíte docieliť len čisto zmenou palety. Na zapnutie grafického režimu použite prerušenie 0x10. Na samotné vykreslovanie použite buď prerušenie Ox10 alebo priamy prístup do pamäte. Na nastavenie palety použite prerušenie 0x10.
Funkcie žiadne
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv01/cv01_05.exe
Vzor Priklad 5
Komentár Ak chcete vytvoriť cyklus, ktorý bude bežať až do stlačenia klávesy, môžete zavolať funkciu kbhit(). Tá vráti TRUE, ak bola stlačená klávesa, inak vráti FALSE. Čiže cyklus
while(!kbhit())
{
  // rob nieco
}
getch();
bude bežať až do stlačenia klávesy. Inšpiráciu môžete získať aj z vtipných príkladíkov na podstránke Informácie ku cvičeniam 1, 2, 3 a 4.