Ú-2  Styk mikropočítača s prostredím

 
 µ  Vstup dát pomocou klávesnice
   q Základné informácie o klávesnici
   q Vhodné inštrukcie pre vstup z klávesnice
     q  Práca s ASCII znakmi
 µ  Výstup dát na obrazovku monitora
   q Základné informácie o zobrazovaní informácie
   q Niektoré potrebné služby VIDEO-BIOS INT 10H
 µ  Niektoré dôsledky z používania MS DOS
   q Logická štruktúra disku v MS DOS
   q Zakončenie programu a na návrat do DOS
   q Automatizovanie tvorby suboru.com
   q Prenosu parametrov z promtu do súboru.com 
   q Použitie výsledku zo súboru.com v dávkovom súbore.bat


µ
Výstup dát pomocou klávesnice

q Základné informácie o klávesnici

Klávesnica komunikuje s procesorom sériovým spôsobom ( 5 kolíkový konektror s logickými úrovňami signálu TTL ) a na identifikáciu klávesov používa špecialny polohový kód ( IBM Scan code od 01H po E0H ) Na identifikáciu stlačenia, resp. uvoľnenia klávesu sa používa bit 7 scan kódu. Ak je Bit 7=1 t.j. hodnota kódu je vyššia o 80H, je procesor iinformovaný, že kláves je stlačený. Napríklad prvým z hľadiska polohy na klávesnicu je kláves ESC ( v ľavom hornom rohu ) a jeho scan kód je 01H, resp 81H počas stlačenia. Kláves Q má scan kód 10H / 90H a pod. Vďaka polohovému spôsobu kódovania kláves možno nadefinovať národné abecedy, napríklad azbuku.

Po stlačení klávesu klávesnica žiada o prerušenie pomocou špecialneho bitu, ktorý sa vysiela ako prvý. Napríklad po stlačení klávesu R, ktorý má polohový kód 13H = 0001 0011B sa výšle sériová postupnosť bitov (v postupnosti bit žiadajúci o prerušenie, Lsb a na konci Msb):
 
pri stlačení  0001 0011 1 ( bit pre INT9)
pri uvoľnení 1001 0011 1 

Sériová postupnosť bitov sa na strane počítača prekonvertuje pomocou posuvného registra na paralelný kód a prečíta sa (cez port PA na adrese 60H) po vyvolaní BIOS prerušenia INT9H do procesora. Po prečítaní kódu z PA=60H sa volá ďalšia služba INT 15H/ ah=4FH, ktorá umožňuje napríklad predefinovať polohu Y a Z na klávesnici. Po ukončení INT 9H sa uložia do bufera klávesnice 2 bajty : ASCII kód klávesu (LSB ) a pomocný scan code (MSB) ak bol stlačený znakový kláves. V prípade, že bol stlašený špecialny kláves tak jeho LSB = 0 a MSB bude obsahovať scan code klávesu.

Kódy klávesov sa ukladajú do RAM pamäte o dlžke 32 bajt (KBD_buffer klávesnice na adrese 0:41EH v spolupráci s počitadlami znakov pre začiatonú na adrese 0:41AH a poslednú polohu na adrese 0:41CH . Napr ak je KBD_buffer prázdny je obsah ( 0:41AH ) a ( 0:41CH ) rovnaký.) Túto komunikáciu ovplyvňujú ešte 2 stavové registre ( na adrese 0:417H a 0:418H) v ktorých je uložený stav pomocných klávesov tzv. KB_Flags, napríklad Shift, Alt, Ctrl, Num Lock, Caps Lock a pod.
 
Adresa 0:417H 
Adresa 0:418H
Bit Váha Význam  Bit Váha Význam
7 80H Insert aktívny 7 80H Insert stlačený
6 40H Caps Lock aktívny 6 40H Caps Lock stlačený
5 20H Num Lock aktívny 5 20H Scroll Lock stlačený
4 10H Scroll Lock aktívny 4 10H Ctrl+NumLock stlačený
3 08H Alt stlačený 3 08H -
2 04H Ctr stlačený 2 04H -
1 02H ľavý Shift aktívny 1 02H ľavý-Ctrl stlačený
0 01H pravý Shift aktívny 0 01H ľavý Alt stlačený -

Komunikáciu klávesnice s mikroprocesorom možno najjednoduchšie realizovať pomocou prerušení BIOS. Úlohou obsluhy prerušenia BIOS INT 9H je uložiť kódy stlačených klávesov (resp. správne interpretovné kódy v spolupráci s pomocnými klávesmi ) do buffera a do tabuľky BIOS. Pre užívateľov je určené predovšetkým BIOS prerušenie INT 16H, ktoré umožňuje vyzdvihnúť si kódy (polohový scan kód, ASCII kód) pre potreby aplikácii, resp. aj prerušenie DOS INT 21H.


q Vhodné inštrukcie pre vstup z klávesnice

Demoread

Postupnosť inštukcii na ilustráciu rôznych možnosti vstupu z klávesnice (znakov alebo reťazcov) - s využitím prerušenia BIOS INT 16H ( aj scan kod) a rôznych variantov prerušenia DOS INT 21H ( s echom a bez echa, kontrola statusu klávesu a pod.) Tvar programu je určený pre testovanie účinku inštrukcii pomocou krokovania programu pomocou debuggera.

demoread.com
INT 16H/ah=0 - BIOS
    mov ah, 0 ;Bez echa čaka
    int 16 H  ;AL=ASCII, AH=scan kod
      :Funkc klav AL=0
 
INT 21H - DOS 
    Mov AH, 1  ;Read_KBD_AND_echo
    int 21 H  ;AL=ASCII pre znaky
      ;zobr aj ASCII funkc klav
 
    mov ah, 6 ;Dir-console-io
    mov dl, 0ff H  ;vstup na stand. zar.
    int 21 H  ;=>AL= ASCII
    cmp al, 1B H  ;caka na ESC
    jne 110H  
 
    mov ah, 7 ;Dir-console-input
    int 21 H  ;(AL)=ASCII bez echa
 
    mov ah, 8 ;Read_kbd
    nop  ;caka (AL)=ASCII bez echa
    int 21 H   
 
    mov ah, 0AH ;Get_string
    push cs  ;Vstup retazca zakonc CR
    pop ds  ;do buffera DS:DX
    mov dx, 13CH ;(DS:DX) max pocet znakov
    int 21 H ;(DS:DX+1) aktual pocet znakov 
      ;(DS:DX+2) buffer
 
    mov ah, 0C H ;Flash_and_read_kbd =>vymaze
    mov al, 7  ;bufer_kbd a cita kbd bez echa
    int 21 H ;(AL)=1,6,7,8,A - prepinac
      ;(AL)=ASCII
 
    mov ah, 0bH ;Check_kbd_status
  137H: test al, 0FFH ;Ak nestlaceny klaves AL=0
    jnz 137H ;Ak lubov stlaceny AL=FF
      ;resp ASCII
    RET  
  13cH: db  20,0,"BUFER o dlzke20H",20,20,20,20,20,20,20

 


q Práca s ASCII znakmi

Zoznam príkladov na demonštrovanie rôznych vstupov a úprav ASCII reťazcov
 

  • GetKey - Test stlačenia klavesu, bez echa. Znak stlačeného klávesu uloží do AL.
  • GetKey2 - Test, v ktorom čaká na stlačenie klávesu Ak stlačený RETURN tak (AL) =0DH. Pre ostatné klávesy je (AL)=0.
  • GetKey3 - Test, v ktorom čaká na stlačenie klávesu Ak stlačený RETURN tak (AL) =0DH. Pre ostatné klávesy je (AL)=FFH.
  • GetKey4 - Test, v ktorom čaká na stlačenie klávesu RETURN alebo ESC. Po stlačení RETURN resp. ESC je (AL) =0DH, alebo 1BH. Pre ostatné klávesy je (AL)=0.
  • GetFkey - Test funkčnej klávesy na základe scankódu z AL rozhodne o type klávesu a ak ide o funkčný kláves F1 až F10 tak jeho kód (3BH až 41H) uloží do AL.
  • GetNew2 - Read_KBD_and_echo . Výstup AL=ASCII znak. AH= scan kód.
  • GetYes - Test vloženia y, resp. Y.
  • GetNum - Test numerckých klávesov, ktoých ASCII kód (30H až 39H) uloží do AL.
  • GetLetr - Test vloženia a - z, resp. A - Z. a transformuje vložený znak na (AL) = 1 až 1AH.
  • LowerIt - Úprava vloženého znaku na malé ASCII.
  • UpperIt - Úprava vloženého znaku na veľké ASCII.

 

Príklady vstupu dát z klávesnice a operácii s ASCII znakmi
 

GETKEY.COM - čita znaky z klávesnice do (AL) bez echa.
Používa BIOS INT 16/ah=0 => čaka na stlačenie klávesu.
 
19E8:0100 B400  MOV AH, 00  
19E8:0102 CD16  INT 16h  ;Vystup: AL=ASCII
19E8:0104 B44C  MOV AH, 4Ch ;AH=SCAN kod
19E8:0106 CD21  INT 21h  

GETNEW2.com - Úprava GETKEY s echom.
Používa DOS INT 21/ah=01 - READ_KBD_AND_ECHO => okamžite.
 
19E8:0100 B401  MOV AH, 01  
19E8:0102 CD21  INT 21h ;Vystup: AL=ASCII
19E8:0104 B44C  MOV AH, 4Ch ;AH=SCAN kod 
19E8:0106 CD21  INT 21h  

GETYES.com- Čaká na stlačenie Y, y t.j. keď (AL) = 59H, alebo 79H, pre ostatne znaky (AL)=FFH.
 
19E8:0100 B400  MOV AH, 00
19E8:0102 CD16  INT 16h
19E8:0104 24DF  AND AL, DF
19E8:0106 3C59  CMP AL, 59
19E8:0108 7502  JNZ 010C
19E8:010A B0FF  MOV AL, FF
19E8:010C B44C  MOV AH, 4C
19E8:010E CD21  INT 21

GETKEY2.com- čaka na stlačenie RETURN =>(AL) = 0DH pre ostatne znaky (AL)=0.
 
19E8:0100 B400  MOV AH, 00
19E8:0102 CD16  INT 16
19E8:0104 3C0D  CMP AL, 0D
19E8:0106 7502  JNZ 010A
19E8:0108 30C0  XOR AL, AL
19E8:010A B44C  MOV AH, 4C
19E8:010C CD21  INT 21

GETKEY3.com - variant GETKEY2 ,rozdiel je výstup pre ostatné znaky (AL)=FFH.
 
19E8:0100 B400 MOV AH, 00
19E8:0102 CD16  INT 16
19E8:0104 3C0D  CMP AL, 0D
19E8:0106 7502  JNZ 010A
19E8:0108 B0FF  MOV AL, FF
19E8:010A B44C  MOV AH, 4C
19E8:010C CD21  INT 21

 

GETKEY4.com - Čaka na stlačenie CR alebo ESC =>(AL) = 0DH alebo 1BH.
 
19E8:0100 B400  MOV AH, 00
19E8:0102 CD16  INT 16
19E8:0104 3C0D  CMP AL, 0D
19E8:0106 7404  JZ 010C 
19E8:0108 3C1B  CMP AL, 1B
19E8:010A 75F4  JNZ 0100 
19E8:010C B44C  MOV AH, 4C
19E8:010C CD21  INT 21 

GETFKEY.com- Čaká na stlačenie funkčnej klávesy =>(AL)=Scancode pre iné znaky (AL) = FFH. Kód F1 - F10 je 3BH- 41H.
 
19E8:0100 B400  MOV AH, 00
19E8:0102 CD16 INT 16 
19E8:0104 3C00  CMP AL, 00
19E8:0106 7404  JZ 010C 
19E8:0108 B0FF  MOV AL, FF
19E8:010A EB02  JMP 010E 
19E8:010C 88E0  MOV AL, AH
19E8:010E B44C  MOV AH, 4C
19E8:0110 CD21  INT 21 

 

GETNUM.com - Čaká na stlačenie 0 - 9 => (AL)=30H az 39H.
 
19E8:0100 B400  MOV AH, 00
19E8:0102 CD16  INT 16 
19E8:0104 3C30  CMP AL, 30
19E8:0106 72F8  JB 0100 
19E8:0108 3C39  CMP AL, 39
19E8:010A 77F4  JA 0100 
19E8:010C B44C  MOV AH, 4C
19E8:010E CD21  INT 21 

 

GETLETR.com - Čaká na vloženie a - z, resp A - Z a transformuje znak na (AL)=1 az 1AH okrem ESC => koniec.
 
19E8:0100 B408  MOV AH, 08
19E8:0102 CD21  INT 21 
19E8:0104 3C1B  CMP AL, 1B
19E8:0106 7412  JZ 011A 
19E8:0108 3C7A CMP AL, 7A
19E8:010A 77F6  JA 0102 
19E8:010C 3C60  CMP AL, 60
19E8:010E 7604  JBE 0114 
19E8:0110 24DF  AND AL, DF
19E8:0112 EB04  JMP 0118
19E8:0114 3C5A  CMP AL, 5A
19E8:0116 77EA  JA 0102 
19E8:0118 243F  AND AL, 3F
19E8:011A B44C  MOV AH, 4C
19E8:011C CD21  INT 21 

 

LOWERIT.com - Úprava vloženého znaku na malé ASCII.
 
19E8:0100 B400 MOV AH, 00
19E8:0102 CD16  INT 16 
19E8:0104 0C20  OR AL, 20 
19E8:0106 B44C  MOV AH, 4C
19E8:0108 CD21  INT 21 

 

UPPERIT.com - Úprava vloženého znaku na veľké ASCII.
 
19E8:0100 B400  MOV AH, 00
19E8:0102 CD16  INT 16 
19E8:0104 24DF  AND AL, DF
19E8:0106 B44C  MOV AH, 4C
19E8:0108 CD21  INT 21 

 


 
µ
Výstup dát na obrazovku monitora

q Základné informácie o zobrazovaní informácie na obrazovke

Základnou súčasťou obrazovkového podsystému (video subsystému) je obrazovka, videokontrolér ( obvody pre riadenie zobrazovania ), video pamäť (buffer, v ktorom je uložená informácia pre zobrazovanie. V počítačoch s OS DOS je pre ňu rezervovaný priestor od A000:0 po BFFF:0).

Potrebná veľkosť videopamäti v grafickom móde závisí od počtu zobrazovaných bodov na obrazovke (pixel - picture element ) a od nárokov na množstvo farieb. Obrazovku teda možno chápať ako maticu bodov, napr pre adapter EGA 640*350 bodov. Ak može byť každý bod zafarbený jednou zo 16 farieb ( 4 bit = 0.5 bajt informácia) tak štandarný grafický mód EGA potrebuje 640*350/0.5 = 112000 bajtov videopamäte. Pre jednofarebné zobrazenie s horšim rozlíšením, napríklad v grafickom móde adaptéra CGA treba 640*200/8 = 16 kB. V grafickom móde sa používa tzv. mapovanie pamäti do menšieho logického adresovacieho priestoru, ktoré umožňuje, aby sa jeden bit adresovacieho priestoru premietal do príslušných bitových rovin (napríklad 4 videostránok pri Ega adaptéri), v ktorých sa nachádza informácia o jednotlivých bitoch farebného kódu. Napríklad pomocou adresovacieho priestoru 32 kB ( 640*320/8 = 28kB + 4 kB voľných na každej videostránke ) možno zobraziť všetky pixely na obrazovke v 16 farbách. Pritom pixel (0,0) v ľavom hornom rohu obrazovky bude na adrese A000:0 H a jebo kobaltové zafarbenie zabezpečí 4 bitové číslo 0011B, uložené v ďalšich bitových rovinách ( pamäťových mapách), spriahnutých s adresou daného pixelu (0,0). Z dôvodov kompatibility je pre adresovanie pixelov v grafickom móde adaptera VGA vyhradený adresný priestor od adresy A000:0H o veľkosti 8 videostránok, každá o veľkosti 32KB, čo zabezpečuje pamäť na uloženie 2 obrazoviek 640*350 pixelov so 4 bitmi farebnej informácie.

V textovom (alfanumerickom) režime sa používa na zobrazenie jedného znaku dvojbajtová informácia : ASCII kód znaku a atribút . Na základe ASCII kódu sa rozkreslí tvar znaku a na základe atribútu sa určí jeho zafarbenie a farba podkladu Pritom horná štvorica bitov atribútu definuje farbu pozadia ( Ak b= 1 tak zobrazenie znaku bliká ). Dolná štvorica bitov atribútu definuje zafarbenie textu, pričom bit I = 1 zvyšuje intenzitu odtieňa farby

Význam jednotlivých bitov atribútu znaku:
 
 
pozadie 
text
číslo bitu 7 6 5 4 3 2 1 0
význam b R G B I R G B

 
000 - black  100 - red (R) 1000 - sivá  1100 - sv. červená
001 - blue (B) 101 - magenta  1001 - sv. modrá 1101 - sv. fialová
010 - green (G) 110 - hnedá  1010 - sv. zelená  1110 - žltá
011 - cyan 111 - biela 1011 - sv .kobalt 1111 - sv. biela

napr. 4EH - sa interpretuje ako žlty text na červenom pozadí.

Bity R (red), G (green), B(blue) v staršich typoch adapterov , napríklad v CGA zodpovedajú priamo farbe signálu a v novšich typoch adaptérov slúžia ako ukazovateľ ( pointer ) na jeden z palety registrov, ktoré potom obsahujú 3*6 bit kód farby. Pomocou 6 bit možno vytvoriť 64 odtieňov každej základnej zložky farby takže celkove v každom registri jednu z 64*64*64 = 262144 farieb. Pritom atribút ovláda monitor u staršich typov adaptérov (CGA, EGA) digitálnym spôsobom a u novšich typov adaptérov pomocou DAC prevodníka analógovým spôsobom.

V najbežnejšich textových módoch býva v riadku 80 znakov. Na zaplnenie obrazovky s 25 riadkami treba pamäť 2*80*25= 4000 bajtov. . Nakoľko 4kB = 4096 je na každej textovej stránke nevyužitých 96 bajtov. Pretože prakticky vždy je k dispozícii väčšia oblasť pamäte ako 4kB, s ktorou sa počíta pre zobrazenie textov, napríklad 32 kB, rozdeľuje sa aj videopamäť v textovom režine na niekoľko stánok po 4 kB.

Znaky sa premietajú na obrazovku ako sériová postupnosť 2 bajtov (ASCII kód, atribút znaku). Poloha znaku je adresovaná spôsobom video_segment:offset_znaku, v závislosti od polohy riadku Row_No (0 - 24 ) a stĺpca Cols_No ( 0 - 79), ktorý určuje polohu znaku v riadku:
            Offset_znaku = (Row_No*80*2) + (Cols_No*2) -
Z dôvodov zachovania kompatibility pri vývoji rôznych adaptérov býva adresa videosegmentu v textových módoch najčastejšie B800, tak ako u adaptéra CGA. Pre grafické a textové módy zobrazovania sa teda používajú rôzne oblasti do ktorých sa mapuje videopamäť.

V grafickom móde sa znaky softwarovo kreslia pomocou pixelov . V textových módoch sa znaky zobrazujú hardwarovo pomocou generátora znakov. Základná definičná tabuľka znakov býva v pamäti ROM. Vzorka 128 znakov mimo základný rozsah 01 až 7FH , je uložená v oblasti nepoužívanej videopamäte RAM na adrese, ktorú špecifikuje prerušenie INT 1FH, ( na adrese 0:007CH), takže oblasť znakov 80 -FFH možno predefinovať, napríklad podľa potrieb diaktriky národných abecied.

Každý znak v textovom móde je definovaný tvarom (font), na ktorý sa odvoláva pomocou pointera, ktorý tvorí ASCII kód znaku (0 - 255) . O vykreslenie znaku o rozmeroch m*n (m - šírka, n - výška v počte pixelov ) sa stará HW generátor znakov. Pri rovnakej šírke m = 8 pixelov závisí výška znaku od typu adaptéra. Napríklad v adaptéri EGA má rozmer obrazovky 640*350 bodov. Pri 80 znakoch v riadku je šírka fontu m= 640/80 = 8 bodov a pri 25 riadkoch je výška znaku n = 350/25 = 14 bodov. Možno ju meniť, napr pri výške znaku 8 bodov bude 350/8 = 43 riadkov. Základná definičná tabuľka so štruktúrou fontového bloku o max výške znaku až 32 bodov potrebuje 256*32 = 8kB je tak navrhnutá. že každý bodový vzor znaku sa nachádza na stálej adrese, aj keď výška znaku je meniteľná. Preto zostane pri rôznych výškach znakov časť 32 - n bajtov v rámci každého znaku voľná. Adresu tabuľky fontového bloku možno zistiť , resp. modifikovať pomocou preušenia BIOS INT 10H/ ax = 1130H

Pretože BIOS je uložený v pamäti ROM ukladá si najdôležitekšie parametre nastavenia videomódy do vyhradenej oblasti pre BIOS data (od adresy 400:0 po 400:FF a v rámci nej do Video_Display_Data_Area . Niektorá z nich sú v tabulke:
 
Adresa Počet byte Názov implicitné nastavenie
449H 1 MODE - aktuálny videomód 3
44AH 2 COLS -počet stĺpcov textu 50H=80
44CH 2 REGEN_SIZE - rozmer 1 videostránky 1000H=4kB
44EH 2 Video_start - začiatok videopamäti 0
462H 1 Active_Page - aktívna videostránka 18H = 24
482 1 ROWS - počet riadkov-1 18H=24
485H 2 POINTS - výška znaku [ pixel] 14








q Niektoré potrebné služby VIDEO-BIOS INT 10H
 

AH = 0 - nastavenie módu
 
  Vstup: AL = požadovaný mód, napríklad textmode = 3, grafický = 10H, 11H

AH = 5 H - nastavenie videopage z tabuľky BIOS parametrov 0: 462 ; 0:44E = offset; a 0:44C = dlžka pamäti stránky.
 
  Vstup AL = číslo videostránky

AH = 0FH - zistenie aktuálneho videomódu
 
Výstup:  AL = aktuálny videomód napríklad 3
  AH = počet znakov na riadok, napríklad 50H = 80D 
  BH = číslo stránky, napríklad 0

AH = 01H - nastavenie veľkosti kurzora
 
    CGA EGA VGA
Vstup: CH = 6 začiatoč. linka kurzora (bit 0-4) 6 (11) 6 (13)  
  CL = koncová linka kurzora (bit 0-4) 7 7 (12) 7 (14)
  Mov cx,0607h   0:460 - horná linka
  Mov ah, 1   0:461 - dolná linka
  Int 10h      
  ret      
         

AH = 02H - nastavenie polohy kurzora
 
Vstup: BH = číslo videostránky (0 v grafickom mode)
  DH = riadok
  DL = stĺpec

AH = 03H - čítanie polohy kurzora
 
Vstup: BH = číslo videostránky (0 v grafickom mode)
  CH = začiatočná linka kurzora
  DL = koncová linka kurzora 
  DH = riadok
  DL = stĺpec

AH = 06H / 07H - rolovanie obrazovky smerom hore / dole
 
Vstup: BH = atribút pre uvolnené riadky ( napríklad 07H, 01H)
  CH = riadok vľavo hore
  DL = stĺpec vľavo hore 
  DH = riadok vpravo dolu
  DL = stĺpec vpravo dolu
  AL = počet riadkov, ktoré rolovať - vysunuté tiadky sú stratené
  ak AL = 0 tak celá obrazovka

 
Napríklad:
  mov ax, 0600h  
  mov bh, 07h  
  xor cx, cx ;cx = 0
  mov dx, 184Fh  
  int 10h  
  ret    

AH = 08H - čítanie znaku a atribútu na pozícii kurzora
 
  Výstup: AL = ASCII
    AH = atribút znaku

AH = 09H - zápis znaku a atribútu na pozícii kurzora
 
Vstup: AL = ASCII
  BH = číslo videostránky 
  BL = atribút znaku ( v grafickom mode farba)
  CX = počet znakov

AH = 0AH - zápis znaku na aktuálnu pozíciu kurzora
 
Vstup: AL = ASCII
  BH = číslo videostránky
  CX = počet znakov

 
Napríklad - vymazanie riadku
  Mov ah, 0Fh  
  Int 10h ;=> BH = page
  Mov ah, 03h ;poloha kurzora
  Int 10h  
  Mov ah, 02h ;kurzor na začiatok riadku
  Xor dl, dl  
  Int 10h  
  Mov ax, 0A20h ;20 = medzera
  Mov cx, 80  
  Int 10h  
  Ret   

AH = 0CH - zobrazenie bodu na špecifikovanej pozícii
 
Vstup: AL = farba
  BH = číslo videostránky (pre mód 0Dh až 11h)
  CX = stĺpec
  DX = riadok
   

AH = 0DH - načíta farbu bodu
 
Vstup: BH = číslo videostránky
  CX = stĺpec
  DX = riadok
Výstup: AL = farba bodu

 
Napríklad Hline - vodorovná čiara (SI) = dlžka čiary; (BL) = farba
  Mov ah, 0Fh  
  Int 10h ; (bh) = page
  Mov al, bl ; (al) = farba
skok: mov ah, 0Ch  
  int 10h ;zobrazí bod
  inc cx  
  dec si  
  jc skok ;flag Zero ?
  ret  

AH = 0EH - terminálový výstup => vypíše znak a posunie kurzor
 
Vstup: AL = znak
  BH = číslo videostránky v text móde
  BL = v grafic. farba, v text netreba

 
Napríklad:Dsptxt - zobrazenie textu
  Vstup:  [SP + 2] = riadok_ptr
    [SP + 4] = stĺpec_ptr
    [SP + 6] = znak_ptr

 
Dsptxt:    Push bp  
    Mov bp, sp  
    Push si  
    Mov ah, 0Fh ; page
    Int 10h  
    Mov dh, [bp + 4] ;riadok
    Mov dl, [bp + 6] ;stlpec
    Mov ah, 02 ;nast. kurzora
    Int 10h  
    Mov si, [bp + 8] ;retazec0
  DSP1: LODSB  
    Or al, al   
    Jz DSP  
    Int 10h  
    Jmp DSP1  
  DSP: pop si  
    Pop bp  
    Ret   

AH = 11H - zistenie info o fontoch
 
  Vstup: AL = 30
  Výstup: CX = výška znaku
    DL = počet znakov v riadku - 1
    ES:BP = ukazovateľ na tabuľku predlôh

AH = 11H - zavedenie užívateľského fontu bez zmeny výšky znakov
 
Vstup: AL = 0, 1, 2 (pre Vga aj 4)
  BL = blok fontov (1 font blok 64kB, EGA 0-3, VGA 0-7) 
  BH = počet bajt/znak (výška max 32)
  CX = počet definovaných znakov
  DX = ASCII kód prvého definovaného znaku
  ES:SP = ukazovateľ na tabuľku predlôh

AH = 11H - zavedenie užívateľského fontu so zmenou výšky znakov
 
Vstup: AL = 10h, 11h, 12h (pre Vga aj 14h)
  BL = blok fontov (1 font blok 64kB, EGA 0-3, VGA 0-7) 
  BH = počet bajt/znak (výška max 32)
  CX = počet definovaných znakov
  DX = ASCII kód prvého definovaného znaku
  ES:SP = ukazovateľ na tabuľku predlôh

Napríklad ak je definičná tabuľka hodnôt znakov reprezentovaná len údajmi o rozkreslení znaku Č, jeho zavedenie do uživateľského fontu zabezpečí nasledovná postupnosť inštrukcii:
 
  .Data    
DefZnk: db 01100110 B ; štruktúra pre znak Č
  db 00111100 B  
  db 01100110 B  
  db 11000000 B  
  db 11000000 B  
  db 11000000 B  
  db 01100110 B  
  db 00111100 B  
  .Code    
SetZnk Proc near    
  Mov ax,1100 H    
  Mov bx,0800H   ;8 bajt na 1 znak, 0 blok
  Mov cx, 1   ;1 znak
  Mov dx, 80H    
  Mov bp, Offset DefZnk    
  Int 10H    
  Ret    
  Endp    








q Príklady na demonštrovanie rôznych výstupov na obrazovku

Whicya.com - zmena farby textu a pozadia na obrazovke - svetlobiely text na kobaltovom pozadí.

whicya.com demo zmeny farby text pozadie na obrazovke:
1B05:0100 B80006  MOV AX, 0600  
1B05:0103 B90000 MOV CX, 0000   
1B05:0106 BA4F18 MOV DX, 184F   
1B05:0109 B73F3 MOV BH, 3F  ;=> pozadie =kobalt
1B05:010B CD10  INT 10  ;F=svetle biely text
1B05:010D B402  MOV AH, 02   
1B05:010F BA0000  MOV DX, 0000   
1B05:0112 B700  MOV BH, 00   
1B05:0114 CD10  INT 10   
1B05:0116 B00F  MOV AL, 0F   
1B05:0118 BAD903  MOV DX, 03D9  
1B05:011B EE  OUT DX, AL   
1B05:011C C3  RET  







Demowrt.com- vhodné inštrukcie pre výstup na obrazovku

Postupnosť inštrukcii na ilustráciu rôznych možnosti výstupu na pbrazovku (znakov alebo reťazca$) - s využitím prerušenia BIOS INT 10H ( aj zmena videostránky, nastavenie kurzora, rolovanie okna) a prerušenia DOS INT21H. Tvar programu je určený pre testovanie účinku inštrukcii pomocou krokovania programu pomocou debuggera.

demowrt.com
INT 10H/ah = 0EH - BIOS
  mov ah, 0EH Terminal output
  mov al, 41H ;BIOS (AL) zobrazi
  mov bh, 1 ;videopage
  mov bl, 07H ;farba v grafic mode
  int 10 H   

 
INT21H - DOS
  Mov AH, 02 ;Display_char   
  Mov dl, 41H ;(DL) zobrazi  
  int 21 H     
  mov AH, 06 ;Dir-console-io  
  mov dl, 0 H ;výstup na stand. zar. ak (dl)<>FFH  
  mov al, 07H ;(AL) sa zobrazi => bell  
  int 21 H     
 
  mov ah, 9 ;Displ_string$  
  push cs  ;Adr.retazca zakonc $  
  pop ds ;do buffera DS:DX  
  mov dx, 11a     
  int 21H    
  RET     
Cs:11a:  db  20,20,20,24  BUFER na konci s $

D_Video - demo priameho výstupu na obrazovku

Postupnosť inštrukcii na ilustráciu rôznych možnosti výstupu na obrazovku (znakov alebo reťazca$) - s využitím prerušenia BIOS INT 10H ( aj zmena videostránky, nastavenie kurzora, rolovanie okna) a prerušenia DOS INT21H.

Videostránka v textovom móde2000 * 2 = 4000D = 1000H
z toho odpočítať - 4 * 24 = 60H => 1000H - 60H = FA0H - 1 = F9FH
 
  page adresa zač. adresa konca
  0 0H 0F9FH
  1 1000H 10F9FH
  2 2000H 29FH
  3 3000H 3F9FH

 
a/ zaplniť znak / atribut “G” = 47H => biely text na červenom
 
  F B800:0  L50 "HGOGRGEG"
  F B800: 7CAH  "SVTVRVEVDV" hnedy text na fialovom
  F B800: FD4H "A" 07 42 70 43 37 44 73

 
b / uložiť zafarbenie na rôzne stránky
       
  F B800:0  LF9F B0 07
  F B800: 1000 LF9F 32 17
  F B800: 2000 LF9F 33 20
  F B800: 3000 LF9F 34 37

 
potom postupne prepínať stránky pomocou:
  mov ax, 0501 resp. 0502, 0503
  int 10H    
c / zapísať na pôvodné pozadie obrazovky “A” od 600H po A00H
  mov ax, B800H  
  mov es, ax ;nepriamo do ES
  mov di, 0600 ;začiatok
  mov al, 41 ;"A"
skok: stosB     ;(AL)<- ES:DI a DI<- DI + 1
  inc di   ; preskočí atributovú bunku
  cmp di, 0A00H ;koniec zápisu
  jnz skok    
  ret      








µ Niektoré dôsledky vyplývajúce z používania MS DOS

q Logická štruktúra disku v MS DOS

Jedna z najdôležitejšich funkcii operačného systému je organizácia dát na vonkajšich médiach. Systém MS DOS rozoznáva dva typy zariadení: znakové (napríklad tlačiareň) a blokové (napríklad disk). Informačným celkom na blokovom médiu je logický súbor. Súbory sú združované do skupin nazývaných adresáre. Logické súbory sú v rámci adresára identifikované dvojicou - meno.typ, kde meno je postupnosť max. 8 znakov a typ je postupnosť max. 3 znakov. MS DOS (od verzie 3:3 ) prevzal od Unixu hierarchickú (stromovú) štruktúru adresárov s prístupom k súboru pomocou manipulátora (handle), ktorý ukazuje na aktuálny logický záznam. (Na logickej úrovni sa súbor skladá z logických záznamov pevnej dľžky). Služby jadra operačného systému umožňujú logický záznam prečítať, zapísať, presmerovať (nastaviť na požadované číslo).

V začiatočnej ére, keď počítače nemali ešte pevné disky a súborov bolo málo postačovala na obsluhu disku služba, ktorá pomocou určitej vyhradenej oblasti v pamäti FCB (file control block) odovzdávala informáciu medzi programom a DOS. Každý otvorený súbor v počítači si alokoval v oblasti pamäte dátovú štruktúru s informáciou o súbore (Drive, File Name, File ext, veľkosť záznamov vyjadrenú v bajtoch, veľkosť súboru vyjadrenú v bajtoch, čas a dátum a aktuálne číslo záznamu ku ktorému sa pristupuje buď sekvenčným spôsobom alebo náhodným spôsobom.) FCB nepodporuje hierarchickú štruktúru, je efektívny len v aktuálnom adresári určitého disku

Súbory vykonávajúce program mali koncovku .com, museli byť kratšie ako 64kB, takže aj kód programu aj data a zásobník boli alokované v rámcii jedného Code segmentu. Program typu .com sa definične začína od adresy 100H a vrchol jeho zásobníka je na konci 64kB segmentu. Segmenty DS a ES sú v súbore.com nastavené na začiatok segmentu CS a do 256 bajtovej oblastii PSP (Program Segment Prefix ) na začiatku programu si DOS ukladá niektoré potrebné údaje. PSP nie je súčasťou programového súboru. Obsahuje aktuálne údaje o stave operačného systému v okamihu zavádzania programu. (Systém sem uloží okrem iného všetky parametre prompt príkazu. PSP slúži aj ako komunikačná oblasť medzi MS DOS a programom.) Napríklad oblasť DTA ( Data Transfer Area ) cez ktorú si vymieňa súbor dáta s diskom a ktorá má implicitnú šírku 128 bajt alebo oblasť pre uloženie FCB#1 a FCB#2, napríklad pri kopírovaní súborov sa sem, resp aj do DTA prenesie meno zdrojového a cieľového súboru. Program môže tieto informácie využívať pri svojej práci, napríklad na prenos jedného až dvoch vstupných parametrov do súboru.com. PSP má vždy dĺžku 100H (256 bajtov) a je lokalizovaný v súbore.com CS:IP od IP=0 až IP=100H.

PSP obsahuje:
Adresa        
0H INT_20  db 2 dup(?) na navrat do DOS; v .com RET, v .exe JMP
  Memory_size dw  ? Seg. adr. konca použit pamäti xxxx0
       
2CH Segm. Adr. dw ? DOS prostredie napríklad 0816=>1608:0
        sú tam ako ASCIIZ reťace - comspec, path a pod.
       
05CH FCB1 db  16 dup(?)  =>File control block #1
       
06CH FCB2  db 16 dup(?)  =>File control block#2
       
080H DTA db ?   ; počítadlo znakov v DTA
081H DTA+1 db  128 dup(?)  ;DTA -Data Transfer Area



u Demo: kontrolný výpis obsahu registrov na začiatku súboru.com

 

-r => CS=DS=ES=SS a IP=100 SP=ffff-2 =FFFE

AX=0000 BX=0000 CX=0006 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 
DS=19EA ES=19EA SS=19EA CS=19EA IP=0100 NV UP EI PL NZ NA PO NC
19EA:0100 B402 MOV AH,02 


Takto to vyzerá po vykonani poslednej RET => obnovilo sa SP a IP
AX=0000 BX=0000 CX=0006 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 
DS=19EA ES=19EA SS=19EA CS=19EA IP=0000 NV UP EI PL NZ NA PO NC
19EA:0000 CD20 INT 20 


V neskoršich verziach DOS sa zaviedla podpora práce s pevným diskom, zaviedla sa podpora hierarchickej štruktúry adresárov a podpora presmerovania súborov, ktoré sú chápané rovnako ako vstupy / výstupy periférii. Pri tejto úprave došlo k oddeleniu funkcie disku od FCB a zaviedla sa funkcia manipulátora súboru - handle, ktorý je priradený každému otvorenému súboru ako rozlišovacia jednotka. Je to reťazec zakončený 0 a kompletne popisuje lokalizáciu súboru (včetne disku a mnohoúrovňových adresárov). Na rozdiel od FCB sa tvorí vnútri operačného systému, nie v uživateľskej pamäti. Handle podporuje presmerovanie I/O (pretože za manipulátorom môže byť skrytý nielen súbor ale aj tlačiareň, obrazovka a pod. Handle tiež podporuje zdieľanie a uzamykanie súborov (príkaz SHARE). Existuje 5 štandardne preddefinovaných handle (0 až 4), ktoré sú prístupné každému programu. Štandardne zariadenia sú preddefinovane ako otvorený súbor . Konzola (CON) formálne v handle 0 - 2 predstavuje to isté zariadenie t.j. monitor s klávesnicou, ale z hľadiska funkcie ide o rozdielne zariadenia. AUX reprezentuje pomocný výstup, realizovaný cez sériový port COM1. PRN je označenie pre paralelný výstup tlačiarne, pripojený štandardne k LPT1. Ostatné handle pre súbory alebo zariadenia dostanú priradené výššie poradie handle. DOS si rezervuje oblasť pre tabuľky toľkých handle koľko je predefinovaných v config.sys.
 
 
  No. Handle Funkcia Kde pôsobí
  0 STDIN CON
  1 STDOUT CON
  2 ERROR CON
  3 AUX COM1
  4 PRN LPT1

V súvislosti s týmto zdokonalením sa začali používať sbory.exe, ktoré môžu používať aj väčší zásobník, rozsiahlejšie dáta adresované pomocou segmentov DS a ES a nemajú na začiatku vyhradenú oblasť pre PSP. V porovnaní so súbormi.com sú súbory.exe o 200H = 512 bajt dlhšie, teda o oblasť záhlavia, kde majú uložené informácie o PSP, o segmentoch o prostredí DOS a pod.


Programy spolupracujú väčšinou s prostredím prostredníctvom služieb jadra systému. MS DOS využíva pre tento účel prerušenia INT . Rôzne obslužné programy operačného systému nie sú alokované na absolutných adresách ale sú založené na vyvolaní prerušení INT. Toto umožňuje snadné napodobňovanie pri výrobe počítačov, kde vlastné programy môžu byť neidentické ale výsledný účinok s pohľadu operačného systému je kompatibilný. V osobných počítačoch kompatibilných IBM PC sa používa 5 typov obsluh BIOS, pre ktoré boli rezervované prerušenia INT 0 až INT 1FH a prerušenia DOS INT 21H. Ak obchádza program služby jadra (buď používa priamo služieb vrstvy BIOS alebo priamo komunikuje s technickými prostriedkami) prestáva byť jednoducho prenosný na rôzne inštalácie systému MS DOS.







 u Základné typy obslúh realizované pomocou prerušení INT BIOS v PC IBM
 
a/ obsluha periférnych zariadení
  INT Použitie
  10H obsluha zobrazovania
  13H obsluha diskov
  14H komunikačné služby
  15H systémové služby
  16H štandardná obsluha klávesnice
  17H obsluha tlačiarne
b/ správa o stave obslužných zariadení
  11H zoznam pripojených zariadení
  12H veľkosť pamäte
c/ informácie o čase a dátume
  1AH obsluha času a dátumu
d/ kopirovanie obrazovky
  05H hard copy obrazovky. V PC AT predefinované
e/ špecialne služby
  18H aktivuje ROM Basic
  19H aktivuje bootstrap start - up rutinu

 u Základné typy prerušení INT DOS v PC IBM

MS DOS služby používajú prerušeniq INT 20H až INT 3FH.
 
INT Popis
20H; 21H; 25H; 26H a 27H systémové služby
22H;23H;24H;28H na ziskanie adries volaných samotným DOS
2FH rezervovaný na komunikáciu medzi rezidentnými programami 







q Niektoré často používané funkcie handle INT 21H

AH = 3CH - Create Handle
 
  DS:DX - offset path =ASCIZ$=> napr"B:\TEXT\jano.asc",0
    CX - atribut suboru napríklad 00 - read only
      01 - hidden
      02 - system a pod.

AH = 3DH - Open Handle
 
DS:DX - offset path =ASCIZ$=> napr"B:\TEXT\jano.asc",0
  AL - kod pristupu 0-read, 1-write, 2-read/write

AH = 3EH - Close Handle
 
  BX - handle cislo

AH = 3FH - Read Handle
 
  BX - handle cislo  
  CX - pocet bajtov ktore citat  
  DS:DX Bufer DTA   
    Vystup: AX= pocet prečítaných bajtov

AH = 40H - Write Handle
 
  BX - handle cislo  
  CX - pocet bajtov ktore citat  
  DS:DX Bufer DTA   
    Vystup: AX= pocet zapisanych bajtov

q Príklady použitia inštrukcii pre vstup / výstup s funkciou handle

Escr1.com - Demo vstupu reťazca zakončeného 0DH cez Handle =STDIN=CON
pomocou INT21H/AH=3FH

escr1.com - demo INT 21/ah=3FH => vstup dát pomocou Handle = STDIN
1184:0100 MOV AH,3F ;Read handle 
1184:0102  MOV BX,0  ;STIN=CON=>0 
1184:0105  MOV CX,10  ;pocet znakov bufera 
1184:0108  MOV DX,010E  ;Adr. kam uloži text z CON
1184:010B  int 21   
1184:010D  RET   
1184:010E  Db : "BUFER", 20,20,20,20……

Kontolný výpis:
 
-dcs:10e l10   
1195:0100 42 55 46 45 52 20 20 20 20 20-20 20 20 20  BUFFER….







Escw.com1 - Demo výstupu správy z pamäti na obrazovku zakončenej 0DH 0AH cez Handle =STOUT=CON pomocou INT21H/AH=40H.

escw1.com - demo INT21/ah=40H výstup dát pomocou handle = STDOUT.
1184:0100 MOV AH, 40H ;WRITE handle 
1184:0102 MOV BX, 1 ;STout=CON=>1 
1184:0105  MOV CX, 10 ;pocet znakov bufera 
1184:0108  MOV DX, 010E ;Adr. ODKIAL text NA CON 
1184:010B  int 21  
1184:010D  RET   
1184:010E  db  "BUFER",20,20,20,20,20,20,20,20,20,20,20 
1184:011E  db  "123456789" 

=> vypíše len prvých 10H=16 znakov z bufera na obrazovku

Escape1.com - Demo, že pri otvorení súboru sa pridelí nasledujúce voľné handle,
t.j. handle = 5 v danom prípade, ako prvé voľné. Pri otvorení je meno štandardného zariadenia CON definované pomocou obsahu registra DX. Po kontrole dlžky počítadla na adrese CS:80, určujúceho dlžku aktuálneho DTA sa na nasledujúcu pozíciu realizuje cez DTA výstup sekvencie ANSI kódu 1B 5B na obrazovku, ktorá sa po výstupe na obrazovku zobrazí ako ß [., čo potvrdzuje, že novootvorené zariadenie CON sa chová ako štandardné zariadenie s rovnakým menom a handle STOUT= 1. (ANSI.sys slúži v DOS na zjednodušenie podpory riadenia displeja a konzoly. V config.sys musí byť deklarované DEVICE = ANSI.sys. Charakteristické pre príkazy ANSI je počiatočný kód ESC a "[". Napríklad clear obrazovky možno realizovať kódom 1B 5B 32 4A.)
 
escape1.com - demo otvorenia súboru s novým handle = CON, zápis na displej riadiacich znakov ANSI 1BH, 5BH + text.
1195:0100 B8013D MOV AX, 3D01 Otvorí súbor
1195:0103 BA2201  MOV DX, 0122 ;Tu je meno suboru, 
1195:0106 CD21  INT  21  resp. zariadenia CON
1195:0108 89C3  MOV BX, AX ;prideli mu AX=5
1195:010A BE8000  MOV  SI, 0080 Tu je počítadlo
1195:010D 8A0C  MOV CL, [SI] Stav počitadla
1195:010F FEC1  INC  CL   
1195:0111 30ED  XOR  CH, CH  
1195:0113 C7041B5B  MOV  WORD PTR [SI], 5B1B  
1195:0117 89F2  MOV  DX, SI  
1195:0119 B440  MOV AH, 40 ;zapis do CON 
1195:011B CD21  INT  21  =>na obrazovku <-[
1195:011D B43E  MOV AH, 3E Zavretie suboru
1195:011F CD21  INT  21   
1195:0121 C3 RET     
1195:0122  43 4F 4E 20 20 20-20 20 00 8A  CON……….

Úloha:

Upravte program pomocou presmerovania z konzoly CON na tlačiaren LPT1 pre výstup postupnosti riadiacich kodov na zmenu jej režimu tlačenia. Postupnosť bajtov pre:

  • komprimované písmo: 1BH, 0FH, 0DH, 0AH - text komprimovany;
  • unkomprimované písmo: 12h, 00H, 0DH, 0AH - text odkomprimovany.









q Zakončenie programu a na návrat do DOS

Súbor typu.com možno zakončiť a vrátiť sa do DOS na základe poznatku, že po štarte programu sa nastaví obsah segmentových registrov na hodnotu menšiu o 100H ako je obsah CS, v ktorom je uložený kód programu a že zásobník sa nastaví na vrchol - 1 =.> na FFFEH, nakoľko si program do zásobnika už uložil 0. Ak je program zakončený inštrukciou RET, tak sa do CS:IP obnoví hodnota CS:0. Pretože ale na tejto adrese je začiatok PSP a tam je uložená inštrukcia INT20H, vráti sa riadenie po jej vykonaní do DOS.

Možno sa o tom presvedčiť pri odlaďovaní nasledujúceho programu. Na jeho začiatku je SP= FFFEH a výpis obsahu zásobníka (dss:fffe L2) zobrazí 00 00 => že na vrchole zásobníka sa uložila 0.
 
heart.com
1195:0100 B93007  MOV CX, 0730 H  ;730H=1840D=> 
1195:0103 B203  MOV DL, 03 H  ;23 riadkov*80 znakov
1195:0105 B402  MOV AH, 02 H   
1195:0107 CD21  INT 21 H   
1195:0109 E2FC  LOOP 0107 H   
1195:010B C3  RET     

Po vykonaní záverečnej inštrukcie RET sa obnoví SP=0000 a aktualna inštrukcia na vykonanie bude INT 20H, ktorá vráti riadenie do DOS.

Pre súbory typu .exe je po štarte programu v segmente DS uložená adresa začiatku PSP, takže pomocou inštrukcie RET sa môže tiež vykonať skok na túto adresu, kde je uložený INT 20H, ktorý vykoná návrat do DOS. Treba však vopred uložiť do zásobníka adresu DS:0 ktorá bude po RET slúžiž ako návratová adresa CS:IP. Nasledujúca postupnosť inštrukcii ilustruje tento postup:
 
Prog  proc  FAR  ;=> CS:IP
  push  DS  
  mov  AX,0  
  push  AX  ;=>DS:0
       
       
  RET    ;tu je INT 20 na začiatku PSP
Prog  ENDP    

Iný spôsob súvisí s postupným zdokonaľovaním operačného systému DOS a sice umožnením návratu do DOS pomocou INT 21H/ah=4CH, pričom možno využiť informáciu uloženú programom v registri AL pre dávkový súbor. Tento spôsob zakončenia programu vyhovuje nielen pre súbory typu .com ale aj pre súbory typu .exe.








q Automatizovanie tvorby súboru.com

Postup je založený na zapísaní a uložení potrebných príkazov debuggera a postupnosti inštrukcii mikroprocesora, tvoriacich potrebnú procedúru do súboru.scr (pomocou textového editora). Potom tento súbor.scr presmerovať tak, aby tvoril vstupné dáta pre program debug.exe. Napríklad pre súbor escape1.scr príkazom z promtu:

debug.exe<escape1.scr

Po zbehnutí programu sa vytvorí v aktuálnom adresári súbor escape1.com.
 
Príklad obsahu súboru Escape1.scr 
(všetky operandy sú v hexadecimálnom tvare, implicitnom pre debager.)
N escape1.com

A

  MOV  AX, 3d01  ;Open handle al=1 input 
  MOV DX, 0122  ;Adr. kde oznam
  int  21    
  mov  bx, ax  ;BX<=file handler
  mov  si, 0080  ;na adr 80H buffera
  mov  cl, [si]  ;pocet znakov
  inc  cl     
  xor  ch, ch  ;ch->0
  mov  word ptr [si], 5B1B ;ANSI sekvencia pre ESC
  mov  dx, si  
  mov  ah, 40h ;zapis na con
  int  21    
  MOV  AH, 3eh ;zavretie suboru 
  INT  21     
  RET       
  db "CON",20,20,20,20,20,0
Rcx  
2b  
W  
Q  








q Príklady prenosu parametrov z klávesnice do súboru.com 

Využíva sa vlastnosť PSP súborov.com DOS, do ktorého sa ukladajú parametre uvedené za menom súboru po zadaní z promtu.Na vstup parametrov do súboru.com možno využiť fakt, že sa tieto definovaným spôsobom presunú do PSP do lokality:
 
FCB#1, FCB#2

Farba2p.com - demo prenosu 2 parametrov

(2 maximálne šestnásť znakových reťazcov, oddelených medzerou - v uvedenom programe však majú význam len začiatočné znaky reťazcov) cez FCB1 a FCB2. Znaky sú interpretované v ASCII kóde. Napr A predstavuje 41H a pod. V uvedenom programe jeden znak reprezentuje farbu pozadia a druhý farbu textu, resp. presnejšie využíva sa len 4 LSb z bajtového hexadecimálneho čísla ASCII znaku. 4 LSb prvého zadaného znaku tvorí základ 4 MSb kódu pre pozadie (treba ho preto najprv oddeliť a potom posunuť doľava na miesto MSb atribútu znaku). 4 LSb druhého zadaného znaku tvorí farbu pozadia, t.j. 4 LSb atribútu znaku. Teda napríklad po zadaní prompt príkazu:

        Farba2p.com A 7

sa z prvého znaku A = 41H zamaskuje najprv na 01H a po posuve o 4 bity vľavo sa vytvorí kód 10H, ktorý bude tvoriť modrú farbu pozadia. Z druhého číslice, reprezentovanej ASCII kódom 37 sa po zamaskovaní vytvorí kód 07H, ktorý bude slúžiž ako biela farba pre text. Na záver príkaz VideoBIOS INT=10H/ah=06H na základe zloženého atribúto v bx=17H pomocou rolovania obrazovky spôsbí zmenu jej zafarbenia.

Farba2p.com X Y => prenos 2 parametrov cez FCB#1 a FCB#2.
1195:0100 A05D00  MOV AL, [005D]
1195:0103 240F  AND AL, 0F
1195:0105 8A266D00  MOV AH, [006D]
1195:0109 80E40F  AND AH, 0F
1195:010C B104  MOV CL, 04
1195:010E D2E0  SHL AL, CL
1195:0110 08E0  OR AL, AH
1195:0112 88C7  MOV BH, AL
1195:0114 30DB  XOR BL, BL
1195:0116 B80006  MOV AX, 0600
1195:0119 BA4F18  MOV DX, 184F
1195:011C B90000  MOV CX, 0000
1195:011F CD10  INT 10
1195:0121 C3  RET

 

Úloha : Zaplnit obrazovku znakom, zadaným ako 1 čislica za menom súboru. Číslica ako znak ASCII (30 - 39) - bude slúžit ako LSB (=>AND 0FH). MSB HEX bude B alebo F => konst. napríklad tak, aby sa vytvoril znak B0H-B3H, F8H-FAH, 01H - OEH a pod.
 
  mov  bh, [5D]
  and  bh, 0FH
  or  bh, B0H
  mov  cx, 0730H
  mov ah, 02H
XX: int  21 H  
  loop XX    
  ret    


 
Disk Transfer Area - DTA

Farba80.com - demo prenosu parametrov cez DTA.

V tomto prípade sa na prenos parametrov využíva oblasť DTA (ako prvý v oblasti DTA je bajt, reprezentujúci aktuálny počet zadaných znakov za menom súboru - maximálne 128- a na ďalších pozíciach sa ukladajú samotné kódy mena súboru a zadaných znakov. Na demonštráciu si skúste najprv zadať bez medzery farba80.comA7 - takýto príkaz je síce pre program neopoužiteľný ale ukáže vám ako sa to uloží do DTA. Potom znova zadajte správne s medzerami farba80.com A 7 a uvidíte, že pôvodný promt s menom súboru sa prepísal tak, že na adrese CS:82 sa bude nachádzť 41 20 37 20 => A medzera 7 medzera ) Postup vytvorenia farebného atribútu na zafarbenie obrazovky je obdobný ako v predošlom príklade. Na záver programu sa ešte zobrazia 2 výpisy znakových reťazov, jeden uložený na konci programu na adrese CS:340, a druhý ako príklad na spestrenie hneď na začiatku na adrese CS:103 (pretože program.com sa musí začínať na adrese CS:100 s nutným preskokom oblasti dát.)

Tvar príkazu: Farba80.com X Y ( Mezi znakmi X Y nechat 1 medzeru! ) príklad prenosu 2 parametrov: text pozadie cez DTA. Napríklad tvar prikazu: farba80.com O 0, kde : O - farba text, 0 -farba pozadie =>kod farby :

  • O=ASCII (4F=> F= > svetle biela),
  • 0=ASCII (30=> 0=> black)

1195:0100 E93D02 JMP 0340 Začiatok. Preskočí DATA AREA
     
1195:0340 BE8000 MOV SI, 0080H  
1195:0343 8A0C  MOV CL, [SI] ;počitadlo
1195:0345 80F904  CMP CL, 04  
1195:0348 7529  JNZ 0373  
1195:034A 8A7C02  MOV BH, [SI+02]  
1195:034D 8A5C04  MOV BL, [SI+04]  
1195:0350 80E70F  AND BH, 0F  
1195:0353 80E30F  AND BL, 0F  
1195:0356 38DF  CMP BH, BL  
1195:0358 7419  JZ 0373   
1195:035A B104  MOV CL, 04  
1195:035C D2E3  SHL BL, CL  
1195:035E 08DF  OR BH, BL  
1195:0360 B80006  MOV AX, 0600  
1195:0363 B90000  MOV CX, 0000  
1195:0366 BA4F18  MOV DX, 184F  
1195:0369 CD10  INT 10   
1195:036B B409  MOV AH, 09 Zobrazenie textu z CS:103
1195:036D BA0301  MOV DX, 0103  
1195:0370 CD21  INT 21   
1195:0372 (C3)  (RET)  Eventualne: NOP
1195:0373 B409  MOV AH, 09 Zobrazenie textu z CS:310
1195:0375 BA1003  MOV DX, 0310  
1195:0378 CD21  INT 21   
1195:037A C3  RET   
    DATA area preoznamy.
1195:0103 2A 2A 2A 2A…. Prvý oznam pre zobrazenie
1195:0310 5A 61 64 61 6E 65 20 Druhý oznam pre zobrazenie.








q Použitie výsledku zo súboru.com v dávkovom súbore.bat

Ak je v dávkom súbore.bat použitý súbor.com s návratom do DOS pomocou int 21H/ ah=4CH, tak výstupný parameter z tohto súboru, predtým uložený do registra AL sa prenesie na výstup a možno ho použiť v súbore.bat, napríklad pri rozhodovacom procese pomocou príkazu if errorlevel - then. Nasledujúce 2 demonštračné programy sa líšia použitým programom.com. V oboch sa však rozhoduje podľa obsahu registra AL v tvare ASCII číslice. (Do súboru.bat sa ASCII číslica prekonvertuje do desiatkového tvaru.)








MENU1.bat - demo rozvetvenia v dávkovom súbore na základe číslic 0 - 9

Subor MENU1.bat používa na voľbu rozhodovacieho skoku procedúru GETNUM.com a rozhoduje sa pomocou číslic + if errorlevel . Napr ak výstupom z procedúry getnum.com je al=01H má 1 po prechode do DOS tvar (AL)>=31H=49D a if errorlevel x skok sa uskutoční pre (AL)>= 49D => pre BCD kód číslic. ASCII.
 
@echo off
:top
cls
echo **************************************************
echo Ponuka moznosti:
echo 1 - 1 program
echo 2 - 2 program
echo 3 - Koniec
echo ***************************************************
:menu
echo Zvol 1, 2 alebo 3
GETNUM.com
if errorlevel 52 goto menu
if errorlevel 51 goto end
if errorlevel 50 goto dva
if errorlevel 49 goto jedna
goto menu
:jedna
echo Tu je X - 1 program
goto top
:dva
echo Tu je Y - 2 program
goto top
:end
echo The End

MENU2.bat - demo rozvetvenia v dávkovom súbore na základe znakov A - E

Súbor menu2.bat používa na rozhodovanie GETLETR.com Rozhoduje sa síce pomocou znakov A, a - E, e, resp. ESC na výstup z rozhodovacej procedúry ale pomocou vnútornej masky 3FH v GETLETR.com sa upraví výstup (AL) na 1 až 5 pre zadané A,a až E,e ,takže if errorlevel už rozhoduje zase na základe ASCII číslic v BCD tvare, ako v predošlom variante.
 
@echo off
:top
cls
echo ************************************
echo * Ponuka moznosti: *
echo * A - 1 program *
echo * B - 2 program *
echo * C - 3 program *
echo * D - 4 program *
echo * E - 5 program *
echo * ESC - Koniec *
echo ************************************
:menu
echo Zvol A, B. alebo ESC
GETLETR
rem test >ESC von znaky 
if errorlevel 28 goto menu
if errorlevel 27 goto end
rem vylucim znaky >=6
if errorlevel 06 goto menu
if errorlevel 05 goto labelE5
if errorlevel 04 goto labelD4
if errorlevel 3 goto labelC3
if errorlevel 2 goto labelB2
rem pre A, resp. a je 1 => labelA1
if errorlevel 1 goto labelA1
goto menu
:labelA1
echo Tu je - 1 program
pause
goto top
:labelB2
echo Tu je - 2 program
pause
goto top
:labelC3
echo Tu je - 3 program
pause
goto top
:labelD4
echo Tu je - 4 program
pause
goto top
:LabelE5
echo Tu je - 5 program
pause
goto top
:end
echo The End


 

[Návrat]