ATHELP
(SH help v 1.0)
Seznam kapitol
Položka Pachatel
───────────────────────────────────────────────────────────────────────────────
Procesory - INTEL made
Koprocesory - INTEL made
Instrukce procesoru - INTEL made
Přerušení CPU - INTEL made
Přerušení BIOSu - IBM made (velká modrá)
IRQ - Přerušení hardware - IBM made
Seznam přerušení - Tady se podepsali všichni
Přerušení DOSu - Microsoft made (malá modrá)
Funkce DOSu - Microsoft made
I/O Porty - IBM made
Mapa paměti - IBM, INTEL & Microsoft made (Uf)
ASCII
Rejstřík
Literatura
───────────────────────────────────────────────────────────────────────────────
ASCII kódování
ASCII je zkratka z American Standard Code for Information Interchange
(Americký standardní kód pro výměnu informací). Je to množina 256 přiřazení
textových a řídících znaků. Dolních 128 znaků je definováno a dodržováno růz-
nými výrobci poměrně přesně. Hodnoty větší než 127 jsou však interpretovány
různými výrobci a různými počítači různě. Příkladem může být i to, že tento
text čtete česky - písmena s českou diakritikou mají přiřazeny právě kódy přes
128 podle tzv. kódu Kamenických.
Dále viz :
ASCII tabulka
Rámečky
Rozšířené kódy kláves
Řídící kódy tiskáren
Tabulka znaků
Řídící kódy ASCII
HPGL - jazyk plotteru
Řídící kódy modemu
Na mnoha místech zmiňovaný řetězec ASCIIZ (používán mnoha funkcemi DOSu a v pro-
gramovacím jazyku C) je posloupnost ASCII znaků zakončená nulovým bytem. Příklad
assemblerové deklarace :
DB "nejaky napis",0
Převody ASCII - desítkové - šestnáckové
╔═╤════════╦═╤════════╦═╤════════╦═╤════════╦═╤════════╦═╤════════╦═╤════════╗
║A│DDD HH ║A│DDD HH ║A│DDD HH ║A│DDD HH ║A│DDD HH ║A│DDD HH ║A│DDD HH ║
╠═╪════════╬═╪════════╬═╪════════╬═╪════════╬═╪════════╬═╪════════╬═╪════════╣
║ │000 00 ║¶│020 14 ║(│040 28 ║<│060 3c ║P│080 50 ║d│100 64 ║x│120 78 ║
║☺│001 01 ║§│021 15 ║)│041 29 ║=│061 3d ║Q│081 51 ║e│101 65 ║y│121 79 ║
║☻│002 02 ║▬│022 16 ║*│042 2a ║>│062 3e ║R│082 52 ║f│102 66 ║z│122 7a ║
║♥│003 03 ║↨│023 17 ║+│043 2b ║?│063 3f ║S│083 53 ║g│103 67 ║{│123 7b ║
║♦│004 04 ║↑│024 18 ║,│044 2c ║@│064 40 ║T│084 54 ║h│104 68 ║|│124 7c ║
║♣│005 05 ║↓│025 19 ║-│045 2d ║A│065 41 ║U│085 55 ║i│105 69 ║}│125 7d ║
║♠│006 06 ║ │026 1a ║.│046 2e ║B│066 42 ║V│086 56 ║j│106 6a ║ │126 7e ║
║•│007 07 ║ │027 1b ║/│047 2f ║C│067 43 ║W│087 57 ║k│107 6b ║⌂│127 7f ║
║ │008 08 ║∟│028 1c ║0│048 30 ║D│068 44 ║X│088 58 ║l│108 6c ║ │ ║
║ │009 09 ║↔│029 1d ║1│049 31 ║E│069 45 ║Y│089 59 ║m│109 6d ║ │ ║
║ │010 0a ║▲│030 1e ║2│050 32 ║F│070 46 ║Z│090 5a ║n│110 6e ║ │ ║
║♂│011 0b ║▼│031 1f ║3│051 33 ║G│071 47 ║[│091 5b ║o│111 6f ║ │ ║
║♀│012 0c ║ │032 20 ║4│052 34 ║H│072 48 ║\│092 5c ║p│112 70 ║ │ ║
║ │013 0d ║!│033 21 ║5│053 35 ║I│073 49 ║]│093 5d ║q│113 71 ║ │ ║
║♫│014 0e ║"│034 22 ║6│054 36 ║J│074 4a ║^│094 5e ║r│114 72 ║ │ ║
║☼│015 0f ║#│035 23 ║7│055 37 ║K│075 4b ║_│095 5f ║s│115 73 ║ │ ║
║►│016 10 ║$│036 24 ║8│056 38 ║L│076 4c ║`│096 60 ║t│116 74 ║ │ ║
║◄│017 11 ║%│037 25 ║9│057 39 ║M│077 4d ║a│097 61 ║u│117 75 ║ │ ║
║↕│018 12 ║&│038 26 ║:│058 3a ║N│078 4e ║b│098 62 ║v│118 76 ║ │ ║
║‼│019 13 ║'│039 27 ║;│059 3b ║O│079 4f ║c│099 63 ║w│119 77 ║ │ ║
╚═╧════════╩═╧════════╩═╧════════╩═╧════════╩═╧════════╩═╧════════╩═╧════════╝
╔═╤════════╦═╤════════╦═╤════════╦═╤════════╦═╤════════╦═╤════════╦═╤════════╗
║A│DDD HH ║A│DDD HH ║A│DDD HH ║A│DDD HH ║A│DDD HH ║A│DDD HH ║A│DDD HH ║
╠═╪════════╬═╪════════╬═╪════════╬═╪════════╬═╪════════╬═╪════════╬═╪════════╣
║Č│128 80 ║ö│148 94 ║š│168 a8 ║╝│188 bc ║╨│208 d0 ║Σ│228 e4 ║°│248 f8 ║
║ü│129 81 ║Ó│149 95 ║ř│169 a9 ║╜│189 bd ║╤│209 d1 ║σ│229 e5 ║∙│249 f9 ║
║é│130 82 ║ů│150 96 ║ŕ│170 aa ║╛│190 be ║╥│210 d2 ║µ│230 e6 ║·│250 fa ║
║ď│131 83 ║Ú│151 97 ║Ŕ│171 ab ║┐│191 bf ║╙│211 d3 ║τ│231 e7 ║√│251 fb ║
║ä│132 84 ║ý│152 98 ║¼│172 ac ║└│192 c0 ║╘│212 d4 ║Φ│232 e8 ║ⁿ│252 fc ║
║Ď│133 85 ║Ö│153 99 ║¡│173 ad ║┴│193 c1 ║╒│213 d5 ║Θ│233 e9 ║²│253 fd ║
║Ť│134 86 ║Ü│154 9a ║«│174 ae ║┬│194 c2 ║╓│214 d6 ║Ω│234 ea ║■│254 fe ║
║č│135 87 ║Š│155 9b ║»│175 af ║├│195 c3 ║╫│215 d7 ║δ│235 eb ║⌂│255 ff ║
║ě│136 88 ║Ľ│156 9c ║░│176 b0 ║─│196 c4 ║╪│216 d8 ║∞│236 ec ║ │ ║
║Ě│137 89 ║Ý│157 9d ║▒│177 b1 ║┼│197 c5 ║┘│217 d9 ║φ│237 ed ║ │ ║
║Ĺ│138 8a ║Ř│158 9e ║▓│178 b2 ║╞│198 c6 ║┌│218 da ║ε│238 ee ║ │ ║
║Í│139 8b ║ť│159 9f ║││179 b3 ║╟│199 c7 ║█│219 db ║∩│239 ef ║ │ ║
║ľ│140 8c ║á│160 a0 ║┤│180 b4 ║╚│200 c8 ║▄│220 dc ║≡│240 f0 ║ │ ║
║ĺ│141 8d ║í│161 a1 ║╡│181 b5 ║╔│201 c9 ║▌│221 dd ║±│241 f1 ║ │ ║
║Ä│142 8e ║ó│162 a2 ║╢│182 b6 ║╩│202 ca ║▐│222 de ║≥│242 f2 ║ │ ║
║Á│143 8f ║ú│163 a3 ║╖│183 b7 ║╦│203 cb ║▀│223 df ║≤│243 f3 ║ │ ║
║É│144 90 ║ň│164 a4 ║╕│184 b8 ║╠│204 cc ║α│224 e0 ║⌠│244 f4 ║ │ ║
║ž│145 91 ║Ň│165 a5 ║╣│185 b9 ║═│205 cd ║ß│225 e1 ║⌡│245 f5 ║ │ ║
║Ž│146 92 ║Ů│166 a6 ║║│186 ba ║╬│206 ce ║Γ│226 e2 ║÷│246 f6 ║ │ ║
║ô│147 93 ║Ô│167 a7 ║╗│187 bb ║╧│207 cf ║π│227 e3 ║≈│247 f7 ║ │ ║
╚═╧════════╩═╧════════╩═╧════════╩═╧════════╩═╧════════╩═╧════════╩═╧════════╝
Pozn.: Tabulka jako všechno, co zobrazuje AT help, prošla konverzí češtiny.
Platné výsledky jsou jen pro zvolenou KeybCS 2.
Tabulka znaků ASCII Rámečky
Znaky pro kreslení rámečků
ASCII Dec Hex ASCII Dec Hex ASCII Dec Hex
▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀ ▀▀▀ ▀▀▀▀▀ ▀▀▀ ▀▀▀
┌ ┬ ┐ 218 194 191 da c2 bf ─ 196 c4 ↑ 24 18
├ ┼ ┤ 195 197 180 c3 c5 b4 │ 179 b3 ↓ 25 19
└ ┴ ┘ 192 193 217 c0 c1 d9 ═ 205 cd -> 26 1a
║ 186 ba <- 27 1b
╔ ╦ ╗ 201 203 187 c9 cb bb
╠ ╬ ╣ 204 206 185 cc ce b9 ░ 176 b0 ▲ 30 1e
╚ ╩ ╝ 200 202 188 c8 ca bc ▒ 177 b1 ▼ 31 1f
▓ 178 b2 ► 16 10
╓ ╥ ╖ 214 210 183 d6 d2 b7 █ 219 db ◄ 17 11
╟ ╫ ╢ 199 215 182 c7 d7 b6
╙ ╨ ╜ 211 208 189 d3 d0 bd ▄ 220 dc ♥ 3 03
▌ 221 dd ♦ 4 04
╒ ╤ ╕ 213 209 184 d5 d1 b8 ▐ 222 de ♣ 5 05
╞ ╪ ╡ 198 216 181 c6 d8 b5 ▀ 223 df ♠ 6 06
╘ ╧ ╛ 212 207 190 d4 cf be
Pozn.: Rámečky jako všechno, co zobrazuje AT help, prošly konverzí češtiny.
Platné výsledky jsou jen pro zvolenou KeybCS 2.
Řídící kódy ASCII ASCII Tabulka znaků ASCII tabulka
Rozšířené ASCII kódy kláves
Vrátí-li Klávesnice INT 16 Fn 00H v registru AL nulu, je v AH rozšířený ASCII
kód klávesy podle následující tabulky. Když se ze Znakové I/O funkce vrátí znak
00H, zavolejte ji podruhé, čímž získáte rozšířený ASCII kód.
Tip: Doporučujeme napsat pro čtení klávesy vlastní podprogram, který bude mít
výsledek typu WORD (nikoliv char), a který automaticky rozhodne, zda je nutné
druhé volání. V tom případě bude hodnotou klávesy 0100H + rozšířený kód,
čímž se logicky rozšíří kódování kláves.
╓─────────────╥───────────────────╥───────────────────╥──────────────────╖
║ Klv Hex Dec ║ Klávesa Hex Dec ║ Klávesa Hex Dec ║ Klávesa Hex Dec ║
╟─────────────╫───────────────────╫───────────────────╫──────────────────╢
║ F1 3b 59 ║ Shift-F1 54 84 ║ Ctrl-F1 5e 94 ║ Alt-F1 68 104 ║
║ F2 3c 60 ║ Shift-F2 55 85 ║ Ctrl-F2 5f 95 ║ Alt-F2 69 105 ║
║ F3 3d 61 ║ Shift-F3 56 86 ║ Ctrl-F3 60 96 ║ Alt-F3 6a 106 ║
║ F4 3e 62 ║ Shift-F4 57 87 ║ Ctrl-F4 61 97 ║ Alt-F4 6b 107 ║
║ F5 3f 63 ║ Shift-F5 58 88 ║ Ctrl-F5 62 98 ║ Alt-F5 6c 108 ║
║ F6 40 64 ║ Shift-F6 59 89 ║ Ctrl-F6 63 99 ║ Alt-F6 6d 109 ║
║ F7 41 65 ║ Shift-F7 5a 90 ║ Ctrl-F7 64 100 ║ Alt-F7 6e 110 ║
║ F8 42 66 ║ Shift-F8 5b 91 ║ Ctrl-F8 65 101 ║ Alt-F8 6f 111 ║
║ F9 43 67 ║ Shift-F9 5c 92 ║ Ctrl-F9 66 102 ║ Alt-F9 70 112 ║
║ F10 44 68 ║ Shift-F10 5d 93 ║ Ctrl-F10 67 103 ║ Alt-F10 71 113 ║
╙─────────────╨───────────────────╨───────────────────╨──────────────────╜
──────────────╥───────────────╥────────────────╥─────────────────╥──────────────
Kláv Hex Dec ║ Kláv Hex Dec ║ Kláv Hex Dec ║ Kláv Hex Dec ║ Kláv Hex Dec
──────────────╫───────────────╫────────────────╫─────────────────╫──────────────
Alt-A 1e 30 ║ Alt-N 31 49 ║ Alt-0 81 129 ║ dolů ↓ 50 80 ║
Alt-B 30 48 ║ Alt-O 18 24 ║ Alt-1 78 120 ║ vlevo <- 4b 75 ║ ^left 73 115
Alt-C 2e 46 ║ Alt-P 19 25 ║ Alt-2 79 121 ║ vpravo-> 4d 77 ║ ^right 74 116
Alt-D 20 32 ║ Alt-Q 10 16 ║ Alt-3 7a 122 ║ nahoru↑ 48 72 ║
Alt-E 12 18 ║ Alt-R 13 19 ║ Alt-4 7b 123 ║ NUL 03 3 ║
Alt-F 21 33 ║ Alt-S 1f 31 ║ Alt-5 7c 124 ║ Shft-Tab 0f 15 ║
Alt-G 22 34 ║ Alt-T 14 20 ║ Alt-6 7d 125 ║ Del 53 83 ║
Alt-H 23 35 ║ Alt-U 16 22 ║ Alt-7 7e 126 ║ End 4f 79 ║ ^End 75 117
Alt-I 17 23 ║ Alt-V 2f 47 ║ Alt-8 7f 127 ║ Home 47 71 ║ ^Home 77 119
Alt-J 24 36 ║ Alt-W 11 17 ║ Alt-9 80 128 ║ Ins 52 82 ║
Alt-K 25 37 ║ Alt-X 2d 45 ║ Alt-- 82 130 ║ PgDn 51 81 ║ ^PgDn 76 118
Alt-L 26 38 ║ Alt-Y 15 21 ║ Alt-= 83 131 ║ PgUp 49 73 ║ ^PgUp 84 132
Alt-M 32 50 ║ Alt-Z 2c 44 ║ ║ ║ ^PrtSc 72 114
──────────────╨───────────────╨────────────────╨─────────────────╨──────────────
╔════════════════════════════════════════════════════════╗
║ Rozšíření 101-tlačítkové klávesnice podporované BIOSem ║
╓─────╨─────────────╥───────────────────────╥──────────────────╨─────╖
║ Key Hex Dec ║ Key Hex Dec ║ Key Hex Dec ║
╟───────────────────╫───────────────────────╫────────────────────────╢
║ F11 85 133 ║ Alt-Bksp 0e 14 ║ Alt- K / a4 164 ║
║ F12 86 134 ║ Alt-Enter 1c 28 ║ Alt- K * 37 55 ║
║ Shft-F11 87 135 ║ Alt-Esc 01 1 ║ Alt- K - 4a 74 ║
║ Shft-F12 88 136 ║ Alt-Tab a5 165 ║ Alt- K + 4e 78 ║
║ Ctrl-F11 89 137 ║ Ctrl-Tab 94 148 ║ Alt- K Enter a6 166 ║
║ Ctrl-F12 8a 138 ║ ║ ║
║ Alt-F11 8b 139 ║ Alt-up ↑ 98 152 ║ Ctrl- K / 95 149 ║
║ Alt-F12 8c 140 ║ Alt-down ↓ a0 160 ║ Ctrl- K * 96 150 ║
║ Alt-[ 1a 26 ║ Alt-left <- 9b 155 ║ Ctrl- K - 8e 142 ║
║ Alt-] 1b 27 ║ Alt-right -> 9d 157 ║ Ctrl- K + 90 144 ║
║ Alt-; 27 39 ║ ║ ║
║ Alt-' 28 40 ║ Alt-Delete a3 163 ║ Ctrl- K ↑ [8] 8d 141 ║
║ Alt-` 29 41 ║ Alt-End 9f 159 ║ Ctrl- K 5 [5] 8f 143 ║
║ Alt-\ 2b 43 ║ Alt-Home 97 151 ║ Ctrl- K ↓ [2] 91 145 ║
║ Alt-, 33 51 ║ Alt-Insert a2 162 ║ Ctrl- K Ins[0] 92 146 ║
║ Alt-. 34 52 ║ Alt-PageUp 99 153 ║ Ctrl- K Del[.] 93 147 ║
║ Alt-/ 35 53 ║ Alt-PageDown a1 161 ║ ║
╙───────────────────╨───────────────────────╨────────────────────────╜
Scan-kódy klávesnice Příznaky klávesnice Klávesnice INT 16
ASCII
Řídící kódy tiskáren EPSON/IBM
Hex Dec Popis
▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
07 7 (BEL) pípne (někdy)
09 9 (HT) posun na další tabulační zarážku (Viz ESC D)
0a 10 (LF) posun řádku - posune papír o jeden řádek
0b 11 (VT) posune řádky na další vertikální tabulační zarážku (Viz ESC B)
0c 12 (FF) posun na další stránku (Viz ESC C)
0d 13 (CR) návrat vozu - vytiskne řádek bez posunu papíru. Vyprázdní buffer.
0e 14 začne tisknout ve dvojité šířce (končí CR nebo LF. Viz ESC W)
0f 15 začne tisknout komprimovaným písmem
11 17 výběr (select) tiskárny
12 18 konec komprimovaného tisku
13 19 logicky odpojí (deselect) tiskárnu
14 20 konec tisku ve dvojité šířce
18 24 (CAN) vymaže buffer tiskárny
1b 27 (ESC) počáteční kód víceznakové sekvence (Viz níže)
7f 127 (DEL) vymaže buffer tiskárny
ESC sekvence jsou řazeny podle kategorie, ne podle pořadí sekvencí:
ASCII Hex Popis
▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Font / parametry tisku
────────────────────────────────────────────────────────────────────────────────
ESC - ◄1► 1b 2d 01 začni podtrženě (UNDERLINE)
ESC - ◄0► 1b 2d 00 konec podtrženě
ESC E 1b 45 začni zvýrazněně (EMPHASIZED)
ESC F 1b 46 konec zvýrazněně
ESC G 1b 47 začni dvojitý tisk (DOUBLE-STRIKE)
ESC H 1b 48 konec dvojitého tisku
ESC S ◄0► 1b 53 00 začátek horního indexu (SUPERSCRIPT)
ESC S ◄1► 1b 53 01 začátek dolního indexu (SUBSCRIPT)
ESC T 1b 54 konec horního nebo dolního indexu
ESC W ◄1► 1b 57 01 začátek tisku ve dvojité šířce (není rušeno LF)
ESC W ◄0► 1b 57 00 konec tisku ve dvojité šířce
ESC 4 1b 34 začátek tisku kurzívou EPSON
označení začátku stránky IBM
ESC 5 1b 35 svislé znaky (konec kurzívy) EPSON
ESC 5 <0> 1b 35 00 zruš automatický posun řádku IBM
ESC 5 <1> 1b 35 01 zapni automatický posun řádku IBM
ESC 6 1b 36 vyber znakový soubor IBM #2 (80h-a0H znaky)
ESC 7 1b 37 vyber znakový soubor IBM #1 (80h-a0H řídící kódy 00-20h)
Hustota řádkování / délka stránky
────────────────────────────────────────────────────────────────────────────────
ESC 0 1b 30 8 řádků na palec - výška řádku 1/8 palce
ESC 1 1b 31 výška řádku 7/72 palce
ESC 3 ◄n► 1b 33 xx nastav řádkování variabilního posuvu na ◄n►/216-palce
ESC J ◄n► 1b 4a xx nastav řádkování na ◄n►/216-palce pro následující LF
ESC 2 1b 32 proveď variabilní posun řádku (Viz ESC A)
rovněž 6 řádků na palec, nebylo-li ESC A
ESC A ◄n► 1b 41 xx výška řádku ◄n►/72-palce.
(jednorázový posun řádku spouštěný ESC 2)
ESC C ◄n► 1b 43 xx nastav n řádků na stránku (0-7fH)
ESC N ◄n► 1b 4e xx nastav přeskakování perforace na ◄n► řádků
ESC O 1b 4f zruš přeskakování perforace
Různé
────────────────────────────────────────────────────────────────────────────────
ESC 8 1b 38 ignoruj konec papíru
ESC 9 1b 39 zruš ignorování konce papíru
ESC < 1b 3c hlavu do výchozí polohy
(jednořádkový jednosměrný tisk)
ESC U ◄1► 1b 55 01 začátek jednosměrného tisku ( pro grafiku )
ESC U ◄0► 1b 55 00 začátek obousměrného tisku
ESC B ◄n..0► nastavení vertikálních tabulátorů (vyslat ESC B a pak
posloupnost binárních hodnot, zakončených nulou)
1b 42 xx..00
ESC D ◄n..0► nastavení horizontálních tabulátorů (vyslat ESC D a pak
1b 44 xx..00 posloupnost binárních hodnot, zakončených nulou)
Grafika
────────────────────────────────────────────────────────────────────────────────
ESC K ◄n1►◄n2►◄b1..bn► 480-bodová bitová grafika (60 bodů na palec).
1b 4b xx xx yy..yy Tiskne n1 + 256 * n2 bytů (horní tečka je bit 7,
dolní bit 0)
ESC L ... 1b 4c ... 960-bodová bitová grafika (120 bodů ma palec)--pomalá
(Viz ESC K, ESC Y)
ESC Y ... 1b 59 ... 960-bodová bitová grafika (120 bodů ma palec)--rychlá
(nelze tisknout dva body těsně vedle sebe)
ESC Z ... 1b 59 ... 1920-bodová bitová grafika (240 bodů na palec)
(nemůže tisknout dva body těsně vedle sebe)
ESC * Volba grafického režimu
1b 2a ... Volba jednoho ze sedmi grafických režimů pomocí
a tisk grafiky v tomto režimu (ostatní parametry jako
ESC K).
n0 Grafický režim
-----------------------
0 Normální hustota (60 bodů na palec)
1 Dvojitá hustota (120 bodů na palec)
2 Dvojitá hustota, rychle
3 Čtyřnásobná hustota (240 bodů na palec)
4 CRT grafika I. (80 bodů na palec)
5 Plotterová grafika 1:1 (72 bodů na palec)
6 CRT grafika II. (90 bodů na palec)
7 Plotterová grafika 1:2 (144 bodů na palec)
────────────────────────────────────────────────────────────────────────────────
Řídící kódy ASCII Tabulka znaků ASCII tabulka ASCII
HPGL
Tabulka znaků ASCII
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
00 ☺ ☻ ♥ ♦ ♣ ♠ • ◘ Tab LF ♂ ♀ CR ♫ ☼
10 ► ◄ ↕ ‼ ¶ § ▬ ↨ ↑ ↓ -> <- ∟ ↔ ▲ ▼
20 ! " # $ % & ' ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } Tilda ⌂
80 Č ü é ď ä Ď Ť č ě Ě Ĺ Í ľ ĺ Ä Á
90 É ž Ž ô ö Ó ů Ú ý Ö Ü Š Ľ Ý Ř ť
a0 á í ó ú ň Ň Ů Ô š ř ŕ Ŕ ¼ ¡ « »
b0 ░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐
c0 └ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧
d0 ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀
e0 α ß Γ π Σ σ µ τ Φ Θ Ω δ ∞ φ ε ∩
f0 ≡ ± ≥ ≤ ⌠ ⌡ ÷ ≈ ° ∙ · √ ⁿ ² ■
Pozn.: Tabulka jako všechno, co zobrazuje AT help, prošla konverzí češtiny.
Platné výsledky jsou jen pro zvolenou KeybCS 2.
Rámečky ASCII tabulka ASCII
Řídící kódy ASCII
Dec Hex Ctl Name Význam Dec Hex Ctl Name Význam
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 00 ^@ NUL null (end of string) █ 16 10 ^P DLE data line escape
1 01 ^A SOH start of heading █ 17 11 ^Q DC1 device ctrl 1 (X-ON)
2 02 ^B STX start of text █ 18 12 ^R DC2 device ctrl 2
3 03 ^C ETX end of text █ 19 13 ^S DC3 device ctrl 3 (X-OFF)
4 04 ^D EOT end of transmission █ 20 14 ^T DC4 device ctrl 4
5 05 ^E ENQ enquiry █ 21 15 ^U NAK negative acknowledge
6 06 ^F ACK acknowledge █ 22 16 ^V SYN synchronous idle
7 07 ^G BEL bell █ 23 17 ^W ETB end of transmit block
8 08 ^H BS backspace █ 24 18 ^X CAN cancel
9 09 ^I HT TAB horizontal tab █ 25 19 ^Y EM end of medium
10 0a ^J LF line feed █ 26 1a ^Z SUB substitute
11 0b ^K VT vertical tab █ 27 1b ^[ ESC escape
12 0c ^L FF form feed █ 28 1c ^\ FS file separator
13 0d ^M CR carriage return █ 29 1d ^] GS group separator
14 0e ^N SO shift out █ 30 1e ^^ RS record separator
15 0f ^O SI shift in █ 31 1f ^_ US unit separator
Rámečky ASCII tabulka ASCII
Řídící kódy modemu
Řídící kódy ASCII Řídící kódy tiskáren HPGL
+++ Standardní ESC sekvence (Registr S2)
, Standardní znak pro pauzu (Registr S8)
AT Standardní sekvence začáku komunikace PC s modemem
ATA Odpověď na volání
ATC0 Vypnout přijímač
ATC1 Zapnout přijímač
ATD Vytoč číslo (uvedené za)
ATDP Vytoč číslo (uvedené za) - pulzní volba (ČR)
ATDT Vytoč číslo (uvedené za) - tónová volba
ATE0 Vypni lokálení odezvu
ATE1 Zapni lokálení odezvu
ATF0 Half duplex
ATF1 Full duplex
ATH0 Nucené zavěšení
ATH1 Nucené 'zvednutí sluchátka'
ATH2 Nucené speciální zavěšení (pro HAM)
ATI0 Požaduj verzi, vrátí PPV, PP=produkt, V=verze
ATI1 Požadavek o ROM CRC
ATL1 Sluchátko modemu potichu
ATL2 Sluchátko modemu středně
ATL3 Sluchátko modemu nahlsa
ATM0 Sluchátko odpojit
ATM1 Sluchátko zapnuto dokud není spojení
ATM2 Sluchátko vždy zapnuto
ATM3 Sluchátko vypnuto na vytáčení a přenos
ATO Nastav modem na on-line Status
ATP Nastavit modem na pulzní volbu na default
ATQ0 Modem vrací result kódy
ATQ1 Modem nevrací result kódy
ATR Nastav modem na auto-odpoveď po skončení přenosu
ATSn Nastavení S registrů ( viz níže )
ATT Nastavit modem na tónovou volbu na default
ATV0 Číselné chybové kódy
ATV1 Textové chybové kódy
ATX0 Vracet jen standardní chyby "CONNECT", nečekat na volací tón
ATX1 Vracet rozšířené chyby "CONNECT 1200", nečekat na volací tón
ATX2 Čekat na volací tón, vracet rozšířené chyby
ATX3 Jen detekovat obsazeno, vracet rozšířené chyby (ČR)
ATX4 Čekat na volací tón,detekovat obsazeno, vracet rozšířené chyby
ATZ Nastav na default
Modemy 2400 baudů
ATB0 Nastavit protokol CCITT V.22 na 1200 bps
ATB1 Nastavit protokol BELL 212A na 1200 bps
AT&C DCD vždy zapnut
AT&C1 DCD jen během přenosu
AT&D DTR signál ignorovat
AT&D1 Po DTR povoleno zavěsit
AT&D2 Po DTR povoleno zavěsit (+ automatické odpovědi off)
AT&D3 Po DTR povoleno zavěsit (+ reset modemu)
AT&F Nastavit DEFAULT hodnoty modemu
AT&G Žádný guard tón
AT&G1 550 Hz guard tón
AT&G2 1800 Hz guard tón
AT&J RJ11/RJ41S/RJ45 jack
AT&J2 RJ12/RJ13 jack
AT&L Běžná telefonní linka
AT&L1 Sdílená telefonní linka
AT&M Asynchronní operace
AT&M1 Asynchronní + synchronní operace
AT&M2 Synchronní automatické vytáčení
AT&M3 Synchronní manuální vytáčení
AT&P 39/61 pulz / mezera poměr
AT&P1 33/67 pulz / mezera poměr
AT&T4 Provádět ROL auto-test
AT&T5 Neprovádět ROL auto-test
AT&W Zapsat hodnotu registrů do trvalé paměti
AT&X Synchronní časování interní
AT&X1 Synchronní časování externí
AT&X2 Synchronní časování slave
AT&Z Uložit poslední volací příkaz
Registry modemu
Pozn.: Ne všechny jsou přístupné na všech typech modemů
Nastavit registr : AT Sr=## (CR - #13)
Čtení registru : AT Sr? (CR - #13)
Kde "r" je číslo registru a CR znak pro Enter - #13
() indicates defaults for Smartmodem 1200
** indicates possible inconsistencies across modems
Reg Hodnoty Funkce - význam
S0 0-255 Zazvonění pro odpověď ( 0=neodpovídat )
S1 0-255 Počet zazvonění ( pouze ke čtení )
S2 0-255 ESC znak, normálně "+", 128-255 zakazuje ESC
S3 0-127 EOLN znak (0D = CR)
S4 0-127 Line Feed znak (0A = LF)
S5 0-32,127 Backspace znak (08 = BS)
S6 2-255 Pauza před volbou(vytáčením) v sec (2)
S7 1-255 Čekací doba na signál v sec (30)
S8 0-255 Pauza pro čárku v sec (2)
S9 1-255 Čekání na spojení v 1/10 sec (6)
S10 1-255 Po ztrátě spojení zavěs za 1/10 sec, 255=ignoruj (7)
S11 50-255 Rychlost tónového vytáčení, v ms (70)
S12 20-255 ESC guard čase, v 1/50 sec (50)
│7│6│5│4│3│2│1│0│ S13 Formát asynchronních dat
│ │ │ │ │ │ │ └──── Nepoužito
│ │ │ │ │ │ └───── Chybové kódy, 0=Standard, 1=Rozšířené
│ │ │ │ │ └────── Parita, 0=není, 1=je
│ │ │ │ └─────── Parita, 0=lichá, 1=sudá
│ │ │ └──────── Data bitů, 0=7 bitů, 1=8 bitů
│ │ └───────── Nedefinován
│ └────────── Vysílat chybu při přetečení bufferu : 0=ne, 1=ano
└─────────── Osmý bit přenášených dat
│7│6│5│4│3│2│1│0│ S14 Volby výstupu
│ │ │ │ │ │ │ └──── Nepoužito
│ │ │ │ │ │ └───── Lokální odezva, 0=ne, 1=ano
│ │ │ │ │ └────── Chybové kódy, 0=ano, 1=ne
│ │ │ │ └─────── Cybové kódy, 0=číselné, 1=slovní
│ │ │ └──────── Rozpoznávání příkazů, 0=ano, 1=ne
│ │ └───────── Vytáčení 0= tónové , 1=pulzní
│ └────────── Nevyužito
└─────────── 0=odpověď, 1=volání
S15 Registr příznaků
│7│6│5│4│3│2│1│0│ S16 Status test
│ │ │ │ │ │ │ └──── Analogová okruh, 0=neaktivní, 1=aktivní
│ │ │ │ │ │ └───── Nepoužito
│ │ │ │ │ └────── Digitální okruh, 0=neaktivní, 1=aktivní
│ │ │ │ └─────── Přenosové reg digitálního okruhu, 0=ne, 1=ano
│ │ │ └──────── Přenosový digitální okruh, 0=ne ,1=ano
│ │ └───────── Auto test RDL, 0=neaktivní, 1=aktivní
│ └────────── Auto test analogového okruhu ,0=neaktivní,1=aktivní
└─────────── Nepoužito
S18 0-255 Test přenosu v sec
│7│6│5│4│3│2│1│0│ S21 Status voleb
│ │ │ │ │ │ │ └──── typ jacku , 0=RJ11,RJ41,RJ45,1=RJ12,RJ13
│ │ │ │ │ │ └───── Nepoužito
│ │ │ │ │ └────── CTS status, 0=následuje RTS, 1=vynucený
│ │ │ └─┴─────── DTR - modem spolupráce
│ │ └────────── DCD, 0=vynucený, 1=následuje přenos
│ └─────────── DSR, 0=vynucený, 1=pracuje normálně
└──────────── Rozpojení po dlouhé pauze,0=zakázáno,1=povoleno
Bity
43 DTR - Modem spolupráce
00 ignorovat DTR
01 Předpokládat příkaz po DTR
10 Předpokládat příkaz a odpojit auto-příjem po DTR
11 Reset po DTR
│7│6│5│4│3│2│1│0│ S22 Status nastavení
│ │ │ │ │ │ └─┴──── Sluchátko - hlasitost, 01=malá,10=stř.,11=velká
│ │ │ │ └─┴─────── Sluchátko - nastavení
│ └─┴─┴────────── X příkaz vybrán
└─────────────── Poměr pulz/pauza, 0=39/61, 1=33/67
Bity
32 S22 Sluchátko - nastavení
00 Vždy vypnuto
01 Zapnuto do zahájení přenosu
10 Vždy zapnuto
11 Vypnuto během vytáčení a přenosu
Bity
654 S22 X - příkaz
100 X1
101 X2
110 X3
111 X4
│7│6│5│4│3│2│1│0│ S23 Status nastavení
│ │ │ │ │ │ │ └──── ?????
│ │ │ │ │ └─┴───── Přenosová rychlost
│ │ │ │ └──────── Nepoužito
│ │ └─┴───────── Parita
└─┴──────────── Nastavení guard tónu
Bity
21 S23 Rychlost přenosu
00 0-300 bps
01 600 bps
10 1200 bps
11 2400 bps
Bity
54 S23 Parita
00 sudá
01 bit parity vždy 0
10 lichá
11 bit parity vždy 1
Bity
76 S23 Nastavení guard tónu
00 Žádný
01 550 hz
10 1800 hz
S25 0-255 DTR detekční pauza v sec (5)
S26 0-255 RTS - CTS pauza v millisec (1)
│7│6│5│4│3│2│1│0│ S27 Status nastavení
│ │ │ │ │ │ └─┴──── Synchronní / asynchronní mód
│ │ │ │ │ └─────── Telefonní linka, 0= veřejná, 1=sdílená
│ │ │ │ └──────── Nepoužito
│ │ └─┴───────── Časování
│ └──────────── Protokol, 0=CCITT V.22, 1=Bell 212A
└───────────── Nepoužito
Bity
10 S27 Synchronní / asynchronní mód
00 Asynchronní mód
01 Synchronní / asynchronní mód
10 Synchronní automatické vytáčení
11 Synchronní manuální vytáčení
Bity
45 S27 Časování
00 Interní
01 Externí
10 Slaved
ASCII Řídící kódy ASCII
HPGL - Hewlett Packard Graphic Language
HPGL je standardním komunikačním jazykem plotterů. Je podporován většinou
výrobců. Jeho využívání je velmi snadné, skládá se ze zkratek anglických
příkazů pro kreslení.
Standardním oddělovačem příkazů je středník ';', příkaz musí být jen na jedné
řádce, po středníku může následovat CR+LF. Předávaná čísla jsou v desítkové
soustavě psána ASCII. Po příkazu může následovat libovolné množství mezer.
Jednotlivé parametry se oddělují čárkou.
IN - Inicializace plottru. nastavení poloh zarážek P1 a P2 na implicitní hodnoty
SC [rat] - Měřítko. Bez parametrů nastaví na 1:1, jinak na rat. Všechny
parametry se násobí tímto desetinným číslem.
PU [X,Y] - Pen Up. Zvedne pero, je-li udáno X a Y, přenese pezo na absolutní
souřadnici X a Y.
LT [vzorek[,vel]] - Nastaví typ čáry na vzorek. Je-li udáno vel, pak nastaví
velikost vzorku na vel % vzdálenosti P1 a P2.
Vzorek : bez parametrů plná čára
1 tečkovaná
2 čárkovaná
3 čerchovaná
VS [speed] - Nastaví rychlost posuvu pera na speed cm/s. Bez parametru na
default rychlost.
SP [n] - Select pen. Je-li dáno číslo, vybere pero ze zásobníku n.
SP bez parametrů odevzdá pero. Měl by se volat po každém
skončeném výkresu.
PA X,Y - Pen Absolute. Nastaví pero na absolutní souřadnici X,Y. Je-li
pero dole, nakreslí přímku.
PD [X,Y] - Pen Down. Spustí pero ( a nastaví na pozici X,Y, je-li udána).
PR X,Y - Pen Relative. Nastaví pero na souřadnici Xs+X, Ys+Y, kde Xs,Ys
je aktuální souřadnice pera. X a Y může být záporné.
DI [Xr,Yr] - Direction. Nstaví počátek souřadnicových os do aktuálního bodu
tak, aby byl proti standardnímu otočen o úhel, jehož tangens
je poměř Yr/Xr. Xr nebo Yr může být i 0.
LB [text]♥ - Vypíše text na aktuální souřadnici. Text se ukončuje znakem '♥',
ASCII 03.
HPGL lze emulovat i na tiskárnách LaserJet, použitím následujících příkazů:
ESC & l 0 O ESC % 0 B - inicializace HPGL
1B 26 6C 30 4F 1B 25 30 42
... zde normální příkazy HPGL pro vykreslování ..
... ne řídící příkazy !! ....
... SP 0 - bílá barva (nic) ...
... SP 1 - černá barva ...
ESC % 0 A ESC & l 0 H ESC E - návrat k PCL + Eject Page
1B 25 30 41 1B 26 6C 30 48 1B 45
Řídící kódy tiskáren ASCII Řídící kódy ASCII
IRQ - Interrupt Request
Přerušení spadající do kategorie IRQ jsou generována asynchronně nezávisle
na běhu programu vnějšími periferiemi. Na AT existuje 16 různých IRQ linek.
jsou ovládány řadičem přerušení 8259. Ten přiřazuje jednotlivým IRQ tyto
standardní INTy :
IRQ Význam INT
───────────────────────────────────────────────────────────────
0 Časovač INT 08
1 Klávesnice INT 09
2 EGA - INT 0A
3 COM - INT 0B
4 COM - INT 0C
5 LPT - INT 0D
6 Floppy - INT 0E
7 LPT - INT 0F
8 Časovač INT 70
9 LAN adaptér INT 71
A Rezervováno INT 72
B Rezervováno INT 73
C Myš INT 74
D Koprocesor INT 75
E HDD INT 76
F Rezervováno INT 77
Prvních 8 IRQ bylo již blahých časů na 8086, IBM jim dala INTy dost nízko.
INTEL se rozhodl tytéž inty použít jako Přerušení CPU , a tak dochází ke
kolizím. V REAL MÓDu většina přerušení CPU nenastává a ke konfliktům
nedochází. V PROTECTED MÓDu a V86 MÓDu musí být IRQ přemapována jinam.
Ve V86 MÓDu ale 99% programů spoléhá na nějaké to IRQ na standardní pozici.
Proto správce V86 musí přerušení IRQ odchytit a provést přerušení v REAL stylu
podle hodnot na původních vektorech. Viz Zpracování přerušení .
Přesměrování přerušení ( zde na vektor 50h jako Windows ):
cli
xor ax, ax
mov ds, ax
mov es, ax
mov si, 08h*4
mov di, 50h*4
mov cx, 10h
cld
rep movsw
in al, 21h
push ax
xor al, al
out 0F1h, al ; reset koprocesoru
mov al, 11h
out 20h, al
jmp Delay1
Delay1: jmp Delay2
Delay2: jmp Delay3
Delay3:
mov al, 50h
out 21h, al
jmp Delay4
Delay4: jmp Delay5
Delay5: jmp Delay6
Delay6:
mov al, 04h
out 21h, al
jmp Delay7
Delay7: jmp Delay8
Delay8: jmp Delay9
Delay9:
mov al, 01h
out 21h, al
jmp Delay10
Delay10:jmp Delay11
Delay11:jmp Delay12
Delay12:
pop ax
out 21h, al
sti
Pozn. : IRQ se někdy ( občas, vždy ) mezi sebou mlátí. O válkách uživatel -
počítač (IRQ) lze získat nejlepší informace v BYTE (BAJTU) ve článcích
od Jerryho Pournella.
Přerušení CPU Přerušení DOSu Přerušení BIOSu
INT 76
Toto přerušení je rezervováno pro kaskádu 8259. Je využíváno některými
Hard Disky.
IRQ
INT 75
Toto přerušení je rezervováno pro kaskádu 8259. Je voláno při chybě
koprocesoru X87. BIOS jej přesměrovává na INT 02 ve stylu 8087.
Chyby koprocesoru : viz INT 09 INT 0D a INT 10
IRQ Koprocesory
INT 74
Toto přerušení je rezervováno pro kaskádu 8259. Může být voláno COM portem
a tudíž zde může sídlit myš.
IRQ
INT 71
Toto přerušení je rezervováno pro kaskádu 8259. Může být voláno LAN adaptérem.
Obsluha BIOSu jej přesměrovává na EGA - INT 0A .
IRQ
INT 08H Časovač
Toto hardwarově generované přerušení ( IRQ 0) se provádí po každém taktu hodin
reálného času. Takt proběhne každých 55 ms, což je asi 18.2 taktů za sekundu.
Standardní rutina ROM-BIOSu při tomto přerušení zvýší hodnotu hodin na 0:046c.
Kromě toho také vypíná pohon disketové jednotky, jestliže aspoň 2 sekundy
nedošlo ke čtení nebo zápisu. Viz Datová oblast BIOSu .
Chcete-li použít toto přerušení na uživatelské, časově závislé činnosti,
nesmíte zapomenout připojit instrukce, které systému sdělí, že je přerušení
již u konce. Kouzelná sekvence, která to zajistí, je:
mov al,20H ;pošli signál Konec Přerušení
out 20H,al ;na řadič přerušení 8259
Většina programů pracuje takto: Po instalaci uschovají originální vektor do
proměnné nazvané cs:[saved_int8]. Pak provedou při každém přerušení INT 08H
následující činnost:
pushf ;simuluj INT
call dword ptr cs:[saved_int8] ;zajisti normální činnost časovače
cmp cs:my_var,test_value ;nyní přijde co potřebuje uživatel
... atd. ...
iret ;návrat k programu, který vyvolal přerušení
CPU má INT 08 rezervované jako Double fault. Viz IRQ o přemapování.
Přerušení CPU
INT 09H Přerušení klávesnice
Toto hardwarově generované přerušení ( IRQ 1) se provádí při každém stisku a
uvolnění klávesy. Rutina ROM-BIOSu interpretuje klávesu a uschová hodnoty do
zásobníku klávesnice na 0:041e. Ošetřuje také speciální klávesy, jako jsou
PrtSc a SysReq, a kontroluje stav kláves shift a zámků (shift lock, scroll lock)
┌─┐
│V│ Klávesnice INT 16 .. služba BIOSu zpřístupňující klávesy uložené v bufferu
│I│ a poskytující stav shiftů.
│Z│ Scan-kódy klávesnice seznam hodnot každé klávesy přijatelné přerušením
│ │ INT 09H.
│ │ ASCII tabulka
│T│ Rozšířené kódy kláves hodnoty, které BIOS umísťuje do zásobníku klávesnice
│É│ po jejich převedení ze scanovacího kódu.
│Ž│ Příznaky klávesnice . jak zjistit, testovat a modifikovat bitové hodnoty
└─┘ příznaků shiftů a locku.
Rezidentmí programy používající ke své aktivaci "hot─key" obvykle volají INT 09
a testují danou klávesu asi takto:
push ax
in al,60H ;načti klávesu
cmp al,POP_KEY ;je to "hot key"?
je do_pop ; ano, aktivujeme program
; ne, vrátíme se zpátky
pop ax
jmp cs:[int9_vect] ;jenom odskočíme na orginální obsluhu
do_pop: ;────── tohle bude nutné ke správnému provedení hrdwr přerušení
in al,61H ;zjisti hodnotu řízení klávesnice
mov ah,al ; ulož ji
or al,80h ;nastav bit "povolení klávesnice"
out 61H,al ; a zapiš to na řídící port
xchg ah,al ;vezmi originální hodnotu řízení portu
out 61H,al ; a zapiš ji zpátky
mov al,20H ;pošli signál KonecPřerušení
out 20H,al ; na řadič přerušení 8259
;────── další rutina to obslouží, jiná otestuje a pak se zavolá program
CPU má INT 09 rezervované jako Chyba koprocesoru. Viz IRQ o přemapování.
Přerušení CPU
INT 0EH: Disketové přerušení
INT 0EH je hardwarově generované přerušení ( IRQ 6) používané řadičem pružného
disku.
ROM─BIOS nastaví bit 7 v proměnné BIOSu "seek_status" (0:043e), což indikuje
funkci vystavení hlavy disketové jednotky. Tento příznak používá INT 13H ke
zjištění, zda bude požadována před další činností rekalibrace řadiče.
CPU má INT 0E rezervované jako Výpadek stránky. Viz IRQ o přemapování.
Datová oblast BIOSu Disk INT 13 Přerušení BIOSu Funkce DOSu
Přerušení CPU
EGA - INT 0A
Toto je harwarové přerušení úrovně 2 ( IRQ 2) a je generováno:
• EGA adaptérem při vertikálním snímkování
• na počítači Tandy 1000, je použito pro hard disk
• adaptéry TOPS a PCnet pro IRQ linku (default)
CPU má INT 0A rezervován pro chybu TSS . Někdy je nutno přemapovat IRQ .
Viz též: Přerušení BIOSu Funkce DOSu
Přerušení CPU I/O porty
COM - INT 0B
Toto přerušení hardwarové úrovně 3 ( IRQ 3) je generováno:
sériovým portem COM2 (default)
na PS/2 toto přerušení sdílejí porty COM2 až COM8
na mnoha PC toto přerušení sdílí také port COM4:
adaptéry TOPS a PCnet pro IRQ linku (alternativně)
Často zde sídlí driver myši.
CPU má INT 0B rezervován pro výpadek segmentu. Někdy je nutno přemapovat
IRQ .
Viz též: Přerušení BIOSu COM - INT 0C Funkce DOSu
Přerušení CPU I/O porty
COM - INT 0C
Toto přerušení hardwarové úrovně 4 ( IRQ 4) je generováno:
sériovým portem COM1: (default)
na mnoha PC toto přerušení sdílí také port COM3:
Často zde sídlí driver myši.
CPU má INT 0B rezervován pro výpadek zásobníku. Někdy je nutno přemapovat
IRQ .
Viz též: Přerušení BIOSu COM - INT 0B Funkce DOSu
Přerušení CPU I/O porty
LPT - INT 0D
Toto přerušení hardwarové úrovně 5 ( IRQ 5) je generováno:
• Hard diskem (PC)
• Paralelním portem LPT2 (AT, PS/2)
• Na počítači Tandy 1000, je použito pro 60 Hz RAM refresh
• Některými kartami Ethernet
• Sound Blasterem
CPU má INT 0B rezervován pro chyby ochrany. Někdy je nutno přemapovat
IRQ .
Viz též: Přerušení BIOSu Funkce DOSu
I/O porty Přerušení CPU
LPT - INT 0F
Toto přerušení hardwarové úrovně 7 ( IRQ 7) je generováno paralelním portem
LPT1, jestliže je tiskárna připravena. Existují však adaptéry, které toto
přerušení občas (většinou, je-li to potřeba - dle Murphyho zákona)
negenerují, jinak pracují spolehlivě.
CPU má INT 0F rezervován pro budoucí rozšíření.
Viz též: Přerušení BIOSu Funkce DOSu
I/O porty Přerušení CPU
Seznam přerušení
R - je prováděno-lze provést v REAL MÓDu a V86 MÓDu
P - je prováděno-lze provést v PROTECTED MÓDu
PD - je prováděno-lze provést v PROTECTED MÓDu pod DPMI
S - Je voláno synchronně
A - Je voláno asynchronně
CPU - Přerušení CPU
Hardware - Nejčastěji IRQ
DOS - Přerušení DOSu
BIOS - Přerušení BIOSu
Číslo INT R P PD S A Kategorie
────────────────────────────────────────────────────────
INT 00 X X X X CPU
INT 01 X X X X CPU
INT 02 X X X X Hardware ( FPU )
INT 03 X X X X CPU
INT 04 X X X X CPU
INT 05 X X X X CPU
INT 06 X X X X CPU
INT 07 X X X X CPU
INT 08 X X X X CPU
Časovač INT 08 X X Hardware ( IRQ )
INT 09 X X X X CPU, FPU
Klávesnice INT 09 X X Hardware ( IRQ )
INT 0A X X X CPU
EGA - INT 0A X X Hardware ( IRQ )
INT 0B X X X CPU
COM - INT 0B X X Hardware ( IRQ )
INT 0C X X X CPU
COM - INT 0C X X Hardware ( IRQ )
INT 0D X X X X CPU
LPT - INT 0D X X Hardware ( IRQ )
INT 0E X X X CPU
Floppy - INT 0E X X Hardware ( IRQ )
LPT - INT 0F X X Hardware ( IRQ )
INT 10 X X X X CPU
Video INT 10 X X X BIOS
INT 11 X X X CPU
Konfigurace INT 11 X X X BIOS
Paměť INT 12 X X X BIOS
Disk INT 13 X X X BIOS
COM INT 14 X X X BIOS
BIOS INT 15 X X X BIOS
Klávesnice INT 16 X X X BIOS
LPT INT 17 X X X BIOS
ROM Basic INT 18 X X BIOS
BOOT INT 19 X X BIOS
Časovač INT 1A X X BIOS
Break INT 1B X X BIOS, DOS
Uživatelský časovač INT 1C X X X BIOS, IRQ
Video parametry INT 1D X X X BIOS Jen tabulka, ne kód
Parametry diskety INT 1E X X X BIOS Jen tabulka, ne kód
Tabulka znaků INT 1F X X X BIOS Jen tabulka, ne kód
INT 20 X X DOS
INT 21 X X X DOS
INT 22 X X X DOS
INT 23 X X X DOS
INT 24 X X X DOS
INT 25 X X X DOS
INT 26 X X X DOS
INT 27 X X DOS
INT 28 X X DOS
INT 29 X X DOS
INT 2A X X DOS
INT 2B X X DOS
INT 2C X X DOS
INT 2D X X DOS
INT 2E X X DOS
INT 2F X X X DOS, Multiplex
INT 31 X X DPMI
INT 33 X X Ovladač myši
Parametry HD 1. INT 41 X X BIOS Jen tabulka, ne kód
Parametry HD 2. INT 46 X X BIOS Jen tabulka, ne kód
Budík INT 4A X X BIOS, IRQ
INT 67 X X EMS
INT 70 X X X BIOS, IRQ
INT 71 X X X BIOS, IRQ
INT 74 X X X BIOS, IRQ
INT 75 X X X BIOS, IRQ
INT 76 X X X BIOS, IRQ
Přerušení DOSu Přerušení BIOSu Přerušení CPU Zpracování přerušení
IRQ Mapa paměti Seznam kapitol
Selektor
Pojmem selektor se rozumí obsah viditelné části segmentového registru při
práci v PROTECTED MÓDu . V REAL MÓDu a V86 MÓDu je totéž nazýváno
SEGMENT. Tento rozdíl je zaveden, aby se jasně rozlišilo, kdy je obsah
segmentového registru přímo součástí adresy - SEGMENT a kdy se jedná jen
o index do tabulky Deskriptorů - Selektor.
Struktura selektoru (WORD) je následující :
15 3 2 1 0
┌─────────────────────────────────────┬───┬─────┐
│ 13 bitů - index do tabulky │ L │ XPL │
└─────────────────────────────────────┴───┴─────┘
Index do tabulky - udává číslo Deskriptoru v tabulce
L - Přepínač LDT/GDT
0 - GDT
1 - LDT
XPL - Úroveň privilegovanosti.
U CS se nazývá CPL , jinak RPL .
Obecně platí CPL<=RPL (numericky)
Pro RPL SS navíc CPL = RPL
Podrobnosti : Viz Systém ochrany RPL CPL DPL EPL IOPL
Deskriptor PROTECTED MÓD
Deskriptor
Deskriptor je položka GDT, LDT nebo IDT. Je využíván v PROTECTED MÓDu .
Velikost deskriptoru je 8 byte a jeho struktura se výrazně odlišuje podle
nastavení jednotlivých jeho bitů.
1. Deskriptor mimo operační paměť.
Bity:
63 48 47 46 45 44 43 40 39 0
┌──────────────────┬───┬─────┬───┬────────┬──────────────────────────────┐
│ XXXXXXXXXXXXXXXX │P=0│ DPL │ S │Reserved│ XXXXXXXXXXXXXXXXXXXXXXXXXXXX │
└──────────────────┴───┴─────┴───┴────────┴──────────────────────────────┘
Důležitá je hodnota P=0. To znamená, že deskriptor je mimo operační paměť,
a tudíž veškeré snahy o jeho použití vyvloají INT 0B , který jej musí
natáhnout. (nastavit P=1). Položky DPL a S by měly mít správnou hodnotu,
procesor ještě před provedením instrukce testuje schopnost deskriptoru být
použit pro danou operaci. Pokud tato pole obsahují nesmysly, dojde
pravděpodobně k INT 0D . Pole Reserved nemusí být zachováno během testů
procesoru (s P=0) a nemělo by u nepřítomných deskriptorů být využíváno.
Pole XXXXX mohou obsahovat libovolné hodnoty, které pomohou správci INT 0B
nalézt deskriptor např. na disku. Hodí se pro virtualizaci paměti.
Výhodnější virtualizací na 386 a 486 je využití Stránkování a INT 0E .
2. Deskriptor datového segmentu
63 56 55 52 51 48 47 44 40 39 16 15 0
┌─────┬─┬─┬──┬─────┬─┬─────┬─┬─┬──┬─┬─┬─────────────────┬────────────┐
│ bbb │G│D│00│ lll │1│ DPL │1│0│ED│W│A│ BBBBBBBBBBBBBBB │ LLLLLLLLLL │
└─────┴─┴─┴──┴─────┴─┴─────┴─┴─┴──┴─┴─┴─────────────────┴────────────┘
L - bity 0 .. 15 : Limit segmentu. Na 286 max. 65536, 386 a 486 viz. l
B - bity 16 .. 39 : Báze segmentu. Na 286 max. 16MB, 386 a 486 viz b
A - bit 40 Accesed : nastaven na 1 po každé R/W operaci v segmentu
W - bit 41 Writealbe : 1 - lze i psát, 0 jen číst
ED- bit 42 Expand down (roste dolů) : 0 ne (data) 1 ano (stack)
0 - bit 43 Zde signalizuje datový segment. Tento segment nelze použít
pro CS.
1 - bit 44 Zde signalizuje nesystémový deskriptor ( lze použít pro ?S reg)
DPL bity 45 a 46. Descriptor Privileg level. Viz zvláštní kapitola DPL
1 - bit 47 Zde znamená přítomnost segmentu
──────────────────────────────────────────────────────────────────────────
Jen 386 a 486
l - bity 48 .. 51 : horní 4 bity pro limit. Limit u 386 má 20 bitů
max 1MB (viz ještě bit G)
00 - bity 52 a 53 musí být 0 - zachování kompatibility.
D - bit 54 : 0 v segmentu se adresuje 16 bitově
1 v segmentu se adresuje 32 bitově
Důležité až pro kódové selektory.
G - bit 55 : 0 - délka segmentu je v bytech (max 1 MB)
1 - délka segmentu je v 4096bytech (stránky, max 4 GB)
nastavením G na 1 a všech ll a LL na 1 lze získat deskriptor
pro adresaci celého paměťového prostoru.
b - bity 56 .. 63 : horní BYTE báze. U 386 a 486 může být báze až 4 GB.
Pozn. : Pro SS nemusí být ED 1, je-li však 1, lze segment snadněji zvětšit při
nebezpečí podtečení.
3. Deskriptor kódového segmentu
63 56 55 52 51 48 47 44 40 39 16 15 0
┌─────┬─┬─┬──┬─────┬─┬─────┬─┬─┬─┬─┬─┬─────────────────┬────────────┐
│ bbb │G│D│00│ lll │1│ DPL │1│1│C│R│A│ BBBBBBBBBBBBBBB │ LLLLLLLLLL │
└─────┴─┴─┴──┴─────┴─┴─────┴─┴─┴─┴─┴─┴─────────────────┴────────────┘
L - bity 0 .. 15 : Limit segmentu. Na 286 max. 65536, 386 a 486 viz. l
B - bity 16 .. 39 : Báze segmentu. Na 286 max. 16MB, 386 a 486 viz b
A - bit 40 Accesed : nastaven na 1 po každé R operaci v segmentu
R - bit 41 Readable : 1 - lze i číst, 0 jen provádět
C - bit 42 Conform - lze jej používat i pokud CPL >= DPL .
1 - bit 43 Zde signalizuje kódový segment. Tento segment lze použít i
pro DS, ES, FS a GS. NE pro SS (nelze zapisovat).
1 - bit 44 Zde signalizuje nesystémový deskriptor ( lze použít pro ?S reg)
DPL bity 45 a 46. Descriptor Privileg level. Viz zvláštní kapitola DPL
1 - bit 47 Zde znamená přítomnost segmentu
──────────────────────────────────────────────────────────────────────────
Jen 386 a 486
l - bity 48 .. 51 : horní 4 bity pro limit. Limit u 386 má 20 bitů
max 1MB (viz ještě bit G)
00 - bity 52 a 53 musí být 0 - zachování kompatibility.
D - bit 54 : 0 v segmentu se adresuje 16 bitově
1 v segmentu se adresuje 32 bitově
Důležité ! Viz Prostředí 16/32
G - bit 55 : 0 - délka segmentu je v bytech (max 1 MB)
1 - délka segmentu je v 4096bytech (stránky, max 4 GB)
nastavením G na 1 a všech ll a LL na 1 lze získat deskriptor
pro adresaci celého paměťového prostoru.
b - bity 56 .. 63 : horní BYTE báze. U 386 a 486 může být báze až 4 GB.
4. Systémový deskriptor - brány
63 48 47 46 45 43 39 36 32 31 16 15 0
┌──────────────────┬─┬─────┬─┬────┬───┬─────┬────────────┬────────────┐
│ oooooooooooooooo │1│ DPL │0│TYPE│000│ CNT │ OOOOOOOOOO │ SSSSSSSSSS │
└──────────────────┴─┴─────┴─┴────┴───┴─────┴────────────┴────────────┘
S - bity 0 .. 15 Selektor segmentu (podle typu)
O - bity 16 .. 31 Offset uvnitř segmnetu (286 jen 16)
CNT bity 32 .. 36 Počet WORDů / DWORDů ke zkopírování mezi zásobníky
000 bity 37 .. 39 Musí být 0 pro zachování kompatibility.
TYPE bity 40 .. 43 typ systémového deskriptoru - viz tabulku níže
0 bit 44 systémový deskriptor
DPL bity 45 a 46 Descriptor Privileg Level. Viz kapitolu DPL
1 bit 47 Přítomný deskriptor
──────────────────────────────────────────────────────────────────────────
Jen 386 a 486
o bity 48 .. 63 Vyšší WORD offsetu pro selektor.
5. Systémové deskriptory ostatní (LDT, TSS )
63 56 55 52 51 48 47 44 40 39 16 15 0
┌─────┬─┬───┬─────┬─┬─────┬─┬──────┬─────────────────┬────────────┐
│ bbb │G│000│ lll │1│ DPL │0│ TYPE │ BBBBBBBBBBBBBBB │ LLLLLLLLLL │
└─────┴─┴───┴─────┴─┴─────┴─┴──────┴─────────────────┴────────────┘
L - bity 0 .. 15 : Limit segmentu. Na 286 max. 65536, 386 a 486 viz. l
B - bity 16 .. 39 : Báze segmentu. Na 286 max. 16MB, 386 a 486 viz b
TYPE bity 40 .. 43 : viz tabulku níže
0 - bit 44 Zde signalizuje systémový deskriptor
DPL bity 45 a 46 : Descriptor Privileg level. Viz zvláštní kapitola DPL
1 - bit 47 Zde znamená přítomnost segmentu
──────────────────────────────────────────────────────────────────────────
Jen 386 a 486
l - bity 48 .. 51 : horní 4 bity pro limit. Limit u 386 má 20 bitů
max 1MB (viz ještě bit G)
000 - bity 52 .. 54 musí být 0 - zachování kompatibility.
G - bit 55 : 0 - délka segmentu je v bytech (max 1 MB)
1 - délka segmentu je v 4096bytech (stránky, max 4 GB)
b - bity 56 .. 63 : horní BYTE báze. U 386 a 486 může být báze až 4 GB.
┌──────────────┬─────────────────────────────────────────────────┬───────┐
│ TYPE │ Význam │ CNT │
╞════╤═════════╪═════════════════════════════════════════════════╪═══════╡
│ 00 │ 0 0 0 0 │ Zakázaný typ - použití vyvolá INT 0D │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 01 │ 0 0 0 1 │ TSS procesoru 286 ( 386 umí zpracovat) │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 02 │ 0 0 1 0 │ Deskriptor LDT │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 03 │ 0 0 1 1 │ Aktivní TSS procesoru 286 ( 386 umí ) │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 04 │ 0 1 0 0 │ Brána volání podprogramu 286 ( 386 umí ) │ WORD │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 05 │ 0 1 0 1 │ Brána volání tásku TSS │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 06 │ 0 1 1 0 │ Brána volání obslužné rutiny přerušení 286 IF=0 │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 07 │ 0 1 1 1 │ Brána volání obslužné rutiny přerušení 286 IF=1 │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 08 │ 1 0 0 0 │ Zakázaný typ │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 09 │ 1 0 0 1 │ TSS procesoru 386 │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 0A │ 1 0 1 0 │ Rezervováno │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 0B │ 1 0 1 1 │ Aktivní TSS procesoru 386 │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 0C │ 1 1 0 0 │ Brána volání podprogramu 386 │ DWORD │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 0D │ 1 1 0 1 │ Rezervováno │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 0E │ 1 1 1 0 │ Brána volání obslužné rutiny přerušení 386 IF=0 │ XXX │
├────┼─────────┼─────────────────────────────────────────────────┼───────┤
│ 0F │ 1 1 1 1 │ Brána volání obslužné rutiny přerušení 386 IF=1 │ XXX │
└────┴─────────┴─────────────────────────────────────────────────┴───────┘
Pozn. : Co dokáže 286, dokáže i 386 a 486. Jen u obslužných rutin přerušení
není obvyklé používat na 386 286-kovou bránu, nezjistí se mnoho
důležitých informací. (EFLAGS)
Typy 0E, 0F, 06 a 07 by měly být jen v IDT.
Selektor CPL DPL EPL RPL IOPL Systém ochrany TSS
Zpracování přerušení
DPL - Descriptor Privileg level
Tato hodnota je uložena v každém Deskriptoru . Je velká 2 bity a její pozice
je vždy 45 a 46 bit.
Podle DPL se chová Systém ochrany : pokud testy vyjdou, je vše OK,
jinak vyvolá INT 0D .
Obecné zásady :
Hodnota DPL je pevně daná v Deskriptoru . Nemůže (neměla by) být měněna
uživatelským programem s CPL =3. Poměrně vysokou prioritou by měly být chráněny
systémové tabulky (GDT, IDT, LDT a TSS), aby je program (chtěně nebo nechtěně)
nemohl zlikvidovat.
Chybu vyvolá :
■ Pokus o naplnění Selektoru SS Deskriptore m , jehož DPL <> CPL
■ Pokus o naplnění Selektoru DS, ES, FS a GS Deskriptore m ,
jehož DPL < CPL ( tedy je jíce privilegovaný než program ).
■ Pokus o vyvolání přerušení, jehož brána má v IDT DPL < CPL
■ Pokus o skok (call) do segmentu, jehož Deskriptor má DPL <> CPL
běžícího programu. (předpokládá se, že deskriptor NEMÁ nastaven bit C )
■ Pokus o skok (call) do segmentu, jehož Deskriptor má DPL > CPL
běžícího programu. (předpokládá se, že deskriptor MÁ nastaven bit C )
( je to tedy obráceně než u DPL datového segmentu )
RPL CPL IOPL EPL Systém ochrany Deskriptor Selektor
CPL - Current Privileg Level
CPL je hodnota, jež poskytuje informace o oprávněnosti právě běžícího programu.
Je uložena v Selektoru CS (nejnižší 2 bity) a NESMÍ být přímo měněna.
Její hodnota se MUSÍ shodovat s DPL a RPL SS.
Hodnotu CPL kontroluje procesor při každé instrukci JMP far a CALL far,
NESMÍ během nich dojít ke změně její hodnoty.
Při provádění instrukcí RETF [n] se může změnit CPL na nižší privilegovanost
(numericky vyšší CPL), ale musí se změnit i stack na správnou úroveň DPL .
Podle typu Deskriptoru CS platí :
■ CPL= DPL deskriptoru CS, pokud bit C je nastaven na 0.
■ CPL>= DPL deskriptoru CS, pokud bit C je nastaven na 1.
V případě porušení těchto zásad dojde k vyvolání INT 0D .
Podle hodnoty CPL se řídí oprávněnost I/O operací ( porovnává se s IOPL ).
RPL DPL IOPL EPL Systém ochrany Deskriptor Selektor
Requested Privileg Level
Tato hodnota je uložena v Selektoru datových segmentů. Její velikost se
může měnit podle následujících zásad :
Stack segment :
■ DPL = RPL SS = CPL . RPL SS NELZE měnit, musí zůstat zachována.
Ostatní (DS, ES, FS a GS)
■ DPL >= RPL >= CPL V rámci tohoto intervalu je možno měnit RPL podle
libosti. Nejlépe se na to hodí instrukce ARPL.
RPL byla zavedena, aby pomohla zpracovávat OS data od méně privilegovaných
programů. Ty OS předají odkaz na data v jejich datových segmentech. OS
může tyto datové segmenty přímo využít a to dokonce i v případě, že
by uživatelský program neněl právo přístupu k nim. OS tedy jednoduše nastaví
RPL svých datových segmentů na hodnotu CPL volajícího programu a má tak
zajištěno, že bude zpracovávat jen data uživatelskému programu přístupná.
Pokud by tomu tak nebylo, vyvolá se INT 0D a OS může zjistit, že
uživatelský program podvádí. V případě, že OS nechá RPL přístupu k datům
na své CPL může ve prospěch meprivilegovaného programu změnit data a
třeba pomoci uživatelskému programu k vyšší prioritě.
Pokud jste ten výklad nepochopil, nic se nedějě. Váš program stejně dostane
CPL = 3 a DPL =3, takže RPL může být jen 3 a o ARPL si můžete jen nechat
zdát.
CPL DPL IOPL EPL Systém ochrany Deskriptor Selektor
Effective Privileg Level
Tato hodnota je používána pro vyhodnocování přístupu k datovému Deskriptoru .
Není nikde uložena a je definováná jako numericky větší z čísel RPL a CPL .
Procesor porovnává DPL Deskriptoru s EPL a pokud DPL >= EPL, přístup povolí.
Je zaváděna literaturou pro zrychlení výkladu.
CPL DPL IOPL RPL Systém ochrany Deskriptor Selektor
Input Output Privileg Level
Jedná se o hodnotu uloženou ve (E)FLAGS (bity 14 a 13). Používá se
v PROTECTED MÓDu a V86 MÓDu .
Protected mód
IOPL se srovnává s CPL programu. Pokud je CPL >IOPL jsou zakázány
následující operace :
■ Instrukce CLI
■ Instrukce STI
Pokud IOPL >= CPL , pak je POVOLENO jakokoliv
■ IN ( INSB, INSW, INSD )
■ OUT ( OUTSB, OUTSW, OUTSD )
Pokud CPL > IOPL , pak nejsou I/O operace povoleny jako celek a
o oprávněnosti konkrétní operace rozhoduje až neformátovaná část TSS .
V86 mód
V86 pracuje vždy s CPL = 3. Význam IOPL se poněkud změnil :
Pokud IOPL<>3, pak programy nesmí :
■ CLI - Správce musí emulovat
■ STI - Správce musí emulovat
■ INT [n], INT 3, INTO - Správce musí emulovat - viz Zpracování přerušení
■ IRET - Správce musí emulovat
■ Měnit IOPL, IF a [ VM ] (to ale s IOPL nesouvisí, jen pro úplnost )
Instrukce Pushf maskují VM na 0
Popf IOPL, VM nemění .
Pokud IOPL=3, pak se může také
■ CLI
■ STI
■ INT [n], INT 3, INTO - Správce musí 'pomoci' - viz Zpracování přerušení
■ IRET - Správce musí 'pomoci'
■ Měnit IF
Pozn.: Pro VM nebývá IOPL = 3.
Poznamenejme jen, že instrukce IN a OUT (+ mutace) jsou zakázány i V86
programům, pokud je v TSS označen požadovaný port 1 (zakázaný).
Pozn.: IOPL může měnit jen program s CPL = 0. Buď přímo Popf nebo IRET.
CPL DPL EPL RPL Systém ochrany Deskriptor Selektor
REAL MÓD
Tento mód má 8086,80286.. procesor nastaven po svém zapnutí nebo resetu.
Probíhá v něm :
■ REÁLNÝ systém Adresace ,
■ REÁLNÝ systém Zpracování přerušení ,
■ REÁLNÝ systém přístupu k I/O (bez omezení),
■ CPL pro REAL MÓD je 0 (286 +)
■ IOPL je 0 (286 +)
■ Ze všech registrů lze číst i zapisovat ( I CS !!! )
■ Nic nebrání použít Privilegované instrukce (286 +)
REAL mód se nedestruktivně pozná (buď XT - real vždy nebo 286) :
Smsw ax
Shr ax,1
JNC REAL
Jc nereal
PROTECTED MÓD Procesory V86 MÓD
V86 MÓD
Nastavení V86 se provádí z PROTECTED MÓDu většinou přepnutím TSS .
Není to až zas tak jednoduchá činnost. V86 lze provozovat jen na 386 a 486.
Pro V86 je specifický :
■ REÁLNÝ systém Adresace ,
■ V86 systém Zpracování přerušení ,
■ V86 systém přístupu k I/O - viz TSS ,
■ CPL pro V86 MÓD je 3
■ IOPL je volitelné, často 0
■ Ze všech registrů lze číst i zapisovat ( I CS !!! )
■ Použití Privilegované instrukce vyvolá buď INT 0D nebo INT 06
■ Oproti REAL MÓDu neplatí rovnost Lineární adresa = Fyzická adresa
Viz Stránkování
PROTECTED MÓD Ochrana V86 Procesory REAL MÓD
EMS
EMS označuje Expanded memory standard. Pracuje podobně jako XMS , ale
používá pevně určenou cílovou oblast přenosu - Page Frame.
Verze EMS 4.0 je standard od října 1987, takže při použití nových funkcí
by neměly být žádné problémy s kompatibilitou.
Pro přístup k funkci EMM nastavte AX na číslo funkce a ostatní registry
zaplňte tak, jak to funkce požaduje a poté volejte INT 67H. Při návratu
kontrolujte status návratu v AH. Pokud AH není 0, k žádné akci nedošlo.
Standardní funkce EMM
AX Popis
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
4000H Dej status EMM
4100H Dej segment adresy rámce
4200H Dej velikost paměti celková/k dispozici
4300H Otevři handle/alokuj stránky
4400H Zmapuj paměť (přesuň stránky EMS z/do paměti)
4500H Uzavři handle/uvolni stránky
4600H Dej číslo verze EMM
Rozšířené funkce EMM
AX Popis
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
4700H Ulož kontext mapování
4800H Obnov kontext mapování
4B00H Počítadlo stránek handlů
4C00H Počítadlo aktivních handlů
4D00H Dej informace o stránce (všechny handly)
4E--H Dej/Nastav celkovou mapu stránky
4E00H Dej všechny mapující řegistry do pole na ES:DI
4E01H Nastav všechny mapující řegistry z pole na DS:SI
4E02H Dej a nastav mapující registry (kombinace subfunkcí 0 a 1)
4E03H Dotaz na velikost bufferu potřebného pro subfunkce 0-2
4F--H Dej/Nastav částečnou mapu stránky (EMS 4.0)
4F00H Dej mapující registry
4F01H Obnov mapování
4F02H Dotaz na velikost bufferu potřebného pro subfunkci 0
5000H Mapuj/Demapuj více stránek (EMS 4.0)
5100H Realokace (změna velikosti) handlu EMS (EMS 4.0)
52--H Dej/Nastav atributy handlu (EMS 4.0)
5200H Dej atributy handlu
5201H Nastav atributy handlu
5202H Dotaz na atribut možností
53--H Dej/Nastav jméno handlu (EMS 4.0)
5300H Dej jméno handlu
5301H Nastav jméno handlu
54--H Najdi pojmenovaný handle (EMS 4.0)
5400H Dej adresář handlu
5401H Prohledávej pro pojmenovaný handle
5402H Počítadlo všech otevřených handlů
5500H Změň mapu stránky a skoč (EMS 4.0)
5600H Změň mapu stránky a volej (EMS 4.0)
57--H Přesuň/Vyměň paměť (EMS 4.0)
5700H Přesuň oblast paměťi
5701H Vyměň oblast paměťi
58--H Dej mapovatelné pole fyzických adres (EMS 4.0)
5800H Dej pole map segment-ku-stránce
5801H Počítadlo položek map segment-ku-stránce
Systémové funkce EMM
AX Popis
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
59--H Dej konfiguraci hardware (EMS 4.0)
5900H Dej informaci o hardware
5901H Dej pošítadlo nealokovaných 'surových' stránek
5A--H Alokuj standardní/surové stránky (EMS 4.0)
5A00H Alokuj standardní 16K bytové logické stránky
5A01H Alokuj surové stránky
5B--H Alternuj sadu mapových registrů (EMS 4.0)
5B00H Dej alternativní sadu mapových registrů
5B01H Nastav alternativní sadu mapových registrů
5B02H Dej velikost pole alternativní sady mapových registrů
5B03H Alokuj alternativní sadu mapových registrů
5B04H Dealokuj alternativní sadu mapových registrů
5B05H Alokuj sadu registrů DMA
5B06H Povol DMA na alternativní sadě mapových registrů
5B07H Zakaž DMA na alternativní sadě mapových registrů
5B08H Dealokuj sadu registrů DMA
5C00H Připrav na teplý start systému (EMS 4.0)
5D--H Povol/Zakaž funkci OS Set Functions (EMS 4.0)
5D00H Povol všechny funkce EMM typu OS-only
5D01H Zakaž všechny funkce EMM typu OS-only
5D02H Vrať přístupový klíč (umožni dalšímu volajícímu dostat klíč)
VCPI - Virtual Control Program Interface
AX Popis
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
DE00H Test instalace
DE01H Dej rozhraní VCPI
DE02H Dej maximální adresu fyzické paměti
DE03H Dej počet volných 4KB stránek
DE04H Alokuj 4KB stránky
DE05H Uvolni 4KB stránky
DE06H Dej fyzickou adresu stránky v prvním MB
DE07H Čti CRO
DE08H Čti registry pro odladění
DE09H Nastav registry pro odladění
DE0AH Dej mapování vektoru přerušení 8259
DE0BH Nastav mapování vektoru přerušení 8259
DE0CH Přepni do PROTECTED MÓDu
Standardní funkce EMM Rozšířené funkce EMM
Systémové funkce EMM Detekce EMS
VCPI DPMI XMS Mapa paměti BIOS INT 15
Standardní funkce EMM
Tyto funkce EMM (INT 67H) tvoří jádro použitelné v obvyklých
aplikacích. Viz také Rozšířené funkce EMM a Systémové funkce EMM .
AX Popis
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
4000H Dej status EMM
4100H Dej segment adresy rámce
4200H Dej velikost paměti: celková/k dispozici
4300H Otevři handle/alokuj stránky
4400H Zmapuj paměť
4500H Uzavři handle/uvolni stránky
4600H Dej číslo verze EMM
Funkce 57--H (Přesuň/Vyměň paměť verze EMS 4.0) je v aplikacích obvykle
také používána. Podrobnosti o této funkci viz Rozšířené funkce EMM .
AH=40H Dej status EMM. Použijte po instalaci přihlášení EMM. Viz EMS.
▄▄▄▄▄▄ Výstup: AH= Status EMM (0=vše OK)
AH=41H Dej fyzický segment adresy rámce EMS (64KB ve čtyřech 16 KB
▄▄▄▄▄▄ jednotkách).
Výstup: BX=segment adresy (pokud AH vrací 0)
AH= Status EMM
Často v bloku UMB
AH=42H Dej velikost celkové paměti/paměti k dispozici
▄▄▄▄▄▄ Výstup: DX=celkový počet stránek EMS v systému (16KB každá)
BX=počet stránek EMS aktuálně k dispozici
AH= Status EMM
AH=43H Otevři handle EMM a alokuj paměť
▄▄▄▄▄▄ Požaduje: BX=počet požadovaných stránek
Výstup: DX=handle (používáno při dalších operacích)
AH= Status EMM
AH=44H Mapuj paměť. Mapuje stránky 1 až 4 do oblasti fyzických adres.
▄▄▄▄▄▄ Požaduje: AL=fyzické číslo stránky (0 až 3)
BX=logická stránka (0 až [n-1], kde n je počet stránek,
alokovaných k handlu. U verze EMS 4.0 hodnota
0FFFFH demapuje příslušnou fyzickou stránku, takže
z ní nikdo nemůže číst ani do ní psát. Pro
zpřístupnění stránky použijte tuto funkci znovu s
korektním číslem logické stránky).
DX=handle EMM
Výstup: AH= Status EMM
AH=45H Uzavři handle EMM. Uvolní paměť alokovanou k handlu pomocí
▄▄▄▄▄▄ EMM Fn 43H.
Požaduje: DX=handle EMM
Výstup: AH= Status EMM
AH=46H Dej číslo verze EMM.
▄▄▄▄▄▄ Výstup: AL=číslo verze EMM v BCD (AL=32H je verze EMM 3.2)
AH= Status EMM
Viz též: Rozšířené funkce EMM Systémové funkce EMM
Status EMM Detekce EMS
Rozšířené funkce EMM
Tyto funkce EMS (INT 67H) jsou použity v aplikacích, které potřebují:
■ běžet jako TSR a musí uložit/vyvolat status EMM
■ použít 'pojmenované' handly EMM pro komunikaci mezi procesy
■ spouštět kód v expandované paměti (EMS)
■ přesouvat bloky dat
Viz také Standardní funkce EMM a Systémové funkce EMM .
AX Popis
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
4700H Ulož kontext mapování
4800H Obnov kontext mapování
4B00H Počítadlo stránek handlů
4C00H Počítadlo aktivních handlů
4D00H Dej informace o stránkách přidělených všem handlům
4E--H Dej/Nastav celkovou mapu stránky
4F--H Dej/Nastav částečnou mapu stránky EMS 4.0
5000H Mapuj/Demapuj více stránek EMS 4.0
5100H Realokuj (změň velikost paměti) handle EMS EMS 4.0
52--H Dej/Nastav atributy handlu EMS 4.0
53--H Dej/Nastav jméno handlu EMS 4.0
54--H Najdi pojmenovaný handle EMS 4.0
5500H Změň mapu stránky a skoč EMS 4.0
5600H Změň mapu stránky a volej EMS 4.0
57--H Přesuň/Vyměň paměťový blok EMS 4.0
58--H Dej pole mapovatelných fyzických adres EMS 4.0
──────────────────────────────────────────────────────────────────────────
AH=47H Ulož kontext mapování. EMM uloží aktuální stav mapování stránek
▄▄▄▄▄▄ EMS, takže TSR program nebo řídící program zařízení může
vložit svůj vlastní blok paměti do oblasti přerušeného programu.
Funkce EMM Fn 48H obnovuje původní mapování.
Požaduje: DX=handle EMM vyžadujícího procesu
Výstup: AH= Status EMM
AH=48H Obnov kontext mapování. EMM obnoví stav mapování stránek tak,
▄▄▄▄▄▄ jak byl uložen při předchozím volání EMM Fn 47H se stejným
handlem. Funkce by měla být použita řídícím programem zařízení
a TSR před výstupem do aplikace.
Požaduje: DX=handle EMM vyžadujícího procesu
Výstup: AH= Status EMM
AH=4BH Počítadlo stránek handlů. Vrátí počet stránek EMS, které má
▄▄▄▄▄▄ handle přiděleny.
Požaduje: DX=handle EMM (proces může mít více než jeden)
Výstup: BX=počet logických 16KB stránek, které handle má (1-255)
AH= Status EMM
AH=4CH Počítadlo aktivních handlů. (Užitečné před aktivací EMM Fn 4DH)
▄▄▄▄▄▄ Výstup: BX=počet aktivních handlů
AH= Status EMM
AH=4DH Dej informace o stránkách přidělených všem handlům. Vrátí pole
▄▄▄▄▄▄ informací popisujících kolik paměti EMS je alokováno všem aktivním
handlům.
Požaduje: ES:DI=>adresa bufferu
Výstup: BX=počet aktivních handlů EMM
ES:DI=>buffer naplněný BX položkami délky
dword. První WORD je číslo handlu, druhý je
celkový počet stránek, které tento handle vlastní.
AH= Status EMM
AH=4EH Dej/Nastav celkovou mapu stránky. Tato funkce je vytvořena pro
▄▄▄▄▄▄ podporu víceúlohových operačních systémů pro dokonalejší řízení
EMS. Mapující pole může obsahovat řadu informací závislých na
hardware.
Požaduje: AL=číslo subfunkce
AL=0 Dej všechny mapující registry do pole na ES:DI
AL=1 Nastav všechny mapující registry z pole na DS:SI
AL=2 Dej a nastav mapující registry
(kombinace subfunkcí 0 a 1)
AL=3 Dotaz na velikost bufferu potřebného pro
subfunkce 0-2
DS:SI=>pole nesoucí informace (subfunkce 1 nebo 2)
ES:DI=>pole pro uložení informace (subfunkce 0 nebo 2)
Výstup: AL=velikost bufferu mapujících registrů (subfunkce 3)
ES:DI=>buffer naplněný mapujícím polem EMS (subfn 0 a 2)
AH= Status EMM
AH=4FH Dej/Nastav částečnou mapu stránky (EMS 4.0). Pracuje jako
▄▄▄▄▄▄ EMS Fn 4EH , ale dává možnost uchovat mapující obsah pro
vybrané stránky, ne pro všechny (tedy šetří paměť a čas).
Požaduje: AL=číslo subfunkce
AL=0 Dej částečnou mapu stránky.
DS:SI=>struktura obsahující seznam segmentů,
jejichž kontexty mapování mají být uloženy
ES:DI=>pole pro mapu stránky
AL=1 Nastav částečnou mapu stránky
DS:SI=>struktura obsahující uloženou částečnou
mapu stránky
AL=2 Dej velikost částečné mapy stránky
BX=počet mapovatelných segmentů v částečné mapě
stránky, které mají být uloženy
Výstup: AH= Status EMM
AL=velikost částečné mapy stránky pro subfunkci 2
AH=50H Mapuj/Demapuj více stránek (EMS 4.0). Dovolí vám demapovat
▄▄▄▄▄▄ (učinit nepřístupnými) více stránek najednou.
Požaduje: DX=handle EMS, získaný z EMS Fn 43H
CX=počítadlo 4-bytových prvků v poli na DS:SI
AL=číslo subfunkce
AL=0 Mapuj/Demapuj stránky použitím čísel stránek
DS:SI=>pole dvouslovných prvků (dword). V každém
prvku je první slovo číslo logické stránky, druhé
je fyzické číslo stránky. Logické číslo stránky
0FFFFH demapuje odpovídající fyzickou stránku.
AL=1 Stejně jako subfunkce 0, ale druhé slovo každého
prvku je segment adresy (musí být pro mapovatelný
segment).
Výstup: AH= Status EMM
AH=51H Realokuj (změň) handle EMS (EMS 4.0). Dovoluje vám získat
▄▄▄▄▄▄ další EMS paměť, nebo ji všechnu nebo část uvolnit.
Požaduje: DX=handle EMS, získaný EMS Fn 43H
BX=požadovaná nová velikost v logických stránkách
(po 16KB každá)
Výstup: AH= status EMM
AH=52H Dej/Nastav atributy handlu (EMS 4.0). Aktuálně vám dovoluje
▄▄▄▄▄▄ označit některé stránky jako trvalé, v naději, že EMS bude
schopna zachovat obsah této části paměti při teplém startu. ( Ale
já na pohádky nevěřím ).
Požaduje: AL=číslo subfunkce
AL=0 Dej atribut handlu
DX=handle EMS, získaný EMS Fn 43H
AL=1 Nastav atribut handlu
DX=handle EMS, získaný EMS Fn 43H
BL=nový atribut
AL=2 Dotaz na atribut možností
(vrací AL=0, pokud není možné stránky označit
jako trvalé)
Výstup: AL=atribut (pro subfunkci 0)
0 znamená, že deska EMS nepodporuje trvalé atributy
(všechna data při restartu jsou ztracena).
1 znamená, že označení 'trvalé' je OK.
(Platí pro paměť alokovanou požadovaným handlem.)
AL=atribut možností (pro subfunkci 2)
0 znamená, že jsou podporovány pouze dočasné handly.
1 znamená, že jsou podporovány jak dočasné, tak
trvalé handly.
AH= Status EMM
AH=53H Dej/Nastav jméno handlu (EMS 4.0). Dovoluje aplikacím
▄▄▄▄▄▄ spolupráci, sdílet stránky EMS, tak dlouho, dokud každá z aplikací
zná 8-znakové jméno handlu.
Požaduje: DX=handle EMS, získaný EMS Fn 43H
AL=číslo subfunkce
AL=0 Dej jméno handlu
ES:DI=>8-bytový buffer pro jméno
AL=1 Nastav jméno handlu
DS:SI=>8-bytové pole obsahující jméno
Výstup: AH= Status EMM
AH=54H Najdi pojmenovaný handle (EMS 4.0). Dovoluje aplikacím
▄▄▄▄▄▄ spolupráci, sdílet stránky EMS, tak dlouho, dokud každá z aplikací
zná 8-znakové jméno handlu.
Požaduje: AL=číslo subfunkce
AL=0 Dej adresář handlu
ES:DI=>buffer pro pole 10-bytových prvků. První
slovo každého prvku bude handle EMS a dalších
8 bytů bude jméno handlu.
AL=1 Hledej pojmenovaný handle
ES:DI=>8-bytové pole pro hledané jméno
AL=2 Počítadlo všech otevřených handlů
Výstup: (AL=0) buffer ES:DI bude obsahovat data; AL=počítadlo
položek.
(AL=1) DX bude obsahovat handle (pouze pokud AH=0)
(AL=2) BX bude obsahovat počítadlo handlů. Velikost
bufferu (AL=0) je BX*10.
AH= Status EMM
AH=55H Změň mapu stránky a skoč (EMS 4.0). Dovoluje vám přehodit
▄▄▄▄▄▄ některé stránky spustitelného kódu v paměti, potom tento kód
spustit pomocí FAR JUMP.
Požaduje: DX=handle EMS, získaný EMS Fn 43H
AL=číslo subfunkce
AL=0 Použij čísla stránek v poli fyzických stránek
DS:SI=>9-bytová struktura 'mapuj-a-skoč'. První
4 byty jsou offset a segment skoku. Daslší byte
je počítadlo mapujících prvků. Poslední 4 byty
je FAR adresa pole 4-bytových prvků mapující
informace: v tomto poli obsahuje první slovo
každého prvku číslo logické stránky a druhé slovo
obsahuje fyzické číslo stránky.
AL=1 Stejné jako u subfunkce 0, ale v poli informací
o mapování použijte hodnoty segmentu (namísto
čísla fyzických stránek).
Výstup: AH= Status EMM (0 znamená, že řízení bylo předáno)
AH=56H Změň mapu stránky a volej (EMS 4.0). Dovoluje vám přehodit
▄▄▄▄▄▄ některé stránky spustitelného kódu v paměti, potom tento kód
spustit pomocí FAR CALL. Specifikujete též, které mapování
se má při návratu vyvolat.
Požaduje: AL=číslo subfunkce
AL=0 Použij čísla stránek v poli fyzických stránek
DX=handle EMS, získaný EMS Fn 43H
DS:SI=>22-bytová struktura 'mapuj-a-volej'.
Prvních 9 bytů je popsáno v EMS Fn 55H.
Jsou následovány dalším bytem délky a adresou
dalšího pole mapování 'logické-na-fyzické'.
Toto pole vyplňte mapováním, které chcete mít
při návratu z volání. Konečně struktura obsahuje
prostor 8 rezervovaných bytů.
AL=1 Stejné jako u subfunkce 0, ale v obou polích
informací o mapování použijte hodnoty segmentu
(namísto čísla fyzických stránek).
AL=2 Dej požadavky na zásobník pro tuto funkci.
Výstup: (AL=2) BX=prostor v zásobníku vyžadovaný subfunkcí 0
nebo 1. Použijte pro nastavení svého
zásobníku při návratu.
AH= Status EMM (Bylo-li volání úspěšné, je volána
cílová adresa. Pro návrat a vyvolání
kontextu mapování použijte RETF.)
AH=57H Přesuň/Vyměň paměťový blok (EMS 4.0). Použijte pro přesun
▄▄▄▄▄▄ bloků paměti do, z, nebo uvnitř paměti EMS nebo konvenční paměti.
Při přesunech je povoleno přetečení nebo přepsání; jsou povoleny
bloky velikosti až 1MB.
Požaduje: AL=číslo subfunkce
AL=0 Přesuň oblast paměti
DS:SI=>18-bytová struktura info-o-pohybu
AL=1 Vyměň oblasti paměti
DS:SI=>18-bytová struktura 'info-o-pohybu'
Výstup: AH= Status EMM (poznámka: 92H NENÍ chyba).
AH=58H Dej pole mapovatelných fyzických adres (EMS 4.0). Vrátí
▄▄▄▄▄▄ vzájemné odkazy mezi čísly všech stránek EMS a segmenty, na
kterých jsou fyzicky umístěny.
Požaduje: AL=číslo subfunkce
AL=0 Dej pole mapovatelných fyzických adres
ES:DI=>buffer na pole 4-bytových prvků. První
slovo každého prvku bude hodnota segmentu a
další slovo bude číslo fyzické stránky EMS.
AL=1 Dej počet položek pole mapovatelných fyzických
adres
Výstup: CX=počet prvků v poli 'segment-strana'. Velikost
bufferu potřebného v subfunkci 0 je CX*4.
AH= Status EMM
Viz též: Standardní funkce EMM EMM funkce OS
6Status EMM
Po návratu z přerušení obsluhy expandované paměti - INT 67H - obsahuje
registr AH vždy status nebo kód chyby. Jestliže status není 0, požadavek
nebyl vykonán a jakákoliv hodnota registrů (mimo AH) je nevýznamná.
Zde je uveden seznam známých chybových a stavových kódů EMM:
Status Význam
▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 bez chyby; funkce byla úspěšná; vrácené parametry jsou OK
80H interní chyba EMM
81H chyba funkce hardware EMS
82H EMM obsazen
83H nesprávný handle
84H nedefinovaný funkční požadavek
85H žádné další handle nejsou k dispozici
86H chyba při ukládání nebo obnovování kontextu mapování
87H požadavek na alokaci je větší než celková paměť EMS
88H požadavek na alokaci je větší než počet volných stránek
89H nelze otevřít handle s počtem stránek 0
8AH handle nevlastní tolik stránek
8BH nekorektní mapování - jsou definovány jen fyzické stránky 0-3
8CH oblast ukládání kontextu mapování je plná
8DH lze uložit jen jediný kontext mapování pro každý handle
8EH nelze obnovit kontext mapování bez předchozího uložení
8FH parametr subfunkce v Al není definován (EMS 4.0)
90H typ atributu není defiován
91H nejednoznačnost není podporována
92H zdrojová a cílová oblast se v EMS RAM překrývají
Jen varování, nikoli chyba !
93H cílová oblast v handlu je příliš malá
94H konvenční paměť překrývá oblast EMS RAM
95H offset pro přenos bloku je příliš veliký
96H blok je příliš velký, tj. > 1MB
97H zdrojová a cílová oblast jsou ve stejném handlu a překrývají se
98H typ cílové nebo cílové paměti je nekorektní (offset 4 v balíku)
9AH alternativní sada registrů mapování není podporována
9BH všechny alternativní registry mapování/DMA jsou obsazeny
9CH alternativní registry mapování/DMA nejsou podporovány
9DH specifikované registry mapování/DMA jsou nekorektní nebo používány
9EH přidělený DMA kanál není podporován
9FH specifikovaný DMA kanál není podporován
A0H žádný handle nemá specifikované jméno
A1H specifikované jméno již existuje
A2H zdrojový offset + délka oblasti > 1MB (pokus o zacyklení)
A3H obsah specifikovaného balíku dat je poškozen nebo nekorektní
A4H přístup k této funkci je zakázán nebo špatný přístupový klíč
Viz též: EMS
Systémové funkce EMM
Tyto funkce EMS (INT 67H) jsou používané pouze operačními systémy a
softwarem pro řízení prostředí (např. Windows). Nejsou určeny pro použití
ve standardních programových aplikacích. Viz také Standardní funkce EMM ,
Rozšířené funkce EMM a VCPI .
AX Popis
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
59--H Dej konfiguraci hardware EMS 4.0
5A--H Alokuj standardní/'surové' stránky EMS 4.0
5B--H Alternuj sadu mapových registrů EMS 4.0
5C00H Připrav na teplý start systému EMS 4.0
5D--H Povol/Zakaž funkci OS Set Fn EMS 4.0
60--H Dej pole fyzického okna EEMS
68--H Dej adresy všech rámců stránek v systému EEMS
69--H Mapuj stránku do rámce EEMS
6A--H Mapování stránky EEMS
──────────────────────────────────────────────────────────────────────────
AH=59H Dej konfiguraci hardware (EMS 4.0). Vrací strukturu informace
▄▄▄▄▄▄ o hardware, která pro aplikace nemá žádný význam a neměla by
v nich být používána. Je pouze pro potřeby operačního systému.
Požaduje: AL=číslo subfunkce
AL=0 Dej informaci o hardware
ES:DI=>buffer pro příjem dat (nedokumentováno)
AL=1 Dej počet nealokovaných 'surových' stránek.
Výstup: (AL=0) naplněný buffer na ES:DI
(AL=1) BX=nealokované 'surové' stránky
??možná DX?? CX=celkový počet 'surových' stránek
AH= Status EMM
AH=5AH Alokuj standardní/'surové' stránky (EMS 4.0). Používáno
▄▄▄▄▄▄ operačním systémem pro podporu chytrých schémat určení velikosti
stránek s proměnnou délkou.
Požaduje: AL=číslo subfunkce
AL=0 Alokuj standardní 16KB logické stránky
BX=žádaný počet 16KB stránek
AL=1 Alokuj 'surové' stránky
BX=žádaný počet 'surových' stránek
Výstup: DX=handle EMS (pro AL=0)
DX=speciální handle 'surových' stránek (pro AL=1)
AH= Status EMM
AH=5BH Alternuj sadu mapových registrů (EMS 4.0). Používáno operačním
▄▄▄▄▄▄ sytémem pro podporu nízkoúrovňových funkcí jako je provádění
změn (tampering) v DMA.
Požaduje: AL=číslo subfunkce
AL=0 Dej alternující sadu mapujících registrů
AL=1 Nastav alternující sadu mapujících registrů
BL=číslo nové alternující sady mapujících
registrů
ES:DI=>buffer pro příjem dat (je-li BL=0)
AL=2 Dej velikost pole alternující sady mapujících
registrů
AL=3 Alokuj alternující sadu mapujících registrů
AL=4 Dealokuj alternující sadu mapujících registrů
BL=číslo nové alternující sady mapujících
registrů
AL=5 Alokuj sadu registrů DMA
AL=6 Povol DMA na alternující sadě mapujících
registrů
BL=číslo sady registrů DMA
DL=číslo kanálu DMA
ES:DI=>buffer pro příjem dat
AL=7 Zakaž DMA na alternující sadě mapujících
registrů
BL=číslo nové alternující sady mapujících
registrů DMA
AL=8 Dealokuj sadu registrů DMA
BL=číslo sady registrů DMA
Výstup: (AL=0) BL=aktuální aktivní alternující sada mapujících
registrů (jestliže BL nebylo 0)
ES:DI=>prostor pro uložení kontextu mapujících
registrů (je-li BL=0)
(AL=2) DX=velikost pole
(AL=3) BL=číslo alternující sady mapujících registrů
(BL=0 v případě, že funkce není podporována)
(AL=5) BL=číslo sady registrů DMA
(BL=0 v případě, že funkce není podporována)
AH= Status EMM
AH=5CH Připrav na teplý start systému (EMS 4.0). Používáno operačním
▄▄▄▄▄▄ systémem pro varování EMM, že bude proveden teplý start
systému.
Požaduje: nic
Výstup: AH= Status EMM
AH=5DH Povol/Zakaž funkci OS Set Fn (EMS 4.0). Používáno operačním
▄▄▄▄▄▄ systémem za účelem zamezit programům vykonávat určité EMS operace
na úrovni operačního systému. Není určeno pro použití v
aplikacích.
Požaduje: AL=číslo subfunkce
AL=0 Povol všechny funkce EMM určené pro OS
BX,CX=přístupový klíč
AL=1 Znemožni všechny funkce EMM určené pro OS
BX,CX=přístupový klíč
AL=2 Vrať pžístupový klíč (provede reset EMM a při
dalším volání vrátí přístupový klíč)
BX,CX=přístupový klíč
Výstup: (AL=0 nebo 1) BX,CX budou obsahovat přístupový klíč,
ale pouze při prvním volání této funkce (nebo po
volání subfunkce 2)
AH= Status EMM
AH=60H Dej pole fyzického okna (EEMS).
▄▄▄▄▄▄ Požaduje: ES:DI=>buffer
Výstup: AH= Status EMM
AL=počet položek
ES:DI=>naplněný buffer
AH=68H Dej adresy všech rámců stránek v systému (EEMS).
▄▄▄▄▄▄ Požaduje: ES:DI=>buffer
Výstup: AH= Status EMM
AL=počet položek
ES:DI=>naplněný buffer
Poznámka: Je ekvivalentní funkci 58H v LIM 4.0.
AH=69H Mapuj stránku do rámce (EEMS).
▄▄▄▄▄▄ Požaduje: AL=číslo rámce
BX=číslo stránky
DX=handle
Výstup: AH= Status EMM
Poznámka: Je ekvivalentní funkci EMS Fn 44H.
AH=6AH Mapování stránky (EEMS).
▄▄▄▄▄▄ Požaduje: AL=číslo subfunkce
AL=0 Ulož částečnou mapu stránky
CH=rámec první stránky
CL=počet rámců
ES:DI=>buffer, který má být naplněn
AL=1 Vyvolej částečnou mapu stránky
CH=rámec první stránky
CL=počet rámců
DI:SI=>dříve uložená mapa stránky
AL=2 Ulož a vyvolej částečnou mapu stránky
CH=rámec první stránky
CL=počet rámců
ES:DI=>buffer pro aktuální mapu stránky
DI:SI=>nová mapa stránky
AL=3 Dej velikost ukládaného pole
CH=rámec první stránky
CL=počet rámců
ES:DI=>buffer pro aktuální mapu stránky
DI:SI=>nová mapa stránky
Výstup: AL=velikost pole v bytech
AL=4 Přepni na standardní nastavení registrů mapování
AL=5 Přepni na alternativní nastavení registrů mapování
AL=6 Dealokuj stránky mapované na rámce v konvevční
paměti
CH=rámec první stránky
CL=počet rámců
Výstup: AH= Status EMM
Poznámka: Je podobná funkci EMS Fn 44H až na to, že může být
specifikován podrozsah stránek.
Viz též: Rozšířené funkce EMM Standardní funkce EMM
Status EMM Detekce EMS
VCPI
VCPI - Virtual Control Program Interface
Služby VCPI vznikly jako důsledek nutnosti poskytnout programům pracujícím
s CPL =3 ve V86 MÓDu možnost spolupracovat s rozšířenou pamětí na úrovni
PROTECTED MÓDu . Bližší informace o VCPI poskytuje:
Phar Lap Software
60 Aberdeen Avenue
Cambridge
MA, 02138
USA
Poznámka: Tyto funkce jsou podporovány většinou řídících programů EMS na
bázi EMM386.SYS vč. produktů QuarterDeck (QEMM386.SYS) a
Qualitas (386MAX.SYS) vyprodukovaných po roce 1988.
Samozřejmě jsou dostupné pouze na počítačích s procesorem 386
a vyšším.
AX Popis
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
DE00H VCPI - test instalace
DE01H VCPI - dej rozhraní VCPI
DE02H VCPI - dej maximální adresu fyzické paměti
DE03H VCPI - dej počet volných 4KB stránek
DE04H VCPI - alokuj 4KB stránky
DE05H VCPI - uvolni 4KB stránky
DE06H VCPI - dej fyzickou adresu stránky v prvním MB
DE07H VCPI - čti CRO
DE08H VCPI - čti registry pro ladění DRx
DE09H VCPI - nastav registry pro ladění DRx
DE0AH VCPI - dej mapování vektoru přerušení 8259
DE0BH VCPI - nastav mapování vektoru přerušení 8259
DE0CH VCPI - přepni do PROTECTED MÓDu
──────────────────────────────────────────────────────────────────────────
AX=DE00H Test instalace VCPI
▄▄▄▄▄▄▄▄ Požaduje: nic
Výstup: AH = 00H: VCPI je přítomen, jinak VCPI není přítomen
BH = majoritní číslo verze
BL = minoritní číslo verze
AX=DE01H Dej Vstupní bod VCPI
▄▄▄▄▄▄▄▄ Požaduje: ES:DI => buffer 4KB tabulky ( jedná se NUTNĚ o první
položku adresáře stránek. Měla by být zarovnána
na 4KB hranici. Vhodná je kombinace s EMS
a funkcí DE06 ) Viz. Stránkování
DS:SI => tři položky tabulky deskriptorů v GDT
první se stane deskriptorem segmentu kódu,
další dva jsou pro využití hlavním řídícím
programem
Výstup: AH = 00H: úspěšné, jinak selhání
DI => první nevyužitá položka tabulky stránek
EBX => vstupní bod VCPI v segmentu kódu
AX=DE02H Dej maximální adresu fyzické paměti
▄▄▄▄▄▄▄▄ Požaduje: nic
Výstup: AH = 00H: úspěšné, jinak selhání
EDX = fyzická adresa nejvyšší 4KB stránky paměti
Pozn.: Hodnotu lze zjistit a přepočítat i pomocí hodnot v CMOS
AX=DE03H Dej počet volných 4KB stránek
▄▄▄▄▄▄▄▄ Požaduje: nic
Výstup: AH = 00H: úspěšné, jinak selhání
EDX = počet volných 4KB stránek paměti
Poznámka: Tato funkce je též k dispozici v PM
voláním vstupního bodu VCPI.
AX=DE04H Alokuj 4KB stránky
▄▄▄▄▄▄▄▄ Požaduje: nic
Výstup: AH = 00H: úspěšné, jinak selhání
EDX = fyzická adresa alokované stránky paměti
Poznámka: Tato funkce je též k dispozici v PM
voláním vstupního bodu VCPI.
AX=DE05H Uvolni 4KB stránky
▄▄▄▄▄▄▄▄ Požaduje: EDX=fyzická adresa 4KB stránky paměti
Výstup: AH = 00H: úspěšné, jinak selhání
Poznámka: Tato funkce je též k dispozici v PM
voláním vstupního bodu VCPI.
AX=DE06H Dej fyzickou adresu stránky v prvním MB
▄▄▄▄▄▄▄▄ Požaduje: CX = číslo stránky
Výstup: AH = 00H: úspěšné, jinak selhání
EDX = fyzická adresa stránky
Použitelné pro stránky promítané EMM do Page Frame
AX=DEO7H Čti CRO
▄▄▄▄▄▄▄▄ Požaduje: nic
Výstup: AH = 00H: úspěšné, jinak selhání
EBX = hodnota CR0
Pozn.: Dolní WORD CR0 lze přečíst kdykoliv pomocí Smsw i pro CPL =3
AX=DE08H Čti registry pro ladění
▄▄▄▄▄▄▄▄ Požaduje: ES:DI => pole délky 8 dword
Výstup: AH = 00H: úspěšné, jinak selhání
buffer naplněný nejprve DR0, DR4 a DR5 jsou nevyužity
a DR7 je poslední
Hardware Breakpoints
AX=DE09H Nastav registry pro ladění
▄▄▄▄▄▄▄▄ Požaduje: ES:DI => pole délky 8 dword pro nové hodnoty registrů
pro odladění
Výstup: AH = 00H: úspěšné, jinak selhání
Hardware Breakpoints
AX=DE0AH Dej mapování vektoru přerušení 8259
▄▄▄▄▄▄▄▄ Požaduje: nic
Výstup: AH = 00H: úspěšné, jinak selhání
BX = první vektor používaný nadřízeným 8259 (IRQ0)
CX = první vektor používaný podřízeným 8259 (IRQ8)
AX=DE0BH Nastav mapování vektoru přerušení 8259
▄▄▄▄▄▄▄▄ Požaduje: BX = první vektor používaný nadřízeným 8259
CX = první vektor používaný podřízeným 8259
Výstup: AH = 00H: úspěšné, jinak selhání
Pozn. : Změny v mapování by měly být vráceny na původní hodnotu po
skončení aplikace. O přemapování viz IRQ
AX=DE0CH Přepni do chráněného módu
▄▄▄▄▄▄▄▄ Požaduje: ESI = lineární adresa hodnot pro tabulku parametrů
( umístěná v 1. MB )
Proveďte CLI před INT .
Výstup: zakázaná přerušení
SS:ESP musí mít několik wordů volných, a vstupní
bod musí okamžitě nastavit nový zásobník
EAX, ESI, DS, ES, FS, GS jsou zničeny
Formát hodnot systémových registrů pro přepnutí do PROTECTED MÓDu (pro ESI):
Offset Velikost Popis
▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
00H dword hodnota pro CR 3
04H dword lineární adresa (v prvním megabyte) PWORDu hodnot pro GDTR
08H dword lineární adresa (v prvním megabyte) PWORDu hodnot pro IDTR
0CH word hodnota pro LDTR
0EH word hodnota pro TR
10H pword CS:EIP => vstupní bod kódu v PROTECTED MÓDu
Pozn.: V PROTECTED MÓDu je možno volat vstupní bod získaný fcí DE01 (EBX)
a Selektore m alokovaným VCPI na prvním místě v GDT s těmito hodnotami:
AX = DE0CH
DS = selektor segmentu dat z funkce EMM Fn DE01H
(č.2)
Zásobník připravený podle obr :
31 16 15 0
│ 0000000000000 │ GS │
├───────────────┼───────────────┤
│ 0000000000000 │ FS │
├───────────────┼───────────────┤
│ 0000000000000 │ DS │
├───────────────┼───────────────┤
│ 0000000000000 │ ES │
├───────────────┼───────────────┤ ▲
│ 0000000000000 │ SS │ │
├───────────────┼───────────────┤ <┴ Tyto hodnoty budou
│ 0000000000000 │ SP │ dosazeny do seg. registrů
├───────────────┴───────────────┤ V86
│ Vyhrazeno pro EFLAGS │ <─ Toto vyplní VCPI sám
├───────────────┬───────────────┤ včetně VM = 1
│ 0000000000000 │ CS │
├───────────────┼───────────────┤
SS:ESP před │ 0000000000000 │ IP │ <─ Sem se předá řízení ve V86
Call far -> ├───────────────┼───────────────┤
| 0000000000000 │ CS |
├ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ┤
SS:ESP nalezená| EIP |
VCPI -> ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤ <─ Toto dosadí Call Far
Přepne na V86 MÓD se zakázanými přerušeními, všemi segmentovými registry
zavedenými a zničeným EAX.
Pozn .: Prostudujete-li kapitolu Zpracování přerušení , zjistíte, že se
nápadně shodují záznamy na stacku pro VCPI návrat do V86 MÓDu a
pro návrat z obsluhy přerušení. Je to tím, že VCPI provede jen
inicializaci pole pro Eflags, změní IDT a CR3 a provede IRET.
Nepokoušejte se přepnout do V86 nebo dokonce do REAL MÓDu vlastními
silami. Jde to ( máte CPL =0), ale je to moc ožehavý. Uvědomte si
následující :
■ Máte jinou IDT . Pokud byste to chtěli risknout, můžete jí celou
změnit tak, fungovala ( Zpracování přerušení ), ale je to moc
práce za málo peněz. Pokud to přece jenom budete provádět, musíte
podle IOPL V86 procesu správně nastavit obslužné rutiny, ohlídat
mapování IRQ a Přerušení CPU obsadit rozumným kódem.
■ Máte odlišné mapování stránek - CR3 . Některé části paměti nad
HMA ( Tam např sídlí QEMM, EMM , jeho systémová data, jeho IDT,
jeho adresáře stránek ... ) NEBUDOU v adresáři první stránky získané
fcí DE01 vůbec obsaženy ( budou tam 0, EMM se tak chrání proti
přepisu ).
■ Bloky UMB nemusí být v 1. stránce poskytnuté VCPI mapovány správně
nebo vůbec.
■ Stále existuje zařízení EMMXXXX0, které MUSÍ obsazovat vektor 67h
a poskytovat služby EMM a VCPI.
■ I když EMMXXXX0 zlikvidujete, mohou být nainstalovány rezidentní
programy ( SMARTDRIVE, RAMDRIVE ), které si přítomnost EMM zjistily
dříve a budou stále volat INT 67h. Takže musíte obsluhovat i služby
EMM.
Pokud toto všechno zvládáte, pak nic nebrání tomu, abyste si přepínali módy
sami. Windows, když běží v 386 Enhanced módu, VCPI použijou, pak vykopnou a před
ukončením opět obnoví.
DPMI XMS EMS PROTECTED MÓD
Detekce EMS
Paměť EMS je řízena instalovatelným řídícím programem zařízení se jménem
zařízení 'EMMXXXX0', a odkazuje na něj jako na EMM (Expanded Memory Manager).
Ke zjištění, zda řídící program byl instalován můžete použít subfunkci
07H DOS Fn 44 (I/O obsluha zařízení) dávající status instalace.
Pokud navrácený status (v AL) je 0, EMM NENÍ instalován a z nějakých
důvodů existuje diskový soubor se jménem 'EMMXXXX0'.
Je-li řídící program EMM instalován, nastavuje vektor INT 67H na
hlavičku svého zařízení. Proto existuje další způsob, jak testovat EMS.
Vyvolejte adresu ve vektoru pro INT 67H (0000:019CH) a prohledejte offset
0AH z této adresy. Měl by obsahovat znaky 'EMMXXXX0'.
Služby EMM Pro přístup k EMM použijte INT 67H s kódem subfunkce, jak
▄▄▄▄▄▄▄▄▄▄ je popsáno ve funkcích EMM.
Příklad detekce :
emmname DB 'EMMXXXX0',0
...začátek ...
Push cs
Pop ds
Lea dx,emmname
Mov ax,3d00h
Int 21h
Jc @neems
Mov bx,ax
Mov ax,4407h
Int 21h
or al,al
Jz @neems
.. ems přítomna ...
.. Zavřít soubor !!! ..
nebo
Xor ax,ax
Mov es,ax
Les di,es:[019ch]
Mov di,0ah
Push cs
Pop ds
Lea si,emmname
Mov cx,08
Repz cmpsb
Jz @jeems
Jnz @neniems
Viz též: Standardní funkce EMM EMS
Stránkování
Stránkování je mechanismus přepočtu :
Lineární adresa ─-> Fyzická adresa
Lineární adresu získá procesor pomocí segment:offset adresace nebo
přičtením offsetu k bázi příslušného Deskriptoru . Viz Adresace .
Fyzická adresa je umístění bytu v paměti na desce.
Na 8086 a 80286 platí : Fyzická adresa=Lineární adresa.
Na 80386 a 80486 platí vztah uvedený výše jen je-li bit PG v CR0 nastaven
na 0. Tedy v REAL MÓDu vždy a v ostatních módech podle CR0.
Činnost popsanou níže provádí procesor a uživatelský program VŮBEC nemusí
zajímat. Uživatelský program pracuje jen s Linrárními adresami, a nezajímá
ho, jak se tyto promítají do Fyzické paměti.
Základem je rozdělění paměti do úseků velioksti 4096 Byte. Tyto úseky
se nazývají STRÁNKY a jsou zarovnány na hranici 4096 BYTE.
V paměti se pak nacházejí tyto typy stránek ( podle využití ) :
Typ Počet: Min Max Využití
──────────────────────────────────────────────────────────
Adresář stránek 1 1 Uložení Fyzických adres stránkových
podadresářů
Podadresáře 1 1024 Uložení Fyzických adres jednotlivých
stránek stránek
Stránky - paměť 1 1047551 Uživatelské programy, data ...
pro programy
První 2 typy jsou systémové oblasti určené pro procesor, poslední typ
je přístupný pro uživatele.
Název adresář a podadresář nejsou náhodné. Názorně vystihují situaci
v paměti. Viz obr :
Registr CR3 - Fyzická adresa Adresáře stránek
│
▼
Adresář stránek
┌───────────────────────────────┐
0 │Fyzická adresa podadresáře 0│ ┐
├───────────────────────────────┤ │
1 │Fyzická adresa podadresáře 1│ │
├───────────────────────────────┤ │
2 ........................... │
dalsí fyzické adresy │
pro další podadresáře │
........................... │
├───────────────────────────────┤ │
1023 │Fyzická adresa podadresáře 1023│ │
└───────────────────────────────┘ │
│
┌─────────────────────────────────┘
│
▼
Podadresář stránek č.0
┌───────────────────────────────┐
0 │Fyzická adresa stránky č.0│ ┐
├───────────────────────────────┤ │
1 │Fyzická adresa stránky č.1│ │
├───────────────────────────────┤ │
2 ........................... │
dalsí fyzické adresy │
pro další stránky │
........................... │
├───────────────────────────────┤ │
1023 │Fyzická adresa stránky č.1023│ │
└───────────────────────────────┘ │
│
┌─────────────────────────────────┘
│
▼
┌───────────────────────────────┐
│ │
4096 BYTE stránka
│ │
└───────────────────────────────┘
Takovou strukturu v paměti musí vystavit správce, než zapne stránkování.
Je jasné, že ne všechny položky adresáře stránek popř. i podadresářů musejí
být vyplňeny. Např. pro 4 MB RAM stačí vyplnit 1 položku Adresáře (č. 0)
a potřebný počet položek podadresáře. Nic nezabraňuje tomu, aby 1 stránka
byla uvedena ve více podadresářích či adresářích. Procesor se o danou
položku adresáře / podadresáře začne zajímat až ve chvíli, kdy je třeba
s ní manipulovat. Proto je-li vyplněna jen 1 položka adresáře stránek
a program začne chtít manipulovat s položkou č. 125 podadresáře č.958,
dojde k chybě až teprve v místě výskytu příslušné instrukce.
A nyní již k překladu.
Lineární adresa se rozdělí podle následujícího schématu :
Lineární adresa - 32 bitů
31 22 21 12 11 0
┌───────────────────┬───────────────────┬───────────────────────┐
│A A A A A A A A A A│P P P P P P P P P P│O O O O O O O O O O O O│
└───────────────────┴───────────────────┴───────────────────────┘
Bity 31 - 22 udávají číslo položky adresáře stránek. Procesor tedy
bude poracovat s podadresářem, jehož Fyzická adresa je
uvedena v AAAAAAAAAA - té položce adresáře stránek.
AAAAAAAAAA dává 1024 kombinací ve shodě s počtem položek
adresáře stránek.
Bity 21 - 12 udávají číslo položky podadresáře stránek. Procesor tedy
v podadresáři, jehož fyzickou adresu již dříve zjistil,
vybere položku číslo PPPPPPPPPP. Tam se přečte Fyzická adresa
stránky, se kterou bude program pracovat.
Bity 11 - 0 Je-li k dispozici fyzická adresa stránky, které se týká
uvedená Lineární adresa , zbývá už jen určit offset uvnitř
ní. Stránka má délku 4096 byte, k její adresaci musí být 12
bitů (0 - 11).
Např : Program bude pracovat s lineární adresou
12345678h
Binárně : 0001001000 │ 1101000101 │ 011001111000b
Položka adresáře - 048h
Položka podadresáře - 345h
Offset uvnitř stránky - 678h
CR3 - fyzická adresa 00002000h
Adresář stránek
00002000h - Fyzická adresa
┌───────────┐
│ Položka 0 │
├───────────┤
│ Položka 1 │
.............
├───────────┤
│Položka 48h│ - Fyzická adresa podadresáře č. 48 třeba 84529000h
├───────────┤ │
............. │
┌───────────────────────────────────────────────┘
▼
Podadresář stránek
84529000h - Fyzická adresa
┌────────────┐
│ Položka 0 │
├────────────┤
│ Položka 1 │
..............
├────────────┤
│Položka 345h│ - Fyzická adresa příslušné stránky třeba 45626000h
├────────────┤ │
............. │
┌───────────────────────────────────────────────┘
▼
Vlastní stránka Fyzická adresa 45626000h
┌─────────────────────────────────┐
│ │
│ │
│ │
│ │
...................................
byte 678h uvnitř stránky - cíl operace
...................................
│ │
│ │
│ │
└─────────────────────────────────┘
Daná Lineární adresa tedy v paměti má (za daných okolností) fyzickou
adresu 45626678h.
Povšimněte si, že všechny adresáře i podadresáře mají počátek zarovnán na
4096 BYTE, tedy poslední 3 HEXa číslice jsou 0.
Pro manipulaci (R/W) se stránkami adresáře a podadresářů si musí řídící program
vytvořit vlastní položky, nelze je tedy zpřístupnit např. pomocí CR3. Vhodné
je např. v první volné položce adresáře stránek vystavit odkaz na podadresář,
kde bude uveden seznam všech použitých stránek. Je jen těžko předpokladatelné,
že by správce nepotřeboval stránkty časem měnit. Pokud by si odkazy nevytvořil,
stránky adresářů a podadreaářů nebudou již přítomné ( a ani adresovatelné ).
Každá položka adresáře, podadresáře i CR3 má délku 4 BYTE a másledující
strukturu:
31 12 11 9 8 7 6 5 4 3 2 1 0
┌──────────────────────────────────────┬─────┬────┬─┬─┬─┬─┬─┬─┬─┐
│ Fyzická adresa odkazu │ AVL │ 00 │D│A│C│W│U│R│P│
└──────────────────────────────────────┴─────┴────┴─┴─┴─┴─┴─┴─┴─┘
( bez posledních 3 HEXa cifer,které jsou vždy 0 )
AVL - 3 bity volné. Systém je může využít podle vlastních potřeb.
D - Dirty. Nastaven na 1 po každém zápisu do stránky.
A - Accesed. NAstaven na 1 po R/W ze stránky (adresáře)
C - Jen 486. Pro tuto stránku (adresář) nepoužívat cache
W - Jen 486. Je-li 1 write - through , jinak write - back.
Vnitřní cache write - back nedokáže. Je to řízení externí cache.
U - User/Supervisor. 1 znamená, že program s CPL =0 smí použít.
0 znamená nesmí.
R - Write/Read. 1 znamená, že program s CPL =0 smí zapisovat.
0 znamená nesmí.
P - Present. 1 znamená ano
0 znamená ne, procesor ignoruje ostatní bity
a při pokusu o práci s takovou stránkou vyvolá
INT 0E . Využití - virtualizace.
Hlavní výhodou Stránkování je možnost přemapovat RAM do souvislých bloků
a možnost mít RAM, kde je 'díra'. EMM tak vytvářejí Page frame pro EMS
a bloky UMB . Viz Mapa paměti .
Pozn.: Pro některé oblasti by mělo platit Lineární adresa = Fyzická adresa .
Je to zejména GDT, Tabulky stránek, TSS a místa zpracování
Přerušení CPU .
Adresace PROTECTED MÓD V86 MÓD REAL MÓD Přerušení CPU
Nové registry 386 Nové registry 486
Přerušení CPU - seznam
CPU generuje v něktrých kritických situacích přerušení, která zpracována OS
mohou alespoň na chvíli odvrátit spadnutí systému.
Jsou to následující přerušení (někdy nazývaná výjimky) :
Výjimka Typ Popis
────────────────────────────────────────────────────────────────────────
INT 00 C Dělení 0 ( přetečení )
INT 01 C,H Krokování (ladící přerušení)
INT 02 Nemaskovatelné přerušení
INT 03 H Přerušení od Breakpointu
INT 04 H Přerušení při přetečení INTO
INT 05 C Přerušení při vyhodnocování BOUND
INT 06 C Neznámá instrukce
INT 07 C Emulace koprocesoru
INT 08 P Dvojitá chyba
INT 09 P Chyba adresace koprocesoru
INT 0A C Špatný TSS
INT 0B C Výpadek segmentu
INT 0C C Výpadek segmentu zásobníku
INT 0D C Obecná chyba ochrany
INT 0E C Výpadek stránky
INT 0F Rezervováno
INT 10 Hla Chyba koprocesoru
INT 11 C Chyba zarovnávání
INT 12 - INT 1F Rezervováno firmou INTEL pro budoucí rozšíření
────────────────────────────────────────────────────────────────────────
Vysvětlivky :
C = Chyba. Přerušení je generováno PŘED provedením instrukce. Na zásobníku
je uloženo místo, kde k chybě došlo, tedy po Iret se počítá
s pokračováním na místě chyby. Pokud není chyba obsluhou odstraněna,
vyvolá se chyba znova, a tak dojde k zacyklení. Proto obsluha takové
výjimky MUSÍ buď chybu odstranit, nebo zlikvidovat celý program.
H = Hlášení. Přerušení je generováno PO provedení instrukce. Na zásobníku
je tedy ukazatel na instrukci NÁSLEDUJÍCÍ.
P = Problém. Chyba je už tak závažná, že se pokoušet o její nápravu nemá
cenu. Tak se na zásobník neuloží nic.
Hla=něco mezi. Je to specialita koprocesoru. Dojde-li k chybě ve FPU,
není signalizována hned, ale až před provedením další instrukce FPU.
Z hlediska CPU se tedy jedná o hlášení ( až po instrukci ), pro FPU
je to chyba ( před instrukcí ).
Některá přerušení jsou specifická jen pro PROTECTED MÓD , jiná se vyskytují
i při REAL MÓDu nebo V86 MÓDu .
Čísla některých výjimek se shodují s přerušeními rezervovanými BIOSem pro
činnost IRQ a některých obslužných rutin BIOSu. Je-li potřeba využívat IRQ,
pak je vhodné je pomocí řadiče přerušení přemapovat.
Přerušení BIOSu Přerušení DOSu Seznam přerušení IRQ
Vektor INT 00
Toto přerušení je generováno CPU, pokud při zpracovávání instrukce DIV nebo
IDIV dojde k přetečení. To se zpravidla stane, pokud je dělitel 0 nebo malé
číslo.
Např. následující kód vyvolá INT 00 :
CS:IP-6 Mov ax,5000h
CS:IP-3 Mov bx,02h ;5000h / 2 = 2800h, to se do AH nevejde
CS:IP Div bl
Kód na INT 00 nalezne na stacku následující :
(E)FLAGS
CS ──┬── Tady je začátek DIV. Včetně prefixů
(E)IP ──┘ ( narozdíl od 8086 )
SS:(E)SP ─────>
Po provedení IRET se tedy pokračuje znovu DIV !!! ( A existuje tedy
reálné riziko zacyklení. ) Obslužný kód tedy musí chybu odstranit ( zde
změnit bl ) nebo upravit návratovou adresu tak, aby se řízení dostalo až
na následující instrukci.
Přerušení CPU
Přerušení 01 - krokování
Je-li nastaven příznak TF v (E)FLAGS před vykonáním určité instrukce, pak
se po jejím provedení provede INT 01. Je důležité si uvědomit, že například
následující kód TF shodit nemusí :
... start debugování, předpokládáme TF = 1 ...
Pushf
Pop ax
And ax,0feffh
Push ax
<─────-Zde je ještě TF = 1,
Popf
<──────proto se zde provede INT 01
Obslužná rutina tedy ještě může TF nastavit.
Pro TF se INT 01 chová jako Hlášení.
Hardware Breakpoints
Jedna z novinek CPU 80386 jsou tzv. Hardware Breakpoints . Je-li
provedena akce splňující podmínky Hardware Breakpointu, provede se rovňež
INT 01. To, jestli INT 01 vyvolal Hardware Breakpoint nebo TF lze
zjistit přečtením statusu v DR6 registru. Po dobu zpracovávání INT 01 jsou
všechny DRx registry čitelné i zapisovatelné, a to i v případě, že je
nastaven bit GD v registru DR7. Podrobnosti viz. Hardware Breakpoints .
Poznamenávám jen, že DRx registry jsou dostupné pro 80386SX a
vyšší, jež zpracovává program, jehož CPL =0. Viz Systém ochrany .
Int 01 generovaný Hardware Breakpointem je Chyba. (ve smyslu terminologie
zavedené v kapitole Přerušení CPU ).
INT 03 Přerušení CPU
INT 02 - Nemaskovatelné přerušení
Toto přerušení ve vyvoláno signálem NMI procesoru bez ohledu na stav
příznaku IF v (E)FLAGS. Nelze jej tedy zakázat instrukcí CLI. NMI znamená
havárii, kterou způsobil hardware (např. pokles napájecího napětí, ztráta
parity RAM ... ). Dává tak software šanci zachránit, co se dá. Standardní
obsluha INT 02 vyvolá ztuhnutí počítače při ztrátě parity. (Jak užitečné.)
INT 02 na sebe přesměrovává SMARTDRIVE s write cache, aby nezůstalo při
vypnutí vše jen v paměti. Jiné praktické použití je mizivé.
Během zpracování INT 02 je NMI signál procesorem ignorován, a tak nedojde
k zacyklení.
Na PC AT lze NMI zakázat pomocí hardware, použitím portu 70h. ( Bit 7 )
Mov al,80h ; bit 7
Out 70h,al ; maskovat
Jmp @wait
@wait:
In al,71h ; Port 70h je standardně použit pro CMOS paměť. Zápis na port 70
; vybírá registr CMOS a přes port 71h jej lze číst-modifikoat.
; zde jej přečteme, aby náhodný zápis na port 71h nezpůsobil
; katastrofu.
Přerušení CPU
INT 03 - Přerušení breakpointem
INT 03 je vyvolán synchronně instrukcí INT 03, která má však operační kód
pouze 1 byte. Lze ji tak vložit do programu i na místo jednobytové
instrukce bez obav z přepsání dalších instrukcí.
Debugger je zodpovědný za obnovení původního obsahu místa, kam vložil
breakpoint. Tady mu CPU nepomůže. ( Ale hodilo by se to .. ).
Po IRET se provede instrukce ZA vloženou INT 3, tedy často nesmysl.
Je tedy třeba opravit návratovou adresu na zásobníku. Viz popis v kapitole
Hardware Breakpoints .
INT 01 Hardware Breakpoints Přerušení CPU
INT 04 - Přetečení
Přerušení je generováno synchronně buď instrukcí INT 04 nebo INTO.
Instrukce INTO generuje INT 04 v případě, že je nastaven OF - přetečení.
Vyšším programovcím jazykům to usnadní kontroly v aritmetických operacích.
Využít lze např. následovně:
...
Mov ax,proměnná1
Add ax,proměnná2
INTO ; případné zpracování chyby
...
TP 6.0 a 7.0 však na chyby v celočíselné aritmetice příliš nedbají, a tak
lze INTO v kódu generovaným TP nalézt jen zřídkakdy. ( Pokud si ovšem
nenastavíte $R přepínač. )
Po IRET se provede hned další instrukce za INTO. (Pokud ovšem obsluha
nevypopuje CS IP a Flags a neskočí jinam.)
Přerušení CPU
INT 05 - Výsledek BOUND je mimo meze
Instrukce BOUND generuje INT 05, pokud testované číslo neleží zadaném
intervalu (Interval ve uzavřený, tedy . Intelové zase
jednou něco vyřešili na 1* . Místo nastavení 1 příznaku ( co třeba CF )
a jeho následné kontroly se při použtí BOUND programátor musí namáhat
s obsazováním vektoru. Navíc INT 05 používá BIOS pro Print Screeen
( generováno stiskem SysRq ), a tak "vůbec ke kolizím nedochází". Existuje
jen jedna možnost - BOUND nepoužívat. Koneckonců, dvakrát CMP dokáže totéž.
CS:(E)IP BOUND Ax,dword ptr ds:[meze]
....
DS:MEZE dw MezLo,MezHi
INT 05 vyvolaný BOUND nalezne na stacku následující :
(E)FLAGS
CS ──┬── tady je začátek BOUND
(E)IP ──┘
SS:(E)SP ----->
Po provedení IRET se tedy pokračuje znovu BOUND !!! ( A existuje tedy
reálné riziko zacyklení. ) Obslužný kód tedy musí chybu odstranit ( zde
změnit ax, což moc smyslu nedává ) nebo upravit návratovou adresu tak, aby
se řízení dostalo až na následující instrukci.
Instrukce může mít trochu lepší použitelnost v PROTECTED MÓDu ( BIOS je
off ), ale tam jsou zase problémy s alokací vektoru v IDT pro program
s CPL >0. A tak si myslím, že mluvím za všechny, když prohlásím :
BOUND je na ..... .
Znám jen jedno rafinovaný použití BOUND :
Xor ax,ax
Dec ax ;0FFFF
Bound ax,dword ptr cs:[meze] ; a už tisknu
......
meze dw 0,0
Přerušení CPU
INT 06 - Opcode trap
Toto přerušení vyvolá CPU, pokud narazí na sekvenci bajtů, které nejsou
instrukcí. To se stane např. při použití instrukcí 286 na XT. Druhá možnost
vyvolání INT 06 je v REAL MÓDu použitá instrukce PROTECTED MÓDu .
Např. následující kód vyvolá INT 06 i na 386 ( v RM ):
ARPL ds,ax
V módu real jsou zakázány tyto instrukce :
LAR, LSL, VERR, VERW, ARPL, LTR, STR, CTS, LLDT a SLDT
Instrukce protected módu, které INT 06 nevyvolají ani při použití
v reálném módu :
LGDT, LIDT, SGDT, SIDT, LMSW, SMSW, MOV xx,CR?, MOV CR?,xx, MOV xx,DR?,
MOV DR?,xx
Všechny výše jmenované instrukce vyjma SMSW použité ve V86 MÓDu vyvolají
výjimku INT 0D . Viz Privilegované instrukce
Vyvolaný INT 06 nalezne na stacku následující :
(E)FLAGS
CS ──┬── tady je ta mrcha
(E)IP ──┘
SS:(E)SP ----->
Po provedení IRET se tedy pokračuje znovu "provinilou" instrukcí !!! ( A
existuje tedy reálné riziko zacyklení. ) Obslužný kód tedy musí chybu
odstranit ( zde změnit část kódu, což půjde těžko ) nebo upravit návratovou
adresu tak, aby se řízení dostalo někam, kde je rozumný kód : debugger,
sekvence k ukončení programu (ah=4C, int 21) nebo RESET. Posledně jmenované
( ač nepříjemné ) je asi nejrozumnější. Těžko lze odhadnout, co poničený
kód stačil natropit, než vyvolal INT 06. Není špatný nápad pokusit se
"vysypat" RAM na disk, provést RESET a pak analyzovat, co se vlastně
semlelo.
Standardní obsluha BIOSu vypíše něco jako :
* Opcode trap *
CS:IP = 1234:5678 , flags = 788E
Fatal error - please restart the system.
a pak se dá opravdu jen resetovat. Čas od času lze "optrap" brejknout
( CTRL + PAUSE ), ale systém pak rychle padá. Je-li "optrap" opravdu tvrdej
( čti : blokuje klávesnici ), pak CTRL + ALT + DEL nepomůže a nezbývá nic
než tvrdej RESET. Pokud ( jako já ) nemáte RESET tlačítko na Vašem počítači,
tak se alespoň na chvíli uleví elektrárně.
Programy jako EMM386, QEMM386, 386MAX a podobné přepínají CPU do V86 módu
a přebírají obsluhu INT 06. Při výskytu "optrapu" dají možnost RESET nebo
TERMINATE. Někdy to i funguje ...
Instrukce procesoru Přerušení CPU Registry procesoru
INT 07 - Emulace koprocesoru
Pokud CPU narazí na instrukci pro koprocesor, a zároveň dojde k závěru, že
koprocesor není nainstalován, přečte MSW (286) nebo CR0 (386,486) a otestuje
bit 2. Pokud je 0, vyvolá INT 06 , jinak INT 07. Vektor INT 07 tedy
obsazuje emulátor koprocesoru a snaží se počítat. Adresu instrukce
koprocesoru najde na stacku :
(E)FLAGS
CS <──┬─ Tady jí máme
(E)IP <──┘
SS:(E)SP ----->
Po provedení výpočtu je třeba změnit návratovou adresu, aby se provedla
následující instrukce. Jinak dojde k zacyklení.
Je-li TS v MSW 1 (viz Nové registry 286 ), pak se INT 07 vyvolá i pro
EXISTUJÍCÍ koprocesor. Správce úloh musí zaměnit obsah koprocesoru
a provést CTS (viz Instrukce 80286 ).
Je dobrý nápad kontrolovat TS na začátku každé INT 07. Nic se tím nepokazí.
Např :
INT 07 ----> Push ax
Smsw ax
And ax,08 ;(bit TS)
Jz Zpracuj_instrukci
Cts
Pop ax
Iret
Zpracuj_Instrukci: ...vlastní emulace ..
Pop ax
Iret
Registry Procesoru Přerušení CPU Registry koprocesoru
Koprocesory
INT 08 - Vnořená chyba
Pokud dojde při zpracování výjimky procesoru INT 00 - INT 1F k další stejné
výjimce nebo v průběhu INT 0E k jajékoliv výjimce, CPU ztratí trpělivost a
provede INT 08. Tam se "něco" může provést a pak procesor "ztuhne". Na PC se
nic neprovede a počítač se rovnou resetuje. INT 08 má jednu zvláštnost :
neukládá se návratová adresa. Na vrchol zásobníku se uloží 0, abychom věděli,
že nás má procesor rád. Koneckonců IRET nemá cenu provádět, a tak tam ta 0 ani
moc nepřekáží.
INT 08 je vyhrazen IBM pro časovač. Ten se volá ( v real módu ) 18.2 x za
vteřinu. V REAL MÓDu to ani moc nevadí a V86 MÓD nebo PROTECTED MÓD
před povolením IRQ provede přemapování.
Časovač INT 08 Přerušení CPU
INT 09 - Chyba adresace koprocesoru
INT 09 se vyvolá, adresuje - li koprocesor mimo segment. Vše, co se po
obslužné rutině požaduje je provedení FNINIT a předání řízení správci. Když
se navíc koprocesor používá k výpočtům, bývá vhodné si poznamenat, že výsledky
asi nebudou z nejpřesnějších.
Toto přerušení obsazuje jen 286 a 386. 486 hlásí tuto chybu pomocí INT 0D .
INT 09 používá BIOS a hardware k obsluze klávesnice. Po přepnutí do
PROTECTED MÓDu nebo V86 MÓDu se musí IRQ přemapovat. Pro bližsí
informace viz Klávesnice INT 09 a IRQ
Registry Procesoru INT 10 INT 0D Registry koprocesoru
Přerušení CPU Koprocesory
INT 0A - Chybný TSS
Tato výjimka je vyvolána při přepínání úloh mechanismem podpory
multitaskingu procesoru 286, 386, 486. K chybě dojde :
1. Limit TSS je menší než 103 byte. Viz TSS . (386)
2. CS nebo SS v TSS obsahují 0 (neplatný selektor).
3. Selektor CS není kódový.
4. DPL deskriptoru určeného CS a CPL nejsou shodné, segment navíc není
konformní. CPL , DPL , Deskriptor , Selektor , Systém ochrany
5. Limit deskriptoru určeného CS je menší než (E)IP.
6. DPL pro SS není shodné s CPL .
7. Deskriptor určený SS není zapisovatelný nebo není present.
8. Selektor v DS,ES,FS nebo GS je systémový nebo kódový deskriptor.
9. DPL pro DS,ES,FS nebo GS je větší než CPL .
Je to pěkné smetiště, kam jdou všechny chyby při přepínání úloh. Pokud
k nějaké chybě dojde, je skoro nejlepší úlohu zrušit. Pokud to nejde, pak
obsluze může pomoci chybový kód uložený na vrchol zásobníku. Obsahuje
selektor, který způsobil chybu. Před koncem je potřeba odstranit jej.
Bity :
15 3 2 1 0
┌─────────────────────────────┬──┬──┬──┐
│Index v tabulce Deskriptorů │ │ │ │
└─────────────────────────────┴──┴──┴──┘
│ │ └─ 1=k chybě došlo během INT (výjimka)
│ └──── 1=k chybě došlo během INT (přerušení)
└─────── 1=LDT 0=GDT
Systém ochrany IRQ EGA - INT 0A Registry procesoru
Přerušení CPU
INT 0B - Výpadek segmentu
Tato výjimka je generována, má-li být použit Deskriptor , jež není present.
Obslužná rutina musí bit present v příslušném deskriptoru nastavit na 1 před
svým ukončením ( jinak se zacyklí ). INT 0B se využívá pro virtualizaci
paměti. Je-li P bit 0, dostane se sem řízení a deskriptor se natáhne třeba
z disku. (Chacha. V PM to nejde přímo, musí se do V86, načíst a přemístit.)
Snazší je ale použít pro virtualizaci INT 0E . (Ale i tam platí ─┘. )
Obsluze může pomoci chybový kód uložený na vrchol zásobníku. Obsahuje
selektor, který způsobil chybu. Před koncem je potřeba odstranit jej.
15 3 2 1 0
┌─────────────────────────────┬──┬──┬──┐
│Index v tabulce Deskriptorů │ │ │ │
└─────────────────────────────┴──┴──┴──┘
│ │ └─ 1=k chybě došlo během INT (výjimka)
│ └─── 1=k chybě došlo během INT (přerušení)
└───── 1=LDT 0=GDT
Systém ochrany IRQ COM - INT 0B Registry procesoru
Přerušení CPU
INT 0C - Výpadek segmentu zásobníku
Tato výjimka je generována, má-li být použit pro stack Deskriptor , jež
není present nebo dojde-li k podtečení zásobníku. V každém případě musí obslužná
rutina problém odstranit ( v nejhorším případě odstranit problematickou úlohu ).
Obsluze může pomoci chybový kód uložený na vrchol zásobníku. Obsahuje buď
0 (podtečení) nebo selektor, který způsobil chybu. Před koncem je potřeba
odstranit jej.
15 3 2 1 0
┌─────────────────────────────┬──┬──┬──┐
│Index v tabulce Deskriptorů │ │ │ │
└─────────────────────────────┴──┴──┴──┘
│ │ └─ 1=k chybě došlo během INT (výjimka)
│ └──── 1=k chybě došlo během INT (přerušení)
└─────── 1=LDT 0=GDT
Systém ochrany IRQ COM - INT 0C Registry procesoru
Přerušení CPU
Pozn.: Tato výjimka se mi 2x objevila u AThelpu ( ne u XThelpu ) při práci s TP.
Na počítači byl nainstalován ovladač češtiny, a TP používal EMS.
Bohužel, ovladač češtiny měl malý vlastní zásobník a při Pusha a volání
XMS došlo k jeho podtečení. V jiných programech se to neprojevilo ( Mám
nejasné tušení, že to způsobují Turbo Vision a sledování událostí. ), a
tak jsem to ani neopravoval, aby rezidentní kód nebyl zbytečně velký.
Pokud se Vám tato chyba projeví, napište mi o mí ( včetně konfigurace
a spuštěných programů). Pokud se tato chyba bude projevovat častěji,
zásobník přidělám. AThelp ale bude to ale o takových 300 byte
rezidentních delší.
INT 0D - Obecná chyba ochrany
Cokoliv se semele a není to v kompetenci ostatních INTů, ohlásí se tady.
Je to takový velký smetiště. Obslužnou rutinu nezbývá než litovat. Vždy je
na zásobníku uložen WORD, který spíše vzdáleně specifikuje chybu.
Existují 3 základní kategorie chyb, které vyvolají INT 0D :
1. Chyby z V86 MÓDu . Pouze 386,486.Poznají se podle bitu VM v EFLAGS
uložených na stacku. Viz obr.:
vše 32 - bitové (16 - bitová obsluha sice může existovat,
0 GS ale není k ničemu. Důvod - viz
0 FS Zpracování přerušení .)
0 DS
0 ES
0 SS - V86 Procesu
0 SP - V86 Procesu
EFLAGS VM = 1
0 CS
0 IP
Chybový kód
SS:ESP ─────────>
Po předání řízení budou DS,ES,FS a GS nulové (neplatný selektor).
Je potřeba je inicializovat. Po ukončení IRET obnoví původní hodnoty.
Není tedy třeba je PUSHnout a pak POPnout.
Ve V86 módu hlásí chybu tyto instrukce :
LGDT, LIDT, *SGDT, *SIDT, *LSL, LAR, *ARLP, LLDT, *SLDT, *VERW, *VERR,
LMSW, *MOV xxx,CR?, MOV CR?,xxx, *MOV xxx,DR?, MOV DR?,xxx,
*MOV xxx,TR?, MOV TR?,xxx, CTS, HLT, LTR a *STR
Hodný správce VM by mohl povolit ohvězdičkované instrukce ( provede,
co VM chce sám s CPL =0 ), ale není to podmínkou. Mezi zakázanými
instrukcemi není SMSW, tak VM proces může zjistit, že není v real módu
a chovat se podle toho. Blíže viz Registry procesoru
Pokud pole IOPL v EFLAGS neobsahuje hodnotu 11b, pak chybu způsobí
i tyto instrukce :
INT n, INTO, INT 3 (CCh), IRET, STI, CLI, PUSHF a POPF.
Správce VM MUSÍ všechny tyto instrukce emulovat - jinak by VM proces
nepracoval.
Pokud IOPL je 11b, pak VŠECHNY vektory v IDT musí obsahovat kód, který
vyvolá původní obsluhu přerušení. Není to ale moc šikovné a užívané.
Ve V86 módu ( vždy CPL = 3 ) NEVYVOLAJÍ chybu instrukce IN, OUT, INS a
OUTS, pokud TSS VM procesu má v neformátované části odkazující na I/O
samé 0. Pokud jsou některé porty zakázány, může přijít i chyba z I/O.
Chybový kód je pak stejně 0. Viz TSS
2. Chyby z PROTECTED MÓDu . Bit VM v EFLAGS na stacku je 0.
Vše 32 - bitové (386,486)
Nebo 16-bitové (286) , 386 a 486 v 16 - bit zprac.
( 0 ) SS - Přerušeného
(E)SP - Přerušeného
(E)FLAGS
( 0 ) CS
(E)IP
SS:(E)SP ---->
Chyby vyvolává :
Pro CPL > 0: LIDT, SIDT, LGDT, SGDT, LMSW, MOV CR?,xxx, MOV xxx,CR?,
MOV xxx,DR?, MOV DR?,xxx, CTS, HLT, MOV TR?,xxx a MOV TR?,xxx
Pro CPL > IOPL : IN, OUT, INS, OUTS, STI a CLI
Navíc se zde objeví i chyba z I/O pro CPL>0, je-li v TSS zakázán
příslušný port.
Chyby z I/O dávají chybový kód 0.
3. Chyby se souvislostí s CPL , DPL , RPL , EPL a DPL . Objeví-li
se podezřelá akce, kterou Systém ochrany nechce uznat, objeví se
zde hlášení. Chybový kód může být jakýkoliv (tedy i 0, bohužel) ;
pokud je nenulový, udává deskriptor, který chybu zavinil.
Chyby se nejčastěji objevují při pokusu změnit svou CPL , použít
zakázaný deskriptor, přímé volání kódu s vyšší i nižší (!) prioritou
použití příliš privilegovaného INTu a i příliš vysoká (!) priorita
pro použití konformního segmentu. Viz Systém ochrany .
Chybový kód :
Bity :
15 3 2 1 0
┌─────────────────────────────┬──┬──┬──┐
│Index v tabulce Deskriptorů │ │ │ │
└─────────────────────────────┴──┴──┴──┘
│ │ └─ 1=k chybě došlo během INT (výjimka)
│ └──── 1=k chybě došlo během INT (přerušení)
└─────── 1=LDT 0=GDT
Pro 486 se zde objeví i chyba adresace koprocesoru, dříve (286 a 386)
INT 09 .
Je to všechno marný, obslužná rutina stejně musí analyzovat kód. Pokud to
není přerušení z V86, pak je nejlepší viníka zrušit. Po opuštění MUSÍ být
chyba odstraněna. Jinak dojde k zacyklení.
Systém ochrany V86 MÓD PROTECTED MÓD Registry procesoru
IRQ Přerušení CPU Zpracování přerušení LPT - INT 0D
INT 0E - chyba stránkování
Veškeré chyby spojené se Stránkováním jsou hlášeny zde. K chybě dojde jen
na 386 a 486. Vrchol zásobníku obsahuje chybový kód, který popisuje provinilou
stránku.
Bity :
15 3 2 1 0
┌─────────────────────────────┬──┬──┬──┐
│ Rezervováno │ │ │ │
└─────────────────────────────┴──┴──┴──┘
│ │ └─ 0=stránka nepřítomna (P=0)
│ └──── 0=k chybě došlo během čtení
│ 1=k chybě došlo během zápisu
└─────── 1=chyba v souvislosti s CPL=3
0=chyba v souvislosti s CPL>3
V CR2 registru je uložena lineární adresa, která způsobila INT 0E.
Chyby INT 0E jsou :
1. Požadovaná stránka není přítomna.
2. Program s CPL =3 použil stránku s U=0
3. Program s CPL =3 zapisoval do stránky s W=0
Konečně výjimka, která má jasně dané příčiny vzniku. Obsluhovat INT 0E je
slast. Jediný problém může být natáhnout příslušnou stránku z disku.
Obsluha INT 0E musí chybu odstranit, jinak se zacyklí.
!! POZOR !! INT 06 , INT 07 , INT 09 , INT 0A , INT 0B , INT 0C ,
INT 0D , INT 10 nebo INT 11 vyvolané v průběhu
INT 0E způsobí INT 08 , tedy RESET !!!
Jak natáhnout vypadlou stránku
Pokud si přečtete popis 80X86, X>=2, budou pravděpodobně vychvalovat možnost
virtualizace paměti mechanismem Deskriptorů a Stránkování . Pravda je, že
procesor cosi takového zajišťuje, ale provádět virtualizaci není až zas tak
jednoduché. Problémy jsou 2 : DOS a BIOS.
Stránky budou uloženy na disku v souboru. Pokud se chceme chovat slušně, tedy
ne jako programátorští řezníci nebo salámisti, budeme k souborům přistupovat
přes Funkce DOSu . DOS je však funkční jen v REAL MÓDu maximálně ješte ve
V86 MÓDu . DOS během čtení používá BIOS, tedy Disk INT 13 , který rovněž
NESMÍ být volán z PROTECTED MÓDu .
Vlastní načtení tedy proběhne buď v REALu nebo ve V86. Potud vše OK.
REAL : Rutina obsluhující INT 0E, ale i rutiny obsluhující INT 0C nebo
INT 0B budou pracovat s CPL =0, tedy přepnutí nebude problémem.
Mají povoleny všechny Privilegované instrukce .
Ale pozor ! Před spadnutím do REALu je třeba vypnout stránkování,
pak přepnout RM, načíst požadovanou část souboru, přepnout do PM
a nakonec zapnout stránkování. Dost fuška.
V86 : Mohlo by se zdát, že použití V86 k načtení bude bezproblémové.
Stačí si vystavit jeden malý TSS , který spustí krátký prográmek ve
V86 nebo Pushnout na zásobník strukturu jako při přerušení, provést
IRET, prográmek načte požadované, zavolá jakýsi INT a tam si zase
vezmeme řízení...
Ale pozor ! Pokud použijete přepnutí pomocí TSS, pak s největší
pravděpodobností dojde k vyvolání INT 0C nebo INT 0A a CPU
to nevydrží ( viz INT 08 ). Proto NEDOPORUČUJI používat TSS
pro obsluhu INT 0E. Ani volání obsluhy pomocí brány TSS !
Pokud použijete při virtualizaci metodiku s IRET je velmi důležité
správné nastavení pole IOPL . I zde jsou 2 možnosti :
1. IOPL =3. Poměrně kaskadérský kousek, který se nemusí vyplatit.
Je třeba předělat celou IDT, aby provedení INT z V86 správně předalo
řízení. Je třeba si uvědomit, že nám Bill svým MS-BOSSem hází klacky
pod nohy, poněvadž v průbehu INT 21 stále povoluje IRQ , kde může
viset kdeco ( třeba i AThelp ). Pokud swapujete na floppy
( CHA CHA CHA ! ), pak se určitě vyskytne Floppy - INT 0E , některé
HD si generují jakási svá IRQ a pokud se swapuje na síťový disk,
karta Ethernet ( nebo podobná ) si při ukládání jakési přerušení taky
vyžádá. VŠECNY vektory IDT tedy musí obsahovat kód, který upraví V86
zásobník a předá řízení podle tabulky vektorů pro RM. Všecny kromě
jednoho, kde budeme čekat návrat z V86. ( ještě lépe je použít
výhybku a kontrolovat odkud že je ten konečný INT volán... )
Popis metodik volání INT z V86 je podrobně popsán v kapitole
Zpracování přerušení
2. IOPL < 3. Zde NENÍ třeba překopat celou IDT, ale jen navíc obsadit
INT 0D a tam kontrolovat návrat. Ale musíme navíc ošetřovat i IRET,
CLI a STI .....
Jinak je tento systém jednodušší a rychlejší, a proto je využíván
častěji. Pozornému čtenáři jistě neuniklo, že se během obsluhy
INT 0E tímto stylem URČITĚ nejednou vyvolá INT 0D ( pro každou
z instrukcí CLI, STI, INT a IRET použitou ve V86 ). A to ovšem
v souvislosti s poznámkou výše o vnořeném volání výjimek znamená,
že se tedy bude RESETovat. Není to pravda. Hrozba RESETu platí
pouze pro tu část rutiny od vyvolání INT do prvního IRET. A V86
jsme spustili právě IRET. Takže vše je OK.
Popis metodik volání INT z V86 je podrobně popsán v kapitole
Zpracování přerušení
Vytvořit opravdu kvalitní virtualizaci není sranda. Schéma 1 ukazuje
součinnost DOSu a BIOSu při virtualizaci :
PM Program -> INT 0E Obsluha INT Obsluha INT
│ ▲ │ ▲ │
──────────────────┼───────┼────────┼────────────┼────────┼──────────────────
▼ │ ▼ │ ▼
V86 DOS ─> Int 21 Přístup -> INT 13 Přístup na disk
k souboru
a analogicky pro IRET zpátky ...
Windows 3.1 podporují 32 bitový přístup na disk. Je to sice prasárna, ale
zjednoduší to schéma uvedené nad :
PM Program -> INT 0E Obsluha INT Přístup na disk
│ ▲ │ ▲
──────────────────┼───────┼────────┼────────────┼──────────────────────────
▼ │ ▼ │
V86 DOS ─> Int 21 Přístup -> INT 13
k souboru
Windows for Workgroups 3.11 to ještě zjednodušily :
PM Program -> INT 0E -> Přístup k souboru -> Přístup na disk
───────────────────────────────────────────────────────────────────────
V86
Sice je to hezké, ale ne všechna média tak lze obsloužit. Třeba na RAM disk
je třeba přistupovat poslušně přes DOS.
Zde já vidím nejslabší stránku PC a DOSu, díky kterému se Windows prosadí.
Systém ochrany IRQ Stránkování Floppy - INT 0E
Registry procesoru Přerušení CPU
INT 0F
Tento int si INTELOVé vyhradili a neměl by být použit. (Pozdě hoši, pozdě..)
Standardně je zde totiž obsluha IRQ od LPT 1.
Viz IRQ a LPT - INT 0F Přerušení CPU
INT 10 - Chyba činnosti koprocesoru
INT 10 je hlášen při jakékoliv chybě práce UVNITŘ koprocesoru, která není
maskovaná ?M bitem v CW. Např. přetečení, podtečení, dělení nulou, odmocnina
ze záporného čísla atp. Obsluha INT 10 musí "vysypat" celý obsah koprocesoru
FNSAVE a zjistit, proč kopr bojkotuje. Pak provést "opravu" tak, aby výpočet
mohl pokračovat. Chyba musí být odstraňena před IRETem (zacyklení) .
Pozn.: To, co je na stacku (CS, (E)IP) NENÍ adresa špatné instrukce, ale
další instrukce koprocesoru. Adresa té, jež chybu provedla má
koprocesor uloženou v FCS:FIP a lze jí zjistit pomocí F(N)SAVE.
Registry Procesoru Přerušení CPU INT 09 Registry koprocesoru
Koprocesory Instrukce koprocesoru
Chyba zarovnávání - jen 486
Výjimka INT 11 je hlášena CPU pro programy s CPL =3, CR0 bit AM=1 a EFLAGS
bit AC=1, pokud nesplůjí při práci s daty následující podmínky:
Operand Adresa (musí být dělitelná)
BYTE 1 - kdekoliv (naštěstí)
WORD 2 - sudá
DWORD 4 - (už to houstne)
SINGLE REAL (4 BYTE) 4
DOUBLE REAL (8 BYTE) 8
SELEKTOR 2
48 bitový ukazatel 4 (32 bitové prostředí)
32 bitový ukazatel 4 (16 bitové prostředí)
LGDT, LIDT 4
Řetězec bvitů 4
Je to jen jedna velká buzerace. Obslužná rutina by asi měla načíst hodnotu
jak to chce proces s CPL =3 a předat ji, jakoby se nechumelilo. Je to dobrý
tak na 2 věci ... Ale nechá se tak poznat 486 !
Registry Procesoru Přerušení CPU
Procesory užívané v PC
Procesory používané v PC se postupem času vyvíjely (těžko řící, zda k lepšímu
nebo k horšímu). Pro programátora PC může být jen černou můrou, že jich
INTELové vyvinuli tolik. Posuďte sami :
8086 ─┐
8088 │
V20 │
V30 │
V40 │
V50 │
80186 │
80188 │
80286 │
80386SX ├── Celkem je to 16 různých typů.
80386DX │ Budiž nám IBM, INTEL a Microsoft milostiv.
80486SX │ ( Skoro jako svatá trojice, ne ? )
80486DX │
80486DX/2 │
80486DX/4 │
Pentium ─┘
Mezi oblíbené programátorské sporty patří i Detekce procesoru a také
Detekce koprocesoru na kterém program běží. Díky některým chybám
strojoven od INTELu to jde.
Registry procesoru Systém ochrany Formát dat koprocesoru Adresace
Stránkování REAL MÓD PROTECTED MÓD V86 MÓD Deskriptor
Koprocesory Zpracování přerušení
Procesor 8086
Pod tento typ spadají procesory 8086, 8088, V20, V30 a 80186. Jejich
společným znakem je, že patří do šrotu. Pracovaly pouze v REAL MÓDu a
svojí taktovací frekvencí ( 4.77 MHz ) se hodily tak na hraní piškvorek.
80186 a 80188 je vůbec nejmíň rozšířený, je to určitý mezityp : má některé
nové instrukce 80286 , ale neobsahuje PROTECTED MÓD .
V20 a V30 lze nalézt jen v pohádkách a laptopech. Je to jen trochu dražší
a ( prý ) méně energeticky náročná varianta 8086.
V40 a V50 jsem nikdy nevidě, nikdy jsem o nich nic nečetl, ale prý existují.
8086 a 8088 se staly základem série PC. Staré dobré XT s nimi trochu
fungovalo, ale tenkrát nebyly MS-Windows a podobně rychlé a paměťově
nenáročné aplikace. Dnes po nich zbyl proklínaný způsob Adresace a
solidní základ programového vybavení psaného pro REAL MÓD .
Procesory Registry procesoru Instrukce 8086
Procesor 80286
Trochu vylepšený 8086 se poměrně dlouho udržel na výsluní. Byl rychlejší
než 8086, měl některé užitečné instrukce a základ PROTECTED MÓDu . Tato
novinka se však téměř vůbec neujala ( s tím INTEL asi nepočítal ) . Není se
co divit : bylo napsáno příliš mnoho programů pro 8086, které by v PROTECTED
MÓDu nefungovaly, v PM nelze použít BIOS ani DOS a hlavně u INTELu nedali
286-kám možnost PM shodit (Jen resetem). To oblibě PM neprospělo a tak
téměř všichni PM ignorovali. Sice se tím ochudili o rozšířemou paměť nad
1 MB, ale to moc nebolelo, protož průměrná 286-ka měla právě 1 MB RAM.
Adresní sběrnice 80286 je 24 bitů (fyzicky jen 23, ale vždy se pracuje
s WORDem), to dává 16 MB paměti, kterou je možno adresovat.
Procesorům 80286 odzvonil 80386SX a 80386DX Stránkováním , V86 MÓDe m
a 32 bitovou arcitekturou.
Procesory Deskriptor Instrukce 80286
Nové registry 286
Procesor 80386SX
Jedná se o levnější variantu 80386DX , jen trochu pomalejší. Jeho sběrnice
je pouze 16 bitová, ale vnitřně skládá 2 WORDy, a tak se může tvářit jako
32 bitový procesor. Jediný rozdíl mezi 80386SX a 80386DX je v rychlosti,
toho se využívá i Detekce procesoru .
Adresace procesorů INTEL
Pojmem adresace rozumějte způsob přístupu do paměti a zobrazování informací
v ní.
Všechny procesory INTEL mají data uložena obráceně - tedy nejméně významný
byte první. V praxi to zmanená (1 písmeno je jedna hexa cifra) :
Jednotka Hodnota Uložení v paměti
BYTE BB BB
WORD HiLo Lo,Hi
DWORD HIhiLOlo lo,LO,hi,HI
POINTER 32 SSss:OOoo oo,OO,ss,SS
POINTER 48 SSss:OHOhoLol ol,oL,Oh,OH,ss,SS
Pro začátečníka se to může zdát komplikované, ale je to jen věc zvyku. Navíc
systém LoHi umožňuje snadné přetypování.
Adresování - Reálný mód práce
Adresa se vždy skládá ze dvou částí - segmentu a offsetu. Výpočet lineární
adresy je následující :
Instrukce např. : Mov al, es:[di] es= 1234h
di= 4567h
Lineární adresa = 16d*Segment+Offset, zde tedy 16d*1234h+4567h
Zde dokonce má lineární adresa stejnou hodnotu jako Fyzická adresa v paměti.
Segment i offset jsou WORDy. Celkem lze obsáhnout 10FFFO adres, tedy
1114096 byte.
Je tu jeden háček : 8086 měl 20 bitů adresní sběrnice, obsáhl tedy 1048576
byte. Zbývajících 65520 byte se cyklicky promítalo zpět, sobě odpovídaly
adresy 0FFFFh:0000h a 0000h:0010h, 0FFFFh:0001h a 0000h:0011h ... atd.
S příchodem 80286 se sběrnice rozšířila a nebylo důvodu, proč adresy
promítat cyklicky zpět. Nově vzniklý prostor se nazývá HMA (High Memory
Area) a je oblíbeným hnízdem DOSu. Příkaz DOS=HIGH provede přesunutí dat
DOSu do HMA.
Někdo velmi inteligentní se domníval, že existuje tak ztřeštěný program pro
8086, který segment 0000 adresuje pomocí segmentu 0FFFF. A tak v zájmu ještě
vyšší kompatibility zavedl A20 bránu . Ta, pokud je povolena, nedělá nic
a nechává existovat HMA. Pokud je zakázána, nuluje 20. adresní linku procesoru
a efekt XT je na světě. Ovládání A20 provádí XMS driver pomocí portů PPI.
Pro normální program je A20 povolena. Některé systémy ani nedovolují
A20 zakázat.
Pokud program pracuje v PROTECTED MÓDu , je nutné mít A20 povolenu, jinak
každá operace s pamětí přes 1.MB vyvolá (pravděpodobně) chybu.
PROTECTED MÓD
Adresování v PM je poněkud složitější, je s ním více zábavy a více zamlžuje.
V systému existují 2 tabulky, které obsahují Deskriptory , jež popisují
jednotlivé úseky paměti. Pro adresaci je důležitý začátek bloku. Toto 24
bitové číslo ( 80286 ) nebo 32 bitové číslo ( 80386SX , 80386DX , 80486SX
nebo 80486DX ) udává lineární adresu začátku bloku. K této adrese je
připočten offset (16 nebo 32 bitů) a tak je získána Lineární adresa .
Konkrétní případ :
ds=0026 <----- důležité jsou bity 15 .. 3
si=1589 0000000000100 - tedy 4.deskriptor
│ │
│ Tabulka GDT (nebo LDT) │
│ ---> 0,0,0,0,0,0,0,0 (tzv. falešný deskriptor) │
│ 1. Deskriptor │
│ 2. Deskriptor │
│ 3. Deskriptor │
│ 4. Deskriptor <─┬───────────────────────┘
│ ........ └ zde přečíst začátek
│ (třeba 013800, 24 bitů pro 80286)
└────────────────── + ─────────────────────┘
001589 + 013800
Lineární adresa : 014D89
Pokud tedy provedeme Mov ax,ds:[si], pak procesor provede celou anabázi
popsanou nad. Podle stavu Stránkování je lineární adresa buď přímo využita
jako Fyzická adresa ( PG bit v CR0 je 0 ) nebo je přepočtena na fyzickou
adresu (PG v CR0 je 1, jen 80386 a lepší ) pomocí Stránkování .
Rozdíl tedy spočívá ve využití segmentového registru. V Reálném adresování
segmentový registr udával přímo část adresy, zde záleží na obsahu tabulky
deskriptorů. Struktura deskriptoru - viz Deskriptor .
Segmentový registr má 13 nevvyšších bitů využitých jako index do tabulky
deskriptorů. Význam nižších bitů :
Bity :
15 3 2 1 0
┌─────────────────────────────┬───┬───────┐
│ Index v tabulce │ L │ XPL │
└─────────────────────────────┴───┴───────┘
Viz též Selektor │ └─┴─ CPL nebo RPL
└──────── 1=LDT 0=GDT
Jak bylo uvedeno výše, existují 2 tabulky deskriptorů - globální a lokální.
Výběr mezi nimi je určen bitem 2. Pole označené CPL nebo RPL má význam
v systému ochrany, viz kapitola Systém ochrany .
Jak vidět, během jednoho přístupu do paměti se toho musí hodně přečíst
odjinud ( GDT, LDT ). Každý segmentový registr má svou cache, kam procesor
po instrukci např. Mov ds,ax načte celý deskriptor. Tato cache je pro
programátora neviditelná a může být měněna zároveň se změnou Selektoru
segmentu. Má to jediný důsledek - změna hodnot v tabulce deskriptorů se
projeví až po znovunačtení segmentového registru. A hlavně to zrychlí
práci CPU.
Adresování V86 mód
Adresování je stejné jako pro Reálný mód, pouze zůstává v činnosti systém
Stránkování , proto může existovat více V86 procesů v paměti zároveň a lze
je přepnout pouhou změnou TSS . Lineární adresa určená výpočtem ve stylu
16*Segment+Offset je na rozdíl od adresování v reálném módu přepočtena systémem
Stránkování a tak teprve vznikne Fyzická adresa .
Registry procesoru Systém ochrany Formát dat koprocesoru Procesory
Stránkování REAL MÓD PROTECTED MÓD V86 MÓD Deskriptor
Koprocesory Zpracování přerušení
Registry procesoru
Obecné registry
Bity :
31 16 15 8 7 0
┌─────────────────────────┬────────────┬────────────┐
│ │ AH │ AL │
│ ├────────────┴────────────┤
│ (jen 80386 a 80486 ) │ AX │ Aritmetické
│ └─────────────────────────┤ operace
│ EAX │
└───────────────────────────────────────────────────┘
┌─────────────────────────┬────────────┬────────────┐
│ │ BH │ BL │
│ ├────────────┴────────────┤
│ (jen 80386 a 80486 ) │ BX │ Adresování
│ └─────────────────────────┤
│ EBX │
└───────────────────────────────────────────────────┘
┌─────────────────────────┬────────────┬────────────┐
│ │ CH │ CL │
│ ├────────────┴────────────┤
│ (jen 80386 a 80486 ) │ CX │ Počítač cyklů
│ └─────────────────────────┤
│ ECX │
└───────────────────────────────────────────────────┘
┌─────────────────────────┬────────────┬────────────┐
│ │ DH │ DL │
│ ├────────────┴────────────┤
│ (jen 80386 a 80486 ) │ DX │ Přístup I/O portům
│ └─────────────────────────┤ Aritmetika
│ EDX │
└───────────────────────────────────────────────────┘
Indexové registry
31 16 15 0
┌─────────────────────────┬─────────────────────────┐
│ (jen 80386 a 80486 ) │ SI │
│ └─────────────────────────┤ Adresace
│ ESI │
└───────────────────────────────────────────────────┘
┌─────────────────────────┬─────────────────────────┐
│ (jen 80386 a 80486 ) │ DI │
│ └─────────────────────────┤ Adresace
│ EDI │
└───────────────────────────────────────────────────┘
┌─────────────────────────┬─────────────────────────┐
│ (jen 80386 a 80486 ) │ SP │
│ └─────────────────────────┤ Ukazatel zásobníku
│ ESP │
└───────────────────────────────────────────────────┘
┌─────────────────────────┬─────────────────────────┐
│ (jen 80386 a 80486 ) │ BP │
│ └─────────────────────────┤ Adresace
│ EBP │
└───────────────────────────────────────────────────┘
┌─────────────────────────┬─────────────────────────┐
│ (jen 80386 a 80486 ) │ IP │
│ └─────────────────────────┤ Ukazatel kódu
│ EIP │
└───────────────────────────────────────────────────┘
Segmentové registry
15 0 Neviditelná část (80286 a výš), 56 bitů 286
Nedokumentované instrukce 96 bitů 386
┌─────────────────────────┬─────────────────────────────────────────┐
│ CS │ CACHE │ kód
└─────────────────────────┴─────────────────────────────────────────┘
┌─────────────────────────┬─────────────────────────────────────────┐
│ DS │ CACHE │ data
└─────────────────────────┴─────────────────────────────────────────┘
┌─────────────────────────┬─────────────────────────────────────────┐
│ ES │ CACHE │ data
└─────────────────────────┴─────────────────────────────────────────┘
┌─────────────────────────┬─────────────────────────────────────────┐
│ SS │ CACHE │ stack
└─────────────────────────┴─────────────────────────────────────────┘
Jen 386,486
15 0 Neviditelná část
┌─────────────────────────┬─────────────────────────────────────────┐
│ FS │ CACHE │ data
└─────────────────────────┴─────────────────────────────────────────┘
┌─────────────────────────┬─────────────────────────────────────────┐
│ GS │ CACHE │ data
└─────────────────────────┴─────────────────────────────────────────┘
Příznaky (E)FLAGS
Bity
15 14 1312 11 10 09 08 07 06 05 04 03 02 01 00
┌──────────────────────────────────────────────────┐
│ 00 NT IOPL OF DF IF TF SF ZF 00 AF 00 PF 01 CF │
└──────────────────────────────────────────────────┘
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
┌─────────────────────────────────────────────────┐
│ 00 00 00 00 00 00 00 00 00 00 00 00 00 AC VM RF │
└─────────────────────────────────────────────────┘
Význam :
CF - Carry flag - Přenos mezi BYTy, WORDy a DWORDy.
PF - Parity flag - 1 pro sudý počet 1 ve výsledku.
AF - Pomocný flag přenosu - 1 pro přetečení mezi bity 3 a 4.
Je užívaný BCD matematikou.
ZF - Nastaven na 1 pro výsledek 0.
SF - Znaménko. Obraz nejvyššího bitu výsledku. 1 pro záporné.
TF - Trap flag. Krokování. Viz INT 01
IF - Interrupt flag. 0 zakazuje IRQ
DF - Směr zpracování instrukcí STOS, SCAS, MOVS, LODS, INS, OUTS a CMPS.
0 pro vzrůstající, 1 pro klesající.
OF - Aritmetické přetečení. Viz INT 04
IOPL - 2 bity. Udává úroveň priority, kde lze provádět I/O operace.
Viz IOPL . Pouze 286, 386 a 486.
NT - Je-li NT=1 a VM=0 provede následující IRET přepnutí úloh podle LINK
ukazatele TSS . Pouze 286, 386 a 486.
RF - Restart instrukce - Je-li 1, pak se opakovávaně nevolá ladicí aparát.
Automaticky se nuluje po provedení každé instrukce.
Viz Hardware Breakpoints . Pouze 386 a 486.
VM - V86 flag. Je-li 1, pak je CPU ve V86 MÓDu . Pouze 386 a 486.
AC - Kontrola zarovnávání - Je-li 1 a zároveň AM v CR0 =1, pak se provádí
test zarovnávání. Viz INT 11 . Pouze 486.
Poznámka : Některé bity se tváří, jako že jsou a přitom nejsou.
Následující kód nefunguje :
... jsme na 386 ..
Pushfd ;cele eflags
Pop eax
And eax, 00020000h ;test VM
jz real
jnz V_86
..........
Systém se tváří, že je stále reálný mód. Před PUSHnutím se VM automaticky
maskuje na 0. Obraz VM lze zjistit jedině :
... předpoklad : jsme DOSovská aplikace, tedy buď real, nebo V86 ...
SMSW ax ;neprivilegovaná instrukce !!!!!!
;nenásleduje INT 0D
Shr ax,1 ;PE bit ->CF
Jc V_86
Jnc Real
...... a ted to je ok ....
Pokud se někdo domnívá, že si přilepší, když provede následující (V86 i
PM) pak je silně naivní :
Pushfd
Pop eax
Or ax,6000h ;IOPL = 3, všichni můžou I/O
Push eax
Popfd
... a ejhle, IOPL se nezměnilo, na to musí bejt CPL=0
... a VM nezmění ani CPL=0, tam musí jít volání přes TSS nebo IRET s CPL=0
... NT lze měnit volně
... AC jen s CPL =0
Podrobnosti : Systém ochrany .
Počínaje 286, procesory INTEL obsahují další registry, které spolupracují
se systémem ochrany. Jsou to:
Nové registry 286 Nové registry 386 Nové registry 486
Přidané registry 80286
Počínaje 286, objevily se instrukce a registry pro práci s ochranou, které 8086
memělo. Jsou to :
MSW - Machine Status Word
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
┌─────────────────────────────────────────────────┐
│ 00 00 00 00 00 00 00 00 00 00 NE ET TS EM MP PE │
└─────────────────────────────────────────────────┘
PE - Protection enable - PE=1 znamená, že procesor provozuje
PROTECTED MÓD nebo V86 MÓD
PE=0 znamená REAL MÓD
MP - Math Present - MP=1, je li přítomen koprocesor
(Na 286 je to nejlepší způsob detekce přítomnosti koprocesoru.)
Smsw ax
And ax,02
Jz 80X87_nepřítomen
Jnz 80X87_přítomen
SMSW nepatří mezi Privilegované instrukce , nezpůsobí tedy INT 0D
ani pro CPL > 0. Doporučuji i pro 386 a 486.
EM - Emulation - Je-li EM = 1 , pak je přítomen emulátor koprocesoru.
Je-li EM=0 a MP=0, pak si uživatel musí připravit logaritmické
pravítko a provádět výpočty sám.
Je-li MP=0 a procesor narazí na instrukci koprocesoru, pak pro
EM = 1 provede INT 07 jinak INT 06 . Emulátor by teoreticky
mohl mít EM = 0 , viset na INT 06 a kontrolovat všechny optrapy
a rozlišovat instrukce koprocesoru, ale nadřel by se podstatně víc,
než, když nastaví EM na 1.
TS - Task switched - Procesor nastaví TS na 1 po každém přepnutí úloh.
(změna TR). Je to podpora multitaskingu, aby se nemusel po každém
přepnutí uschovávat obsah koprocesoru (FNSAVE trvá příliš dlouho).
Task manager tedy přepne úlohy a zkusí, co to udělá. Pokud nová
úloha "sáhne" na koprocesor, ohlásí se výjimka INT 07 . Správce
úloh pak musí opravdu vyklopit kopr a načíst do něj nová data.
Poté provede CTS a shodí TS.
Pozn. : jednou z mála možností, jak zjistit, jsme - li táskováni je právě
TS. Pokud tomu tak je, a NEPROVEDEME-LI žádnou instrukci koprocesoru,
stačí prostě přečíst MSW ( Smsw NENÍ privilegovaná instrukce ! ) a
podle stavu TS určit, kolik uhodilo. Uvedený postup však selže,
je-li :
■ použito přepínání úloh jinak než aparátem procesoru a TSS ( např.
dos's hell )
■ správce je pečlivý a důsledný natolik, že sám koprocesor
inicializuje po každé změně úloh a TS bude vždy 0
■ běhm spouštění dojde k instrikci koprocesoru ( Command.com to
nedělá, ale některá z nadstaveb OS může )
Obecně platí pouze implikace TS => táskování. Je-li TS nastaven, pak
jsme URČITĚ táskováni, ale je-li TS 0 nelze jednoznačně rozhodnout.
ET a NE - lze číst Smsw, ale na 286 vždy 0.
ET - 386
NE - 486
Při práci s MSW se vyplatí opatrnost. Je lepší bity 2x přepočítat, než
10x RESETovat. Pokud má být provedena změna MSW, pak se zápis provede
Lmsw. POZOR !!! Následující kód nefunguje !!
Smsw ax
And al,0feh ; shodit PE
Lmsw ax ; stále PE=1
Intelové nepředpokládali, že by snad někdo chtěl PROTECTED MÓD opustit.
Ale najdou se i takoví, kteří tvrdí, že to jinak nejde (čtení z disku,
BIOS, DOS, VGA-BIOS ..). Chcete-li shodit PE, pak to lze pomocí CR0
registru 386 nebo RESETem 286.
Podrobnosti viz PROTECTED MÓD a Nové registry 386 .
GDTR - Global Descriptor Table Register
Bity:
55 40 39 16 15 0
┌────────┬──────────────────────────────────┬───────────────────────┐
│00000000│ Lineární adresa │ Délka │
└────────┴──────────────────────────────────┴───────────────────────┘
Velikost GDTR je 48 bitů, tedy 6 BYTE, ale nejvyšší BYTE je nevyužit (286).
Naplnění se provede z REAL MÓDu následovně:
Data segment public para
Align 4
GDT_data .....
.....
.....
GDT_end
Align 4
GDTLimit dw offset GDT_end-GDT_data-1
GDTLo dw ?
GDTHi db ?
Dummy db 0 ; 386,486 nejvyšší BYTE
..
Data ends
code segment public use16 para
assume cs:code,ds:data
Mov ax,seg data
Shl ax,4
Add ax,offset GDT_data ; zde může vypadnout CF
Mov [GDTlo],ax ┌────────────┘
Mov ax,seg data ▼
Sbb al,al ; Je-li CF=0, al=0, jinak al=FF
Neg al ; al=0, al=01
Shr ah,4
Add al,ah
Mov [GDThi],al
Lgdt qword ptr [DLimit] ; GDT naplňena
....
Využití - viz Adresace
LDTR - Local Descriptor Table Register
Bity: 15 3 2 0 Neviditelná část
┌──────────────────┬───┬───────────────────────────┐
│ Položka v GDTR │000│ 48 bitů CACHE (jako GDTR) │
└──────────────────┴───┴───────────────────────────┘
LDTR plnit až v PROTECTED MÓDu a s CPL =0 !
Využití - viz Adresace
TR - Task Register
Bity: 15 3 2 0 Neviditelná část
┌──────────────────┬───┬─────────────────────────────────┐
│ Položka v GDTR │000│ 48 bitů CACHE (jako GDTR) + TYP │
└──────────────────┴───┴─────────────────────────────────┘
Využití - multitasking, obsahuje TSS aktivního procesu.
Viz také Deskriptory .
IDTR - Interrupt Descriptor Table Register
Bity:
47 40 39 16 15 0
┌────────┬──────────────────────────────────┬───────────────────────┐
│00000000│ Lineární adresa │ Délka │
└────────┴──────────────────────────────────┴───────────────────────┘
Velikost IDTR je 48 bitů, tedy 6 BYTE, ale nejvyšší BYTE je nevyužit (286).
Naplnění se provede z REAL MÓDu nebo PROTECTED MÓDu s CPL =0.
IDT je využita i v REAL MÓDu , jestliže dojde ke změně v PROTECTED MÓDu ,
je třba IDT vrátit do původního stavu před povolením INTů.
Využití - viz Zpracování přerušení .
Podrobnosti o uložení polí GDTR, IDTR TR a LDTR v procesoru naleznete
v oddílu Nedokumentované instrukce
Registry procesoru Nové registry 386 Nové registry 486
Přidané registry 80386
Procesor 80386 obsahuje několik dalších registrů, takže někdy má vyšší
kapacitu, než volná operační paměť.
386 zachovává vzestupnou kompatibilitu, podporuje tedy všechny
Nové registry 286 . V některých místech však dochází ke změnám:
Obecné registry mají rozšíření :
AX --> EAX BX --> EBX CX --> ECX DX --> EDX
SP --> ESP BP --> EBP DI --> EDI SI --> ESI
IP --> EIP
Bohužel, nelze přímo použít horní word Eregistru. Chceme-li tedy měnit jen
bity 16 .. 31, pomůže pár malých fíglů :
.... bity ECX 16 .. 31 mají být 0, do CX načíst WORD odněkud ........
Špatně Správně
Xor ecx,ecx Movzx ecx,word ptr ds:[www]
mov cx,word ptr ds:[www]
.... potřebuju změnit bity 16..31 EDI , ale zachovat bity 0..15 ...
Špatně Správně
Push di Rol edi,16
Shr edi,16 .. akce
.. akce Rol edi,16
Shl edi,16
Pop di
... word na ds:[di] má být znaménkově rozšířen do EAX
Špatně Správně
Mov ax,word ptr ds:[di] Movsx eax, word ptr ds:[di]
Cwd nebo
Xchg ax,dx Mov ax, word ptr ds:[di]
Shl eax,16 Cwde
Mov ax,dx
To, co je "Špatně" sice funguje, ale trvá 2x-4x déle. Někdy je to zatraceně
znát ...
GDTR - Global Descriptor Table Register
Bity:
47 16 15 0
┌──────────────────────────────────────────┬───────────────────────┐
│ Lineární adresa │ Délka │
└──────────────────────────────────────────┴───────────────────────┘
Velikost GDTR je 48 bitů, tedy 6 BYTE. Nejvyšší BYTE je už využit.
Lineární adresa může být až 4 GB, ale tak velkou RAM stejně nikdo
nikdy neviděl. Naplnění se provede z REAL MÓDu následovně:
Data segment public para
Align 4
GDT_data .....
.....
.....
GDT_end
Align 4
GDTLimit dw offset GDT_end-GDT_data-1
GDTlin dd ?
..
Data ends
code segment public use16 para
assume cs:code,ds:data
Movzx eax,seg data
Shl eax,4
Movzx ebx,offset GDT_data
Add eax,ebx
Mov dword ptr [GDTLin],eax
Lgdt [GDTLimit]
....
Využití - viz Adresace
IDTR - Interrupt Descriptor Table Register
Bity:
47 16 15 0
┌──────────────────────────────────────────┬───────────────────────┐
│ Lineární adresa │ Délka │
└──────────────────────────────────────────┴───────────────────────┘
Velikost IDTR je 48 bitů, tedy 6 BYTE. Nejvyšší BYTE je už využit.
Naplnění se provede z REAL MÓDu nebo PROTECTED MÓDu s CPL =0.
IDT je využita i v REAL MÓDu , jestliže dojde ke změně v PROTECTED MÓDu ,
je třba IDT vrátit do pivodního stavu před povolením INTů.
Využití - viz Zpracování přerušení .
LDTR - Local Descriptor Table Register
Bity: 15 3 2 0 Neviditelná část
┌──────────────────┬───┬───────────────────────────┐
│ Položka v GDTR │000│ 96 bitů CACHE (jako GDTR) │
└──────────────────┴───┴───────────────────────────┘
I zde je cache pro adresu 32 bitová.
Využití - viz Adresace
TR - Task Register
Bity: 15 3 2 0 Neviditelná část
┌──────────────────┬───┬─────────────────────────────────┐
│ Položka v GDTR │000│ 96 bitů CACHE (jako GDTR) + TYP │
└──────────────────┴───┴─────────────────────────────────┘
I zde je cache pro adresu 32 bitová.
Využití - multitasking, obsahuje TSS aktivního procesu.
Viz také Deskriptory .
CRx registry - novinka 386
CR0 - Control Register 0
Až zas tak úplná novinka to není, spodní WORD byl popsán u 286, jako MSW.
Ale horní WORD dříve neexistoval, a tak procesor 386 obsahuje nějakou tu
nulu navíc :
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
┌─────────────────────────────────────────────────┐
│ 00 00 00 00 00 00 00 00 00 00 NE ET TS EM MP PE │ Lo CR0 - MSW
└─────────────────────────────────────────────────┘
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
┌─────────────────────────────────────────────────┐
│ PG CD NW 00 00 00 00 00 00 00 00 00 00 AM 00 WP │
└─────────────────────────────────────────────────┘
PE - Protection enable - PE=1 znamená, že procesor provozuje
PROTECTED MÓD nebo V86 MÓD
PE=0 znamená REAL MÓD
MP - Math Present - MP=1, je li přítomen koprocesor
(Na 286 je to nejlepší způsob detekce přítomnosti koprocesoru.)
Smsw ax
And ax,02
Jz 80X87_nepřítomen
Jnz 80X87_přítomen
SMSW nepatří mezi Privilegované instrukce , nezpůsobí tedy INT 0D
ani pro CPL >0. Doporučuji i pro 286 a 486.
EM - Emulation - Je-li EM = 1 , pak je přítomen emulátor koprocesoru.
Je-li EM=0 a MP=0, pak si uživatel musí připravit logaritmické
pravítko a provádět výpočty sám.
Je-li MP=0 a procesor narazí na instrukci koprocesoru, pak pro
EM = 1 provede INT 07 jinak INT 06 . Emulátor by teoreticky
mohl mít EM = 0 , viset na INT 06 a kontrolovat všechny optrapy
a rozlišovat instrukce koprocesoru, ale nadřel by se podstatně víc,
než, když nastaví EM na 1.
TS - Task switched - Procesor nastaví TS na 1 po každém přepnutí úloh.
(změna TR). Je to podpora multitaskingu, aby se nemusel po každém
přepnutí uschovávat obsah koprocesoru (FNSAVE trvá příliš dlouho).
Task manager tedy přepne úlohy a zkusí, co to udělá. Pokud nová
úloha "sáhne" na koprocesor, ohlásí se výjimka INT 07 . Správce
úloh pak musí opravdu vyklopit kopr a načíst do něj nová data.
Poté provede CTS a shodí TS.
ET - Typ protokolu koprocesoru. ET=1 - 32 bitů (80387)
ET=0 - 16 bitů (80287)
Je-li MP=1 a ET=1, pak je přítomen 80387. Jinak nelze rozhodnout
o typu přítomného koprocesoru.
PG - PaGing mode - PG=1 znamená zapnutý režim Stránkování . Je-li PG=1,
musí být i PE=1, jinak je hlášeno INT 0D .
NE, CD, AM, NW, WP - na 386 vždy 0. Viz Nové registry 486 .
CR1 - Control Register 1
Na 386 ani 486 není využit. Instruke pro práci s CR1 vyvolá chybu INT 06 .
CR2 - Control Register 2
Obsahuje lineáení adresu, jež způobila výpadek stránky. Viz INT 0E .
CR3 - Control Register 3
Obsahuje fyzickou adresu adresáře stránek pro PG=1. Viz Stránkování
CR4 - CR7
Na 386 ani 486 není využit. Instruke pro práci s CR4 - 7 vyvolá chybu
INT 06 .
DRx registry
Viz kapitolu Hardware breakpoints .
TRx registry
TRx registry mají souvislost se Stránkováním . Pomocí nich může program
s CPL =0 zjišťovat fyzickou adresu té které logické adresy. V praxi není
moc užitečné (nechá se bez toho žít, navíc CPL=0 dostane málokdo).
Na 386 existují jen TR6 a TR7. Práce s ostatními TRx vyvolá INT 06 .
Podrobnosti o uložení polí GDTR, IDTR TR a LDTR v procesoru naleznete
v oddílu Nedokumentované instrukce
Registry procesoru Nové registry 286 Nové registry 486
Nové registry 486
I 486-ka přinesla něco málo nových registrů. Pro běžného programátora je to
však nepodstatné, neboť jsou určeny jen pro prioritu CPL =0, tedy kdo nemá
zmáné v Redmontonu u Billa, ten kýženou CPL nedostane a je mu to na ... .
CR0 - Trochu se rozšířil:
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
┌─────────────────────────────────────────────────┐
│ 00 00 00 00 00 00 00 00 00 00 NE ET TS EM MP PE │ Lo CR0 - MSW
└─────────────────────────────────────────────────┘
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
┌─────────────────────────────────────────────────┐
│ PG CD NW 00 00 00 00 00 00 00 00 00 00 AM 00 WP │
└─────────────────────────────────────────────────┘
PE - Protection enable - PE=1 znamená, že procesor provozuje
PROTECTED MÓD nebo V86 MÓD
PE=0 znamená REAL MÓD
MP - Math Present - MP=1, je li přítomen koprocesor
(Na 286 je to nejlepší způsob detekce přítomnosti koprocesoru.)
Smsw ax
And ax,02
Jz 80X87_nepřítomen
Jnz 80X87_přítomen
SMSW nepatří mezi Privilegované instrukce , nezpůsobí tedy INT 0D
ani pro CPL>0. Doporučuji i pro 386 a 486.
EM - Emulation - Je-li EM = 1 , pak je přítomen emulátor koprocesoru.
Je-li EM=0 a MP=0, pak si uživatel musí připravit logaritmické
pravítko a provádět výpočty sám.
Je-li MP=0 a procesor narazí na instrukci koprocesoru, pak pro
EM = 1 provede INT 07 jinak INT 06 . Emulátor by teoreticky
mohl mít EM = 0 , viset na INT 06 a kontrolovat všechny optrapy
a rozlišovat instrukce koprocesoru, ale nadřel by se podstatně víc,
než, když nastaví EM na 1.
TS - Task switched - Procesor nastaví TS na 1 po každém přepnutí úloh.
(změna TR). Je to podpora multitaskingu, aby se nemusel po každém
přepnutí uschovávat obsah koprocesoru (FNSAVE trvá příliš dlouho).
Task manager tedy přepne úlohy a zkusí, co to udělá. Pokud nová
úloha "sáhne" na okprocesor, ohlásí se výjimka INT 07 . Správce
úloh pak musí opravdu vyklopit kopr a načíst do něj nová data.
Poté provede CTS a shodí TS.
ET - Typ protokolu koprocesoru. ET=1 - 32 bitů (80387)
ET=0 - 16 bitů (80287)
Je-li MP=1 a ET=1, pak je přítomen 80387. Jinak nelze rozhodnout
o typu přítomného koprocesoru.
PG - PaGing mode - PG=1 znamená zapnutý režim Stránkování . Je-li PG=1,
musí být i PE=1, jinak je hlášeno INT 0D .
NE - Numeric Exceptions - Přepíná nezi chybami koporocesoru.
Je-li NE = 1, pak se chyba hlásí INT 10
Je-li NE = 0, pak se chyba hlásí INT 0D (já tu obsluhu 0D lituju)
Prý je to ústupek INTELů IBM (10 je taky využit pro video)
WP - Write Protect - WP=1 zákaz zápisu do stránek s W=0 i pro CPL= 0,1,2
Je-li WP=0, pak do stránek s W=0 CPL = 0,1,2 psát může.
Viz Stránkování .
AM - Alignment mask - AM=1 a AC=1 v EFLAGS hlásí chybu INT 11 pro
špatné zarovnávání programů s CPL =3.
CD - Cache Disable - Zapíná a vypíná vnitřní cache paměť 486-ky.
486 obsahuje interní chache paměť o velikosti 8KB. Cache je vhodné
zakázat pro některé diagnostické testy (velikost fronty) a pro
přepínání módů. Zákaz se provede CD=1.
NW - Not Write-through - NW=0 znamená automatické 'znevalidnění' cache
paměti po zápisu, NW=1 odepíná automatické 'znevalidnění'.
Povolené kombinace jsou CD=1 , NW=1 a CD=0 , NW=0 . Jiná kombinace
hlásí INT 0D .
CR1 - Control Register 1
Na 386 ani 486 není využit. Instruke pro práci s CR1 vyvolá chybu INT 06 .
CR2 - Control Register 2
Obsahuje lineáení adresu, jež způobila výpadek stránky. Viz INT 0E .
CR3 - Control Register 3
Obsahuje fyzickou adresu adresáře stránek pro PG=1. Viz Stránkování
CR4 - CR7
Na 386 ani 486 není využit. Instruke pro práci s CR4 - 7 vyvolá chybu INT 06 .
DRx registry
Viz kapitolu Hardware breakpoints .
TRx registry
TRx registry mají souvislost se Stránkováním . Pomocí nich může program
s CPL =0 zjišťovat fyzickou adresu té které logické adresy. V praxi není
moc užitečné (nechá se bez toho žít, navíc CPL=0 dostane málokdo).
Na 486 existují jen TR3,TR4,TR5,TR6 a TR7. Pokusy o práci s ostatními TRx
vyvolají INT 0D .
Registry procesoru Nové registry 286 Nové registry 486
Privilegované instrukce
Tato kapitola se týká jen 80286 a vyšších.
Některé instrukce nebudou fungovat, jestliže budou použity v REAL MÓDu -
viz INT 06 , jiné budou bojkotovat PROTECTED MÓD nebo V86 MÓD -
viz INT 0D , INT 06 .
Následující instrukce lze použít jen s CPL =0 :
LGDT, LIDT, LLDT, LTR, SGDT, SIDT, SLDT, STR, CTS, HLT, *CLI, *STI,
LMSW, MOV CR?,xxx, MOV xxx,CR?, MOV xxx,DR?, MOV DR?,xxx, MOV TR?,xxx a
MOV xxx,TR?.
Instrukce označené * mají výjimečné postavení ve V86 MÓDu . Viz též INT 06
Instrukce procesoru Registry Procesoru
80386DX
Tento plně 32 bitový procesor se díky MS-Windows stal nezbytnou součástí
každého počítače. Procesory 286 a horší signalizují, že se nejedná o počítač,
ale o počítadlo.
Novinky 80386 (SX i DX)
32 - bitová architektura
Stránkování - aneb softwarové přeprogramování sběrnice
V86 MÓD - trochu legrace do umírání a nudy v REAL MÓDu
PROTECTED MÓD a 32 bitové segmenty
Obrovský zmatek ve všem
Procesorům 80386 vděčí obec programátorů za noční můry o prefixech 16/32,
32 bitových segmentech dat a 16 bitové adresaci kódu, problémům, jestli za
?? v kódu typu:
nop
db 0eah ; JMP far
?? offset ; Prostředí 16/32
dw selektor
má dosadit dw nebo dd, jesli si vyvést jen jedeno tvrdý RESET tlačítko, nebo
radši rovnou dvě a zda radši nevybalit z krabice na půdě mírně zaprášený
osmibiťák typu Sinclair, Commodore nebo Atari, kde vše bylo tak jednoduché.
Registry procesoru Instrukce 80386 Nové registry 386 Procesory
80486SX
Jedná se o levnější variantu 80486DX , která nemá koprocesor. Je to jen
obchodní trik : 486SX jsou 486DX, který se nepovedly (mají špatný koprocesor)
486SX brát jen zadarmo !!
Pokud už 486SX vlastníte a koupíte si k ní koprocesor, pak vlastně kupujete
486DX procesor. Po zasunutí švába do příslušného slotu se starý 486SX ÚPLNĚ
odpojí a vše vykonává "koprocesor". Efekt je dvojí : Za procesor zaplatíte
2x a stará 486SX stále žere proud (a příjemně topí, ale já preferuju jiný
přímotopy, který nestojej 5000,- a víc ).
80486DX 80486DX/2 80486DX/4
80486DX
Pokud nestačí rychlostně 80386DX , pak nezbývá než opatřit si 486. Předem
zavrhněte 486SX - v kapitole 80486SX se dočtete proč.
Co 486 dala :
Vyšší rychlost (až 50 MHz)
Pár instrukcí navíc - Instrukce 80486
Pár registrů navíc - Nové registry 486
8 KB interní cache. To má váhu !
Ještě větší zmatek
Co 486 nedala :
Je toho moc. Asi nejvíc schází :
1. Jednotnost módů. Ta už nebude .. Zlatý XT !
2. Šanci procesu z V86 MÓDu pracovat s vyšší pamětí. DPMI a VCPI
( softwaroví strašáci ) to neřeší.
Co 486 vzala :
Svobodu programu s CPL =3 při přístupu do paměti. Viz INT 11 .
To se nechá snadno zjistit po nákupu. Stačí prohlédnout konto a
peněženku.
Procesory 80386DX 80486SX 80486DX/2 80486DX/4
Nové registry 486 Instrukce 80486
80486DX/2
Další fígl INTELu, jak vymámit trochu výkonu navíc a hodně peněz
z uživatelů. Časování procesoru a základní desky u všech předchozích počítačů
bylo stejné. Zde procesor jede 2x rychleji. Znamená to, že veškeré I/O a
přístup do paměti jsou podstatně (2x) pomalejší, než vlastní CPU.
Pokud je CPU 80486DX/2 - 50 Mhz, znamená to, že s pamětí a periferiemi
pracuje stejně rychle jako 80486DX 25 MHz, ale práce procesoru a koprocesoru
je stejně rychlá, jako u 80486DX 50 MHz.
Je to dobrý kompromis pro CAD, částečně i Windows a podobné.
Počítačovými fajnšmekry je někdy nazýván Superkráva.
Procesory 80386DX 80486SX 80486DX 80486DX/4
Nové registry 486 Instrukce 80486
80486DX/4
Další fígl INTELu, jak vymámit trochu výkonu navíc a hodně peněz
z uživatelů. Časování procesoru a základní desky u všech předchozích počítačů
bylo stejné. Zde procesor jede Nx rychleji. Znamená to, že veškeré I/O a
přístup do paměti jsou podstatně (Nx) pomalejší, než vlastní CPU.
Pokud je CPU 80486DX/4 - 100 Mhz, znamená to, že s pamětí a periferiemi
pracuje stejně rychle jako 80486DX 25 MHz, ale práce procesoru a koprocesoru
je téměř stejně rychlá, jako u hypotetické 80486DX - 100 MHz. ( 80486DX 100 MHz
zatím neexistuje.)
Je to dobrý kompromis pro CAD, částečně i Windows a podobné.
80486DX/4 by mohlo vzbuzovat zdání, že N=4 , ale není to úplně pravda. Můžeme
být rádi, pokud je N > 3.5 .
Procesory 80386DX 80486SX 80486DX 80486DX/2
Nové registry 486 Instrukce 80486
Pentium - Intelovská špička
Poslední ránou po pás programátorům je Intelovská novinka PENTIUM.
Sám o něm nic konkrétnějšího nevím, ale je 'plně' kompatibilní s 80486DX .
Má navíc další instrukce, které však mají povahu RISC. Blíže viz
Instrukce procesoru .
V testech (Norton utilities v 7.0) byla změřena rychlost 121 XT !! Pentium
prý vede hlavně v aritmetických operacích v plovoucí desetinné čárce.
Zatím nevím nic o instrukční sadě ani o nových registrech procwsoru. Snad
příště.
Procesory 80486DX Instrukce procesoru
Instrukce procesorů INTEL
Pro každý procesor je typická sada určitých instrukcí. Kedná se vlastně
o matematicky ekvivalentní přiřazení skupiny BYTů některému příkazu. Podle
obsažnosti instrukčního souboru dělíme procesory na RISC (Reduced
Instruction Set) a CISC (Complete Instruction Set). V PCčkách naleznete
CISC. Pouze poslední novinka INTELu Pentium má některé instrukce RISC.
Pro Intel je specifické, že dodržuje vzestupnou kompatibilitu. Je-li
příslušná instrukce v souboru instrukcí 8086, pak ji může použít i
286, 386, 486 i Pentium.
Instrukce 8086 8086 Registry procesoru
Instrukce 80286 80286 Nové registry 286
Instrukce 80386 80386DX Nové registry 386
80386SX
Instrukce 80486 80486DX Nové registry 486
80486SX 80486DX/2 80486DX/4
Nedokumentované instrukce Koprocesory
Direktivy TASM Specifikace modelu
Instrukce 8086
Instrukční sada 8086 tvoří základ instrukcí všech procesorů INTEL. Obsahuje
176 různých instrukcí, ze kterých se využívá asi 50 nejdůležitějších. Pak
se člověk v debuggeru může jen divit, co ta mrcha na šest písmen provede.
Ale to už je úděl CISC.
Instrukce přesunu dat 8086
Aritmetické instrukce 8086
Logické instrukce 8086
Instrukce posunů a rotací 8086
Instrukce pro práci s řetězci dat 8086
Instrukce skoků a volání 8086
Instrukce řídící 8086
Instrukce 80286 Instrukce 80386 Instrukce 80486 Registry procesoru
Hardware Breakpoints (HB)
Jsou novinkou 80386. Jsou celkem 4 a umožňují nejen hlídat provádění instrukce,
ale kontrolovat i čtení - zápis do paměti.
HB jsou dostupné jen pro CPL =0 a navíc je-li nastaven bit CG v DR7 jen
z obsluhy INT 01 .
HB jsou definovány takto :
DR0 ┐
DR1 ├─ Lineární adresa (y) ke hlídání
DR2 │
DR3 ┘
DR4 - neexistuje
DR5 - neexistuje
DR6 - Stavový registr
DR7 - Řídící registr
DR6 - bitové pole :
31 16 15 14 13 12 4 3 2 1 0
┌────────┬────┬────┬────┬─────────────────────┬────┬────┬────┬────┐
│00000000│ BT │ BS │ BD │ 0 0 0 0 0 0 0 0 0 0 │ B3 │ B2 │ B1 │ B0 │
└────────┴────┴────┴────┴─────────────────────┴────┴────┴────┴────┘
BT - 1 znamená, že INT 01 vyvolalo přepnutí na TSS s nastaveným T bitem
BS - 1 znamená, že INT 01 bylo vyvoláno TF příznakem
BD - 1 znamená, že INT 01 bylo vyvoláno, protože program chce pracovat
s DRx regostry, které byly zakázány bitem GD v DR7.
B? - 1 znamená, že INT 01 vyvolal HB příslušného čísla.
DR6 procesor nenuluje. Musí to zajistit obsluha INT 01
DR7 - bitové pole :
15 13 9 8 7 6 5 4 3 2 1 0
┌──────────┬────┬──────────────┬──────┬──────┬──┬──┬──┬──┬──┬──┬──┬──┐
│0000000000│ GD │ 000000000000 │ GE │ LE │G3│L3│G2│L2│G1│L1│G0│L0│
└──────────┴────┴──────────────┴──────┴──────┴──┴──┴──┴──┴──┴──┴──┴──┘
31 16
┌───────┬────────┬────────┬────────┬────────┬────────┬───────┬────────┐
│ LEN 3 │ TYP 3 │ LEN 2 │ TYP 2 │ LEN 1 │ TYP 1 │ LEN 0 │ TYP 0 │
└───────┴────────┴────────┴────────┴────────┴────────┴───────┴────────┘
GD - 1 znamená zákaz přístupu k DRx registrům. Po dobu INT 01 je
nastaveno na 0. Na konci INT 01 je třeba GD případně nastavit.
GE, LE - zajistí správné vyvolávání HB. Díky cache může jinak dojít
k vyvolání HB o několik instrukcí později.
G = globální význam
L = Jen v tomto TSS
G?, L? - breakpoint ? je aktivní.
G = globální význam
L = Jen v tomto TSS
LEN (2 bity) Délka platnosti
──────────────────────────────
0 0 BYTE
0 1 WORD
1 0 zakázáno
1 1 DWORD
TYP (2 bity) Význam
──────────────────────────────
0 0 Provedení instrukce (LEN musí být 00 a HB na začátku instr.)
0 1 Zápis dat
1 0 zakázáno
1 1 Čtení i zápis
Pozn.:
■ Jestliže program narazí na lineární adresu, která vyvolává HB, provede
INT 01 . Ale v okamžiku volání INT ještě nejsou nastaveny nové CS
a (E)IP. To zmanená, že po IRET z INT 01 by se situace opakovala
( znovu je lineání adresa nastavena na nějaký HB ... ).
Obsluha HB tedy buď HB, který jí vyvolal odstraní ( to je ale často
nežádoucí ) nebo nastaví příznak RF v EFLAGS na 1. To zabrání
opakovanému vyvolávání INT 01. Bit RF se pak automaticky vynuluje po
provedení každé instrukce, takže HB umístěný na další instrukci již
INT 01 vyvolá. Pokud by program chtěl ( chtěně nebo nechtěně ) nastavit
RF na 1, aby zabránil HB v práci, nepovede se mu to :
<──────────── Tady je RF na 0 (ukončená předchozí instrukce)
Popfd ; Ade by se RF mohl nastavit na 1, ale až po provedení HB,
; jež by měl co do činění s touto instrukcí.
; Nastavení RF na 1 se provede v průběhu instrukce
; a na jejím konci procesor automaticky nastaví RF na 0.
<──────────── Proto zde již HB pracuje OK.
Mov xxx,yyy ; a zde již HB může být vyvolán
Z popsaného vyplývá, že pracovat s RF má cenu jen ve EFLAGS uložených
na STACKu v průběhu INT 01 .
■ Pole LEN nevyjadřuje přímo délku. Vjadřuje, kolik nejnižších bitů se
nekontroluje. Tedy pro kombinace 01 a 11 to platí pojem délka jen pokud
je HB umístěn na hranici WORDu / DWORDu.
■ V této situaci se jeví práce se softwarovými breakpointy (SB) INT 03
jako obtížná. SB jsou vyvolány synchronně instrukcí INT 03. Obsluha
nalezne na stacku CS a (E)IP ukazující ZA INT 03. INT 03 přepsal 1 BYTE
kódu, proto se musí IP vrátit o 1 zpět (Dec) a INT 03 nahradit původním
obsahem. (Debugger si původní obsah musí někam uložit.)
Situace před vložením breakpointu (část procedury na vyplnění
oblasti v paměti 0)
► cs:0100 33C0 xor ax,ax ◄ Zde má být umístěn SB
cs:0102 8B4EFA mov cx,[bp-06]
cs:0105 C47EF4 les di,[bp-0A]
cs:0108 F3AB rep stosw
► cs:0100 CC int 03 ◄ SB vložen
┌► cs:0101 C08B4EFAC4 ror byte ptr [bp+di-05B2],C4
│ cs:0106 7EF4 jle 00FC
│ cs:0108 F3AB rep stosw
│
└─ Tuto pozici nalezne obsluha INT 03 na stacku. Provede svou činnost
( výpis hodnot, ... ) a má-li pokračovat, musí provést následující :
Přepíše místo breakpointu 33h (původní obsah), zmenší hodnotu (E)IP
na stacku a provede IRET. Zde se vrátí řízení na cs:0100 a program může
pokračovat dál. PROBLÉMEM je, že SB z pozice cs:0100 ZMIZEL !! To je často
nežádoucí.
Obsluha má tedy na vybranou : Buď umístí další SB ihned na další instrukci
( zde Mov cx,[bp-06] ) a po jeho vyvolání obnoví breakpoint na původnm místě.
Zde jsou 2 nevýhody :
1. Musíme určit délku instrukce, abychom nový SB umístili správně na
začátek další instrukce.
2. Pokud je na pozici původního SB ( cs:0100 ) instrukce skoku, druhý
SB se již nevyvolá.
Druhý způsob je schůdnější : Obsluha INT 03 po zpracování SB nastaví
ještě TF ve FLAGS. Pak na obsluze INT 01 čeká na provedení instrukce.
V době, kdy je INT 01 vyvolán zkontroluje, není-li třeba obnovit SB a
případně jej obnoví. Debugger ovšem musí obsadit i INT 01 . To se ale ve
většině případů děje stejně.
Ve srovnání s obsluhou SB je HB složitost pro mateřskou školku. Ale HB
můžeme použít současně jen 4, kdežto SB kolik je libo.
INT 01 INT 03
Systém ochrany
Pojmem systém ochrany se myslí nikoliv 'Super anti hacker Security Systém',
ale zcela hardwarová záležitost procesorů 286, 386 a 486.
Pokud tyto procesory pracují v PROTECTED MÓDu , pak platí přísná pravidla
o přístupu k paměti a I/O portům. V textu se vyskytuje velmi často pojem
priorita. CPU rozeznává 4 priority :
• Priorita 0. Nejvyšší priorita. Má dovoleno téměř vše, zejména
Privilegované instrukce . Je určena pro jádro OS ( ale ne DOS )
správce ochrany, obsluhu přerušení a správce multitaskingu.
• Priorita 1. Nižší priorita. Prý pro doplňky OS. Např. ovladač myši.
Priorita 1 se však téměř nevyužívá.
• Priorita 2. Ještě nižší priorita. Prý pro dobře otestované programy.
Např. překladače, vývojové prostředky a pod.
Priorita 2 se však téměř nevyužívá.
• Priorita 3. Nejnižší priorita. Má zakázáno téměř vše. Sem spadá všechno
ostatní.
V praxi se používá buď priorita 0 (správce) nebo 3 (ostatní).
■ Programy mohou pracovat jen s pamětí, která jim je dostupná přes Deskriptor
Deskriptor je programu dostupný, paltí-li CPL <= DPL . INT 0D
■ Programy mohou pracovat s I/O zařízeními, která jsou jim dovolena polem
IOPL . Aby byl přístup povolen, musí platit CPL <= IOPL nebo příslušný
port musí mít nastavenou 0 v TSS . INT 0D
■ Programy mohou pracovat s IF příznakem, je-li jim to dovoleno polem
IOPL . Aby byl přístup povolen, musí platit CPL <= IOPL
INT 0D
■ Programy s CPL >0 mají povoleny jen ty porty, které jsou v neformátované
části TSS označeny 0. To neplatí, pokud je CPL <= IOPL
INT 0D
■ Každá úroveň privilegovanosti má svůj vlastní STACK. Pro SS Selektor
musí platit: RPL (SS) = CPL = DPL (SS). INT 0D
■ Program NESMÍ zapisovat do segmentu určeného CS. Je-li to třeba, musí
si vytvořit ALIAS (stejná BASE a limit) segment, který je datový
a přístup provádět přes DS, ES, FS, GS nebo SS.
INT 0D
■ Z kódového segmentu lze číst jen je-li nastaven bit R jeho Deskriptoru .
INT 0D
■ Z datových segmentů lze vždy číst; zápis do nich je povolen jen je-li
nastaven bit W v Deskriptoru příslušného segmentu. INT 0D
■ Segment pro zásobník MUSÍ být datový a MUSÍ mít povolen zápis. INT 0C
■ Do CS NELZE umístit Selektor , který určuje datový Deskriptor INT 0D
■ Do DS, ES, FS a GS LZE umístit Selektor kódového segmentu. Má-li to však
mít cenu, musí být tímto určený Deskriptor , jež je READABLE (bit R=1).
INT 0D
■ Do SS NELZE umístit selektor kódového segmentu. INT 0C
■ Program NESMÍ měnit velikost své CPL přímo. INT 0D
■ Program s CPL =3 NESMÍ přistupovat/zapisovat do stránek, kde je to
zakázáno bity U a W. Stránkování INT 0E
■ Program nesmí překročit Offset v rámci použitého segmentu. Offset je
uložen v Deskriptoru příslušného segmentu. Limit NESMÍ být překročen
ani o 1 BYTE. INT 0D
■ Program nesmí podtéci se zásobníkem. (E)SP musí být vždy po provedení PUSH,
CALL a pod alespoň 1. INT 0C
■ Program může volat jen takový INT, který má dovolen polem DPL v
Deskriptoru příslušné položky IDT. Zpracování přerušení
■ Program s CPL >0 NESMÍ provádět Privilegované instrukce . INT 0D
■ (486) Je-li nastavena kontrola zarovnávání, musí program s CPL =3
pracovat jen tak, aby si ochrany nepohněval. Viz INT 11
■ Program MŮŽE přímo CALL far nebo JMP far jen takové, že DPL nového
Deskriptoru CS je STEJNÉ jako CPL !!! INT 0D
■ Program MŮŽE přímo CALL far nebo JMP far i takové, že pro DPL nového
Deskriptoru CS platí : DPL <= CPL a zároveň nový Deskriptor CS má
nastaven bit C. Je to ÚPLNĚ obráceně než s RPL u datových segmentů.
■ Program může NEPŘÍMO volat procedury (FAR), jejihž deskriptor CS má
DPL <= CPL . Volání MUSÍ proběhnout pomocí brány. (viz níže)
■ Program může PŘÍMO RETF z vysoké úrovně privilegovanosti ( CPL =0,1,2) do
méně ( nebo stejně ) privilegovaného programu. Na zásobníku MUSÍ být záznam
stejný jako vytvoří volání přes bránu. (Vysoká privilegovanost má dovoleno
'téměř vše'.)
■ Program může použít i Deskriptor , který má nastaven bit P (present) na 0.
V tom okamžiku se vyvolává INT 0B nebo INT 0C (pro SS) a jeho obsluha
MUSÍ segment zpřístupnit.
■ Program múže použít i stránku, která má nastaven bit P (present) na 0.
V tom okamžiku se vyvolá INT 0E , který musí stránku zpřístupnit.
Volání přes bránu :
program, CPL =3, 16 bitů
Call far 1230:4568
└────────────► Selektor brány. => offset (4568) se zahodí
Brána např. : Selektor 5860
Offset 1485
16 - bitová
CNT = 2 - Viz Deskriptor
DPL brány = 3
Na 5860:1485 se předá řízení.
Změní se priorita, změní se i zásobník ( podle TSS )
Volaný nalezne na zásobníku :
16 0
├──────────────────────────────────┤
│ SS volajícího │
├──────────────────────────────────┤
│ SP volajícího │
├──────────────────────────────────┤
│ 1. parametr │ Počet parametrů udává CNT
├──────────────────────────────────┤ (zde 2 WORDy) Jsou zkopírovány
│ 2. parametr │ procesorem z původního stacku.
├──────────────────────────────────┤ (DWORDy pro 386 bránu)
│ CS volajícího │
├──────────────────────────────────┤
│ IP volajícího │
SS:SP ──>
Po provedení obslužné rutiny se provede RETF 0004. Ten
1. Zjistí rozdíl CPL zpracovávajícího a CPL volajícího. => Změna Stacku
(CPL volavícího >= CPL zpracovatele. Jinak INT 0D )
2. Obnovení CS a IP
3. Zrušení parametrů
4. Obnovení SS a SP volajícího
5. Odstranění parametrů ze stacku volajícího.
Tento systém pracuje obdobně i ve 32 bitovém prostředí. Procesor podporuje
konvence volání PASCAL (parametry odstraňuje volaný). Bohužel nelze využít
pro C.
Přerušení CPU CPL DPL IOPL RPL EPL Deskriptor Stránkování
PROTECTED MÓD REAL MÓD Ochrana V86 V86 MÓD
Ochrana V86
Systém ochrany ve V86 MÓDu je poněkud jiný než Systém ochrany
v PROTECTED MÓDu . V86 má vždy CPL =3.
■ CPL NENÍ uvedena v selektoru CS. Je pevně určena na 3.
■ V ?S registrech je uveden segment, ne Selektor .
■ Přístup k I/O NEZÁLEŽÍ na IOPL . Implicitně je dovolen přístup ke všem
I/O portům.
■ Některá I/O místa lze zakázat použitím neformátované části TSS
■ Je-li IOPL =3, je dovoleno : CLI, STI, INT a IRET
INT musí mít speciální obsluhu, viz Zpracování přerušení
■ Je-li IOPL <3, CLI, STI, INT a IRET vyvolají INT 0D . Tam je správce musí
emulovat. Viz Zpracování přerušení
■ Popf MŮŽE měnit IF. (pro IOPL < 3 INT 0D a emulace )
■ V86 MEMŮŽE vyvolat zpět PROTECTED MÓD maskováním VM v EFLAGS.
( Viz VCPI a DPMI )
■ Jedinou cestou zpět do PROTECTED MÓDu je INT. Viz Zpracování přerušení
■ Jsou zakázány privilegované instrukce. Některé z nich může správce VM
emulovat. ( Ale nemusí. )
Přerušení CPU CPL DPL IOPL RPL EPL Deskriptor Stránkování
PROTECTED MÓD REAL MÓD Systém Ochrany V86 MÓD
PROTECTED MÓD
Protected mód je nově zavedený mód práce procesorů 286 a vyšších, aby
obsáhly veškerou dostupnou paměť. 8086 obsáhlo maximálně 1024576 BYTE,
80286 max. 16MB. 15 MB jinak než v Protected módu adresovatelných nebylo.
386 dokáže adresovat dokonce 4GB paměti a má proto trochu jinou strukturu
Deskriptoru .
V Protected Módu je jiné:
■ Systém adresace - viz Adresace
■ Ne všechno je dovoleno - Systém ochrany .
■ Je podporován multitasking - TSS
■ Je jinak zpracováváno přerušení - Zpracování přerušení
■ Je podporováno přemapování RAM (386 a 486) - viz Stránkování
■ Popf NEOBNOVUJE IF.
• Nelze využívat standardní operace I/O
zejména Přerušení DOSu a Přerušení BIOSu
• Nelze používat standardní mapování IRQ
• Při aktivním Stránkování je někdy problém s DMA.
Vlastní přepnutí do Protected módu ( a zpátky ):
286 procesory - Viz 286 tam a zpátky
386 a 486 procesory - Viz 386 tam a zpátky
Pozn.: Pokud běžíte ve V86 ( QEMM, EMM386, 386MAX, Windows) , nelze
volně přepínat V86 - Protected. Je třeba využít služeb VCPI
nebo DPMI . ( A to je konec. )
REAL MÓD V86 MÓD Systém ochrany Adresace Zpracování přerušení
Přerušení CPU
286 tam a zpátky
Demonstrační program pro přepnutí REAL MÓD - PROTECTED MÓD
Nespouštět pod V86 MÓDe m. Lze použít i na 386. Psáno v MASM stylu.
.286P ; 286 instrukce + Privilegované instrukce
Data segment public para
Assume ds:data;
Descr Struc ; Struktura - viz Deskriptor
Limit dw 0
Base_lo dw 0
Base_Hi db 0
Acces db 0
Add386 dw 0
Descr Ends
; Definice GDT - Nové registry 286
DefGdt Descr <> ; neplatný Deskriptor
DefC Descr <0ffffh,0,0,10011000b> ; Pro CS
DefD Descr <0ffffh,0,0,10010000b> ; Pro DS
DefE Descr <0ffffh,8000h,0bh,10010010b> ; Pro ES
DefS Descr <03ffh,0,0,10010010b> ; Pro SS
Def0400 Descr <0ffffh,0400h,0,10010010b> ; Použitý pro návrat
label GDTend byte ; Velikost GDT
DLimit DW ? ; Struktura pro LGDT
DBase_lo DW ?
DBase_Hi Db ?
db 00h ; 286 styl
CodeBase Dw ? ; Původní CS, pro návrat do REAL MÓDu
Before db 'Před vyvoláním protected módu',0dh,0ah,'$'
Inprot db 'V protected módu',00h
after db 'Po opuštění protected módu',0dh,0ah,'$'
Data ends
Stak segment Stack 'stack'
Assume ss:stak;
storesp Dw ? ; Původní hodnota SP pro návrat
Dw 01ffh dup(?)
Stak Ends
Code Segment Public Use16 para 'Code'
Assume Cs:Code;Ds:Nothing;Es:Nothing;
SetBase Macro Segr,Segm ; Makro nastaví Deskriptor podle hodnot
Mov ax,Segr ; segmentu.
Shr ah,4
Mov [Segm&.Base_Hi],ah
Mov ax,Segr
Shl ax,4
Mov [Segm&.Base_lo],ax
EndM
Start: Mov ax, seg data
Mov ds,ax
Lea dx,before
Mov ah,09h
Int 21h ; jen vypíše text
SetBase cs,Defc
SetBase ds,DefD
SetBase ss,DefS ; Vyplní GDT
Mov ax,cs
Mov [codebase],ax ; ulož CS pro návrat
Mov ax,ds
Shl ax,4
Add ax,offset DefGDT
Mov [DBase_lo],ax
Mov ax,ds
Sbb al,al
Neg al
Shr ah,4
Add al,ah ; výpočty -
Mov [DBase_hi],al ; Lineární adresa pro GDT
Mov [DLimit],offset GDTEnd -offset DefGDT -1
Lgdt pword ptr [DLimit]
Mov [StoreSp],sp ; uložit staré SP pro obnovení při návratu
Cli ; Vše bez INTů
Mov al, 0d1h
Out 64h,al ; někdy je nutné odpojit klávesnici,
; ale většinou ne
Jmp ResetQ ; vyprázdnit předvybrané instrukce
ResetQ: Smsw Ax
Or al,01h
Lmsw Ax ; Nastavit PE - bit v MSW
Jmp ResetQ1
ResetQ1: ; vyprázdnit předvybrané instrukce
Mov ax,offset DefS - offset defgdt
Mov ss,ax
Mov ax,offset DefD - offset defgdt
Mov ds,ax
Mov ax,offset DefE - offset defgdt
Mov es,ax ; vyplnění ?S registrů Selektory
db 0eah ; JMP FAR - vstup do PROTECTED MÓDu
dw prot,offset DefC-offset DefGdt
prot:
Mov di,1600
Mov si,offset inprot
Cld
Mov ah,0eh ; barva
loopik: lodsb
Or al,al
Je @konec
Stosw ;vypiš zprávu. NELZE užít BIOS ani DOS !!!
Jmp loopik
@konec:
;-------------------------------------------------------------------------
; Zde již částečně nedokumentované. Není to podpora CPU, ale hardware PC.
; Používáno i WINDOWS, ale pracoval jsem s počítačem, kde to nefungovalo !
; Jiná možnost návratu do REAL MÓDu ale neexistuje !!!!!!!
;-------------------------------------------------------------------------
Mov ax,[CodeBase]
Push offset def0400 - offset defgdt
Pop ds
assume ds:nothing;
Mov word ptr ds:[067h],offset real
Mov word ptr ds:[069h],ax
; do shutdown adresy BIOSu náš program
; tam se po RESETu procesoru pokračuje
Mov al,0fh
Out 70h,al
jmp delay2
delay2: Mov al,0ah
Out 71h,al ; zapsat SHUTDOWN byte do CMOS
Mov al,0fch ; RESET procesoru
Out 64h,al
halt: hlt ; RESET chvíli trvá, procesor zastavíme
jmp halt ; co kdyby NMI ?
nop
;--------------------------------------------------
; Sem se možná dostaneme po RESET.
; V DH je typ rpocesoru (02 - 286 ....) viz Detekce procesoru
; !! všechny ostatní registry jsou přepsány (0).
;--------------------------------------------------
Real: Mov ax,seg stak
Mov ss,ax ; obnovit stack
Mov sp,[Storesp]
Push seg data
Pop ds
assume ds:data; ; Data segment
Mov al,0ffh ; povolit klávesnici
Out 64h,al
Sti ; i interrupty
Mov dx,offset after
Mov ax,0900h ; poslední zpráva
Int 21h
Mov ax,04c00h ; konec
Int 21h
code ends
end start
386 tam a zpátky PROTECTED MÓD
386 tam a zpátky
Demonstrační program pro přepnutí REAL MÓD - PROTECTED MÓD
Nespouštět pod V86 MÓDe m. Lze použít i na 486. Psáno v MASM stylu.
CELÉ je DOKUMENTOVANÉ.
.386P ; 386 instrukce + Privilegované instrukce
Data segment public para
Assume ds:data;
Descr Struc ; Struktura - viz Deskriptor
Limit dw 0
Base_lo dw 0
Base_Hi db 0
Acces db 0
Add386 dw 0
Descr Ends
; Definice GDT - Nové registry 386
DefGdt Descr <> ; neplatný Deskriptor
DefC Descr <0ffffh,0,0,10011000b> ; Pro CS
DefD Descr <0ffffh,0,0,10010000b> ; Pro DS
DefE Descr <0ffffh,8000h,0bh,10010010b> ; Pro ES
DefS Descr <03ffh,0,0,10010010b> ; Pro SS
Def000 Descr <0ffffh,0400h,0,10010010b> ; Pro návrat
label GDTend byte ; Velikost GDT
DLimit DW ? ; Struktura pro LGDT
DBase_lo DW ?
DBase_Hi Db ?
db 00h ; 286 styl i zde
Before db 'Před vyvoláním protected módu',0dh,0ah,'$'
Inprot db 'V protected módu',00h
after db 'Po opuštění protected módu',0dh,0ah,'$'
Data ends
Stak segment Stack para 'stack'
Assume ss:stak;
Dw 01ffh dup(?)
Stak Ends
Code Segment Public Use16 Para 'Code'
Assume Cs:Code;Ds:Nothing;Es:Nothing;
SetBase Macro Segr,Segm ; Makro nastaví Deskriptor podle hodnot
Mov ax,Segr ; segmentu.
Shr ah,4
Mov [Segm&.Base_Hi],ah
Mov ax,Segr
Shl ax,4
Mov [Segm&.Base_lo],ax
EndM
Start: Mov ax, seg data
Mov ds,ax
Lea dx,before
Mov ah,09h
Int 21h ; jen vypíše text
SetBase cs,Defc
SetBase ds,DefD
SetBase ss,DefS ; Vyplní GDT
Mov ax,ds
Shl ax,4
Add ax,offset DefGDT
Mov [DBase_lo],ax
Mov ax,ds
Sbb al,al
Neg al
Shr ah,4
Add al,ah ; výpočty -
Mov [DBase_hi],al ; Lineární adresa pro GDT
Mov [DLimit],offset GDTEnd -offset DefGDT -1
Lgdt pword ptr [DLimit]
Cli ; Vše bez INTů
Jmp ResetQ ; vyprázdnit předvybrané instrukce
ResetQ: Mov Eax, Cr0
Or al,01h
Mov Cr0,Eax ; Nastavit PE - bit v CR0
Jmp ResetQ1
ResetQ1: ; vyprázdnit předvybrané instrukce
Mov ax,offset DefS - offset defgdt
Mov ss,ax
Mov ax,offset DefD - offset defgdt
Mov ds,ax
Mov ax,offset DefE - offset defgdt
Mov es,ax ; vyplnění ?S registrů Selektory
db 0eah ; JMP FAR - vstup do PROTECTED MÓDu
dw prot,offset DefC-offset DefGdt
prot:
Mov di,1600
Mov si,offset inprot
Cld
Mov ah,0eh ; barva
loopik: lodsb
Or al,al
Je @konec
Stosw ;vypiš zprávu. NELZE užít BIOS ani DOS !!!
Jmp loopik
Mov ax,offset def000 - offset defgdt
Mov DS,AX ; všechny použité seg. registry vyplnit na
Mov es,ax ; limit 64KB, R, W. Jinak REAL MÓD bojkotuje !
Mov ss,ax
assume ds:nothing;
Mov Eax,Cr0
And al,0feh
Mov Cr0,Eax ; shodit PE bit v CR0
db 0eah ; JMP FAR do REALu
dw real,seg real
; jsou zachovány obecné registry, ale segm. reg. je třeba inicializovat
Real: Mov ax,seg stak
Mov ss,ax
Push seg data
Pop ds
assume ds:data;
Sti ; IRQ zapnout
Mov dx,offset after
Mov ax,0900h
Int 21h ; vypsat zprávu
Mov ax,4c00h
Int 21h
code ends
end start
286 tam a zpátky PROTECTED MÓD
Detekce koprocesoru
Detekci koprocesoru by měla předcházet Detekce procesoru . Podle typu
procesoru může nastat :
8086 - může spolupracovat s 8087. Nejjednodušeji se přítomnost zjistí
pomocí Konfigurace INT 11 . Ale 8086 + 8087 najít ...
80286 - Může spolupracovat s 80287.
Přítomnost koprocesoru (HW) :
CMOS - BYTE 14h bit 2
MSW - bit 2
Přítomnost emulace (SW) :
CMOS - BYTE 14 bit 2 je 0
MSW - bit 2 je nula
MSW - bit 3 je 1
Nové registry 286
80386 - Může spolupracovat s 80287 a 80387.
Přítomnost koprocesoru (HW) :
CMOS - BYTE 14h bit 2
MSW - bit 2
Přítomnost emulace (SW) :
CMOS - BYTE 14 bit 2 je 0
MSW - bit 2 je nula
MSW - bit 3 je 1
Rozlišení 287 a 387 - bit 4 MSW.
Nové registry 386
80486 - DX má koprocesor v sobě.
SX nemá koprocesor vůbec.
Jinak jako 80386.
Následujícím způsobem detekuje koprocesor TP v 6.0 :
Mov bx, Volné_místo
;Zde test na environment, najde-li 87=Y
;Je-li, nastaví al na 1 a skočí na Uloz
Xor ax,ax
Out F0,al
Finit
Mov [bx],ax
Fstcw word ptr[bx]
Mov cx,0014
Cekej:
Loop Cekej
Mov ax,[bx]
And ax,0F3F
Cmp ax,033F ; Je staus koprocesoru po FNINIT jak má být
Mov al,00
Jne Uloz ; ne, koprocesor není přítomen
Push sp ; ano. Má nárok být 80287 ?
Pop ax
Cmp ax,sp
Mov al,01
Jne Uloz ; ne, procesor je 8086 a koprocesor tudíž 8087
Wait ; je to buď 80287 nebo 80387
Finit
Wait
Fld1 ; ulož 1
Wait
Fldz ; ulož 0
Wait
Fdivp st(1),st ; Vyděl 1 / 0 - Nekonečno +
Wait
Fld st(0) ; Duplikuj výsledek
Wait
Fchs ; Změň znaménko
Wait
Fcompp st(1) ; Porovnej ST a ST 1
Wait
Fstsw word ptr[bx] ; Ulož příznaky
Wait
Mov ax,[bx]
Sahf ; Načti příznaky do flags
Mov al,02
Je Uloz ; Je-li C0 v SW 0, je to 80287
Mov al,03 ; Je to 80387
Uloz:
; al obsahuje typ koprocesoru
; 0 - Není
; 1 - 8086
; 2 - 80286
; 3 - 80386 nebo lepší
Detekce procesoru Formát dat koprocesoru Koprocesory
Koprocesory
Pro aritmetické operace v plovoucí desetinné čárce je CPU vybaven velmi
chudě. Proto se k němu už od 8086 začaly dodávat koprocesory, které tyto
operace značně zjednoduší a zrychlí. Výrobci software začali koprocesory
poměrně silně podporovat, takže např CAD se bez koprocesoru nespustí.
Koprocesor není nejlevnější. Existují proto i jeho softwarové emulátory.
Architektura procesorů INTEL je podporuje - viz INT 06 , INT 07 a MSW.
Je-li koprocesor přítomen, může program provádět operace v plovoucí
desetinné čárce přímo. Předání operace koprocesoru se provede prefixem
ESC - 11011XXX, který doplňuje Assembler.
Procesor umí provádět jen aritmetické operace pro čísla typu TEMP.
Ostsní typy čísel (single, double, copm, Word ...) dokáže automaticky
konvertovat.
Práce koprocesoru je do značné míry nezávislá na CPU. Může probíhat
asynchronně. Pokud procesor potřebuje pracovat s FPU, měl by koprocesor
být READY. To zajistí instrukce Wait.
Popis koprocesoru, jeho registrů a instrukcí je zaměřen na 80387. Rozdíly
mezi koprocesory nejsou až zas tak podstatné.
Registry koprocesoru Formát dat koprocesoru Instrukce koprocesoru
Procesory Detekce koprocesoru
Formát dat koprocesoru
Čísla předávaná a zpracovávaná Koprocesory mají přesně daný formát. Tento
formát dpovídá normě IEEE. Povolené jsou následuící typy čísel :
Čísla celá :
┌───────────┬─────────────┬───────────────┬─────────────────────────────┐
│ Typ │ Vel. BYTE │ Vel. Bitů │ Rozsah │
╞═══════════╪═════════════╪═══════════════╪═════════════════════════════╡
│ Integer │ 2 │ 1 + 15 │ -32768 ........... 32767 │
├───────────┼─────────────┼───────────────┼─────────────────────────────┤
│ Longint │ 4 │ 1 + 31 │ -2*10^9 ........ 2*10^9 │
├───────────┼─────────────┼───────────────┼─────────────────────────────┤
│ DLongint │ 8 │ 1 + 63 │ -9*10^18 ....... 9*10^18 │
├───────────┼─────────────┼───────────────┼─────────────────────────────┤
│ Comp │ 10d │ 1 + 72 (BCD)│ -9*10^18 ....... 9*10^18 │
└───────────┴─────────────┴───────────────┴─────────────────────────────┘
Struktura (NE v paměti, tam je vše orientováno 'zprava doleva' ) :
Integer :
15 8 7 0
┌─┬─────────┬────────────┐
│S│ Hi BYTE │ Lo BYTE │
└─┴─────────┴────────────┘
Longint :
31 24 23 16 15 8 7 0
┌─┬─────────┬───────────┬───────────┬───────────┐
│S│ HI BYTE │ hi BYTE │ LO BYTE │ lo BYTE │
└─┴─────────┴───────────┴───────────┴───────────┘
DLongint :
63 56 55 48 47 40 39 32 31 24 23 16 15 8 7 0
┌─┬─────────┬────────┬────────┬────────┬────────┬────────┬────────┬─────────┐
│S│ HI BYTE │ │ │ │ │ │ │ lo BYTE │
└─┴─────────┴────────┴────────┴────────┴────────┴────────┴────────┴─────────┘
Comp : ( využívá se kódování BCD, tedy maximální kombinace v půlbyte je 1001 )
79 72 64 56 48 40 32 24 16 8 0
┌─┬────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│S│XXXX│17 16│15 14│13 12│11 10│9 8│7 6│5 4│3 2│1 0│
└─┴────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
Pole S znamená znaménko ( S=0 kladné, S=1 záporné ).
U Comp čísel jsou XXX nepoužité.
Desetinná čísla :
┌──────────┬────┬────────┬───────┬──────────┬─────────────────────────────┐
│ Typ │BYTE│Exponent│Mantisa│ Platno: │ Rozsah │
╞══════════╪════╪════════╪═══════╪══════════╪═════════════════════════════╡
│ Single │ 4 │ 8 bitů │23 bitů│ 6-7 cifer│±3.39*10^-38 ... ±3.39*10^38 │
├──────────┼────┼────────┼───────┼──────────┼─────────────────────────────┤
│ Double │ 8 │11 bitů │52 bitů│15-16 -//-│±1.8*10^-308 ... ±1.8*10^308 │
├──────────┼────┼────────┼───────┼──────────┼─────────────────────────────┤
│ Tempoary │ 10 │15 bitů │64 bitů│ 19 cifer │±1.2*10^-4932...±1.2*10^4932 │
├──────────┼────┼────────┼───────┼──────────┼─────────────────────────────┤
| Real | 6 | 8 bitů |39 bitů| 11 cifer |±2.9*10^-39 ... ±1.7*10^39 |
└ ─ ─ ─ ─ ─┴ ─ ─┴ ─ ─ ─ ─┴ ─ ─ ─ ┴ ─ ─ ─ ─ ─┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
Pozn. : Koprocesor provádí všechny výpočty v Tempoary typech (i celočíselné).
Ostatní typy dokáže sám konvertovat. Názvy odpovídají anglické terminilogii
a zárověň názvům typů čísel v TP. Typ REAL (6 byte) musí být pro výpočty
koprocesoru konverován na typ Double. Konverzi Real - Double neumí provést
koprocesor sám.
Single :
31 30 23 22 0
┌─┬────────────────────┬──────────────────────┐
│S│ Exponent │ Mantisa │
└─┴────────────────────┴──────────────────────┘
Real : (Není podporován koprocesorem, jen pro kompletnost. Pro použití
koprocesorem je třeba provést konverzi ( na Single nebo Double ).
47 46 8 7 0
┌─┬────────────────────┬──────────────────────┐
│S│ Mantisa │ Exponent │
└─┴────────────────────┴──────────────────────┘
Double :
63 62 52 51 0
┌─┬────────────────────┬──────────────────────┐
│S│ Exponent │ Mantisa │
└─┴────────────────────┴──────────────────────┘
Tempoary :
79 78 64 63 0
┌─┬────────────────────┬──────────────────────┐
│S│ Exponent │ Mantisa │
└─┴────────────────────┴──────────────────────┘
S - Signum - znaménko čísla.
0 - kladné
1 - záporné
Exponent - bitové pole určuje pozici 'desetinné tečky' v mantise.
Udává na kolikátou je třeba umocnit 2. Jedná se o vždy o kladné číslo,
které , aby se dosáhlo i hodnot 0 < X < 1 je zmenšováno a konstantu.
Konstanty jsou : 126 pro Single
1022 pro Double
16382 pro Tempoary
128 pro Real
Jsou-li v poli Exponent samé 0 nebo samé 1, jedná se o zvláštní typ čísla
(0, nekonečno ....). Viz níže.
Mantisa - bitové pole představuje 2-kový zápis desetinného čísla.
Jeho struktura je následující :
1,Mantisa pro Single a Double
Mantisa( 1. bit ), Mantisa( zbytek ) pro Tempoary
( 1,Mantisa čti jedna celá mantisa n-tin ; n je 2^ délku mantisy )
Mantisa neobsahuje nikdy samé 0. Je-li tomu tak, jedná se zvláštní typ čísla.
Viz níže.
Vzorec pro výpočet velikosti kódovaného čísla ( ne zvláštní typy )
Single = (-1)^S * 2^(Exponent - 126 ) * 0,1Mantisa
Double = (-1)^S * 2^(Exponent - 1022 ) * 0,1Mantisa
Tempoary = (-1)^S * 2^(Exponent - 16383) * 0,Mantisa
Real = (-1)^S * 2^(Exponent - 128 ) * 0,1Mantisa
└────┬────┘
│
▼
Pro normalizované číslo : < 0.5 ; 1 )
Pro nenormalizované : < 0 ; 0.5 )
Normalizovaná a nenormalizovaná čísla : Normalizované je takové číslo ( typu
Tempoary, Single a Double je normalizované vždy ), které má bit 63 mantisy
jedničku. Koprocesor UMÍ pracovat i s nenormalizovanými čísly, ale výpočty jsou
pak méně přesné ( o jeden dvojkový řád ). Výstup z koprocesoru je VŽDY
normalizované číslo.
Pojem normalizované a nenormanlizované MEMÁ souvislost se zvláštními typy
čísel.
Zvláštní typy čísel :
Výše uvedeným zápisem nelze vyjádřit 0, nekonečno a nedefinovaná hodnota.
Proto jsou zavedeny zvláštní typy čísel, které mají poněkud odlišné kódování.
■ Nula - Má nulový exponent a nulovou mantisu. ( pro Single a Double )
Má nulový exponent a nulovou mantisu ( na bitu 63 nezáleží )
pro Tempoary.
Má-li Tempoary nulovou mantisu ( i bit 63 ) a nenulový exponent,
takže by podle vzorce opravdu vyšla 0, je takové číslo považováno
za chybné a jeho použití vyvolá INT 10 .
Existuje kladná i záporná 0. Při dělení 0 tak procesor určuje znaménko
nekonečno ( podobně jako v limitě ).
■ Nekonečno - Má nulovou mantisu a Exponent samé 1 pro Single a Double.
Má nulovou mantisu, bit 63 je 1 a Exponent samé 1 pro
Tempoary. Rozlišuje se ± nekonečno.
■ NaN - Not a number hodnoty. Jsou využity tam, kde 'není' číslo.
Exponent NaN jsou VŽDY samé 1. Mantisa určuje typ NaN .
Zpracování a závisí na typu NaN :
• Signalizující NaN
Mantisa je nenulová, její nevvyšší bit je 0 a exponent
Mantisa je nenulová a bity 63, 62 = 10 pro Tempoary.
Použití generuje INT 10
• Tichá NaN
Mantisa je nenulová, její nevvyšší bit je 1 a exponent
Mantisa je nenulová a bity 63, 62 = 11 pro Tempoary.
Použití generuje opět tichou NaN.
• Nedefinováno
Vyskytuje se jako výsledek nedefinované operace.
Po konverzi a předání programu :
Integer, Longint a DLongint jsou nastaveny na nejnižší možné číslo
( nejvyšší bit je 1 a ostatní jsou 0 )
Comp - nejvyšších 16 bitů čísla jsou samé 1.
Single, Double - S = 1 ( záporné )
Exponent samé 1.
Nejvyšší bit mantisy 1 ostatní 0.
Tempoary - S = 1
Exponent samé 1.
Nejvyšší bity mantisy 11 ostatní 0.
Koprocesory Procesory Instrukce koprocesoru
Registry koprocesoru INT 06 INT 07 INT 09 INT 10
Registry koprocesoru
Koprocesor obsahuje 3 skupiny registrů :
1. Zásobník obecných registrů ( zpracovávaná čísla )
79 78 64 63 0
┌─┬────────────────────────┬────────────────────────────────────────┐
0. │S│ Exponent │ Mantisa │
├─┼────────────────────────┼────────────────────────────────────────┤
1. │S│ Exponent │ Mantisa │
├─┼────────────────────────┼────────────────────────────────────────┤
2. │S│ Exponent │ Mantisa │
├─┼────────────────────────┼────────────────────────────────────────┤
3. │S│ Exponent │ Mantisa │
├─┼────────────────────────┼────────────────────────────────────────┤
4. │S│ Exponent │ Mantisa │
├─┼────────────────────────┼────────────────────────────────────────┤
5. │S│ Exponent │ Mantisa │
├─┼────────────────────────┼────────────────────────────────────────┤
6. │S│ Exponent │ Mantisa │
├─┼────────────────────────┼────────────────────────────────────────┤
7. │S│ Exponent │ Mantisa │
└─┴────────────────────────┴────────────────────────────────────────┘
V data jsou uložená ve formátu Tempoary - viz Formát dat koprocesoru
Jeden z registrů je vžsy na vrcholu (označuje se ST), ostatní jej následují
podle pevného pořadí ( ST (1), ST (2) ... ) . Je-li ST sedmá položka, pak
je ST (1) položka č. 0. Argumentem většiny instrukcí koprocesoru jsou právě
položky ST nebo ST (X) . Instrukce koprocesoru
2. Stavové registry
Status Word (SW)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
┌───┬────┬─────────────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ B │ C3 │ T O P │ C2 │ C1 │ C0 │ IR │ SF │ PE │ UE │ OE │ ZE │ DE │ IE │
└───┴────┴─────────────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
B , IR - Nastaveny na 1, pokud některý z bitů UE, PE, OE, ZE, DE nabo IE
indikuje přerušení zakázané odpovídajícím ?M v CW.
TOP - číslo registru, který je právě na vrcholu zásobníku ( ST ).
C? - Nastaveny po porovnání 2 čísel. Jejich umístění odpovídá umístění
příznaků v (E)FLAGS tak, aby mohly být použity standardní podmíněné
instrukce. Např:
FCOMPP
FSTSW AX
SAHF
Je @xxxx ( je-li ST=ST(1) )
Jg @yyyy ; atp
SF - Nastaven na 1 po přetečení - podtečení zásobníku. Např. při pokusu
číst prázdný registr z vrcholu zásobníku.
?E - příznaky chyb koprocesoru
Příznak (SW) Maska (CW) Význam
IE IM Špatná operace
DE DM Nenormalizováno
ZE ZM Dělení 0
OE OM Přetečení
UE UM Podtečení
PE PM Chyba přesnosti
Control Register (CW)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
┌───┬────┬────┬────┬────────┬────────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 0 │ 0 │ 0 │ RC │ PC │ 0 │ 1 │ PM │ UM │ OM │ ZM │ DM │ IM │
└───┴────┴────┴────┴────────┴────────┴────┴────┴────┴────┴────┴────┴────┴────┘
RC - Zaokrouhlování. Viz tabulka
Bit 11 10 Význam
0 0 K nejbližší ( nebo sudé )
0 1 Vlevo ( na menší číslo )
1 0 Vpravo ( na větší číslo )
1 1 Vždy směrem k nule
PC - Přesnost. Viz tabulka
Bit 9 8 Význam
0 0 24 bitů mantisy ( Single )
0 1 Zakázáno
1 0 53 bitů mantisy ( Double )
1 1 64 bitů mantisy ( Tempoary )
?M - Maskování chyb koprocesoru.
Nastavení bitu na 1 znamená interní ošetření
0 znamená externí ošetření INT 0A
Viz též tabulku u SW.
TW - Tag Word
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
│ TAG 7 │ TAG 6 │ TAG 5 │ TAG 4 │ TAG 3 │ TAG 2 │ TAG 1 │ TAG 0 │
└────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
TAG X uchovává informace o registru zásobníku X.
Význam TAG
0 0 Normální číslo
0 1 Nula
1 0 Speciální číslo ( nekonečno, NaN )
1 1 Prázdné
3. Chybové registry
31 27 26 16 15 0
┌───────────────────────────────────────────────────────────────────────┐
│ FIP │
├──────────────┬────────────────────────────────────────────────────────┤
│ 0 0 0 0 0 │ FCS │
├──────────────┴────────────────────────────────────────────────────────┤
│ FOO │
├─────────────────────────────────┬─────────────────────────────────────┤
│ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 │ FOS │
└─────────────────────────────────┴─────────────────────────────────────┘
FCS : FIP - Adresa instrukce, jež provedla chybu
bity 16 .. 28 FCS : operační kód instrukce
prefixy vynechány
bity 0,1 a 2 prvního BYTE instrukce => 26,25 a 24
( bity 8..3 prvního byte jsou vždy 11011 )
Druhý BYTE instrukce se uloží do bitů 23..16
FOS : FOP - Adresa operandu, jež se zúčastnil chyby
Koprocesory Procesory Instrukce koprocesoru Formát dat koprocesoru
Instrukce koprocesoru
Instrukce označené (387) jsou dostupné jen pro 80387. (287) znamená totéž
pro 80287. I zde je zachována vzestupná kompatibilita.
Písmeno F na začátku instrukce znamená příkaz pro koprocesor. Písmeno P na
konci instrukce znamená odstranění operandu. Písmeno N na druhém místě
instrukce ( jen některé instrukce, nepovinné ) znamená provádět kontrolu
přerušení před provedením.
F2XM1 (bez operandů)
════════════════════════════════════════════════════════════════════════════
Instrukce provede : ST:= 2^(ST)-1.
Pracuje jen pro -0.5 < ST < 0.5
FABS (bez operandů)
════════════════════════════════════════════════════════════════════════════
Instrukce provede : ST:= ABS (ST).
FADD (bez, 1 nebo 2 operandy )
════════════════════════════════════════════════════════════════════════════
Provede součet 2 čísel.
FADD (bez) Sečte ST a ST(1), odstraní ST(1) a výsledek uloží do ST.
FADD (1)
Parametry : ST(i)
mem 32 (Single)
mem 64 (Double)
Provede : ST:= ST + Parametr
FADD ST, ST(i)
ST(i), ST
Sečte parametry a umístí je na místo 1. (cílového).
Chyba je nekonečno + (-nekonečno).
FADDP ( 2 operandy )
════════════════════════════════════════════════════════════════════════════
Provede součet 2 čísel. Druhý operand odstraní. Výsledek se uloží do prvního
operandu
FADD ST, ST(i)
FADD ST(i), ST
FCHS ( bez )
════════════════════════════════════════════════════════════════════════════
Provede ST:= - ST
FCOM/FCOMP/FCOMPP
════════════════════════════════════════════════════════════════════════════
FCOM/FCOMP ST(i)
FCOM/FCOMP mem32 (Single)
FCOM/FCOMP mem64 (Double)
FCOMPP
Porovná ST a operand (FCOMPP porovnává ST a ST(1) ).
FCOMP navíc odstraní ST ze zásobníku
FCOMPP odstraní ST a ST(1).
Podle výsledku porovnání nastaví SW. Viz Registry koprocesoru
FDIV ( bez, 1 nebo 2 operandy )
════════════════════════════════════════════════════════════════════════════
Provede dělení
FDIV (bez) Vydělí ST(1) a ST, odstraní ST(1) a výsledek uloží do ST.
FDIV (1)
Parametry : ST(i)
mem 32 (Single)
mem 64 (Double)
Provede : ST:= ST / Parametr
FDIV (2)
ST, ST(i)
ST(i), ST
Vydělí parametry op1/op2 a umístí je na místo 1. (cílového).
Nic neodstraňuje.
FDIVP ( 2 operandy )
════════════════════════════════════════════════════════════════════════════
Provede dělení a odstraní operandy ze zásobníku
FDIVP(2)
ST, ST(i)
ST(i), ST
Vydělí parametry op1/op2 a umístí je na místo 1. (cílového).
Odstraní op2.
FDIVR (0,1 nebo 2 operandy )
════════════════════════════════════════════════════════════════════════════
Provede dělení v obráceném pořadí než FDIV.
FDIVRP ( 2 operandy )
════════════════════════════════════════════════════════════════════════════
Provede dělení v obráceném pořadí než FDIVP.
FIADD ( 1 operand )
════════════════════════════════════════════════════════════════════════════
Přičte k ST celé číslo ( Integer nebo Longint ), které je jejím parametrem.
Pracuje jako FADD.
FICOM/FICOMP ( 1 operand )
════════════════════════════════════════════════════════════════════════════
Porovná ST a celé číslo ( Integer nebo Longint ), které je operandem instrukce.
Pracuje jako FCOM/FCOMP.
FIDIV ( 1 operand )
════════════════════════════════════════════════════════════════════════════
Vydělí ST parametrem instrukce ( Integer nebo Longint ). Pracuje jako FDIV.
FIDIVR ( 1 operand )
════════════════════════════════════════════════════════════════════════════
Vydělí parametr instrukce ( Integer nebo Longint ) ST. Pracuje jako FDIVR.
FIMUL ( 1 operand )
════════════════════════════════════════════════════════════════════════════
Vynásobí ST parametrem instrukce ( Integer nebo Longint ). Výsledek do ST.
FISUB ( 1 operand )
════════════════════════════════════════════════════════════════════════════
Od ST odečte parametr instrukce ( Integer nebo Longint ). Výsledek do ST.
FISUBR ( 1 operand )
════════════════════════════════════════════════════════════════════════════
Od parametru instrukce ( Integer nebo Longint ) odečte ST. Výsledek do ST.
FMUL ( 0,1 nebo 2 operandy )
════════════════════════════════════════════════════════════════════════════
FMUL (bez) ST:=ST*ST(1). Vypustí ST(1).
FMUL (1)
ST(i)
mem32 ( Single )
mem64 ( Double )
ST:=ST*parametr
FMUL (2)
ST,ST(i)
ST(i),ST
Cílový operand (1.) je vynásoben druhým. Výsledek do 1. operandu.
FMULP ( 2 operandy )
════════════════════════════════════════════════════════════════════════════
FMULP ST,ST(i)
ST(i),ST
Cílový operand (1.) je vynásoben druhým. Výsledek do 1. operandu.
Druhý operand je odstraněn.
FPREM ( bez )
════════════════════════════════════════════════════════════════════════════
Vypočte zbytek po dělení ST / ST(1). Je-li zbytek vypočten, nastaví C2 v SW.
Není-li C2 = 1, musí se FPREM opakovat. ST je zbytek pro C2=1 nebo 1 pro
nedokončený výpočet. Zbytek leží v intervalu <-ST(1);ST(1)>
FPREM1 ( bez ) (387)
════════════════════════════════════════════════════════════════════════════
Vypočte zbytek po dělení ST / ST(1). Je-li zbytek vypočten, nastaví C2 v SW.
Není-li C2 = 1, musí se FPREM1 opakovat. ST je zbytek pro C2=1 nebo 1 pro
nedokončený výpočet. Zbytek leží v intervalu <-ST(1)/2;ST(1)/2>
FRNDINT ( bez )
════════════════════════════════════════════════════════════════════════════
Zaokrouhlí ST na celé číslo.
FSCALE ( bez )
════════════════════════════════════════════════════════════════════════════
Provede ST := ST * 2^ST(1)
FSUB ( bez, 1 nebo 2 operandy )
════════════════════════════════════════════════════════════════════════════
Provede odečtení
FSUB (bez) Od ST(1) odečte ST, odstraní ST(1) a výsledek uloží do ST.
FSUB (1)
Parametry : ST(i)
mem 32 (Single)
mem 64 (Double)
Provede : ST:= ST - Parametr
FSUB (2)
ST, ST(i)
ST(i), ST
Odečte parametry op1 - op2 a umístí je na místo 1. (cílového).
Nic neodstraňuje.
FSUBP ( 2 operandy )
════════════════════════════════════════════════════════════════════════════
Provede odečtení
FSUBP (2)
ST, ST(i)
ST(i), ST
Odečte parametry op1 - op2 a umístí je na místo 1. (cílového).
Odstraní druhý operand.
FSUBR (0,1 nebo 2 operandy )
════════════════════════════════════════════════════════════════════════════
Jako FSUB, ale v opačném pořadí
FSUBRP ( 2 operandy )
════════════════════════════════════════════════════════════════════════════
Jako FSUBP, ale v opačném pořadí
FSQRT ( bez )
════════════════════════════════════════════════════════════════════════════
Do ST uloží odmocninu z ST. Odmocňovat lze jen kladná čísla a 0.
Odmocnina z -0 je opět -0.
FTST (bez)
════════════════════════════════════════════════════════════════════════════
Srovná ST s 0. Pracuej jako FCOM.
FUCOM/FUCOMP/FUCOMPPP (0,1 nebo 2 ) (387)
════════════════════════════════════════════════════════════════════════════
Pracuje jako FCOM/P/P ale nehlásí chyby pro porovnání NaN.
FXAM (bez)
════════════════════════════════════════════════════════════════════════════
Zjistí hodnotu ST. Nastavuje C?.
C3 C2 C1 C0 Význam
0 0 0 0 Kladná hodnota nepodporovaná koprocesorem
0 0 0 1 Kladné NaN
0 0 1 0 Záporná hodnota nepodporovaná koprocesorem
0 0 1 1 Záporné NaN
0 1 0 0 Kladné číslo mimo 0
0 1 0 1 Kladné nekonečno
0 1 1 0 Záporné číslo mimo 0
0 1 1 1 Záporné nekonečno
1 0 0 0 + 0.0
1 0 0 1 Prázdný a kladný
1 0 1 0 - 0.0
1 0 1 1 Prázdný a záporný
1 1 0 0 + Nenormalizováno
1 1 0 1 Reserved
1 1 1 0 - Nenormalizováno Formát dat koprocesoru
1 1 1 1 Reserved Registry koprocesoru
FXTRACT (bez)
════════════════════════════════════════════════════════════════════════════
Rozloží číslo na Exponent a Mantisu.
Eponent uloží do ST a mantisu do ST(1) . Celý zásobník posune o 1.
Exponent je skutečný, tedy i záporný.
FBLD (mem80)
════════════════════════════════════════════════════════════════════════════
Zavede BCD číslo Comp na zásobník (do ST) Posune jej. (ST - > ST(1) atd. )
FBSTP (mem80)
════════════════════════════════════════════════════════════════════════════
Převede ST na BCD - Comp a uloží jej do paměti.
Posune zásobník (odstraní ST).
FILD (mem)
════════════════════════════════════════════════════════════════════════════
Zavede celé číslo na zásobník (do ST). Posune jej. (ST - > ST(1) atd. )
mem16 - Integer
mem32 - Longint
mem64 - DLongint
FIST (mem)
════════════════════════════════════════════════════════════════════════════
Převede ST na celé číslo a uloží jej do paměti.
mem16 - Integer
mem32 - Longint
mem64 - DLongint
Neodstraňuje !
FISTP (mem)
════════════════════════════════════════════════════════════════════════════
Jako FIST ale odstraní a posune zásobník.
FST (mem nebo ST (i) )
════════════════════════════════════════════════════════════════════════════
Převede ST na číslo požadované přesnosti a uloží jej do paměti. Pokud je
parametrem ST(i), přepíše ST obsah ST(i).
Neodstraňuje !
FSTP (mem nebo ST (i) )
════════════════════════════════════════════════════════════════════════════
Kako FST + odstranění.
FXCH (bez nebo ST (i) )
════════════════════════════════════════════════════════════════════════════
FXCH prohodí registry koprocesoru.
Bez parametrů ST a ST(1), jinak ST a ST(i).
FLD (mem)
════════════════════════════════════════════════════════════════════════════
Zavede do ST Single, Double nebo Tempoary z paměti. Posune celý zásobník.
(ST - > ST(1) atd. )
mem32 - Single
mem64 - Double
mem80 - Tempoary
FLD1 (bez)
════════════════════════════════════════════════════════════════════════════
Do ST umístí 1.Posune zásobník. ( ST-> ST(1) atd. )
FLDL2E (bez)
════════════════════════════════════════════════════════════════════════════
Do ST umístí dvojkový logaritmus e =2.718 ..).Posune celý zásobník.
( ST-> ST(1) atd. )
FLDL2T (bez)
════════════════════════════════════════════════════════════════════════════
Do ST umístí dvojkový logaritmus 10 .Posune celý zásobník.
( ST-> ST(1) atd. )
FLDLG2 (bez)
════════════════════════════════════════════════════════════════════════════
Do ST umístí desítkový logaritmus 2 .Posune celý zásobník.
( ST-> ST(1) atd. )
FLDLN2 (bez)
════════════════════════════════════════════════════════════════════════════
Do ST umístí přirozený( základ je e=2.718) logaritmus 2 .Posune celý zásobník.
( ST-> ST(1) atd. )
FLDPI (bez)
════════════════════════════════════════════════════════════════════════════
Do ST umístí π = 3.1415926535897.. .Posune celý zásobník.
( ST-> ST(1) atd. )
FLDZ (bez)
════════════════════════════════════════════════════════════════════════════
Do ST umístí 0 .Posune celý zásobník. ( ST-> ST(1) atd. )
FCOS (bez) (387)
════════════════════════════════════════════════════════════════════════════
Do ST umístí cos ST .Posune celý zásobník. ( ST-> ST(1) atd. ) a do ST umístí
1. Nastaví C2 na 0. ST je v radiánech a musí být v < 0.0 ; π*2^64).
Chyba je indikována C2 na 1.
FPATAN (bez)
════════════════════════════════════════════════════════════════════════════
Provede arctg ( ST(1)/ST ) Na rozdíl od 287 387 nemá omezenou velikost
operandu. Odstraní ST(1) a výsledek uloží do ST.
FPTAN (bez)
════════════════════════════════════════════════════════════════════════════
Do ST umístí tg ST .Posune celý zásobník. ( ST-> ST(1) atd. ) a do ST umístí
1. Nastaví C2 na 0. ST je v radiánech a musí být v < 0.0 ; π*2^64).
Chyba je indikována C2 na 1.
FSIN (bez) (387)
════════════════════════════════════════════════════════════════════════════
Do ST umístí sin ST .Posune celý zásobník. ( ST-> ST(1) atd. ) a do ST umístí
1. Nastaví C2 na 0. ST je v radiánech a musí být v < 0.0 ; π*2^64).
Chyba je indikována C2 na 1.
FSINCOS (bez) (387)
════════════════════════════════════════════════════════════════════════════
Do ST umístí sin ST .Posune celý zásobník. ( ST-> ST(1) atd. ) a do ST umístí
cos PŮVODNÍHO ST. Nastaví C2 na 0. ST je v radiánech a musí být v intervalu
< 0.0 ; π*2^64 >.
Chyba je indikována C2 na 1.
FYL2X (bez)
════════════════════════════════════════════════════════════════════════════
Provede ST:=ST(1) * lg ST , lg představuje logaritmus o základu 2.
ST musí být kladný. Instrukce odstraní ST(1).
FYL2XP1 (bez)
════════════════════════════════════════════════════════════════════════════
Provede ST:=ST(1) * lg (ST+1) , lg představuje logaritmus o základu 2.
ST musí být z intervalu (-1+√2/2; 1-√2/2 ). Instrukce odstraní ST(1).
FCLEX (bez)
════════════════════════════════════════════════════════════════════════════
Smaže všechny nahromaděné výjimky a bit B SW.
FDECSTP (bez)
════════════════════════════════════════════════════════════════════════════
Sníží hodnotu ST o jedna. 0 podteče na 7.
FINCSTP (bez)
════════════════════════════════════════════════════════════════════════════
Zvýší hodnotu ST o jedna. 7 přeteče na 0.
FINIT (bez)
════════════════════════════════════════════════════════════════════════════
Inicializace koprocesoru.
Nastaví:
■ Zaokrouhlení k nejbližší hodnotě
■ Maskování všech výjimek
■ Přesnost 64 bitů
■ Sw se vynuluje vyjma C?
■ Všechny registry jsou prázdné
Registry koprocesoru
FLDCW (mem16 nebo reg16)
════════════════════════════════════════════════════════════════════════════
Načte CW z registru/paměti. Je-li v SW nastaven bit ?I, který nový CW
nemaskuje, ohlásí se výjimka INT 10 .
FLDENV (mem)
════════════════════════════════════════════════════════════════════════════
Obnoví obsah registrů koprocesoru z paměti :
32 bitové prostředí
32 27 26 16 15 0
┌────────────────────────────┬─────────────────────────────┐
│ 00000000000000000000000 │ CW │
├────────────────────────────┼─────────────────────────────┤
│ 00000000000000000000000 │ SW │
├────────────────────────────┼─────────────────────────────┤
│ 00000000000000000000000 │ TW │
├────────────────────────────┴─────────────────────────────┤
│ FIP │
├───────┬──────────────────────────────────────────────────┤
│ 00000 │ FCS │
├───────┴──────────────────────────────────────────────────┤
│ FOO │
├────────────────────────────┬─────────────────────────────┤
│ 000000000000000000000000 │ FOS │
└────────────────────────────┴─────────────────────────────┘
16 bitové prostředí Prostředí 16/32
15 0
┌────────────────────────────┐
│ CW │
├────────────────────────────┤ IP - Lineární adresa instrukce chyby
│ SW │ (20 bitů)
├────────────────────────────┤ DP - Lineární adresa operandu chyby
│ TW │ (20 bitů)
├────────────┬─┬─────────────┤
│ IP 16..19 │0│ FCS 16 ..26 │
├────────────┴─┴─────────────┤
│ IP 0..15 │
├────────────┬───────────────┤
│ DP 16..19 │00000000000000 │
├────────────┴───────────────┤
│ DP 0..15 │
└────────────────────────────┘
FNOP
════════════════════════════════════════════════════════════════════════════
Nedělá nic ( do ST dá ST )
FRSTOR (mem)
════════════════════════════════════════════════════════════════════════════
Obnoví koprocesor z paměti ( záznam jako FSAVE )
FSAVE (mem)
════════════════════════════════════════════════════════════════════════════
Vysype koprocesor do paměti.
Struktura je závislá na Prostředí 16/32 .
1. částí je zázman jako pro FLDENV ( viz výše )
2. částí je 8 x 10 bytr, ve kterých jsou uloženy hodnoty registrů
koprocesoru ve tvaru Tempoary. Viz Registry koprocesoru
FSTCW (mem16)
════════════════════════════════════════════════════════════════════════════
Uloží obsah CW do paměti.
FSTENV (mem)
════════════════════════════════════════════════════════════════════════════
Uloží obsah řídících registrů do paměti. Viz FLDENV.
FSTSW (mem16)
════════════════════════════════════════════════════════════════════════════
Uloží obsah SW do paměti.
FFREE (bez nebo ST(i) )
════════════════════════════════════════════════════════════════════════════
Označí ST(i) nebo ST (bez) jako prázdný.
FSETPM (bez) (287)
════════════════════════════════════════════════════════════════════════════
Informuje koprocesor, že CPU pracuje v PROTECTED MÓDu . Na 387 NENÍ třeba.
Pozn.: Některé assemblery neuznávají ST, ale vyžadují zápis ST(0). U instrukcí
načítání (FLD, FILD) je striktně vyžadováno doplnění velikosti operandu.
Např.: FLD dword ptr ds:[si]. Podle délky operandu ASM generuje opkód
instrukce.
Jednotlivým číselným typům odpovídají tyto struktury :
Integer WORD
Longint DWORD
DLongint QWORD
Comp TBYTE
Single DWORD
Double QWORD
Tempoary TBYTE
Real (TP) PWORD ( Koprocesor NEUMÍ sám zpracovat. Jen pro úplnost)
Koprocesory Procesory Registry koprocesoru Formát dat koprocesoru
PODPORA MYŠI
Funkce řídícího programu myši:
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Mou Fn 00 Reset řídícího programu/čti status
Mou Fn 01 Zobraz kurzor
Mou Fn 02 Ukryj kurzor
Mou Fn 03 Dotaz na pozici & tlačítka
Mou Fn 04 Změň polohu kurzoru
Mou Fn 05 Dotaz na tlačítko - počet stisknutí
Mou Fn 06 Dotaz na tlačítko - počet uvolnění
Mou Fn 07 Nastav horizontální rozsah
Mou Fn 08 Nastav vertikální rozsah
Mou Fn 09 Nastav tvar grafického kurzoru
Mou Fn 0A Nastav masku textového kurzoru
Mou Fn 0B Dotaz na vzdálenost posledního pohybu
Mou Fn 0C Nastav manipulační program události
Mou Fn 0D Povol emulaci světelného pera
Mou Fn 0E Zakaž emulaci světelného pera
Mou Fn 0F Nastav poměr mickey/pixel
Mou Fn 10 Nastav výlučnou oblast
Mou Fn 12 Nastav velikost bloku grafického kurzoru
Mou Fn 13 Nastav max pro zdvojnásobení rychlosti
Mou Fn 14 Vyměň manipulační program události
Mou Fn 15 Dotaz na velikost bufferu pro uložení stavu myši
Mou Fn 16 Uchovej status myši
Mou Fn 17 Obnov status myši
Mou Fn 18 Nastav alternující manipulační program události
Mou Fn 19 Uživatelský alternativní manipulační program události
Mou Fn 1A Nastav citlivost myši
Mou Fn 1B Dotaz na citlivost myši
Mou Fn 1C Nastav četnost přerušení myši
Mou Fn 1D Nastav stránku obrazovky
Mou Fn 1E Dotaz na aktivní stránku obrazovky
Mou Fn 1F Deaktivuj řídící program myši
Mou Fn 20 Povol řídící program myši
Mou Fn 21 Reset řídícího programu myši
Mou Fn 24 Dotaz na typ myši, číslo přerušení
Mou Fn 42 Dej požadavky pro uložení stavu myši
Mou Fn 50 Ulož stav myši
Mou Fn 52 Obnov stav myši
──────────────────────────────────────────────────────────────────────────
Pro přístup k suportu myši: naplňte registry tak, jak je popsáno u každé
funkce, nastavte AX na číslo funkce (poznámka: NIKOLI AH), a volejte
INT 33H.
Ve většině aplikací v textovém módu je ve skutečnosti potřeba velmi
málo funkcí. Při použití v grafickém módu byste se měli raději držet
suportu myši Windows nebo jiného prostředí. Zde je souhrn použití
v textovém módu:
Ke zjištění přítomnosti myši použijte Mou Fn 00H. Resetuje řídící program
myši a, obecně, platí všechna implicitní nastavení. Pomněte, že
pravděpodobně můžete předpokládat, že uživatel umí instalovat myš
(pomocí MOUSE.COM nebo instalací MOUSE.SYS v souboru CONFIG.SYS).
Aktivitu myši můžete zjišťovat pomocí Mou Fn 03 , nebo obvykleji,
instalujte manipulační program události pomocí Mou Fn 0C nebo
Mou Fn 18 a definujte akci, při níž se tato obsluha vyvolá. Obvyklá
technika je nechat svůj manipulační program události prostě nastavit
hodnoty do globálních proměnných, které lze kdykoli testovat jakoukoli
částí vašeho programu.
Je dobré vědět, že všechny souřadnice na obrazovce používané řídícím
programem jsou specifikovány, jako by obrazovka byla v grafickém režimu.
Pro aplikace v textovém módu je pozice znaku uvažována jako 8 bodů
široká a 16 bodů vysoká. Tedy pro určení hodnoty (X,Y) na obrazovce
z (10,11) předejte hodnotu (80,176). Podobně, pokud suport ukazuje, že
myš je na pozici (632,80), je kurzor ve skutečnosti na znaku (79,5).
Každou souřadnici prostě vydělte 8 (16) (nebo třikrát (4x) binárně zrotujte
doprava).
Výpadky myši Jedna ze zajímavých částí programování myši v textovém
▄▄▄▄▄▄▄▄▄▄▄▄ módu se týká efektu, který nazveme výpadek myši. Pokud
provádíte přímý zápis do bufferu videa (a přitom přepisujete pozici
myši), suport myši nebude vědět nic o novém znaku nebo atributu na
pozici kurzoru. Pokud poté myší pohnete, řídící program znovu obnoví
starý znak/atribut namísto nového, který jste zapsali vy.
Abyste se tomuto vyhnuli, musíte před zápisem přímo do RAM videa použít
Mou Fn 02H (Ukryj kurzor) a po zápisu použít Mou Fn 01H (Zobraz kurzor).
Poznamenejme, že budete-li používat INT 10H, tento problém mít nebudete,
protože suport myši taková I/O volání zastavuje, a tím tento problém
eliminuje.
TSR programy Píšete-li residentní program, který používá myš, musíte
▄▄▄▄▄▄▄▄▄▄▄▄ si dát pozor na výpadky myši, stejně jako na podobné
problémy spojené s přerušením probíhajícího programu.
Při instalaci svého TSR volejte Mou Fn 15H a alokujte buffer naznačené
velikosti. Je-li TSR aktivován, musíte použít Mou Fn 16H pro uložení
stavu myši, a použít Mou Fn 0CH, Mou Fn 14H, nebo Mou Fn 18H
pro instalaci vašeho manipulačního programu události. Při vystoupení
ze svého TSR, musíte použít Mou Fn 17H k opětnému nastavení stavu myši
pro přerušený program.
Verze myši Verze 6.0 řídícího programu myši od Microsoft Inc.
▄▄▄▄▄▄▄▄▄▄ (přibližně rok 1983) podporovala pouze funkce Mou Fn 00H až
Mou Fn 17H a Mou Fn 1DH až Mou Fn 1EH. Verze 6.1 řídícího programu myši
(přibližně 1984) podporuje všechny funkce výše vyjmenované a přidává ještě
schopnost instalovat flexibilnější manipulační program události (kontrola
stisknutí Shift-, Ctrl-, nebo Alt-), stránkování obrazovky, kontrolu
citlivosti myši, a možnost zakázání řídícího programu myši.
Jistý RESET Protože různé manipulační programy reagují různě,
▄▄▄▄▄▄▄▄▄▄▄ doporučujeme pro jistý a bezbolestný reset myši následující
postup:
■ Volejte Mou Fn 21 a otestujte si výsledek.
■ Jestliže vrátí AX=0FFFFH, je vše v pořádku (i pro jakýkoli následující
reset stačí volat Mou Fn 21 ) a můžete ukončit inicializační fázi.
■ Pokud je AX = 21H, volejte Mou Fn 00 .
Je-li AX = 0FFFFH, je řídící program resetován, a v případě dalších
resetů stačí volat Mou Fn 00 .
Mohlo by se zdát, že poučení z výše uvedeného postupu je volat Mou Fn 00H
pro všechny řídící programy, ale v případě některých řídících programů
(např. Genius) trvá Mou Fn 00H neúnosně dlouho (1-2 vteřiny), protože
provádí i reset hardware myši.
Protože všechna tato vylepšení již existují řadu let, neměly by s použitím
postup:
■ Volejte Mou Fn 21 a otestujte si výsledek.
■ Jestliže vrátí AX=0FFFFH, je vše v pořádku (i pro jakýkoli následující
reset stačí volat Mou Fn 21H) a můžete ukončit inicializační fázi.
■ Pokud je AX = 21H, volejte Mou Fn 00H.
Je-li AX = 0FFFFH, je řídící program resetován, a v případě dalších
resetů stačí volat Mou Fn 00 .
Mohlo by se zdát, že poučení z výše uvedeného postupu je volat Mou Fn 00H
pro všechny řídící programy, ale v případě některých řídících programů
(např. Genius) trvá Mou Fn 00H neúnosně dlouho (1-2 vteřiny), protože
provádí i reset hardware myši.
Protože všechna tato vylepšení již existují řadu let, neměly by s použitím
novějších funkcí být žádné potíže.
Viz též: Seznam přerušení
Mou Fn 00 VYNULUJ/DOTAZ NA INSTALOVANÝ STAV
Požaduje: AX = 0000H MS Mouse
Výstup: AX = status instalace myši
0000H: neinstalována (nepoužívejte !)
0FFFFH: instalována
BX = počet tlačítek myši (v případě pozitivní instalace)
3: třítlačítková (Mouse System)
-1,1,2: dvoutlačítková
0: jiná
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Nuluje myš. Tuto funkci použijte ke zjišťení, zda je suport myši
přítomen. Vykonává reset hardware a software (pro reset pouze software
viz Mou Fn 21 ).
Při aplikacích v textovém módu tato funkce provede následující činnost:
■ Umístí kurzor myši doprostřed obrazovky.
■ Ukryje kurzor (pro jeho zobrazení použijte Mou Fn 01 ).
■ Čistí jakoukoli 'výlučnou oblast' nastavenou funkcí Mou Fn 10 .
■ Nastaví masku kurzoru na aktuální: atribut inverze znaku na kurzoru
(pro změnu vzhledu kurzoru použijte Mou Fn 0A ).
Při aplikacích v tgrafickém módu tato funkce provede následující činnost:
■ Umístí kurzor myši doprostřed obrazovky.
■ Ukryje kurzor (pro jeho zobrazení použijte Mou Fn 01H).
■ Čistí jakoukoli 'výlučnou oblast' nastavenou funkcí Mou Fn 10H.
■ Nastaví masku kurzoru na aktuální: atribut inverze znaku na kurzoru
(pro změnu vzhledu kurzoru použijte Mou Fn 0AH).
■ Nastaví rozsah na šířku a výšku celé obrazovky (k vymezení oblasti
zobrazení kurzoru použijte Mou Fn 07H, a Mou Fn 08H nebo Mou Fn 10H).
■ Připraví zobrazení kurzoru na stránce 0 videa (viz Mou Fn 1DH).
■ Povolí emulaci světelného pera (viz Mou Fn 0DH a Mou Fn 0EH).
■ Nastaví poměr rychlosti kurzoru na horizontální: 8 ku 8;vertikální
8 ku 16; a nastaví maximální zdvojnásobení rychlosti na 64 mickeys
(viz Mou Fn 1A ).
Viz též: INT 33 Seznam přerušení
Mou Fn 01 ZOBRAZ KURZOR MYŠI
Požaduje: AX = 0001H MS Mouse
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Inkrementuje vnitřní počítadlo používané suportem myši k určení, kdy
zobrazit kurzor. Počítadlo začíná od -1 (po vynulování Mou Fn 00H).
Volání je inkrementuje na 0. Kdykoli je počítadlo na 0, zobrazí se
kurzor myši a ukáže se na obrazovce. Další volání (je-li počítadlo na 0)
jsou ignorována. Volání Mou Fn 02H (Ukryj kurzor) počítadlo dekrementují.
Tato logika zbavuje programy břemene globálního sledování stavu
ukrytý/zobrazený. Podprogram vždy může na počátku použít Mou Fn 01H a na
konci Mou Fn 02 , bez ovlivnění stavu ukrytý/zobrazený volající rutiny.
Tato funkce též nuluje 'výlučnou oblast' nastavenou funkcí Mou Fn 10H.
Viz též: INT 33 Seznam přerušení
Mou Fn 02 UKRYJ KURZOR MYŠI
Požaduje: AX = 0002H MS Mouse
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Odstraňuje kurzor myši z obrazovky (je-li aktuálně viditelný). Ve
skutečnosti dekrementuje vnitřní počítadlo kurzoru. Pokud je před
zavoláním toto počítadlo 0, kurzor se z obrazovky odstraní.
Tuto funkci použijte před jakýmkoli přímým zápisem do obrazovky videa
(pokud by toto vyvolalo přepsání kurzoru myši), a po zápisu na obrazovku
volejte Mou Fn 01 . Viz také diskusi o výpadcích myši u INT 33 .
Vícenásobné volání ukrytí kurzoru vyžaduje vícenásobné volání Mou Fn 01
pro zobrazení kurzoru.
Viz též: INT 33 Seznam přerušení
Mou Fn 03 DOTAZ NA POZICI & TLAČÍTKA
Požaduje: AX = 0003H MS Mouse
Výstup: BX = status tlačítek
bit 0: levé tlačítko stisknuto
bit 1: pravé tlačítko stisknuto
bit 2: střední tlačítko stisknuto (Mouse System)
CX = souřadnice X (horizontální), pro sloupec textu dělte 8
DX = souřadnice Y (vertikální), pro řádek textu dělte 8
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Vrátí aktuální polohu kurzoru myši a aktuální status tlačítek myši.
Viz též: INT 33 Seznam přerušení
Mou Fn 04 NASTAV POZICI KURZORU MYŠI
Požaduje: AX = 0004H MS Mouse
Výstup: CX = souřadnice X (horizontální), sloupec textu násobte 8
DX = souřadnice Y (vertikální), řádek textu násobte 8
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Nastaví vnitřní souřadnice kurzoru řídícího programu. Kurzor je tam
přesunut, i když je aktuálně ukryt (viz Mou Fn 02 ) nebo když jsou
X, Y ve výlučné oblasti (viz Mou Fn 10 ). Jsou-li X, Y mimo rozsah
stanovený Mou Fn 07 a Mou Fn 08 , je v tomto rozsahu kurzor
'připíchnut' (bude nastaven na nejbližší platnou mez).
Potřeba kurzorem hýbat je vzácná, nejlepší je nechat to na uživateli.
Povšimněte si, že všechny X, Y souřadnice jsou virtuální a při práci
v textovém módu musíte pro získání znakového sloupce a řádku každou
hodnotu vydělit 8 (16).
Viz též: INT 33 Seznam přerušení
Mou Fn 05 DOTAZ NA TLAČÍTKO - POČET STISKNUTÍ
Požaduje: AX = 0005H MS Mouse
BX = dotazované tlačítko (0=levé, 1=pravé, 2=střední)
bit 0: levé tlačítko stisknuto
bit 1: pravé tlačítko stisknuto
bit 2: střední tlačítko stisknuto (Mouse System)
Výstup: AX = status tlačítek
BX = počet stisknutí tlačítka od posledního volání
CX = souřadnice X (horizontální pixel) posledního stisknutí
DX = souřadnice Y (vertikální pixel) posledního stisknutí
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Dodá:
■ Aktuální status tlačítek.
■ Počet stisknutí specifikovaného tlačítka (v BX) od posledního volání
této funkce.
■ Souřadnice X, Y kurzoru v době posledního stisknutí tohoto tlačítka.
Lze použít ke kontrole dvojího stisknutí, nebo k pravidelné kontrole
stisknutí určitého tlačítka (např. pokud pravé znamená 'cancel').
Povšimněte si, že všechny X, Y souřadnice jsou virtuální a při práci
v textovém módu musíte pro získání znakového sloupce a řádku každou
hodnotu vydělit 8 (16).
Viz též: Mou Fn 06 INT 33 Seznam přerušení
Mou Fn 06 DOTAZ NA TLAČÍTKO - POČET UVOLNĚNÍ
Požaduje: AX = 0006H MS Mouse
BX = dotazované tlačítko (0=levé, 1=pravé, 2=střední)
Výstup: AX = status tlačítek
bit 0: levé tlačítko stisknuto
bit 1: pravé tlačítko stisknuto
bit 2: střední tlačítko stisknuto (Mouse System)
BX = počet uvolnění tlačítka od posledního volání
CX = souřadnice X (horizontální pixel) posledního uvolnění
DX = souřadnice Y (vertikální pixel) posledního uvolnění
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Dodá:
■ Aktuální status tlačítek.
■ Počet uvolnění specifikovaného tlačítka (v BX) od posledního volání
této funkce.
■ Souřadnice X, Y kurzoru v době posledního uvolnění tohoto tlačítka.
Povšimněte si, že všechny X, Y souřadnice jsou virtuální a při práci
v textovém módu musíte pro získání znakového sloupce a řádku každou
hodnotu vydělit 8(16).
Viz též: Mou Fn 05 INT 33 Seznam přerušení
Mou Fn 07 NASTAV HORIZONTÁLNÍ ROZSAH
Požaduje: AX = 0007H MS Mouse
CX = nejnižší souřadnice X (horizontální pozice pixelu)
DX = nejvyšší souřadnice X (horizontální pozice pixelu)
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Nastaví horizontální rozsah, za který nebude moci kurzor myši jít. Pokusy
uživatele (nebo programu přes Mou Fn 04H) pohnout kurzorem nalevo od CX
nebo napravo od DX zapříčiní 'připíchnutí' kurzoru na minimální nebo
maximální hodnotu rozsahu.
K omezení pohybu po vertikální ose použijte Mou Fn 08 .
Povšimněte si, že všechny X, Y souřadnice jsou virtuální a při práci
v textovém módu musíte pro získání znakového sloupce a řádku každou
hodnotu vydělit 8.
Viz též: INT 33 Seznam přerušení
Mou Fn 08 NASTAV VERTIKÁLNÍ ROZSAH
Požaduje: AX = 0008H MS Mouse
CX = nejnižší souřadnice Y (vertikální pozice pixelu)
DX = nejvyšší souřadnice Y (vertikální pozice pixelu)
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Nastaví vertikální rozsah, za který nebude kurzor myši moci jít. Pokusy
uživatele (nebo programu přes Mou Fn 04 ) pohnout kurzorem nad CX nebo
pod DX zapříčiní 'připíchnutí' kurzoru na minimální nebo maximální hodnotu
rozsahu.
K omezení pohybu po horizontální ose použijte Mou Fn 07 .
Povšimněte si, že všechny X, Y souřadnice jsou virtuální a při práci
v textovém módu musíte pro získání znakového sloupce a řádku každou
hodnotu vydělit 16.
Viz též: INT 33 Seznam přerušení
Mou Fn 09 NASTAV TVAR GRAFICKÉHO KURZORU
Požaduje: AX = 0009H MS Mouse
BX = referenční bod (horizontální) (-16..16)
CX = referenční bod (vertikální) (-16..16)
ES:DX = adresa pole bitového tvaru kurzoru (64-bytová oblast)
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Definuje vzhled kurzoru myši při práci obrazovky v grafickém módu a
vybírá, která část tohoto kurzoru bude identifikovat ten pixel, na který
myš ukazuje. Implicitní kurzor je doleva mířící šipka směřující nahoru s
referenčním bodem v 0.0 (v levém horním rohu).
Pro modifikaci kurzoru pro textový mód obrazovky viz Mou Fn 0A .
Data v ES:BX mají délku 64 bytů; dvě sady 32 bytů. Každá ze sady 32 bytů
je organizována jako 16x16 bitů; to jest 16 řádků 2-bytových hodnot.
První sada 32 bytů definuje 'masku AND'; to jest kdykoli je v této oblasti
1-bit, ukáže se pozadí.
Druhá sada 32 bytů definuje 'masku XOR'; to jest poté, co 'maska AND'
vymazala některá místa pozadí, jsou pixely odpovídající 1-bitům v této
sadě rozsvíceny.
Hodnoty BX a CX určují 'referenční bod', například je-li BX=0 a CX=0, je
stisknutí tlačítka považováno za výběr pixelu v levém horním rohu
čtyřúhelníku kurzoru. Je-li BX=15 a CX=15, stisknutí tlačítka vybírá
pravý dolní roh kurzoru.
Viz též: Mou Fn 0A INT 33 Seznam přerušení
Mou Fn 0A NASTAV MASKU TEXTOVÉHO KURZORU
Požaduje: AX = 000AH MS Mouse
BX = typ kurzoru: 0=softwarový kurzor
1=hardwarový kurzor
CX = maska AND (je-li BX=0)
nebo počáteční řádek kurzoru (je-li BX=1)
DX = maska XOR (je-li BX=0)
nebo koncový řádek kurzoru (je-li BX=1)
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Tato funkce vám dovoluje měnit vzhled kurzoru myši v textovém módu
obrazovky. Také vám dovoluje používat standardní blikající 'hardwarový
kurzor' jako pointer myši. Implicitně je kurzor 'softwarový kurzor'
zobrazený jako znak, na který je poukázáno, s 'opačným' atributem barvy.
Pro modifikaci kurzoru pro grafický mód obrazovky, viz Mou Fn 09 .
Softwarový kurzor Ke specifikaci žádaných barev popředí a pozadí
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ kurzoru nebo k nastavení zobrazení kurzoru jako
určitého znaku (např. $ a podobně) použijte BX=0. Tato druhá možnost je
vhodná pro signalizaci stisknutí tlačítka nad volitelnou oblastí, např.
nad menu.
Suport myši používá operaci AND na hodnotu char/attr na místě kurzoru
a vaší masce AND (tj. odstraňuje bity char/attr z obrazovky, které jsou
0 ve vaší masce AND). Na výsledek potom aplikuje masku XOR (tj. rozsvěcí
bity, které jsou 1 ve vaší masce XOR). Výsledek těchto dvou operací ukládá
do char/attr na obrazovce.
Dolní byte každé masky ovlivňuje kód znaku a horní byte ovlivňuje atribut
barva-blikání.
Implicitní hodnoty jsou: CX=0FFFFH a BX=7700H. Výsledek je, že žádná
informace není maskou AND maskována a že barva popředí je invertována
(všechny tři bity jsou rozsvícené) a barva pozadí je také invertována.
Následující příklad vytváří kurzor ve tvaru '√ červené na modrém':
mov bx,0 ; softwarový kurzor
mov cx,0000H ; maskuj všechny aktuální informace
mov dx,14FBH ; 1xxx=modré pozadí, x4xx=červené popředí,
xxFB='√'
mov ax,0AH
int 33H
Pro nastavení kurzoru na libovolnou barvu beze změny znaku použijte
CX=00FFH k maskování (vymazání) atributu a BX=xx00 pro nastavení
barvy na xx .
Hardwarový kurzor Volba BX=1 ignoruje všechny předchozí možnosti a
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ spoléhá na známý blikající textový kurzor. V tomto
případě určují hodnoty CX a DX tvar kurzoru myši jako ve funkci 10H
v INT 10H.
CX je počáteční linka kurzoru (0 znamená nejvyšší řádku buňky znaku) a DX
je koncová linka kurzoru. Maximální platná hodnota pro DX závisí na
aktuálním módu obrazovky a typu adaptéru videa:
rozsah linek: CGA od 0 do 7
rozsah linek: MDPA od 0 do 13
CX je počáteční linka kurzoru (0 znamená nejvyšší řádku buňky znaku) a DX
je koncová linka kurzoru. Maximální platná hodnota pro DX závisí na
aktuálním módu obrazovky a typu adaptéru videa:
rozsah linek: CGA od 0 do 7
rozsah linek: MDPA od 0 do 13
rozsah linek: EGA od 0 do 13
rozsah linek: VGA od 0 do 15
Poznamenejme, že EGA a VGA mohou být v módu, který má méně (nebo dokonce
více) linek na buňku znaku (např. v módu 43 řádků mají znaky 8 linek).
Poznamenejme také, že je korektní nastavit DX na větší hodnotu než CX.
V takovém případě je kurzor zobrazen ve dvou částech s mezerou uprostřed.
Blikání kurzoru lze pro EGA/VGA ovlivnit subfunkcí 11H a 12H INT 10H.
Viz též: Mou Fn 09 INT 33 Seznam přerušení
Mou Fn 0B DOTAZ NA VZDÁLENOST POSLEDNÍHO POHYBU
Požaduje: AX = 000BH MS Mouse
Výstup: CX = relativní horizontální vzdálenost od posledního volání
(>0=napravo; <0=nalevo)
DX = relativní vertikální vzdálenost od posledního volání
(>0=dolů; <0=nahoru)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Obdržíte vzdálenost, o kterou se myš pohnula od posledního volání této
funkce. Vracené hodnoty jsou v mickeys. Pro převod na pixely použijte
Mou Fn 1B k dotazu na aktuální poměry mickeys/pixels.
Všimněte si, že CX a DX se vrací jako hodnoty se znaménkem, záporná
hodnota je vzdálenost směrem nahoru a doleva, kladná je vzdálenost dolů a
doprava.
Viz též: INT 33 Seznam přerušení
Mou Fn 0C NASTAV MANIPULAČNÍ PROGRAM UDÁLOSTI
Požaduje: AX = 000CH MS Mouse
CX = maska událostí (událostí, které chcete obsloužit svým
manipulačním programem)
bit 0: volání při pohybu myši
bit 1: volání při stisknutí levého tlačítka
bit 2: volání při uvolnění levého tlačítka
bit 3: volání při stisknutí pravého tlačítka
bit 4: volání při uvolnění pravého tlačítka
bit 5: volání při stisknutí prostředního tlačítka
(Mouse System)
bit 6: volání při uvolnění prostředního tlačítka
(Mouse System)
všechny události: CX = 007FH
zakaž manipulační program: CX = 0000H
ES:DX = FAR adresa kódu vašeho manipulačního programu
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Instaluje obvyklý manipulační program události myši. Bitovými kódy v
registru CX specifikujte, které události chcete monitorovat, a předejte
adresu svého manipulačního programu v ES:DX.
Poznámka: Můžete dát přednost flexibilnější Mou Fn 14 (vyměň
manipulační programy události) nebo Mou Fn 18 (instaluj
myš + klávesu manipulačního programu události).
Dojde-li k jakékoli ze specifikovaných událostí, dostane kód v ES:DX
řízení přes FAR CALL. Na vstupu do vašeho manipulačního programu:
AX obsahuje bitovou masku určující, která událost nastala
(kódováno ve stejném formátu jaký je popsán výše pro CX)
BX obsahuje status tlačítek myši:
bit 0: levé tlačítko
bit 1: pravé tlačítko
bit 2: střední tlačítko (Mouse Systems)
CX horizontální pozice (v textovém módu dělte 8 pro získání řádku
znaků)
DX vertikální pozice (v textovém módu dělte 8 pro získání sloupce
znaků)
DI vzdálenost posledního horizontálního pohybu
(mickeys:>0=napravo; <0=nalevo)
SI vzdálenost posledního vertikálního pohybu
(mickeys:>0=dolů; <0=nahoru)
DS segment dat manipulačního programu myši
Pro přístup k vašim vlastním proměnným budete muset nastavit DS.
Nemusíte uchovávat/vybavovat registry CPU, protože manipulační program
to pro vás udělá.
Ze svého obvyklého manipulačního programu vystupujte příkazem FAR RET
(nikoli IRET).
K povolení nebo zákazu vybraných událostí pro váš manipulační program
použijte tuto funkci znovu s příslušně modifikovanou maskou v CX. K
zákazu všech událostí volejte funkci s hodnotou 0000H v CX. To by se mělo
volat i před ukončením programu. Mou Fn 00 likviduje všechny instalované
ovladače.
Pozn.: Literatura se neshoduje, má-li být adresa podprogramu v ES:BX (logické)
nebo v ES:DX (Billovské). Proto je nejlépe nastavit BX i DX na adresu
vašeho obslužného programu.
Mou Fn 0D POVOL EMULACI SVĚTELNÉHO PERA
Požaduje: AX = 000DH MS Mouse
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Způsobí, že suport myši začne pracovat s programy, které jsou psané pro
suport světelného pera (např. používání funkce PEN v BASIC). Je-li toto
povoleno, suport myši zastavuje Fn 04H v INT 10H.
Je-li emulace povolena, je stisknutí libovolného tlačítka považováno za
stisknutí tlačítka pera na aktuální pozici myši.
Suport zakažte pomocí Mou Fn 0E .
Viz též: INT 33 Seznam přerušení
Mou Fn 0E ZAKAŽ EMULACI SVĚTELNÉHO PERA
Požaduje: AX = 000EH MS Mouse
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Způsobí ukončení emulace světelného pera suportem myši. Dá se použít pro
vyloučení vlivu pohybu myši na připojené světelné pero.
Je-li emulace povolena Mou Fn 0D , suport myši zastavuje Fn 04H v
INT 10H.
Viz též: INT 33 Seznam přerušení
Mou Fn 0F NASTAV POMĚR MICKEY/PIXEL
Požaduje: AX = 000FH MS Mouse
CX = požadovaná horizontální hodnota mickeys na 8 pixelů
DX = požadovaná vertikální hodnota mickeys na 8 pixelů
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Nastavuje rychlost, jakou se kurzor pohybuje po obrazovce, porovnanou se
vzdáleností, o kterou se myš skutečně pohnula.
Poznámky: Mou Fn 1A je modernizovaná verze tohoto volání a Mou Fn 1B
dává možnost zjištění aktuálního stavu.
Poměr mickey/pixel je použit k převodu velikostí vzdáleností,
jako například Mou Fn 0B , a hodnot obdržených v SI a DI
obvyklými manipulačními programy událostí (viz Mou Fn 0C ),
na pixely nebo buňky znaků.
Kurzor se ve skutečnosti může pohybovat dále/rychleji než
určuje základní rychlost specifikovaná v tomto volání.
Pohnete-li myší rychle, suport myši automaticky poměr
zdvojnásobí (hýbe kurzorem exponenciálně rychleji).
Viz Mou Fn 13 .
1 mickey = 1/200 palce = 0.0127 cm (pro myš nastaveno hardwarově)
Povšimněte si, že hodnoty pro CX a DX jsou v buňkách znaků (8-pixelové
bloky). Implicitní nastavení jsou CX=8 a DX=16. To znamená, že kurzor
se pohybuje horizontálně dvakrát rychleji než vertikálně. Také to
znamená, že pomalý plynulý pohyb myši o 1 palec pohne kurzorem
horizontálně o 25 znaků nebo o vertikálně o 12 řádků. Výpočet probíhá
takto:
požadovaný počet znaků na palec = 200/CX
...takže...
CX=200/požadovaný počet znaků na palec (takže CX=8 pohne o 25 buněk
znaků)
Pro grafický mód (tj. měřeno v pixelech) použijte:
CX=25/požadovaný počet znaků na palec (takže CX=8 pohne o 200 pixelů)
Povšimněte si, že hodnoty pro CX a DX jsou v buňkách znaků (8-pixelové
bloky). Implicitní nastavení jsou CX=8 a DX=16. To znamená, že kurzor
se pohybuje horizontálně dvakrát rychleji než vertikálně. Také to
znamená, že pomalý plynulý pohyb myši o 1 palec pohne kurzorem
horizontálně o 25 znaků nebo o vertikálně o 12 řádků. Výpočet probíhá
takto:
požadovaný počet znaků na palec = 200/CX
...takže...
CX=200/požadovaný počet znaků na palec (takže CX=8 pohne o 25 buněk
znaků)
Pro grafický mód (tj. měřeno v pixelech) použijte:
CX=25/požadovaný počet znaků na palec (takže CX=8 pohne o 200 pixelů)
Viz též: INT 33 Seznam přerušení
Mou Fn 10 NASTAV VÝLUČNOU OBLAST
Požaduje: AX = 0010H MS Mouse
CX = (X1) souřadnice levého krajního bodu výlučného čtyřúhelníka
(pixel)
DX = (Y1) souřadnice horního krajního bodu výlučného čtyřúh.
(pixel)
SI = (X2) souřadnice pravého krajního bodu výlučného čtyřúh.
(pixel)
DI = (Y2) souřadnice dolního krajního bodu výlučného čtyřúh.
(pixel)
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Nastavuje čtyřúhelník, ve kterém bude kurzor myši vidět.
Poznámka: Výlučná oblast je nulována každým voláním Mou Fn 01
(zobraz kurzor) a Mou Fn 00 (reset).
Narozdíl od omezujícího rozsahu nastaveného Mou Fn 07H a Mou Fn 08H
se může myš pohybovat do i z výlučné oblasti, ale kurzor bude viditelný
pouze v ní. Nedoporučujeme tuto funkci používat, protože uživatel bude
zmaten: 'Kam se poděla moje myš?'.
Povšimněte si, že všechny X, Y souřadnice jsou virtuální a při práci
v textovém módu musíte pro získání znakového sloupce a řádku každou
hodnotu vydělit 8.
Viz též: INT 33 Seznam přerušení
Mou Fn 12 NASTAV VELIKOST BLOKU GRAFICKÉHO KURZORU
Požaduje: AX = 0012H PC Mouse
BH = šířka kurzoru (words)
CH = řádky v kurzoru
BL = horizontální referenční bod (-16..16)
CL = vertikální referenční bod (-16..16)
ES:DX => bitová mapa obrazovky a mapy kurzoru
Výstup: AX = -1 bylo-li volání úspěšné
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: INT 33 Seznam přerušení
Mou Fn 13 NASTAV ZDVOJNÁSOBENÍ RYCHLOSTI
Požaduje: AX = 0013H MS Mouse
DX = mez zdvojnásobení v mickeys/vteřina
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Pokud hýbete myší rychle, suport myši zdvojnásobuje rychlost pohybu
kurzoru. Tato funkce umožňuje použít pomalý, jemný pohyb pro detailní
práci, aniž byste obětovali efekt rychlého pohybu po obrazovce.
Pokud se myš pohybuje rychlostí 64 mickeys/vteřinu (asi 8 mm/vteřinu),
suport myši implicitně zdvojnásobuje pohyb kurzoru. Pokud dáváte přednost
vyššímu zrychlení, použijte v DX hodnotu menší než 64. Pro menší zrychlení
použijte vyšší hodnoty. Pro účinnou eliminaci zdvojnásobení rychlosti
použijte pro DX opravdu velké hodnoty jako 10 000. Dosadíte-li DX=0,
nastaví se implicitní hodnota 64 mickeys/vteřinu.
Tento efekt můžete docílit i Mou Fn 1A a dotázat se na jeho aktuální
hodnotu použitím Mou Fn 1B .
Viz též: INT 33 Seznam přerušení
Mou Fn 14 VYMĚŇ MANIPULAČNÍ PROGRAM UDÁLOSTI
Požaduje: AX = 0014H MS Mouse
CX = maska událostí (událostí, které chcete obsloužit svým
manipulačním programem)
bit 0: volání při pohybu myši
bit 1: volání při stisknutí levého tlačítka
bit 2: volání při uvolnění levého tlačítka
bit 3: volání při stisknutí pravého tlačítka
bit 4: volání při uvolnění pravého tlačítka
bit 5: volání při stisknutí prostředního tlačítka
(Mouse System)
bit 6: volání při uvolnění prostředního tlačítka
(Mouse System)
všechny události: CX = 007FH
ES:DX => FAR adresa kódu vašeho manipulačního programu
Výstup: CX = maska předchozího manipulačního programu události
ES:DX => FAR adresa kódu dříve instalovaného manipulačního
programu
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Tato funkce pracuje jako Mou Fn 0C (pro detaily viz tuto funkci).
Jediný rozdíl je ten, že na výstupu obdržíte adresu a masku událostí
dříve instalovaného manipulačního programu.
Poznámka: Mou Fn 18 dává flexibilní prostředky pro instalaci až
tří specializovaných manipulačních programů událostí.
Tato funkce dovoluje instalovat manipulační program události dočasně;
to znamená, že jej můžete instalovat při výkonu určitého podprogramu
a po výstupu z podprogramu znovu instalovat původní.
Tato funkce také dovoluje manipulační programy událostí řetězit.
Instalujte manipulační program pro všechny události, a pokud máte událost,
na které vám příliš nezáleží, předejte ji předchozímu manipulačnímu
programu (za předpokladu, že jeho maska takovou událost očekává).
Viz též: INT 33 Seznam přerušení
Mou Fn 15 DOTAZ NA VELIKOST BUFFERU PRO ULOŽENÍ STAVU MYŠI
Požaduje: AX = 0015H MS Mouse
Výstup: BX = velikost bufferu potřebného pro Mou Fn 16H a Mou Fn 17H
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Tuto funkci použijte před voláním Mou Fn 16 . Vrací velikost bufferu
uchovávajícího status. Tuto velikost bude Mou Fn 16H vyžadovat.
Viz též: INT 33 Seznam přerušení
Mou Fn 16 UCHOVEJ STATUS MYŠI
Požaduje: AX = 0016H MS Mouse
ES:DX => FAR adresa bufferu statusu myši, který se má naplnit
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Tato funkce ukládá aktuální sadu proměnných suportu myši do oblasti
dodané volajícím. Volání použijte pro uchování stavu myši v případě, že
jej budete později potřebovat zrestaurovat (např. při aktivaci jako TSR
nebo při návratu řízení po použití DOS Fn 4BH).
VAROVÁNÍ: Pro zjištění velikosti bufferu předávané tomuto volání
použijte Mou Fn 15 . Musíte zajistit dostatek místa, jinak
vám suport myši může přepsat důležitá data.
Struktura bufferu statusu myši není dokumentována.
Viz též: Mou Fn 17 INT 33 Seznam přerušení
Mou Fn 17 OBNOV STATUS MYŠI
Požaduje: AX = 0017H MS Mouse
ES:DX => FAR adresa bufferu obsahujícího uchovaný status myši
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Tuto funkci použijte k obnovení informace o statusu manipulačního
programu, kterou jste získali předchozím voláním Mou Fn 16 (např.
když váš TSR program má předat řízení přerušenému programu nebo
dostáváte zpět řízení od dceřinného programu po použití DOS Fn 4B ).
Buffer na ES:BX by měl být zaplněn daty obdrženými z Mou Fn 16
(struktura bufferu není dokumentována) a měl by mít velikost určenou
hodnotou z Mou Fn 15 .
Viz též: INT 33 Seznam přerušení
Mou Fn 18 NASTAV ALTERNUJÍCÍ MANIPULAČNÍ PROGRAM UDÁLOSTI
Požaduje: AX = 0018H MS Mouse
CX = maska událostí (událostí, které chcete obsloužit svým
manipulačním programem)
bit 0: volání při pohybu myši
bit 1: volání při stisknutí levého tlačítka
bit 2: volání při uvolnění levého tlačítka
bit 3: volání při stisknutí pravého tlačítka
bit 4: volání při uvolnění pravého tlačítka
bit 5: volání, je-li při stisknutí tlačítka stisknut Shift
bit 6: volání, je-li při stisknutí tlačítka stisknut Ctrl
bit 7: volání, je-li při stisknutí tlačítka stisknut Alt
všechny události: CX = 007FH
ES:DX => FAR adresa kódu vašeho manipulačního programu
Výstup: AX = status instalace 0018H: instalováno
0FFFFH: chyba; nelze instalovat
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Tato funkce je elegantnější verzí Mou Fn 0C (kterou prostudujte pro
podrobnosti o kódu obvyklého manipulačního programu).
Tato funkce informuje váš manipulační program o tom, kdy byla při
stisknutí tlačítka myši stisknuta klávesa Shift, Ctrl, nebo Alt.
Dovoluje vám také instalovat až tři různé manipulační programy, za
předpokladu, že každý z nich má v CX odlišnou masku události.
Bity 5, 6 a 7 specifikují klávesy. Pokud tuto informaci nevyžadujete,
můžete místo ní použít Mou Fn 0C nebo Mou Fn 14 .
Pokud už pro specifikovanou masku události (v CX) manipulační program
události existuje, vrací se chyba (při návratu AX=0FFFFH). V tomto případě
můžete pro obdržení adresy předchozího manipulačního programu použít
Mou Fn 19 . Tento manipulační program můžete deinstalovat, instalovat
svůj vlastní, a později starý reinstalovat.
Pro deinstalaci alternativního manipulačního programu události zavolejte
tuto funkci s adresou manipulačního programu a s 0 v příslušných bitech
masky událostí. Před výstupem z vašeho programu byste měli své manipulační
programy událostí deinstalovat.
AX obsahuje bitovou masku určující, která událost nastala
(kódováno ve stejném formátu jaký je popsán výše pro CX)
BX obsahuje status tlačítek myši:
bit 0: levé tlačítko
bit 1: pravé tlačítko
bit 2: střední tlačítko (Mouse Systems)
CX horizontální pozice (v textovém módu dělte 8 pro získání řádku
znaků)
DX vertikální pozice (v textovém módu dělte 16 pro získání sloupce
znaků)
DI vzdálenost posledního horizontálního pohybu
(mickeys:>0=napravo; <0=nalevo)
SI vzdálenost posledního vertikálního pohybu
(mickeys:>0=dolů; <0=nahoru)
DS segment dat manipulačního programu myši
Viz též: Mou Fn 19 INT 33 Seznam přerušení
Mou Fn 19 UŽIVATELSKÝ ALT. MANIPULAČNÍ PROGRAM UDÁLOSTI
Požaduje: AX = 0019H MS Mouse
CX = maska událostí požadovaného manipulačního programu
(stejně jako Mou Fn 18 )
Výstup: CX = maska událostí manipulačního programu
(0000H:žádný manipulační program nesouhlasí)
ES:DX => adresa souhlasného manipulačního programu událostí
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Tuto funkci použijte k získání adresy a masky alternativního manipulačního
programu událostí instalovaného Mou Fn 18 (kterou prostudujte pro
hodnoty bitů pro CX).
Viz též: Mou Fn 18 INT 33 Seznam přerušení
Mou Fn 1A NASTAV CITLIVOST MYŠI
Požaduje: AX = 001AH MS Mouse
BX = horizontální rychlost v mickeys/pixel
CX = vertikální rychlost v mickeys/pixel
DX = mez zdvojnásobení mickeys/vteřina
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Kombinuje funkčnost Mou Fn 0FH (Nastav rychlost kurzoru)a Mou Fn 13
(Nastav max pro zdvojnásobení rychlosti).
Pro aktuální hodnoty těchto proměnných použijte Mou Fn 1B .
Viz též: INT 33 Seznam přerušení
Mou Fn 1B DOTAZ NA CITLIVOST MYŠI
Požaduje: AX = 001BH MS Mouse
Výstup: BX = horizontální rychlost v mickeys/pixel
CX = vertikální rychlost v mickeys/pixel
DX = mez zdvojnásobení mickeys/vteřina
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Dodá aktuální proměnné pohybu-myši-ku-pohybu-kurzoru. Pro podrobnosti
viz Mou Fn 0F a Mou Fn 13 .
Můžete použít tuto funkci, změnit jednu nebo více proměnných a pro
provedení změn volat Mou Fn 1A .
Viz též: INT 33 Seznam přerušení
Mou Fn 1C NASTAV ČETNOST PŘERUŠENÍ MYŠI
Požaduje: AX = 001CH MS Mouse
BX = kód četnost přerušení: 1=žádné; 2=30 za vteřinu;
4=50 za vteřinu;8=100 za vteřinu;16=200 za vteřinu
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Nastaví četnost, podle které bude hardware myši přerušovat aktualizovanou
pozici myši a její status.
Volání má smysl pouze pro Inport myš. Pro zjištění, zda je Inport myš
instalována, použijte Mou Fn 24 .
Zvýšením četnosti přerušení za vteřinu dosáhnete větší přesnosti myši,
ovšem za cenu zpomalení aplikace běžící v popředí.
Viz též: INT 33 Seznam přerušení
Mou Fn 1D NASTAV STRÁNKU OBRAZOVKY
Požaduje: AX = 001DH MS Mouse
BX = číslo stránky, na které má být zobrazen kurzor myši
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Říká suportu myši, na které stránce videa má být zobrazen kurzor myši.
Implicitně je kurzor zobrazován na stránce 0.
Poznámka: Tato funkce příslušnou stránku videa neaktivuje. Pro její
aktivaci použijte INT 10H, Fn 05H.
Viz též: INT 33 Seznam přerušení
Mou Fn 1E DOTAZ NA STRÁNKU OBRAZOVKY
Požaduje: AX = 001EH MS Mouse
Výstup: BX = stránka CRT, na které je zobrazen kurzor myši
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Vrátí číslo stránky videa, na kterou suport myši aktuálně zobrazuje kurzor
myši.
Poznámka: Tato funkce neříká, která stránka videa je aktuálně aktivní.
Pro tuto informaci volejte INT 10H, Fn 0FH. Pro aktivaci
příslušné stránky videa použijte INT 10H, Fn 04H.
Viz též: INT 33 Seznam přerušení
Mou Fn 1F DEAKTIVUJ ŘÍDÍCÍ PROGRAM MYŠI
Požaduje: AX = 001FH MS Mouse
Výstup: AX = status 001FH: deaktivováno
0FFFFH: nelze deaktivovat
ES:DX => vektor předchozího manipulačního programu INT 33H
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Deaktivuje řídící program myši. Všechna přerušení používána suportem myši
jsou zakázána, dojde k účinné eliminaci celého suportu myši.
Pro opětné povolení všech přerušení používaných suportem myši použijte
Mou Fn 21 .
Povšimněte si, že vektor INT 33H zůstává, ale jediná funkce, kterou může
vykonat, je Mou Fn 21H.
Tuto funkci můžete volat těsně před nahrazením suportu myši vaším vlastním
systémem přerušení a černých skříněk. Později použijte hodnotu navrácenou
v ES:DX pro opětnou instalaci kódu předchozího INT 33H (tj. při výstupu
do DOS).
Nastavuje vektory pro INT 10H a INT 71H (8086) nebo INT 74H
(286/386), nastavíte-li INT 33H na ES:BX, bude řídící program úplně
zakázán.
Viz též: INT 33 Seznam přerušení
Mou Fn 20 POVOL ŘÍDÍCÍ PROGRAM MYŠI
Požaduje: AX = 0020H MS Mouse
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Znovu obnovuje spojení mezi myší a jejím suportem. Reinstaluje všechna
přerušení (nastavuje vektory pro INT 10H a INT 71H (8086) nebo
INT 74H (286/386), které funkce 1FH odstranila), která byla odstraněna
předešlým voláním Mou Fn 1F .
Viz též: INT 33 Seznam přerušení
Mou Fn 21 RESET ŘÍDÍCÍHO PROGRAMU MYŠI
Požaduje: AX = 0021H MS Mouse
Výstup: AX = status 0021H: bez chyby
0FFFFH: nelze vynulovat (žádný řídící program)
BX = počet tlačítek myši (v případě pozitivní instalace)
3: třítlačítková (Mouse System)
-1,1,2: dvoutlačítková
0: jiná
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Provede 'softwarový reset' suportu myši. Všechny vnitřní proměnné nastaví
na standardní implicitní hodnoty (popis viz Mou Fn 00 ).
Pracuje jako Mou Fn 00 s tou výjimkou, že nenuluje hardware myši ani
jakékoli proměnné se vztahem k hardware.
Viz též: Mou Fn 18 INT 33 Seznam přerušení
Mou Fn 24 TYP MYŠI/VERZE ŘÍDÍCÍHO PROGRAMU/ČÍSLO PŘERUŠENÍ
Požaduje: AX = 0024H MS Mouse
Výstup: došlo-li k chybě, je AX = 0FFFFH
jinak:
BH = majoritní číslo verze
BL = minoritní číslo verze (tj. číslo napravo od desetinné
tečky)
CH = typ myši
1 = bus myš
2 = serial myš
3 = Inport myš
4 = PS/2 myš
5 = HP myš
CL = číslo hardwarového přerušení (IRQ)
0 = PS/2
2, 3, 4, 5, 6, 7 = číslo PC IRQ
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Pokud potřebujete použít nové funkce poslední verze suportu myši, použijte
tuto funkci a prohlédněte navrácené hodnoty v BH a BL.
Hodnotu v CH můžete použít ke zjištění, zda volání Mou Fn 1C má smysl.
Viz též: Mou Fn 18 INT 33 Seznam přerušení
Mou Fn 42 DEJ POŽADAVKY NA ULOŽENÍ MS MOUSE
Požaduje: AX = 0042H PC Mouse
Výstup: AX = 0FFFFH: bylo-li úspěšné
BX = velikost bufferu v bytech pro Mou Fn 50
a Mou Fn 52
00H: MS Mouse není instalována
42H: nejsou podporovány Mou Fn 42 , Mou Fn 50
a Mou Fn 52
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Mou Fn 18 INT 33 Seznam přerušení
Mou Fn 50 ULOŽ STATUS MS MOUSE
Požaduje: AX = 0050H PC Mouse
BX = velikost bufferu
ES:DX => buffer
Výstup: AX = 0FFFFH: bylo-li úspěšné
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Mou Fn 18 INT 33 Seznam přerušení
Mou Fn 52 VYVOLEJ STATUS MS MOUSE
Požaduje: AX = 0052H PC Mouse
BX = velikost bufferu
ES:DX => buffer
Výstup: AX = 0FFFFH: bylo-li úspěšné
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Mou Fn 18 INT 33 Seznam přerušení
Multiplex - seznam testů
INT 2FH BMB - Compuscience Canada Utilities Interface
INT 2FH Fn 0100H PRINT - test instalace
INT 2FH Fn 0101H PRINT - nabídni soubor
INT 2FH Fn 0102H PRINT - odstraň soubor
INT 2FH Fn 0103H PRINT - odstraň všechny soubory
INT 2FH Fn 0104H PRINT - drž frontu/dej status
INT 2FH Fn 0105H PRINT - znovu nastartuj frontu
INT 2FH Fn 0106H PRINT - dej adresu zařízení
INT 2FH Fn 0500H Obsluha kritické chyby DOS 3+ - test instalace
INT 2FH Fn 05XXH Obsluha kritické chyby DOS 3+ - chyba handlu
INT 2FH Fn 0600H ASSIGN - test instalace
INT 2FH Fn 0601H ASSIGN - dej segment paměti
INT 2FH Fn 0800H DRIVER.SYS - test instalace
INT 2FH Fn 1000H SHARE - test instalace
INT 2FH Fn 1100H Network Redirector - test instalace
INT 2FH Fn 111EH Network Redirector - přesměruj
INT 2FH Fn 1A00H ANSI.SYS - test instalace
INT 2FH Fn 1200H Test instalace
INT 2FH Fn 1202H Dej adresu přerušení
INT 2FH Fn 1203H Dej segment dat DOS
INT 2FH Fn 1204H Normalizuj oddělovač cest
INT 2FH Fn 1205H Výstup znaku
INT 2FH Fn 1206H Vyvolej kritickou chybu
INT 2FH Fn 1207H Přesun bufferu disku
INT 2FH Fn 1208H Dekrementuj slovo
INT 2FH Fn 120DH Dej datum a čas
INT 2FH Fn 1210H Najdi nevyčištěný buffer
INT 2FH Fn 1211H Normalizuj jméno souboru ASCIIZ
INT 2FH Fn 1212H Dej délku řetězce ASCIIZ
INT 2FH Fn 1213H Převod znaku na velká písmena
INT 2FH Fn 1214H Porovnej pointery FAR
INT 2FH Fn 1216H Dej adresu systémového FCB
INT 2FH Fn 1217H Nastav implicitní disk
INT 2FH Fn 1218H Dej registry volajícího
INT 2FH Fn 121AH Dej disk souboru
INT 2FH Fn 121CH Checksum paměti
INT 2FH Fn 121EH Porovnej jména souborů
INT 2FH Fn 121FH Postav blok info disku
INT 2FH Fn 1220H Dej počet FAT
INT 2FH Fn 1225H Dej délku řetězce ASCIIZ
INT 2FH Fn 1229H Dej počet položek FAT pro soubor
INT 2FH Fn 122CH Dej řetěz zařízení
INT 2FH Fn 1400H NLSFUNC.COM - test instalace
INT 2FH Fn 1500H CDROM - test instalace
INT 2FH Fn 1501H CDROM - dej seznam disků zařízení
INT 2FH Fn 1502H CDROM - dej jméno souboru s údajem Copyright
INT 2FH Fn 1503H CDROM - dej jméno abstraktního souboru
INT 2FH Fn 1504H CDROM - dej jméno souboru bibl. dokumentace
INT 2FH Fn 1505H CDROM - čti VTOC
INT 2FH Fn 1506H CDROM - zapni debuggování
INT 2FH Fn 1507H CDROM - vypni debuggování
INT 2FH Fn 1508H CDROM - čti z absolutního disku
INT 2FH Fn 1509H CDROM - piš na absolutní disk
INT 2FH Fn 150BH Multiplex - CDROM 2.00 - test disku
INT 2FH Fn 150CH CDROM 2.00 - dej verzi MSCDEX.Exe
INT 2FH Fn 150DH CDROM 2.00 - dej písmena disků CDROM
INT 2FH Fn 150EH CDROM 2.00 - dej/nastav pref. deskriptoru média
INT 2FH Fn 150FH CDROM 2.00 - dej položku adresáře
INT 2FH Fn 1680H Prázdné volání MS-DOS
INT 2FH Fn 1686H DPMI - dej mód procesoru
INT 2FH Fn 1687H DPMI - test instalace
INT 2FH Fn 4300H XMS - test instalace
INT 2FH Fn 4310H XMS - dej adresu řídícího programu
INT 2FH Fn 4800H DOSKEY.COM - test instalace
INT 2FH Fn 4810H DOSKEY.COM - čti příkazovou řádku
INT 2FH Fn 5453H Rozhraní RAM-residentního programu
INT 2FH Fn 6400H SCRNSAV2.COM - test instalace
INT 2FH Fn 7A00H Novell Netware - test instalace
INT 2FH Fn 8900H WHOA!.COM - test instalace
INT 2FH Fn 8901H WHOA!.COM - zruš instalaci
INT 2FH Fn 8902H WHOA!.COM - nastav počítadlo zpomalení
INT 2FH Fn AA00H VIDCLOCK.COM - test instalace
INT 2FH Fn AD80H KEYB.COM - dej číslo verze
INT 2FH Fn AD81H KEYB.COM - nastav aktivní kódovou stránku
INT 2FH Fn AD82H KEYB.COM - nastav kód země
INT 2FH Fn AD83H KEYB.COM - dej kód země
INT 2FH Fn B000H GRAFTABL.COM - test instalace
INT 2FH Fn B700H APPEND - test instalace
INT 2FH Fn B800H Network - test instalace
INT 2FH Fn B803H Network - dej aktuální poštovní adresu
INT 2FH Fn B804H Network - nastav novou poštovní adresu
INT 2FH Fn E300H ANARKEY.COM - test instalace
INT 2FH Fn F700H AUTOPARK.COM - test instalace
INT 2FH Fn 8901H WHOA!.COM - zruš instalaci
INT 2FH Fn 8902H WHOA!.COM - nastav počítadlo zpomalení
INT 2FH Fn AA00H VIDCLOCK.COM - test instalace
INT 2FH Fn AD80H KEYB.COM - dej číslo verze
INT 2FH Fn AD81H KEYB.COM - nastav aktivní kódovou stránku
INT 2FH Fn AD82H KEYB.COM - nastav kód země
INT 2FH Fn AD83H KEYB.COM - dej kód země
INT 2FH Fn B000H GRAFTABL.COM - test instalace
INT 2FH Fn B700H APPEND - test instalace
INT 2FH Fn B800H Network - test instalace
INT 2FH Fn B803H Network - dej aktuální poštovní adresu
INT 2FH Fn B804H Network - nastav novou poštovní adresu
INT 2FH Fn E300H ANARKEY.COM - test instalace
INT 2FH Fn F700H AUTOPARK.COM - test instalace
INT 2FH Fn F701H AUTOPARK.COM - nastav zpoždění parkování
Viz též: Přerušení DOSu
BMB COMPUSCIENCE CANADA UTILITIES INTERFACE
Požaduje: AH = xx (přiřazeno dynamicky na základě hledání multiplexního
čísla)
AL = 00H test instalace
ES:DI = 0EBEB:0BEBEH
Výstup: AL = 00H neinstalováno
01H neinstalováno, instalovat není OK
FFH instalováno, a pokud ES:DI <> 0EBEB:0BEBEH, bude ES:DI
ukazovat na řetězec 'BMB xxxx', kde xxxx je jméno
výrobku a verze
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PRINT - TEST INSTALACE
Požaduje: AX = 0100H
Výstup: AL = 00H neinstalováno, instalovat je OK
01H neinstalováno, instalovat není OK
FFH instalováno
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PRINT - NABÍDNI SOUBOR
Požaduje: AX = 0101H
DS:DX => data:
Off. Vel. Význam
▀▀▀▀ ▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H byte úroveň (priorita)
01H dword pointer na jméno souboru ASCIIZ
(znaky '*' a '?' nedovoleny)
─────────────────────────────────────────────────────────
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód PRINT
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PRINT - ODSTRAŇ SOUBOR
Požaduje: AX = 0102H
DS:DX => jméno souboru ASCIIZ (znaky '*' a '?' jsou dovoleny)
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód PRINT
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PRINT - ODSTRAŇ VŠECHNY SOUBORY
Požaduje: AX = 0103H
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód PRINT
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PRINT - DRŽ FRONTU/DEJ STATUS
Požaduje: AX = 0104H
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód PRINT
DX = počítadlo chyb
DS:SI => fronta pro tisk (seznam 64-bytových ASCIIZ jmen
souborů ukončených nulovým řetězcem)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PRINT - ZNOVU NASTARTUJ FRONTU
Požaduje: AX = 0105H
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód PRINT
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PRINT - DEJ ADRESU ZAŘÍZENÍ
Požaduje: AX = 0106H
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód PRINT
DS:SI => hlavička zařízení
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Je-li fronta spooleru prázdná, je CF vymazán a registr AX
obsahuje 0. Jinak je CF nastaven, DS:SI ukazuje na hlavičku
zařízení tiskárny a registr AX obsahuje 0008H.
Viz též: Multiplex
OBSLUHA KRITICKÉ CHYBY DOS 3+ - TEST INSTALACE
Požaduje: AX = 0500H
Výstup: AL = 00H neinstalováno, instalovat je OK
01H neinstalováno, instalovat není OK
FFH instalováno
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Tato sada funkcí dovoluje uživatelskému programu částečně nebo
úplně potlačit implicitní manipulační program kritické chyby
v COMMAND.COM. Jen DOS 3+ !
Viz též: Multiplex
OBSLUHA KRITICKÉ CHYBY DOS 3+ - CHYBA HANDLU
Požaduje: AX = 05XXH DOS 3+
AL = rozšířený chybový kód (nikoli nula)
Výstup: CF je 0
ES:DI => zpráva o chybě ASCIIZ
CF nastavený: použij implicitní manipulační program chyby
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
ASSIGN - TEST INSTALACE
Požaduje: AX = 0600H
Výstup: AH <> 0 pokud je instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
ASSIGN - DEJ SEGMENT PAMĚTI
Požaduje: AX = 0601H
Výstup: ES = segment pracovní oblasti ASSIGN
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
DRIVER.SYS - TEST INSTALACE
Požaduje: AX = 0800H
Výstup: AL = 00H neinstalováno, instalovat je OK
01H neinstalováno, instalovat není OK
FFH instalováno
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
SHARE - TEST INSTALACE
Požaduje: AX = 1000H
Výstup: AL = 00H neinstalováno, instalovat je OK
01H neinstalováno, instalovat není OK
FFH instalováno
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex DOS Fn 5C
NETWORK REDIRECTOR - TEST INSTALACE
Požaduje: AX = 1100H
Výstup: AL = 00H neinstalováno, instalovat je OK
01H neinstalováno, instalovat není OK
FFH instalováno
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
NETWORK REDIRECTOR - PŘESMĚRUJ
Požaduje: AX = 111EH
zásobník: word funkce, která se má provést
Výstup: CF nastaven, došlo-li k chybě
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PRÁZDNÉ VOLÁNÍ MS-DOS
Požaduje: AX = 1680H
Výstup: AL = 00H systém podporuje odročení programů
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Popis: Toto přerušení mohou programy použít pro odročení činnosti. Před
vyvoláním tohoto přerušení by programy měly volat DOS Fn 35 .
Viz též: INT 28 Multiplex
ANSI.SYS - TEST INSTALACE
Požaduje: AX = 1A00H
Výstup: AL = 0FFH řídící program ANSI.SYS byl instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: INT 28 Multiplex
TEST INSTALACE
Požaduje: AX = 1200H Interní pro DOS 3+
Výstup: AL = FFH (kompatibilita s ostatními funkcemi INT 2FH)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
DEJ ADRESU PŘERUŠENÍ
Požaduje: AX = 1202H Interní pro DOS 3+
zásobník: word číslo vektoru
Výstup: ES:BX => vektor přerušení
zásobník nezměněn
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Tolik Bill blbne kvůli přečtení 2 WORDů ...
Viz též: Multiplex
DEJ SEGMENT DAT DOS
Požaduje: AX = 1203H Interní pro DOS 3+
Výstup: DS = segment IBMDOS.SYS
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
NORMALIZUJ ODDĚLOVAČ CEST
Požaduje: AX = 1204H Interní pro DOS 3+
zásobník: word znak, který má být normalizován
Výstup: AL = normalizovaný znak (lomítko změněné na zpětné lomítko)
zásobník nezměněn
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
VÝSTUP ZNAKU
Požaduje: AX = 1205H Interní pro DOS 3+
zásobník: word znak, který má být zobrazen
Výstup: zásobník nezměněn
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Lze volat pouze z DOS.
Viz též: Multiplex
VYVOLEJ KRITICKOU CHYBU
Požaduje: AX = 1206H Interní pro DOS 3+
Výstup: AL = 0-3 pro Abort, Retry, Ignore, Fail
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Lze volat pouze z DOS.
Viz též: Multiplex
PŘESUN BUFFERU DISKU
Požaduje: AX = 1207H Interní pro DOS 3+
DS:DI => buffer disku
Výstup: buffer přemístěn na konec seznamu bufferů
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Lze volat pouze z DOS.
Viz též: Multiplex
DEKREMENTUJ WORD
Požaduje: AX = 1208H Interní pro DOS 3+
ES:DI => Wordo, které má být dekrementováno
Výstup: AX = nová hodnota slova
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Lze volat pouze z DOS.
Word , na které ukazoval ES:DI je dekrementováno, nuly jsou
přeskočeny.
Viz též: Multiplex
DEJ DATUM A ČAS
Požaduje: AX = 120DH Interní pro DOS 3+
Výstup: AX = aktuální datum ve zapakovaném tvaru
DX = aktuální čas ve zapakovaném tvaru
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Lze volat pouze z DOS.
Viz též: Multiplex
NAJDI NEVYČIŠTĚNÝ BUFFER
Požaduje: AX = 1210H Interní pro DOS 3+
DS:DI => první buffer disku, který se má testovat
Výstup: DS:DI => první buffer disku, který má vynulovaný příznak Clean
příznak ZF je: vynulován, pokud je buffer nalezen
nastaven, pokud není nalezen
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
NORMALIZUJ JMÉNO SOUBORU ASCIIZ
Požaduje: AX = 1211H Interní pro DOS 3+ Multiplex
DS:SI => ASCIIZ jméno souboru, které se má normalizovat
ES:DI => buffer pro normalizované jméno souboru
Výstup: buffer určení je naplněn jménem souboru s velkými písmeny,
všechna lomítka jsou změněna na zpětná lomítka
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
DEJ DÉLKU ŘETĚZCE ASCIIZ
Požaduje: AX = 1212H Interní pro DOS 3+
ES:DI => řetězec ASCIIZ
Výstup: CX = délka řetězce
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
PŘEVOD ZNAKU NA VELKÁ PÍSMENA
Požaduje: AX = 1213H Interní pro DOS 3+
zásobník: word znak, který má být převeden na velké písmeno
Výstup: AL = převedený znak
zásobník nezměněn
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
POROVNEJ POINTERY FAR
Požaduje: AX = 1214H Interní pro DOS 3+
DS:SI = první pointer
ES:DI = druhý pointer
Výstup: příznak ZF je nastaven, jsou-li pointery shodné, jinak vynulován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
DEJ ADRESU SYSTÉMOVÉHO FCB
Požaduje: AX = 1216H Interní pro DOS 3+
BX = počet položek FAT
Výstup: ES:DI => položka FAT
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
NASTAV IMPLICITNÍ DISK
Požaduje: AX = 1217H Interní pro DOS 3+
zásobník: word disk (0=A:, 1=B: atd.)
Výstup: DS:SI => blok dat disku pro specifikovaný disk
zásobník nezměněn
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Lze volat pouze z DOS.
Viz též: Multiplex
DEJ REGISTRY VOLAJÍCÍHO
Požaduje: AX = 1218H Interní pro DOS 3+
Výstup: DS:SI => uchované registry AX, BX, CX, DX, SI, DI, BP, DS, ES
volajícího (v zásobníku)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Platné pouze, jste-li uvnitř DOS.
Viz též: Multiplex
DEJ DISK SOUBORU
Požaduje: AX = 121AH Interní pro DOS 3+
DS:SI => jméno souboru
Výstup: AL = disk (0=implicitní, 1=A:, atd. FFH=neplatný)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CHECKSUM PAMĚTI
Požaduje: AX = 121CH Interní pro DOS 3+
DS:SI => počátek testované paměti
CX = počet bytů
DX = iniciální checksum (kontrolní součet)
Výstup: DX = checksum
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Platné pouze, jste-li uvnitř DOS.
Viz též: Multiplex
POROVNEJ JMÉNA SOUBORŮ
Požaduje: AX = 121EH Interní pro DOS 3+
DS:SI => první ASCIIZ jméno souboru
ES:DI => druhé ASCIIZ jméno souboru
Výstup: příznak ZF je nastaven, jsou-li jména ekvivalentní, jinak
je vynulován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
POSTAV BLOK INFO DISKU
Požaduje: AX = 121FH Interní pro DOS 3+
zásobník: word písmeno disku
Výstup: ES:DI => blok info disku (další volání jej přepíše)
zásobník nezměněn
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Lze volat pouze z DOS.
Viz též: Multiplex
DEJ POČET FAT
Požaduje: AX = 1220H Interní pro DOS 3+
BX = handle souboru
Výstup: CF nastaven, došlo-li k chybě
AL = 6 (neplatný handle souboru)
CF vynulován, bylo-li volání úspěšné
byte ES:[DI] = počet položek ve FAT pro daný handle souboru
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
DEJ DÉLKU ŘETĚZCE ASCIIZ
Požaduje: AX = 1225H Interní pro DOS 3+
DS:SI => řetězec ASCIIZ
Výstup: CX = délka řetězce
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
DEJ POČET POLOŽEK FAT PRO SOUBOR
Požaduje: AX = 1229H Interní pro DOS 3+
BX = handle souboru
Výstup: ES:DI => položka FAT pro soubor (viz DOS Fn 52 )
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Lze volat pouze z DOS.
Viz též: Multiplex
DEJ ŘETĚZ ZAŘÍZENÍ
Požaduje: AX = 122CH Interní pro DOS 3+
Výstup: BX:AX => hlavička řídícího programu druhého zařízení (první je
NUL) v řetězu řídících programů
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
NLSFUNC.COM - TEST INSTALACE
Požaduje: AX = 1400H
Výstup: AL = 00H neinstalováno, instalovat je OK
01H neinstalováno, instalovat není OK
FFH instalováno
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - TEST INSTALACE
Požaduje: AX = 1500H
BX = 0
Výstup: BX = počet použitých písmen jednotky CDROM
CX = počáteční písmeno disku (0=A:)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Tento test instalace NEPOUŽÍVÁ formát užívaný jiným software.
Viz též: Multiplex
CDROM - DEJ SEZNAM DISKŮ ZAŘÍZENÍ
Požaduje: AX = 1501H
ES:BX => buffer pro seznam písmen disků (5 bytů na písmeno)
Výstup: naplněný buffer, pro každé písmeno disku:
Off. Vel. Popis
▀▀▀▀ ▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H byte počet podjednotek (subunit) v řídícím programu
01H dword adresa záhlaví řídícího programu zařízení
────────────────────────────────────────────────────────────────
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - DEJ JMÉNO SOUBORU S ÚDAJEM COPYRIGHT
Požaduje: AX = 1502H
ES:BX => 38-bytový buffer pro jméno souboru s údajem Copyright
CX = číslo disku (0=A:)
Výstup: CF nastaven, pokud disk není disk CDROM
AX = 15 (neplatný disk)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - DEJ JMÉNO ABSTRAKTNÍHO SOUBORU
Požaduje: AX = 1503H
ES:BX => 38-bytový buffer pro jméno abstraktního souboru
CX = číslo disku (0=A:)
Výstup: CF nastaven, pokud disk není disk CDROM
AX = 15 (neplatný disk)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - DEJ JMÉNO SOUBORU BIBL. DOKUMENTACE
Požaduje: AX = 1504H
ES:BX => 38-bytový buffer pro jméno souboru bibliografické
dokumentace
CX = číslo disku (0=A:)
Výstup: CF nastaven, pokud disk není disk CDROM
AX = 15 (neplatný disk)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - ČTI VTOC
Požaduje: AX = 1505H
ES:BX => 2048-bytový buffer
CX = číslo disku (0=A:)
DX = index sektoru (0=deskriptor prvního média, 1=druhého...)
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód (15=neplatný disk, 21=nepřipraven)
CF je 0, bylo-li volání úspěšné
AX = typ deskriptoru média (1=standardní, 0FFH=terminátor,
0=jiný)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - ZAPNI DEBUGGOVÁNÍ
Požaduje: AX = 1506H
BX = debuggující funkce, která má být zpřístupněna
Výstup: rezervováno pro další vývoj
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - VYPNI DEBUGGOVÁNÍ
Požaduje: AX = 1507H
BX = debuggující funkce, která má být zakázána
Výstup: rezervováno pro další vývoj
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - ČTI Z ABSOLUTNÍHO DISKU
Požaduje: AX = 1508H
ES:BX => buffer
CX = číslo disku (0=A:)
SI:DI = číslo počátečního sektoru
DX = počet sektorů, které mají být přečteny
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód (15=neplatný disk, 21=nepřipraven)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM - PIŠ NA ABSOLUTNÍ DISK
Požaduje: AX = 1509H
ES:BX => buffer
CX = číslo disku (0=A:)
SI:DI = číslo počátečního sektoru
DX = počet sektorů, které mají být zapsány
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Odpovídá INT 26 , v současnosti je rezervována a nefunkční.
Viz též: Multiplex
MULTIPLEX - CDROM 2.00 - TEST DISKU
Požaduje: AX = 150BH
CX = číslo disku (0=A:)
Výstup: BX = ADADH, je-li instalováno MSCDEX.EXE
AX = 0 pokud disk není podporován
<> 0 pokud je podporován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM 2.00 - DEJ VERZI MSCDEX.EXE
Požaduje: AX = 150CH
Výstup: BH = hlavní číslo verze
BL = vedlejší číslo verze
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Verze MSCDEX.EXE dřívější než 1.02 vrací BX=0
Viz též: Multiplex
CDROM 2.00 - DEJ PÍSMENA DISKŮ CDROM
Požaduje: AX = 150DH
ES:BX => buffer pro seznam písmen disku (1 byte na disk)
Výstup: buffer naplněný čísly disků (0=A:). Každý byte odpovídá disku
na stejné pozici pro funkci 1501H.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM 2.00 - DEJ/NASTAV PREF. DESKRIPTORU MÉDI
Požaduje: AX = 150EH
BX = subfunkce
00H Dej preferenci
DX = 0
Výstup: DX = nastavení preferencí
01H Nastav preferenci
DH = preference deskriptoru média
1 = primární deskriptor média
2 = dodatečný deskriptor média
DL = preference dodatečného deskriptoru média
1 = Shift-Kanji (???)
CX = číslo disku (0=A:)
Výstup: CF nastaveno na chybu
AX = chybový kód (15=neplatný disk, 1=neplatná funkce)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
CDROM 2.00 - DEJ POLOŽKU ADRESÁŘE
Požaduje: AX = 150FH
CX = číslo disku (0=A:)
ES:BX => jméno cesty v ASCIIZ tvaru
SI:DI => 255-bytový buffer pro položky adresáře
Výstup: CF nastaven, došlo-li k chybě
AX = chybový kód
CF vynulován, bylo-li volání úspěšné
AX = formát disku (0=High Sierra, 1=ISO 9660)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Formát položky adresáře:
Offset Velikost Popis
▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H byte délka položky adresáře
01H byte délka XAR v jednotkách LBN
02H dword LBN dat, formát Intel (little-endian)
06H dword LBN dat, formát Motorola (big-endian)
0AH dword délka souboru, formát Intel
0EH dword délka souboru, formát Motorola
---High Sierra---
12H 6bytů datum a čas
---High Sierra---
12H 6bytů datum a čas
18H byte bitové příznaky
19H byte rezervováno
---ISO 9660------
12H 7bytů datum a čas
19H byte bitové příznaky
---oba formáty---
1AH byte rozsah prokládání
1BH byte faktor přeskočení pro prokládání
1CH word číslo posloupnosti sady médií, formát Intel
1EH word číslo posloupnosti sady médií, formát Motorola
20H byte délka jména souboru
21H N bytů jméno souboru
byte (volitelný) padding, je-li délka jména souboru lichá
N bytů systémová data
Viz též: Multiplex
XMS - TEST INSTALACE
Požaduje: AX = 4300H
Výstup: AL = 80H, je-li instalován řídící program XMS
AL <> 80H, řídící program není instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: XMS dává přístup k rozšířené paměti nad 1048KB.
Viz též: Multiplex XMS Mapa paměti
XMS - DEJ ADRESU ŘÍDÍCÍHO PROGRAMU
Požaduje: AX = 4310H
Výstup: ES:BX => vstupní bod řídícího programu
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Proveďte volání FAR na vstupní bod řídícího programu; AH nastavte na
kód funkce:
Viz XMS Multiplex
DOSKEY.COM - ČTI PŘÍKAZOVOU ŘÁDKU
Požaduje: AX = 4810H DOS 5.0
DS:DX => buffer s textem příkazové řádky
Offset Význam
▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H maximální velikost bufferu - musí být 128 bytů
01H počet platných znaků v bufferu (smí být
zakončeno CR - 0DH, ale tento znak nesmí být
započten)
02H první znak textu příkazové řádky
───────────────────────────────────────────────────────
Výstup: AX = 0: volání bylo úspěšné
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Popis: Funkce načte příkazovou řádku do interního bufferu DOSKEY.COM a
a začlení příkaz do seznamu provedených příkazů.
Viz též: Multiplex
ROZHRANÍ RAM-RESIDENTNÍHO PROGRAMU
Požaduje: AX = 5453H Multiplex-TesSeRact
BX = subfunkce
00H Kontrola instalace
Požaduje: DS:SI => 8-znakové jméno doplněné mezerami
Výstup: AX = 0FFFFH instalováno
CX = identifikační číslo právě
instalované kopie
AX = cokoli jiného, neinstalováno
CX = identifikační číslo TSR, je-li
instalován
01H Dej uživatelské parametry
Požaduje: CX = identifikační číslo TSR
Výstup: AX = 0 úspěšné
ES:BX => blok uživatelských parametrů
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
8 bytů jméno TSR doplněné mezerami
dword identifikační číslo TSR
byte kód prohledávání primární
horké klávesy
00H = aktivace, když se
shodují stavy Shiftu
FFH = žádná aktivace (pokud je
stav Shiftu také 0FFH)
byte stav Shiftu primární horké
klávesy
FFH = žádná aktivace (pokud je
kód prohledávání také
0FFH)
byte počet sekundárních horkých
kláves
dword pointer na zvláštní sadu
horkých kláves nastavenou
subfunkcí 05H
word aktuální status příznaků TSR
word segment PSP pro TSR
dword DTA pro TSR
word implicitní DS pro TSR
dword zásobník při aktivaci
dword zásobník při volání z pozadí
──────────────────────────────────────
AX <> 0 selhání
02H Zkontroluj, je-li používána horká klávesa
Požaduje: CL = kód prohledávání horké klávesy
Výstup: AX = 0FFFFH horká klávesa je v konfliktu
s jiným TSR, jinak je použití
horké klávesy OK
03H Vyměň implicitní manipulační program krit. chyby
Požaduje: CX = identifikační číslo TSR
DS:SI => nová rutina pro INT 24H
Výstup: AX <> 0 neschopen instalovat nový
manipulační program
04H Dej oblast interních dat
Požaduje: CX = identifikační číslo TSR
Výstup: AX = 0
ES:BX => oblast interních dat pro TSR
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
byte revizní úroveň knihovny
TesSeRact
byte způsob užité aktivace
byte od posledního volání došlo k
INT 08H
byte od posledního volání došlo k
INT 13H
byte aktivní přerušení
byte aktivní softwarové přerušení
byte hlavní verze DOS
byte jak dlouho čekat před aktivací
dword pointer na příznak INDOS
dword pointer na příznak kritické
chyby DOS
word segment PSP přerušeného
programu
word segment programu přerušeného
INT 28H
dword DTA přerušeného programu
dword DTA programu přerušeného INT 28H
word SS přerušeného programu
word SP přerušeného programu
word SS programu přerušeného INT 28H
word SP programu přerušeného INT 28H
dword INT 24H přerušeného programu
3 word rozšířená info o chybě DOS 3+
byte staré nastavení BREAK
byte staré nastavení VERIFY
byte před aktivací běžel MS WORD 4.0
byte zvláštní příznak aktivace
MS WORD 4.0
byte používáno volání rozš. kláv.
byte zpoždění pro MS WORD 4.0
11 krát:
dword starý vektor přerušení
byte vektor přerušení
dword nový vektor přerušení
─────────────────────────────────────────
AX <> 0 TSR nenalezen
05H Nastav násobné horké klávesy
Požaduje: CX = identifikační číslo TSR
DL = počet dalších horkých kláves, které
mají být přiděleny
DS:SI => tabulka horkých kláves
byte kód prohledávání horké klávesy
byte stav Shiftu horké klávesy
byte hodnota příznaku, která má být
předána TSR (nenulová)
Výstup: AX <> 0 neschopen instalovat horké klávesy
06H - 0FH rezervováno
10H Povol TSR
Požaduje: CX = identifikační číslo TSR
Výstup: AX <> 0 neschopen povolit
11H Zakaž TSR
Požaduje: CX = identifikační číslo TSR
Výstup: AX <> 0 neschopen zakázat
12H Uvolni TSR
Požaduje: CX = identifikační číslo TSR
Výstup: AX <> 0 neplatné číslo TSR
Poznámka: Byly-li některé vektory přerušení používané
TSR použity i jinými TSR, počkají rutiny
TesSeRact, dokud není uvolnění označeného
TSR z paměti bezpečné.
13H Restart TSR
Požaduje: CX = identifikační číslo TSR, který byl
uvolněn, ale stále je v paměti
Výstup: AX <> 0 neschopen provést restart
14H Dej stavové slovo
Požaduje: CX = identifikační číslo TSR
Výstup: AX = 0FFFFH neplatné identifikační číslo,
jinak úspěšné
BX = bitové příznaky
15H Nastav stavové slovo
Požaduje: CX = identifikační číslo TSR
DX = nové bitové příznaky
Výstup: AX <> 0 neschopen nastavit
16H Dej stav INDOS při aktivaci
Požaduje: CX = identifikační číslo TSR
Výstup: AX = 0 úspěšné
BX = hodnota bitových příznaků INDOS
17H - 1FH rezervováno
20H Volej uživatelskou proceduru
Požaduje: CX = identifikační číslo TSR
ES:DI => data definovaná uživatelem
Výstup: AX = 0 úspěšné
21H Dej stisknutí kláves do bufferu klávesnice
Požaduje: CX = identifikační číslo TSR
DL = rychlost
00H ulož, pouze je-li buffer prázdný
01H ulož až čtyři stisknutí za takt
02H ulož až patnáct stisknutí za takt
DH = příznak kódu prohledávání
nulový, střídají-li se v bufferu kódy
ASCII a prohledávání
nenulový, pokud jsou v bufferu pouze
kódy ASCII
SI = počet stisknutí kláves
ES:DI => buffer
Výstup: AX = 0 úspěšné
0F0F0H uživatel přerušil Ctrl-C nebo
Ctrl-Break
jiné: neschopen uložit
22H - 2FH rezervováno
01H ulož až čtyři stisknutí za takt
02H ulož až patnáct stisknutí za takt
DH = příznak kódu prohledávání
nulový, střídají-li se v bufferu kódy
ASCII a prohledávání
nenulový, pokud jsou v bufferu pouze
kódy ASCII
SI = počet stisknutí kláves
ES:DI => buffer
Výstup: AX = 0 úspěšné
0F0F0H uživatel přerušil Ctrl-C nebo
Ctrl-Break
jiné: neschopen uložit
22H - 2FH rezervováno
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: Aktivační help systém pro Turbo Pascal a Turbo C firmy Borland
THELP.COM plně podporuje TesSeRact API.
Viz též: Multiplex
SCRNSAV2.COM - TEST INSTALACE
Požaduje: AX = 6400H Multiplex
Výstup: AL = 00H neinstalován
FFH instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: SCRNSAV2.COM je program pro uložení obrazovky pro PS/2 s VGA
od Alana Ballarda.
Viz též: Multiplex
NOVELL NETWARE - TEST INSTALACE
Požaduje: AX = 7A00H Multiplex
Výstup: AL = 00H neinstalován
FFH instalován
ES:DI => vstupní bod FAR pro rutiny jinak přístupné
přes INT 21
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
WHOA!.COM - TEST INSTALACE
Požaduje: AX = 8900H Multiplex
Výstup: AL = 00H neinstalován
FFH instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: WHOA!.COM je systémový zpomalovací obslužný program od Brada D.
Crandalla.
Viz též: Multiplex
WHOA!.COM - ZRUŠ INSTALACI
Požaduje: AX = 8901H Multiplex
Výstup: AL = FDH úspěšné
FEH chyba
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: WHOA!.COM je systémový zpomalovací obslužný program od Brada D.
Crandalla.
Viz též: Multiplex
WHOA!.COM - NASTAV POČÍTADLO ZPOMALENÍ
Požaduje: AX = 8902H Multiplex
BX = počítadlo zpoždění (větší hodnota zvětší zpomalení)
Výstup: AL = FDH úspěšné
FEH chyba
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: WHOA!.COM je systémový zpomalovací obslužný program od Brada D.
Crandalla.
Viz též: Multiplex
VIDCLOCK.COM - TEST INSTALACE
Požaduje: AX = AA00H Multiplex
Výstup: AL = 00H neinstalován
FFH instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: VIDCLOCK.COM jsou residentní hodiny od Thomase G. Hanlina III.
Viz též: Multiplex
KEYB.COM - DEJ ČÍSLO VERZE
Požaduje: AX = AD80H Multiplex
Výstup: BX = číslo verze, je-li program KEYB.COM instalován, jinak BX=0
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
KEYB.COM - NASTAV AKTIVNÍ KÓDOVOU STRÁNKU
Požaduje: AX = AD81H Multiplex
BX = nová Kódová stránka
Výstup: CF je nastaven na CY, došlo-li k chybě
AX = 0001H nekorektní kódová stránka
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
KEYB.COM - NASTAV KÓD ZEMĚ
Požaduje: AX = AD82H Multiplex
BL = kód země 00H domácí
0FFH cizina
Výstup: CF je nastaven na 1, došlo-li k chybě
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
KEYB.COM - DEJ KÓD ZEMĚ
Požaduje: AX = AD83H Multiplex
Výstup: BL = aktuální kód země
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
GRAFTABL.COM - TEST INSTALACE
Požaduje: AX = B000H Multiplex
Výstup: AL = 0FFH byl-li program GRAFTABL.COM instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
APPEND - TEST INSTALACE
Požaduje: AX = B700H Multiplex
Výstup: AH <> 0 pokud je instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
NETWORK - TEST INSTALACE
Požaduje: AX = B800H Multiplex
Výstup: AH = 0 pokud není instalován
AH <> 0 pokud je instalován
BX = příznaky instalovaných komponent (testujte
v tomto pořadí!):
bit 6: obslužný kanál
bit 2: posel (messenger)
bit 7: příjemce
bit 3: redirektor
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
NETWORK - DEJ AKTUÁLNÍ POŠTOVNÍ ADRESU
Požaduje: AX = B803H Multiplex
Výstup: ES:BX = poštovní adresa
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
NETWORK - NASTAV NOVOU POŠTOVNÍ ADRESU
Požaduje: AX = B804H Multiplex
Výstup: ES:BX = nová poštovní adresa
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
ANARKEY.COM - TEST INSTALACE
Požaduje: AX = E300H Multiplex
Výstup: AL = 00H neinstalován
FFH instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: ANARKEY.COM je program volatelný z příkazového řádku od Stevena
Calwase. 0E3H je implicitní číslo funkce, může však být
nastaveno na jakoukoli hodnotu od 0C0H do 0FFH.
Viz též: Multiplex
AUTOPARK.COM - TEST INSTALACE
Požaduje: AX = F700H Multiplex
Výstup: AL = 00H neinstalován
FFH instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: AUTOPARK.COM je residentní parkovací program hard disku od Alana
D. Jonese.
Viz též: Multiplex
AUTOPARK.COM - NASTAV ZPOŽDĚNÍ PARKOVÁNÍ
Požaduje: AX = F701H Multiplex
BX:CX = 32-bitové počítadlo 55ms taktů hodin
Výstup: žádný
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Poznámka: AUTOPARK.COM je residentní parkovací program hard disku od Alana
D. Jonese.
Viz též: Multiplex
DOSKEY.COM - TEST INSTALACE
Požaduje: AX = 4800H DOS 5.0
Výstup: AL <> 0: program DOSKEY.COM byl instalován
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Viz též: Multiplex
INT 2FH FN 1687H - DPMI interface
Požaduje: AX = 1687H
Výstup: AX <> 0 DPMI není instalován
AX = 0 DPMI je instalován.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Je-li DPMI přítomen, je možno využít jeho služeb. Hodnoty ve vrácených
registrech mají následující význam :
BX - atributy DPMI bit 0 : 0 - 16 bitové
1 - 32 bitové Prostředí 16/32
oststní bity ve verzi 0.9 nevyužity
CL - Procesor 02 - 80286
03 - 80386
04 - 80486
DX - Verze DPMI (BCD)
SI - Počet paragrafů pro privátní data DPMI
ES:DI - PROTECTED MÓD entry point - sem call far do protected módu.
Viz též: Multiplex DPMI INT 2FH FN 1686H
INT 2FH FN 1686H - DPMI dej mód procesoru
Požaduje: AX = 1686H
Výstup: AX <> 0 Procesor není v Protected, nebo DPMI není instalováno
AX = 0 Protected mód po DPMI
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Program, který využívá služeb DPMI může teoreticky běžet jak v REAL MÓDu ,
tak v PROTECTED MÓDu , aniž by o tom věděl. Testem touto funkcí zjistím kolik
uhodilo.
Viz též: Multiplex INT 2FH FN 1687H -DPMI test instalace
Task Segment State
Jedná se o strukturu podporovanou procesory 286 a vyššími. Byla vyvinuta
k podpoře multitaskingu. V TSS jsou uchovány hodnty registrů procesoru
v okamžiku přerušení činnosti ( podporuje procesor ) a při opětovném vyvolání
je procesor sám obnoví.
Jestliže program provede JMP far nebo Call far a Selektoru CS připadne
Deskriptor odpovídající TSS, procesor provede přepnutí úloh.
Přepnout úlohy lze rovněž nastavením příznaku NT ve FLAGS a provedením
IRET.
Právě zpracovávaný TSS má hodnotu Aktivní (viz Deskriptor ). Pokud
je TSS volán JMP, nastaví se deskriptor původního TSS na neaktivní TSS.
Pokud je TSS volán CALL, zůstane volající TSS označen jako aktivní, do pole
LINK se umístí Selektor volajícího TSS a novém TSS je nastaven bit NT
ve FLAGS. Provede-li volaný TSS IRET, vrátí se řízení volajícímu TSS.
TSS, který je označen jako Aktivní, nelze znovu volat CALL ani JMP !!
Po zapnutí NEEXISTUJE TSS. První program, který chce TSS podporovat (správce
úloh nebo V86 MÓDu ) musí provést LTR, aby sdělil, kde je jeho TSS. Není-li
TSS nastaveno, povede první pokus o přepnutí úloh pomocí TSS k chybě INT 0D .
Formát 286 TSS
15 0
┌─────────────────────────────────┐
00 │ LINK (Selektor volajícího TSS) │
├─────────────────────────────────┤
02 │ SP pro CPL =0 │
├─────────────────────────────────┤
04 │ SS pro CPL =0 │
├─────────────────────────────────┤
06 │ SP pro CPL =1 │
├─────────────────────────────────┤
08 │ SS pro CPL =1 │
├─────────────────────────────────┤
0A │ SP pro CPL =2 │
├─────────────────────────────────┤
0C │ SS pro CPL =2 │
├─────────────────────────────────┤
0E │ IP │
├─────────────────────────────────┤
10 │ FLAGS │
├─────────────────────────────────┤
12 │ AX │
├─────────────────────────────────┤
14 │ CX │
├─────────────────────────────────┤
16 │ DX │
├─────────────────────────────────┤
18 │ BX │
├─────────────────────────────────┤
1A │ SP │
├─────────────────────────────────┤
1C │ BP │
├─────────────────────────────────┤
1E │ SI │
├─────────────────────────────────┤
20 │ DI │
├─────────────────────────────────┤
22 │ ES │
├─────────────────────────────────┤
24 │ CS │
├─────────────────────────────────┤
26 │ SS │
├─────────────────────────────────┤
28 │ DS │
├─────────────────────────────────┤
2A │ LDTR │
└─────────────────────────────────┘
Velikost 286 TSS je 2Ch byte, tedy 44 BYTE. TSS by měl začínat na sudé adrese.
TSS 386,486
31 16 15 0
┌────────────────┬────────────────┐
00 │ 000000000000 │ LINK │
├────────────────┴────────────────┤
04 │ ESP pro CPL =0 │
├────────────────┬────────────────┤
08 │ 000000000000 │ SS pro CPL 0 │
├────────────────┴────────────────┤
0C │ ESP pro CPL =1 │
├────────────────┬────────────────┤
10 │ 000000000000 │ SS pro CPL 1 │
├────────────────┴────────────────┤
14 │ ESP pro CPL =2 │
├────────────────┬────────────────┤
18 │ 000000000000 │ SS pro CPL 2 │
├────────────────┴────────────────┤
1C │ CR3 │
├─────────────────────────────────┤
20 │ EIP │
├─────────────────────────────────┤
24 │ EFLAGS │
├─────────────────────────────────┤
28 │ EAX │
├─────────────────────────────────┤
2C │ ECX │
├─────────────────────────────────┤
30 │ EDX │
├─────────────────────────────────┤
34 │ EBX │
├─────────────────────────────────┤
38 │ ESP │
├─────────────────────────────────┤
3C │ EBP │
├─────────────────────────────────┤
40 │ ESI │
├─────────────────────────────────┤
44 │ EDI │
├────────────────┬────────────────┤
48 │ 00000000000000 │ ES │
├────────────────┼────────────────┤
4C │ 00000000000000 │ CS │
├────────────────┼────────────────┤
50 │ 00000000000000 │ SS │
├────────────────┼────────────────┤
54 │ 00000000000000 │ DS │
├────────────────┼────────────────┤
58 │ 00000000000000 │ FS │
├────────────────┼────────────────┤
5C │ 00000000000000 │ GS │
├────────────────┼────────────────┤
60 │ 00000000000000 │ LDT │
├────────────────┼────────────────┤
┌─ 64 │ Offset neform. │ 0...........0T │
│ └────────────────┴────────────────┘
│ { Pozn.:Velikost formátované části je 68h BYTE = 104d BYTE
│ T - Je-li 1, hned po aktivaci vyvolej INT 01
│ Offset neform. - offset uvnitř TSS do místa,
│ kde začíná popis práv přístupu. }
│
│ .................................
│ Zde může být cokoliv, ale adresované
│ přes ALIAS segment ( segment se stejnou Bází a limitem )
│ NE přes TSS selektor !!!!
│ Vhodné k uložení stavy koprocesoru
│ ..................................
│
└──► Neformátovaná část :
Pro každý port 1 bit. 0 znamená povolen, 1 zakázán.
port 0 má bit 0 BYTE 0, port 1 má bit 1 BYTE 0, ...
port 8 má bit 0 BYTE 1, atd ..
konec - WORD FFFF.
Všechny porty za limitem TSS jsou zakázané.
Zákazy portů pomocí TSS se nevztahují pro CPL <= IOPL .
Systém ochrany INT 0A Přerušení CPU CPL DPL IOPL
Zpracování přerušení
Přerušení nastane buď asynchronně (hardware) nebo synchronně (program).
Před zpracováním zkontroluje procesor stav IF. Je-li 1, umožní provést
oba typy přerušení, 0 umožňuje jen synchronní.
Asynchronní přerušení musí být ukončeno resetem řadiče přerušení:
Mov al,20h
Out 20h,al
Jinak se co do zpracování procesorem asynchronní a synchronní přerušení neliší.
Předpokládejme výskyt nějakého přerušení. Níže je popis chování procesoru
v různých módech. Číslo přerušení je N.
Real Mód
Procesor zjistí polohu IDT. Na 8086 byla tabulka přerušení vždy na adrese
0000:0000 a její velikost byla 400 BYTE. 286 a vyšší mají polohu uloženou
v IDTR registru po RESETu inicializovanou stejně jako 8086. ( Velikost je 400h
byte, ale v IDTR je uložen limit 3FF )
Procesor vynásobí 4*N. Porovná je s velikostí IDT ( 286 a lepší ). Pokud
se položka v IDT nenachází, vyvolá se INT 08 .
Nyní se na zásobník uloží FLAGS, CS a IP (v tomto pořadí).
Z vypočteného offsetu (4*N) se přečte nová hodnota IP a CS ( v tomto pořadí).
Bity IF a TF ve flags se nastaví na 0.
IRET ze zásobníku pouze obnoví FLAGS, CS a IP a program pokračuje v místě
přerušení. Jak prosté.
Pokud na 286 a vyšších změníte IDT, bude se i v REAL módu používat její
báze. Pak ale krachnou všechny programy, které přistupují k vektorům přímo.
A co si myslíte, že provede DOS Fn 25 a DOS Fn 35 , která 'zajišťuje
bezkonfliktnost s hardware a software, a proto by měla být vždy využívána' ?
Nechte se překvapit. Ale jen předesílám, že DOS do verze 6.02 ani pořádně
nevěděl o typu používaného procesoru ...
REAL MÓD
PROTECTED MÓD
Protected mód musí inicializovat tabulku přerušení jinak než REAL.
Velikost 1 položky IDT je 8 byte a může obsahovat jakýkoli Deskriptor
vyjma bran, LDT a položek nesystémových (bit S). Tak lze i pomocí INT
přepínat úlohy.
Velikost plné IDT je tedy 800 byte ( limit 7FFh ) a její poloha je libovolná
(zarovnávejte na 4). Postup při vyvolání INT je složitější.
1. Zjistí se poloha IDT
2. Provede se výpočet offsetu 8*N
3. Zajistí se přítomnost položky IDT (limit IDT)
4. Porovná se CPL volajícího s DPL příslušné položky IDT. Pokud CPL > DPL,
pak INT 0D . Tento test se vynechává u asynchronně volaných INT a
Přerušení CPU . Pokud test neprojde, vyvolá se INT 0D ( nyní jako
přerušení CPU bez tohoto testu ).
5. Porovná se CPL volajícího a obslužné rutiny. Je-li rozdíl, přepne se
zásobník podle TSS na prioritu obsluhy a na zásobník se uloží (E)SP
a SS volajícího.
6. Na zásobník se uloží (E)FLAGS , (E)IP a CS volajícího.
7. TF se vynuluje. Jedná-li se o nepřerušitelnou obsluhu (viz Deskriptor ),
vynuluje se navíc i IF.
8. Řízení se předá na Selektor :offset uvedený v příslušné položce IDT
IRET pracuje podobněji REAL MÓDu. Obnoví (E)IP, CS a (E)FLAGS. Je-li navíc
zjištěn rozdíl priorit volající - obsluha, obnoví se navíc SS, (E)SP
volajícího a odstraní se ze stacku ( volaného ).
Je-li položkou IDT Selektor TSS , je situace od bodu 5. jiná:
5. Do TSS volajícího se uloží hodnoty registrů
6. Provede se načtení hodnot z nového TSS . Navíc se nastaví NT na 1 a LINK
na hodnotu TSS volajícího. IRET tedy provede správný návrat. (podle LINK)
Hodnoty v závorkách jsou platné pro 386 obsluhu přerušení. 286 obsluha o
EXX nic neví. Ale nesmí jí měnit (na 386), jinak provede pád systému !
Stav zásobníku po INT :
286 obsluha 386 obsluha
15 0 31 16 15 0
├────────────────┤ ├───────────────┬────────────────┤
│ SS přerušeného │ │ 0000000000000 │ SS přerušeného │
├────────────────┤ ├───────────────┴────────────────┤
│ SP přerušeného │ │ ESP přerušeného │
├────────────────┤ ├────────────────────────────────┤
│ FLAGS │ │ EFLAGS │
├────────────────┤ ├────────────────┬───────────────┤
│ CS │ │ 00000000000000 │ CS │
├────────────────┤ ├────────────────┴───────────────┤
│ IP │ │ EIP │
SS:SP ───> SS:ESP ───>
PROTECTED MÓD Prostředí 16/32
V86 obsluha
To nejlepší nakonec. Obsluha INT u V86. Jakýkoliv INT vyvolaný V86 musí
obsloužti IDT v PROTECTED MÓDu. Obsluha MUSÍ být 32 bitová (386).
Podle pole IOPL INT a IRET buď vyvolají příslušný INT přímo (IOPL=3) nebo
vyvolají všechny INT 0D . V obou případech je na zásobníku ( u INT 0D ještě
chybový kód 0, ten je třeba popnout ) situace :
386 obsluha
31 16 15 0
│ 0000000000000 │ GS přerušeného │
├───────────────┼────────────────┤
│ 0000000000000 │ FS přerušeného │
├───────────────┼────────────────┤
│ 0000000000000 │ DS přerušeného │
├───────────────┼────────────────┤
│ 0000000000000 │ ES přerušeného │
├───────────────┼────────────────┤
│ 0000000000000 │ SS přerušeného │
├───────────────┼────────────────┤
│ 0000000000000 │ SP │
├───────────────┴────────────────┤
│ EFLAGS │ VM = 1 !!
├───────────────┬────────────────┤
│ 0000000000000 │ CS │
├───────────────┼────────────────┤
│ 0000000000000 │ IP │
SS:ESP -> ├ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─┤
chybový kód u INT 0D
Správce musí přečíst vektory na adrese 0000:0000 a podle instrukce (CS:IP)
a jejího opkódu vybrat příslušnou položku a dosadit jí na místo CS a IP.
Pokud je IOPL =3, musí ještě nastavit zásobník volajícího tak, aby IRET
obnovil správně hodnoty CS, IP a FLAGS. Tím pro něj obsluha přerušení končí.
Polud IOPL <3, musí původní hodnoty CS , IP a FLAGS na zásobník
přerušeného a příslušně zvětšit SP. Na INT 0D se pak očekává IRET, a v tom
případě správce vyzvedne hodnoty ze stacku V86 a uloží je do hodnot CS, IP a
FLAGS.
Pozn.: Způsob s IOPL <3 je běžnější. Lze tak 'snadno' naprogramovat
preemptivní multitasking.
V86 MÓD
Poznámka závěrem : INT je jediná trvalá věc, jež se nenění s TSS . Proto
se často volí pro obsluhu a přepínání úloh.
INT představuje JEDINOU možnost, jak se dostat v V86.
( Na úrovni software pomůže DPMI a VCPI , ale to
stejně musí volat nějaký INT. )
Systém ochrany IOPL Nové registry 286 TSS Deskriptor Prostředí 16/32
Přesun dat
MOV Obecný tvar: Mov kam, odkud
═══════════════════════════════════════════════════════════════════════════
Mov přesune byte nebo word z místa (odkud) na místo (kam)
Na 80286 jsou povoleny tyto kombinace :
1. Mov registr, místo v paměti Mov ax,word ptr ds:[di]
2. Mov místo v paměti, registr Mov word ptr ds:[di],ax
3. Mov Seg.Registr, registr Mov ds,ax
Seg.Registr jen DS, ES nebo SS. NE CS !!
4. Mov registr, Seg.registr Mov ax,cs
NBez omezemí
5. Mov registr,hodnota Mov bl,90h
registr není segmentový
6. Mov registr,registr Mov ax,cx
7. Mov místo v paměti, hodnota Mov word ptr es:[di],0
Nemění příznaky.
LEA Obecný tvar: LEA reg, co
═══════════════════════════════════════════════════════════════════════════
Lea přesune offset (co) do registru.
Já tím šetřím v TASMu 6 písmen :
místo Mov bx,offset něco napíšu Lea bx,něco
1. Lea reg,místo Lea bx,[bp-09]
reg není Segmentový registr, vždy 16 bitů
Nemění příznaky.
LDS Obecný tvar: LDS reg, odkud
═══════════════════════════════════════════════════════════════════════════
Lds naplní ds a reg ukazatelem (dlouhý realmódový) z (odkud).
1. LDS reg, místo v paměti Lds si,dword ptr es:[bx]
reg je 16 bitů
Nemění příznaky.
LDS použitá v PROTECTED MÓDu pracuje analogicky, jen DS naplní Selektore m
ze zadané adresy. Viz Adresace .
LES Obecný tvar: LES reg, odkud
═══════════════════════════════════════════════════════════════════════════
Les naplní es a reg ukazatelem (dlouhý realmódový) z (odkud).
1. LES reg, místo v paměti Les si,dword ptr es:[bx]
reg je 16 bitů
Nemění příznaky.
LES použitá v PROTECTED MÓDu pracuje analogicky, jen ES naplní Selektore m
ze zadané adresy. Viz Adresace .
XCHG Obecný tvar: XCHG co1, co2
═══════════════════════════════════════════════════════════════════════════
Xchg vymění (co1) a (co2)
1. Xchg reg, místo v paměti Xchg ax,word ptr ds:[bx]
Xchg místo v paměti, reg Xchg word ptr ds:[bx],ax
2. Xchg reg1,reg2 Xchg ax,cx
reg1 a reg2 nejsou segmentové registry
Nemění příznaky.
LAHF Obecný tvar: LAHF
═══════════════════════════════════════════════════════════════════════════
Lahf naplní ah příznaky : SF,ZF,0,AF,0,PF,0,CF.
1. Lahf Lahf
Nemění příznaky.
SAHF Obecný tvar: SAHF
═══════════════════════════════════════════════════════════════════════════
Sahf naplní příznaky SF,ZF,0,AF,0,PF,0,CF hodnotou uloženou v ah.
Formát ah - viz LAHF.
1. Sahf Sahf
Mění příznaky SF,ZF,CF,AF a PF.
PUSH Obecný tvar: PUSH co
═══════════════════════════════════════════════════════════════════════════
Uloží (co) na zásobník. (Co) je 16 bitů. Sníží SP o 2.
1. Push reg Push ax
2. Push segreg Push cs
3. Push místo v paměti Push word ptr ds:[bx+di]
4. Push hodnota Push 0A000h
Nemění příznaky.
PUSHF Obecný tvar: PUSHF
═══════════════════════════════════════════════════════════════════════════
Uloží obsah FLAGS na zásobník. Sníží SP o 2.
1.Pushf Pushf
Nemění příznaky.
POPF Obecný tvar: POPF
═══════════════════════════════════════════════════════════════════════════
Obnoví FLAGS ze zásobníku. Zvýší SP o 2.
1.Popf Popf
Mění všechny příznaky.
POP Obecný tvar: POP co
═══════════════════════════════════════════════════════════════════════════
Obnoví co ze zásobníku. Zvýší SP o 2.
1. Pop reg Pop ax
2. Pop segreg Pop ds
segreg není CS
3. Pop místo v paměti Pop word ptr ss:[bp+58]
Nemění příznaky.
PUSHA Obecný tvar: PUSHA
═══════════════════════════════════════════════════════════════════════════
Uloží na zásobník obsah všech obecných registrů. Situace - viz obr.
< ──────┐
AX │
CX │
DX │
BX │
SP ────┘
BP
SI
DI
SS:SP ---> po provedení Pusha
POPA Obecný tvar: POPA
═══════════════════════════════════════════════════════════════════════════
Obnoví ze zásobníku obecné registry podle záznamu PUSHA.
XLAT Obecný tvar: XLAT
═══════════════════════════════════════════════════════════════════════════
Do al uloží byte z paměti určený ds:[BX+AL]. Hodí se pro výběr z tabulky.
1. XLAT XLAT
Nemění příznaky.
IN Obecný tvar: IN kam,odkud
═══════════════════════════════════════════════════════════════════════════
Přečte port určený (odkud) a výsledek uloží do (kam). Pracuje s 8 a 16 bity.
Kam je buď al nebo ax, odkud je buď číslo < 0FF nebo DX.
1. In reg, hodnota In ax,21
2. In reg, dx In ax,dx
Nemění příznaky.
IN použitá v PROTECTED MÓDu procesem s CPL > IOPL vyvolá INT 0D .
OUT Obecný tvar: OUT kam,co
═══════════════════════════════════════════════════════════════════════════
Na port (kam) zapíše (co). (Co) může být buď al nebo ax, (kam) je buď číslo
0FF nebo dx.
1. Out hodnota,reg Out 20,al
2. Out dx,reg Out dx,al
Nemění příznaky.
OUT použitá v PROTECTED MÓDu procesem s CPL > IOPL vyvolá INT 0D .
ENTER Obecný tvar: ENTER h1,h2
═══════════════════════════════════════════════════════════════════════════
Používá se na začátku procedury. Provede následující:
stack:
SS:SP dříve --->
bp minulé procedury
bp předminulé procedury (h1>0)
bp přepředminulé procedury (h1>1)
.....
lokal 1 ┐
├─ lokální proměnné
lokal h2 ┘
SS:SP nyní ---->
LEAVE Obecný tvar: LEAVE
═══════════════════════════════════════════════════════════════════════════
Odstraní efekt ENTER. Použijee se před RET procedury. Uvolní lokální
proměnné, obnoví bp a nastaví stack zpět.
Instrukce 80286 Instrukce procesoru Registry procesoru
Aritmetické instrukce 80286
ADD Obecný tvar: ADD kam,co
═══════════════════════════════════════════════════════════════════════════
Add přičte k (kam) (co) a výsledek uloží do (kam). Případné přetečení se
objeví v CF.
1. Add reg, reg Add cx,dx
2. Add reg, místo v paměti Add ax, word ptr ds:[si]
3. Add místo v paměti, reg Add byte ptr cs:[bx],ch
4. Add reg, hodnota Add ax,90
5. Add místo v paměti, hodnota Add byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
ADC Obecný tvar: ADC kam,co
═══════════════════════════════════════════════════════════════════════════
Adc přičte k (kam) (co) a CF. Výsledek uloží do (kam). Případné přetečení se
objeví v CF.
1. Adc reg, reg Adc cx,dx
2. Adc reg, místo v paměti Adc ax, word ptr ds:[si]
3. Adc místo v paměti, reg Adc byte ptr cs:[bx],ch
4. Adc reg, hodnota Adc ax,90
5. Adc místo v paměti, hodnota Adc byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
SUB Obecný tvar: SUB kam,co
═══════════════════════════════════════════════════════════════════════════
Sub odečte od (kam) (co) a výsledek uloží do (kam).Případné podtečení se
objeví v CF.
1. Sub reg, reg Sub cx,dx
2. Sub reg, místo v paměti Sub ax, word ptr ds:[si]
3. Sub místo v paměti, reg Sub byte ptr cs:[bx],ch
4. Sub reg, hodnota Sub ax,90
5. Sub místo v paměti, hodnota Sub byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
SBB Obecný tvar: SBB kam,co
═══════════════════════════════════════════════════════════════════════════
Sbb odečte od (kam) (co) a CF. Výsledek uloží do (kam). Případné podtečení se
objeví v CF.
1. Sbb reg, reg Sbb cx,dx
2. Sbb reg, místo v paměti Sbb ax, word ptr ds:[si]
3. Sbb místo v paměti, reg Sbb byte ptr cs:[bx],ch
4. Sbb reg, hodnota Sbb ax,90
5. Sbb místo v paměti, hodnota Sbb byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
INC Obecný tvar: INC co
═══════════════════════════════════════════════════════════════════════════
(Co) zvětší o 1. Případné přetečení se objeví v CF.
1. Inc reg Inc ax
2. Inc místo v paměti Inc byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
DEC Obecný tvar: DEC co
═══════════════════════════════════════════════════════════════════════════
(Co) zmenší o 1. Případné podtečení se objeví v CF.
1. Dec reg Dec ax
2. Dec místo v paměti Dec byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
AAA Obecný tvar: AAA
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po sečtení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aaa Aaa
Mění příznaky CF a AF.
DAA Obecný tvar: DAA
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po sečtení dvou BCD čísel tak, aby výsledek byl opět
BCD. Týká se al.
1. Daa Daa
Mění příznaky CF a AF.
CMP Obecný tvar: SUB co1,co2
═══════════════════════════════════════════════════════════════════════════
Cmp odečte od (co1) (co2). Výsledek nikam neukláda. Nastaví podle něj jen
příznaky.
1. Cmp reg, reg Cmp cx,dx
2. Cmp reg, místo v paměti Cmp ax, word ptr ds:[si]
3. Cmp místo v paměti, reg Cmp byte ptr cs:[bx],ch
4. Cmp reg, hodnota Cmp ax,90
5. Cmp místo v paměti, hodnota Cmp byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
NEG Obecný tvar: NEG co
═══════════════════════════════════════════════════════════════════════════
Do (co) uloží dvojkový doplňek (co). V podstatě násobí -1.
1. Neg reg Neg ax
2. Neg místo v paměti Neg byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
AAS Obecný tvar: AAS
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po odečtení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aas Aas
Mění příznaky CF a AF.
DAS Obecný tvar: DAS
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po odečtení dvou BCD čísel tak, aby výsledek byl opět
BCD.Týká se al.
1. Das Das
Mění příznaky CF a AF.
MUL Obecný tvar: MUL čím
═══════════════════════════════════════════════════════════════════════════
Provede vynásobení AL nebo AX (čím). Je-li (čím) byte, pak se násobí AL (čím)
a výsledek se objeví v AX. Je-li (čím) WORD, pak se násobí AX (čím) a výsledek
se uloží do DX:AX. Předpokládá kladná čísla bez znaménka.
1. Mul reg Mul bl
2. Mul místo v paměti Mul word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
IMUL Obecný tvar: IMUL čím
═══════════════════════════════════════════════════════════════════════════
Provede vynásobení AL nebo AX (čím). Je-li (čím) byte, pak se násobí AL (čím)
a výsledek se objeví v AX. Je-li (čím) WORD, pak se násobí AX (čím) a výsledek
se uloží do DX:AX. Předpokládá, že čísla jsou se znaménkem.
1. Imul reg Imul bl
2. Imul místo v paměti Imul word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
DIV Obecný tvar: DIV čím
═══════════════════════════════════════════════════════════════════════════
Vydělí AX nebo DX:AX (čím). Je-li (čím) word, pak dělí DX:AX, podíl uloží
do AX a zbytek do DX. Je-li (čím) byet, pak vydělí AX (čím), podíl do AL a
zbytek do AH. Předpokládá kladná čísla bez znaménka.
1. Div reg Div bl
2. Div místo v paměti Div word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
Dojde-li k přetečení, vyvolá INT 00 .
IDIV Obecný tvar: IDIV čím
═══════════════════════════════════════════════════════════════════════════
Vydělí AX nebo DX:AX (čím). Je-li (čím) word, pak dělí DX:AX, podíl uloží
do AX a zbytek do DX. Je-li (čím) byet, pak vydělí AX (čím), podíl do AL a
zbytek do AH. Předpokládá čísla se znaménkem.
1. Idiv reg Idiv bl
2. Idiv místo v paměti Idiv word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
Dojde-li k přetečení, vyvolá INT 00 .
AAM Obecný tvar: AAM
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po násobení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aam Aam
Mění příznaky CF a AF.
AAD Obecný tvar: AAD
═══════════════════════════════════════════════════════════════════════════
Provádí korekci před dělením dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aad Aad
Mění příznaky CF a AF.
CBW Obecný tvar: CBW
═══════════════════════════════════════════════════════════════════════════
Provádí znaménkové rozšíření AL do AX.
1. Cbw Cbw
Nemění příznaky.
CWD Obecný tvar: CWD
═══════════════════════════════════════════════════════════════════════════
Provádí znaménkové rozšíření AX do DX:AX.
1. CWD CWD
Nemění příznaky.
BOUND Obecný tvar: BOUND co, mezi
═══════════════════════════════════════════════════════════════════════════
Zadané (co) je porovnáno s mezemi a v případě, že se tam nevejde, pak se
vyvolá INT 05 .
1. BOUND reg, dword BOUND ax,dword ptr ds:[bx]
Instrukce 80286 Instrukce procesoru Registry procesoru
Logické instrukce 80286
XOR Obecný tvar: XOR kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické eXclusive or (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace XOR :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 0 │
└──────────┴──────────┴────────────┘
1. Xor reg,reg Xor ax,ax
2. Xor reg, místo v paměti Xor ax,word ptr ds:[di]
3. Xor místo v paměti, reg Xor word ptr ds:[di],reg
4. Xor reg,hodnota Xor dx,0505
5. Xor místo v paměti, hodnota Xor byte ptr es:[bp],15
Poznámka : k nulování registru je nejrychlejší použít Xor reg,reg.
Např.: Xor dx,dx ; nuluje dx
AND Obecný tvar: AND kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické And (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace AND :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 0 │
│ 1 │ 0 │ 0 │
│ 1 │ 1 │ 1 │
└──────────┴──────────┴────────────┘
1. And reg,reg And ax,ax
2. And reg, místo v paměti And ax,word ptr ds:[di]
3. And místo v paměti, reg And word ptr ds:[di],reg
4. And reg,hodnota And dx,0505
5. And místo v paměti, hodnota And byte ptr es:[bp],15
OR Obecný tvar: OR kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické Or (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace OR :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 1 │
└──────────┴──────────┴────────────┘
1. Or reg,reg Or ax,ax
2. Or reg, místo v paměti Or ax,word ptr ds:[di]
3. Or místo v paměti, reg Or word ptr ds:[di],reg
4. Or reg,hodnota Or dx,0505
5. Or místo v paměti, hodnota Or byte ptr es:[bp],15
NOT Obecný tvar: NOT co
═══════════════════════════════════════════════════════════════════════════
Provede logické Not (co), výsledek uloží do (co).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace NOT :
┌──────────┬────────────┐
│ 1. Bit │ Výsledek │
╞══════════╪════════════╡
│ 1 │ 0 │
│ 0 │ 1 │
└──────────┴────────────┘
1. Not reg Not ax
2. Not místo v paměti Not word ptr ds:[di]
TEST Obecný tvar: TEST kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické And (kam) a (co).Výsledek nikam neukládá, nastaví podle něj.
příznaky : CF=0, OF=0, PF, ZF, SF, AF.
1. Test reg,reg Test ax,ax
2. Test reg, místo v paměti Test ax,word ptr ds:[di]
3. Test místo v paměti, reg Test word ptr ds:[di],reg
4. Test reg,hodnota Test dx,0505
5. Test místo v paměti, hodnota Test byte ptr es:[bp],15
Instrukce 80286 Instrukce procesoru Registry procesoru
Instrukce pro práci s řetězci dat 80286
LODS Obecný tvar: LODS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. LODSB Do AL BYTE z adresy ds:[si], SI zvětší o 1 ( DF=0 )
SI zmenší o 1 ( DF=1 )
2. LODSW Do AX WORD z adresy ds:[si], SI zvětší o 2 ( DF=0 )
SI zmenší o 2 ( DF=1 )
Segmentový registr lze prefixem změnit na CS, ES nebo SS.
Nemění příznaky.
STOS Obecný tvar: STOS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. STOSB AL uloží na adresu es:[di], DI zvětší o 1 ( DF=0 )
DI zmenší o 1 ( DF=1 )
2. STOSW AX uloží na adresu es:[di], DI zvětší o 2 ( DF=0 )
DI zmenší o 2 ( DF=1 )
Segment es NELZE změnit.
Nemění příznaky.
MOVS Obecný tvar: MOVS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. MOVSB Provede LODSB + STOSB
2. MOVSW Provede LODSW + STOSW
Instrukce se používají k přenosu většího množství dat.
Nemění příznaky.
INS Obecný tvar: INS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. INSB Z portu zadaného v dx přečte al a uloží ho na es:[di]
Je-li DF = 0, zvýší DI o 1
Je-li DF = 1, sníží DI o 1
2. INSW Z portu zadaného v dx přečte ax a uloží ho na es:[di]
Je-li DF = 0, zvýší DI o 2
Je-li DF = 1, sníží DI o 2
Instrukce se používají k obsluze DAC registrů VGA a k přímému čtení disku
přes porty.
Nemění příznaky.
INS použitá v PROTECTED MÓDu procesem s CPL > IOPL vyvolá INT 0D .
OUTS Obecný tvar: OUTS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. OUTSB Na port zadaný v dx přečte uloží BYTE z ds:[si]
Je-li DF = 0, zvýší SI o 1
Je-li DF = 1, sníží SI o 1
2. OUTSW Na port zadaný v dx přečte uloží WORD z ds:[si]
Je-li DF = 0, zvýší SI o 2
Je-li DF = 1, sníží SI o 2
Instrukce se používají k obsluze DAC registrů VGA a k přímému zápisu na disk
přes porty.
Nemění příznaky.
OUTS použitá v PROTECTED MÓDu procesem s CPL > IOPL vyvolá INT 0D .
SCAS Obecný tvar: SCAS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. SCASB Porovná AL s BYTEm z adresy es:[di], DI zvětší o 1 ( DF=0 )
DI zmenší o 1 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
2. SCASW Porovná AX s WORDem z adresy es:[di], DI zvětší o 2 ( DF=0 )
DI zmenší o 2 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
CMPS Obecný tvar: CMPS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. CMPSB BYTE z ds:[si] s BYTE z es:[di], SI a DI zvětší o 1 ( DF=0 )
SI a DI zmenší o 1 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
2. CMPSW WORD z ds:[si] s WORD z es:[di], SI a DI zvětší o 2 ( DF=0 )
SI a DI zmenší o 2 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
REP Obecný tvar: REP
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím STOS a MOVS (i k LODS,
ale tam to je jen zdržování ..). Zaručuje, že se následující instrukce
provede cx - krát. Na konci je tedy cx 0.
Následující kód vyčistí celý data segment :
Xor di,di
Xor ax,ax
Push ds
Pop es
Mov cx,8000h
Cld
Rep Stosw
REPZ Obecný tvar: REPZ
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím SCAS a CMPS . Zaručuje,
že se následující instrukce provede cx - krát, pokud zároveň bude ZF=1.
Při používání s CMPS pozor ! Nulové CX po skončení práce nezaručuje shodu.
Kontrola se provádí :
....... es,di,ds,si,cx inicializováno ....
Cld
REPZ CMPSB
Jz @srovnání_ok
Jnz @srovnáná_neok
REPNZ Obecný tvar: REPNZ
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím SCAS a CMPS . Zaručuje,
že se následující instrukce provede cx - krát, pokud zároveň bude ZF=0.
! POZOR !
Při práce s instrukcemi pro řetězce dat VŽDY nastavujte správně DF.
Cld nebo Std by mělo být před každou takovou instrukcí.
Instrukce 80286 Instrukce procesoru Registry procesoru
Instrukce řídící 80286
Prefixy změny segmentu Obecný tvar: CS:, ES:, SS:
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k ostatním instrukcím. Zaručuje,
že se následující instrukce provede v jiném, než implicitním segmentu.
Assembler je doplňuje automaticky.
Obsazení implicitních segmentů :
┌───────────────────┬───────────┬───────────┬─────────────────────┐
│ Odkaz │ Impl. seg │ Alt. seg │ Offset │
╞═══════════════════╪═══════════╪═══════════╪═════════════════════╡
│Výběr instrukce pgm│ CS │ nelze │ IP │
│Práce se zásobníkem│ SS │ nelze │ SP │
│Zdrojový řetězec │ DS │ CS,ES,SS │ SI │
│Cílový řetězec │ ES │ nelze │ DI │
│Data obecně │ DS │ CS,DS,ES │BX,BP,SI,DI,kombinace│
│BP použit jako báze│ SS │ CS,DS,ES │BX,BP,SI,DI,kombinace│
└───────────────────┴───────────┴───────────┴─────────────────────┘
CLC Obecný tvar: CLC
═══════════════════════════════════════════════════════════════════════════
Nastaví CF na 0.
STC Obecný tvar: STC
═══════════════════════════════════════════════════════════════════════════
Nastaví CF na 1.
CMC Obecný tvar: CMC
═══════════════════════════════════════════════════════════════════════════
Přehodí hodnotu CF.
CLD Obecný tvar: CLD
═══════════════════════════════════════════════════════════════════════════
Nastaví DF na 0. Řetězce se zpracovávají odpředu.
STD Obecný tvar: STD
═══════════════════════════════════════════════════════════════════════════
Nastaví DF na 1. Řetězce se zpracovávají odzadu.
CLI Obecný tvar: CLI
═══════════════════════════════════════════════════════════════════════════
Nastaví IF na 0. Asynchronní přerušení jsou zakázána.
CLI použitá v PROTECTED MÓDu procesem s CPL > 0 vyvolá INT 0D .
STI Obecný tvar: STI
═══════════════════════════════════════════════════════════════════════════
Nastaví IF na 1. Asynchronní přerušení jsou povolena.
STI použitá v PROTECTED MÓDu procesem s CPL > 0 vyvolá INT 0D .
HLT Obecný tvar: HLT
═══════════════════════════════════════════════════════════════════════════
Zastaví činnost procesoru. Tento stav zruší NMI INT 02 nebo RESET.
HLT použitá v PROTECTED MÓDu procesem s CPL > 0 vyvolá INT 0D .
WAIT Obecný tvar: WAIT
═══════════════════════════════════════════════════════════════════════════
Zastaví činnost procesoru. Tento stav zruší NMI INT 02 , RESET nebo aktivní
signál TEST. Používá se pro komunikaci s koprocesorem.
ESC Obecný tvar: ESC
═══════════════════════════════════════════════════════════════════════════
Předává instrukci koprocesoru. Viz INT 06 , INT 07 a Koprocesory .
LOCK Obecný tvar: LOCK
═══════════════════════════════════════════════════════════════════════════
Po dobu následující instrukce se blokuje stav sběrnice. Používá se pro
sdílení jedné sběrnice více CPU.
NOP Obecný tvar: NOP
═══════════════════════════════════════════════════════════════════════════
Chvíli nedělej nic. Jak krásná a jednoduchá instrukce. Používá se
k zarovnávání kódu na 286, 386 a 486, aby CPU běžel rychleji.
Instrukce 80286 Instrukce procesoru Registry procesoru
Instrukce posunů a rotací 80286
SAL Obecný tvar: SAL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Přitom dbá, aby nejvyšší bit zůstal zachován.
Nezničí tedy znaménko.
(kolik) je buď číslo, nebo CL.
1. Sal reg,kolik Sal ax,4
2. Sal Místo v paměti,kolik Sal word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SAR Obecný tvar: SAR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Přitom dbá, aby nejvyšší bit zůstal
zachován.Nezničí tedy znaménko.
(kolik) je buď číslo, nebo CL.
1. Sar reg,kolik Sar ax,4
2. Sar Místo v paměti,kolik Sar word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SHL Obecný tvar: SHL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Zničí znaménko.
(kolik) je buď číslo, nebo CL.
1. Shl reg,kolik Shl ax,4
2. Shl Místo v paměti,kolik Shl word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SHR Obecný tvar: SHR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Zničí znaménko.
(kolik) je buď číslo, nebo CL.
1. Shr reg,kolik Shr ax,7
2. Shr Místo v paměti,kolik Shr word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
ROL Obecný tvar: ROL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Vypadávající bit vždy dá na místo bitu 0.
(kolik) je buď číslo, nebo CL.
1. Rol reg,kolik Rol ax,5
2. Rol Místo v paměti,kolik Rol word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
ROR Obecný tvar: ROR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Vypadávající bit vždy dá na místo nevvyššího
bitu .
(kolik) je buď číslo, nebo CL.
1. Ror reg,kolik Ror ax,2
2. Ror Místo v paměti,kolik Ror word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
RCL Obecný tvar: RCL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Vypadávající bit vždy dá do CF.
Původní CF dá na místo bitu 0.
(kolik) je buď číslo, nebo CL.
1. Rcl reg,kolik Rcl ax,1
2. Rcl Místo v paměti,kolik Rcl word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
RCR Obecný tvar: RCR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Vypadávající bit vždy dá do CF. Původní
CF umístí na místo nejvyššího bitu.
bitu .
(kolik) je buď číslo, nebo CL.
1. Rcr reg,kolik Rcr ax,6
2. Rcr Místo v paměti,kolik Rcr word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
Instrukce 80286 Instrukce procesoru Registry procesoru
Instrukce skoků a volání 80286
Podmíněné skoky shrnuje následující tabulka:
┌───────────────────┬────────────────┬─────────────────────────────────┐
│ Instrukce │ Podmínka │ Význam │
╞═══════════════════╪════════════════╪═════════════════════════════════╡
│ Ja / Jnbe │ CF=0▲ZF=0 │ Je nad - ostře větší │
│ Jae / Jnb / Jnc │ CF=0 │Je nad nebo rovno - neostře větší│
│ Jb / Jc / Jnae │ CF=1 │ Je pod - ostře menší │
│ Jbe / Jna │ CF=1▼ZF=1 │Je pod nebo rovno - neostře menší│
│ Je / Jz │ ZF=1 │ Je rovno │
│ Jg / Jnle │(SF<>OF)+ZF = 0 │ Je větší - znaménko se uvažuje │
│ Jge / Jnl │ SF=OF │ Je větší nebo rovno (znaménkově)│
│ Jl / Jnge │ SF<>OF │ Je mensí - znaménko se uvažuje │
│ Jle / Jng │(SF<>OF)+ZF > 0 │ Je menší nebo rovno (znaménkově)│
│ Jne / Jnz │ ZF=0 │ Není rovno │
│ Jno │ OF=0 │ Není přetečení │
│ Jnp / Jpo │ PF=0 │ Není parita - lichá parita │
│ Jns │ SF=0 │ Není záporné - 0 nebo kladné │
│ Jo │ OF=1 │ Je přetečení │
│ Jp / Jpe │ PF=1 │ Je parita - sudá parita │
│ Js │ SF=1 │ Je záporné - není kladné │
│ Jcxz │ CX=0 │ CX je nulové │
└───────────────────┴────────────────┴─────────────────────────────────┘
▼ znamená logické OR
▲ znamená logické AND
Dost značná část podmínek je zbytečná, nejlepší je používat podmíněné skoky,
které mají v názvu jméno příznaku ( Jz místo Je ... ).
LOOP Obecný tvar: LOOP kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží CX o 1 a je-li CX > 0 předá řízení na místo (kam).
Používá se u cyklů s pevným počtem opakování.
LOOPZ Obecný tvar: LOOPZ kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží CX o 1 . Je-li (CX > 0) a (ZF=1) předá řízení na místo (kam).
Používá se u cyklů s proměnným počtem opakování.
LOOPNZ Obecný tvar: LOOPNZ kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží CX o 1 . Je-li (CX > 0) a (ZF=0) předá řízení na místo (kam).
Používá se u cyklů s proměnným počtem opakování.
JMP Obecný tvar: JMP adresa
═══════════════════════════════════════════════════════════════════════════
Instrukce předá řízení na místo určené jako (adresa). Existuje 5 kategorií
skoků :
1. Krátký skok beze změny CS. Cílová adresa leží v rozsahu < -128 ; 127 >
byte od instrukce skoku. JMP short adresa
2. Skok beze změny CS. Cílová adresa leží ve stejném segmentu jako instrukce
skoku. JMP adresa
3. Skok vzdálený (se změnou cs). Změní se jak CS tak IP. V TASMu neexistuje
odpovídající instrukce. Provádím následovně :
db 0EAh
dw offset,segment
4. Krátký nepřímý skok : Jmp word ptr ds:[si]
IP se načte s udané adresy.
5. Vzdálený nepřímý skok : Jmp dword ptr es:[bx]
IP a CS se načtou s udané adresy. POZOR ! IP je první.
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. JMP je používaný pro všechno možné. Viz Nové registry 286 ,
Deskriptor a Instrukce ochrany paměti 80286
CALL Obecný tvar: CALL adresa
═══════════════════════════════════════════════════════════════════════════
Zavolá procedure na místě určeném adresou. Do zásobníku uloží AKTUÁLNÍ IP
( CS ) , tedy adresu ukazující na následující instrukci.
Existují 4 typy CALL :
1.Krátké přímé volání. Provede se uložení IP na zásobník a do IP se uloží
(adresa). Call podproc
2.Krátké nepřímé volání. Provede se uložení IP na zásobník a do IP se uloží
WORD na specifikované adrese. Call word ptr es:[bx + tabulka]
3.Vzdálené přímé volání. Uloží se IP a pak CS se uloží na zásobník , IP a CS
se načte ze zadaných hodnot. Call far Newseg:NewOfs
4.Vzdálené nepřímé volání. Uloží se IP a pak CS se uloží na zásobník , IP a
CS se načte ze zadané adresy. Call dword ptr es:[oldproc]
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. CALL je používaný pro všechno možné. Viz Nové registry 286 ,
Deskriptor a Instrukce ochrany paměti 80286
RET Obecný tvar: RET [n]
═══════════════════════════════════════════════════════════════════════════
Instrukce obnoví IP ( CS ) ze zásobníku. Hodnotu CS a IP uložené na zásobníku
odstraní.
1. RET , RETN - návrat z procedury volané CALL near. Obnoví pouze IP.
2. RETF - návrat z procedure volané jako FAR. Obnoví IP i CS.
Nepovinný parametr n udává počet byte, které má RET nebo RETF ještě odstranit
ze zásobníku. Použije se pro odstranění parametrů předaných proceduře na
stacku. Viz obr.
před RETF 004 Po RETF 004
<---- SS:SP
Parametr 1 CS a IP obnoveno
Parametr 2
Parametr 3
Parametr 4
IP
CS
SS:SP->
před RET 004 Po RET 004
<---- SS:SP
Parametr 1 IP obnoveno
Parametr 2
Parametr 3
Parametr 4
IP
SS:SP->
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. RET je používaný pro všechno možné. Viz Nové registry 286 ,
Deskriptor a Instrukce ochrany paměti 80286
INT Obecný tvar: INT n
═══════════════════════════════════════════════════════════════════════════
Instrukce INT vyvolá přerušení číslo n. Instrukce uloží na zásobník
příznaky (FLAGS), CS a IP (v tomto pořadí). Pak z tabulky umístěné v segmentu
0000 z offsetu 4*n přečte IP a CS příslušného přerušení.
Instrukce INT n je 2 byte dlouhá , ale INT 3 pouze 1 byte. Používá se
jako breakpoint. Viz INT 03 .
INTO je další mutace INT. Provede INT 4, je-li nastaven OF.
Viz INT 04
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. INT je používaný pro všechno možné. Viz Nové registry 286 ,
Zpracování přerušení a Instrukce ochrany paměti 80286
IRET Obecný tvar: IRET
═══════════════════════════════════════════════════════════════════════════
Ukončí přerušení vyvolané INT. Odstraní ze zásobníku uložené IP, CS a FLAGS,
a obnoví je. Provede se Popf, Pop IP a Pop CS. ( v tomto pořadí );
Situace před IRET Po IRET
<-- SS:SP CS, IP, FLAGS obnoveny.
FLAGS
CS
IP
SS:SP ->
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. IRET je používaný pro všechno možné.
Viz Instrukce ochrany paměti 80286 a Nové registry 286 .
Instrukce 80286 Instrukce procesoru Registry procesoru
Instrukce ochrany paměti 80286
S procesorem 80286 přichází ochrana paměti a I/O zařízení, aby se zabránilo
"hloupým a nedokonalým programátorům" při jejicj pokusech shodit systém. To
se však v praxi nepovedlo, protože ti, co dělali menší chyby, se naučili dělat
chyby takové, aby to nevydržela ani ochrana. Navíc na 286-kách se stejně
nikdy v PROTECTED MÓDu neprogramovalo (čest výjimkám).
Důležité je přidání MSW do registrů procesoru - viz Nové registry 286 .
Instrukce ohrany slouží k práci v PROTECTED MÓDu a k přepnutí do něj.
Svévolné užití může vyvolat chybu INT 06 nebo INT 0D . Instrukce povolené
i v REAL MÓDu jsou označeny hvězdičkou.
*LGDT Obecný tvar: LGDT adresa
═══════════════════════════════════════════════════════════════════════════
Naplní obsah GDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Adresace , Nové registry 286 a Privilegované instrukce
*SGDT Obecný tvar: SGDT adresa
═══════════════════════════════════════════════════════════════════════════
Uloží obsah GDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Adresace , Nové registry 286 a Privilegované instrukce
LLDT Obecný tvar: LLDT položka GDT
═══════════════════════════════════════════════════════════════════════════
Naplní obsah LDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Adresace , Nové registry 286 a Privilegované instrukce
SLDT Obecný tvar: SLDT položka GDT
═══════════════════════════════════════════════════════════════════════════
Uloží obsah LDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Adresace , Nové registry 286 a Privilegované instrukce
*LIDT Obecný tvar: LIDT adresa
═══════════════════════════════════════════════════════════════════════════
Naplní obsah IDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Nové registry 286 , Privilegované instrukce a
Zpracování přerušení .
*SIDT Obecný tvar: SIDT adresa
═══════════════════════════════════════════════════════════════════════════
Uloží obsah IDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Nové registry 286 , Privilegované instrukce a
Zpracování přerušení .
LTR Obecný tvar: LTR položka GDT
═══════════════════════════════════════════════════════════════════════════
Naplní obsah TR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Nové registry 286 , Privilegované instrukce a
TSS .
STR Obecný tvar: STR položka GDT
═══════════════════════════════════════════════════════════════════════════
Uloží obsah TR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Nové registry 286 , Privilegované instrukce a
TSS .
LAR Obecný tvar: LAR reg,sel
═══════════════════════════════════════════════════════════════════════════
Naplní reg (16 bitů) přístupovými právy Deskriptoru urcčeného Selektore m
sel. Deskriptorů je značné množství, podrobně jsou popsány na jiném místě.
Zde je uveden nejčastěji se vyskytující selektor - datový. (Některé bity jsou
shodné i pro kódový segment.)
Reg :
15 8 7 0
┌────────────────────────┬──────────────────────────┐
│ P DPL S C E W A │ 0 0 0 0 0 0 0 0 │
└────────────────────────┴──────────────────────────┘
│ │ │ │ │ │ └────── Accesed - v segmentu došlo k R nebo W
│ │ │ │ │ └───────── Writeable - lze zapisovat
│ │ │ │ └──────────── Expand down - rozšíření dolů
│ │ │ └─────────────── Code - 1 kódový segment
│ │ └────────────────── 0=paměťový 1=systémový Deskriptor
│ └────────────────────── CPL , od níž lze použít INT 0D
└────────────────────────── 1=Present 0=Not present INT 0B
Úspěšný pokus nastaví ZF na 1
LSL Obecný tvar: LSL reg,sel
═══════════════════════════════════════════════════════════════════════════
Naplní reg limitem Deskriptoru odpovídajícím sel. Úspěšný pokus nastaví
ZF=1.
VERR Obecný tvar: VERR sel
═══════════════════════════════════════════════════════════════════════════
Testuje Deskriptor určený sel, zda je způsobilý ke čtení.
Je-li OK, nastaví ZF na 1
VERW Obecný tvar: VERW sel
═══════════════════════════════════════════════════════════════════════════
Testuje Deskriptor určený sel, zda je způsobilý k zápisu.
Je-li OK, nastaví ZF na 1
ARPL Obecný tvar: ARPL sel1,sel2
═══════════════════════════════════════════════════════════════════════════
Nastaví RPL sel1 pokud CPL < DPL sel1. Viz Systém ochrany .
Je-li vše OK, nastaví ZF na 1.
CTS Obecný tvar: CTS
═══════════════════════════════════════════════════════════════════════════
Shodí příznak TS v MSW. Používá se při multitaskingu. Viz TSS .
CTS je dostupný jen pro CPL =0.
*LMSW Obecný tvar: LMSW reg
═══════════════════════════════════════════════════════════════════════════
Naplní MSW obsahem reg. Je dostupná jen pro CPL =0.
*SMSW Obecný tvar: SMSW reg
═══════════════════════════════════════════════════════════════════════════
Naplní reg obsahem MSW.
INT Obecný tvar: INT N
═══════════════════════════════════════════════════════════════════════════
Provede přerušení N. Viz Zpracování přerušení . Je-li INT úspěšné,
( Systém ochrany ) pak při změně priotity navíc provede záměnu Stacku podle
aktivního TSS určeného TR. Na zásobníku pak rutina nalezne:
SS přerušeného procesu
SP přerušeného procesu
Flags
CS
IP
SS:SP-->
IRET Obecný tvar: IRET
═══════════════════════════════════════════════════════════════════════════
V PROTECTED MÓDu má IRET odlišnou funkci, než v REAL MÓDu .
Zjistí-li při procesor při IRET, že dojde ke změně CPL , navíc ještě obnoví
původní SS a SP.
Před IRET Po IRET
SS SS, SP, FLAGS, CS a IP obnoveno
SP
Flags
CS
IP
SS:SP-->
Je-li při zpracování IRET nastaven NT příznak ve FLAGS, dojde navíc
k přepnutí úloh podle zpětného ukazatele TSS .
CALL Obecný tvar: CALL adresa
═══════════════════════════════════════════════════════════════════════════
Call v Protected módu pracuje podobně jako v reálném módu. Navíc je při
všech manipulacích s CS kontrolováno, aby nedošlo ke změně CPL .
Podrobnosti - viz Systém ochrany .
Je-li CALL použit při volání před bránu ( Deskriptor ), a je-li změna
CPL bez problémů, dojde ke změně SS a SP. Na SS a SP nové (cílové) priority
CALL vytvoří následující záznam :
SS volajícího
SP volajícího
[ patrametr 1 ] ┐
[ patrametr 2 ] │
[ patrametr 3 ] ├─ jen, je-li CNT brány >0
...... │
[ patrametr N ] ┘
IP volajícího
CS volajícího
SS:SP --->
Bylo-li pole CNT použité brány nenulové, jsou před SS uloženy ještě předávané
parametry.
RETF Obecný tvar: RETF N
═══════════════════════════════════════════════════════════════════════════
RET v Protected módu pracuje podobně jako v reálném módu.
Při použití RETF je navíc kontrolováno, aby nedošlo k neoprávněné změně
CPL. Je-li CPL CS, jež má být vyzvednuto < CPL programu, který RET provádí,
provrde se INT 0D .
Program s CPL =0 si může dělat, co uzná za vhodné.
RETF z programu volaného bránou - ( Deskriptor ) MUSÍ vyzvednout všechny
předávané parametry správně, jinak dojde ke špatnému vrácení SS a vyvolá
se INT 0C .
Instrukce 80286 Instrukce procesoru Nové registry 286
Zpracování přerušení PROTECTED MÓD Adresace
Instrukce 80286
Procesor 80286 je nadmnožinou 8086, zná tedy všechny jeho instrukce.
Pracuje-li v REAL MÓDu , pak se chová stejně jako 8086. Navíc pracují
nové instrukce 80286.
Pro REAL MÓD viz :
Instrukce přesunu dat 80286
Aritmetické instrukce 80286
Logické instrukce 80286
Instrukce posunů a rotací 80286
Instrukce pro práci s řetězci dat 80286
Instrukce skoků a volání 80286
Instrukce řídící 80286
Pro PROTECTED MÓD viz :
Instrukce ochrany paměti 80286
Instrukce 8086 Instrukce 80386 Instrukce 80486
Přesun dat
MOV Obecný tvar: Mov kam, odkud
═══════════════════════════════════════════════════════════════════════════
Mov přesune byte, word nebo dword z místa (odkud) na místo (kam)
Na 80386 jsou povoleny tyto kombinace :
1. Mov registr, místo v paměti Mov ax,word ptr ds:[di]
2. Mov místo v paměti, registr Mov dword ptr ds:[di],eax
3. Mov Seg.Registr, registr Mov ds,ax
Seg.Registr jen DS, ES nebo SS. NE CS !!
4. Mov registr, Seg.registr Mov ax,cs
NBez omezemí
5. Mov registr,hodnota Mov bl,90h
registr není segmentový
6. Mov registr,registr Mov ax,cx
7. Mov místo v paměti, hodnota Mov word ptr es:[di],0
8. Mov xxx, CR? Mov eax,CR0
9. Mov CR?, xxx Mov CR0,ebx
10. Mov xxx, DR? Mov eax,DR0
11. Mov DR?, xxx Mov DR0,ebx
12. Mov xxx, TR? Mov eax,TR6
13. Mov TR?, xxx Mov TR7,ebx
Instrukce pod čísly 8 až 13 jsou Privilegované instrukce .
Nemění příznaky.
MOVZX Obecný tvar: Movzx kam, odkud
═══════════════════════════════════════════════════════════════════════════
Pracuje jako MOV, ale s různou délkou operandů. (Odkud) doplní 0 tak, aby
měl stejnou velikost jako (Kam).
EAX cokoliv, bx = 5005h
MOVZX Eax,bx ;
EAX 00005005h
MOVSX Obecný tvar: Movsx kam, odkud
═══════════════════════════════════════════════════════════════════════════
Pracuje jako MOV, ale s různou délkou operandů. (Odkud) doplní tak, aby
byl znaménkově rozšířen na velikost (Kam).
EAX cokoliv, bx = 8003h
MOVZX Eax,bx ;
EAX FFFF8003h
LEA Obecný tvar: LEA reg, co
═══════════════════════════════════════════════════════════════════════════
Lea přesune offset (co) do registru.
Já tím šetřím v TASMu 6 písmen :
místo Mov bx,offset něco napíšu Lea bx,něco
1. Lea reg,místo Lea bx,[bp-09]
reg není Segmentový registr, 16 bitů, nebo 32 bitů.
Viz Prostředí 16/32
Nemění příznaky.
LDS Obecný tvar: LDS reg, odkud
═══════════════════════════════════════════════════════════════════════════
Lds naplní ds a reg ukazatelem (dlouhý, realmódový) z (odkud).
1. LDS reg, místo v paměti Lds si,dword ptr es:[bx]
reg je 16 nebo 32 bitů. Viz Prostředí 16/32
Nemění příznaky.
LDS použitá v PROTECTED MÓDu pracuje analogicky, jen DS naplní Selektore m
ze zadané adresy. Viz Adresace .
LES Obecný tvar: LES reg, odkud
═══════════════════════════════════════════════════════════════════════════
Les naplní es a reg ukazatelem (dlouhý, realmódový) z (odkud).
1. LES reg, místo v paměti Les si,dword ptr es:[bx]
reg je 16 nebo 32 bitů Viz Prostředí 16/32
Nemění příznaky.
LES použitá v PROTECTED MÓDu pracuje analogicky, jen ES naplní Selektore m
ze zadané adresy. Viz Adresace .
LFS Obecný tvar: LFS reg, odkud
═══════════════════════════════════════════════════════════════════════════
Lfs naplní fs a reg ukazatelem (dlouhý, realmódový) z (odkud).
1. LFS reg, místo v paměti Lfs si,dword ptr es:[bx]
reg je 16 nebo 32 bitů Viz Prostředí 16/32
Nemění příznaky.
LFS použitá v PROTECTED MÓDu pracuje analogicky, jen FS naplní Selektore m
ze zadané adresy. Viz Adresace .
LGS Obecný tvar: LGS reg, odkud
═══════════════════════════════════════════════════════════════════════════
Lgs naplní gs a reg ukazatelem (dlouhý, realmódový) z (odkud).
1. LGS reg, místo v paměti Lgs si,dword ptr es:[bx]
reg je 16 nebo 32 bitů Viz Prostředí 16/32
Nemění příznaky.
LGS použitá v PROTECTED MÓDu pracuje analogicky, jen GS naplní Selektore m
ze zadané adresy. Viz Adresace .
LSS Obecný tvar: LSS reg, odkud
═══════════════════════════════════════════════════════════════════════════
Lss naplní ss a reg ukazatelem (dlouhý, realmódový) z (odkud).
1. LSS reg, místo v paměti Lss si,dword ptr es:[bx]
reg je 16 nebo 32 bitů Viz Prostředí 16/32
Nemění příznaky.
LSS použitá v PROTECTED MÓDu pracuje analogicky, jen SS naplní Selektore m
ze zadané adresy. Viz Adresace .
XCHG Obecný tvar: XCHG co1, co2
═══════════════════════════════════════════════════════════════════════════
Xchg vymění (co1) a (co2)
1. Xchg reg, místo v paměti Xchg ax,word ptr ds:[bx]
Xchg místo v paměti, reg Xchg dword ptr ds:[bx],eax
2. Xchg reg1,reg2 Xchg ax,cx
reg1 a reg2 nejsou segmentové registry
Nemění příznaky.
LAHF Obecný tvar: LAHF
═══════════════════════════════════════════════════════════════════════════
Lahf naplní ah příznaky : SF,ZF,0,AF,0,PF,0,CF.
1. Lahf Lahf
Nemění příznaky.
SAHF Obecný tvar: SAHF
═══════════════════════════════════════════════════════════════════════════
Sahf naplní příznaky SF,ZF,0,AF,0,PF,0,CF hodnotou uloženou v ah.
Formát ah - viz LAHF.
1. Sahf Sahf
Mění příznaky SF,ZF,CF,AF a PF.
PUSH Obecný tvar: PUSH co
═══════════════════════════════════════════════════════════════════════════
Uloží (co) na zásobník. (Co) je 16 bitů. Sníží SP o 2 nebo o 4 .
1. Push reg Push ax
2. Push segreg Push cs
3. Push místo v paměti Push word ptr ds:[bx+di]
4. Push hodnota Push 0A000h
Nemění příznaky.
PUSHF Obecný tvar: PUSHF
═══════════════════════════════════════════════════════════════════════════
Uloží obsah FLAGS na zásobník. Sníží SP o 2.
1.Pushf Pushf
Nemění příznaky.
PUSHFD Obecný tvar: PUSHFD
═══════════════════════════════════════════════════════════════════════════
Uloží obsah EFLAGS na zásobník. Sníží SP o 4.
1.Pushfd Pushfd
Nemění příznaky.
POPF Obecný tvar: POPF
═══════════════════════════════════════════════════════════════════════════
Obnoví FLAGS ze zásobníku. Zvýší SP o 2.
1.Popf Popf
Mění všechny příznaky.
POPFD Obecný tvar: POPFD
═══════════════════════════════════════════════════════════════════════════
Obnoví EFLAGS ze zásobníku. Zvýší SP o 4.
1.Popfd Popfd
Mění všechny příznaky.
POP Obecný tvar: POP co
═══════════════════════════════════════════════════════════════════════════
Obnoví co ze zásobníku. Zvýší SP o 2 nebo o 4.
1. Pop reg Pop ax
2. Pop segreg Pop ds
segreg není CS
3. Pop místo v paměti Pop word ptr ss:[bp+58]
Nemění příznaky.
PUSHA Obecný tvar: PUSHA
═══════════════════════════════════════════════════════════════════════════
Uloží na zásobník obsah všech obecných registrů. Situace - viz obr.
< ──────┐
AX │
CX │
DX │
BX │
SP ────┘
BP
SI
DI
SS:SP ---> po provedení Pusha
POPA Obecný tvar: POPA
═══════════════════════════════════════════════════════════════════════════
Obnoví ze zásobníku obecné registry podle záznamu PUSHA.
PUSHAD Obecný tvar: PUSHAD
═══════════════════════════════════════════════════════════════════════════
Uloží na zásobník obsah všech obecných registrů. Situace - viz obr.
< ──────┐
EAX │
ECX │
EDX │
EBX │
ESP ────┘
EBP
ESI
EDI
SS:ESP ---> po provedení Pusha
POPAD Obecný tvar: POPAD
═══════════════════════════════════════════════════════════════════════════
Obnoví ze zásobníku obecné registry podle záznamu PUSHAD.
XLAT Obecný tvar: XLAT
═══════════════════════════════════════════════════════════════════════════
Do al uloží byte z paměti určený ds:[EBX+AL]. Hodí se pro výběr z tabulky.
1. XLAT XLAT
Nemění příznaky.
IN Obecný tvar: IN kam,odkud
═══════════════════════════════════════════════════════════════════════════
Přečte port určený (odkud) a výsledek uloží do (kam). Pracuje s 8 , 16 a 32
bity. Kam je buď al, ax nebo eax , odkud je buď číslo < 0FF nebo DX.
1. In reg, hodnota In ax,21
2. In reg, dx In ax,dx
Nemění příznaky.
IN použitá v PROTECTED MÓDu procesem s CPL > IOPL vyvolá INT 0D .
OUT Obecný tvar: OUT kam,co
═══════════════════════════════════════════════════════════════════════════
Na port (kam) zapíše (co). (Co) může být buď al, ax nebo eax, (kam) je buď
číslo <0FF nebo dx.
1. Out hodnota,reg Out 20,al
2. Out dx,reg Out dx,al
Nemění příznaky.
OUT použitá v PROTECTED MÓDu procesem s CPL > IOPL vyvolá INT 0D .
ENTER Obecný tvar: ENTER h1,h2
═══════════════════════════════════════════════════════════════════════════
Používá se na začátku procedury. Provede následující:
stack:
SS:(E)SP dříve --->
(e)bp minulé procedury
(e)bp předminulé procedury (h1>0)
(e)bp přepředminulé procedury (h1>1)
.....
lokal 1 ┐
├─ lokální proměnné
lokal h2 ┘
SS:(E)SP nyní ---->
Viz prostředí 16/32
LEAVE Obecný tvar: LEAVE
═══════════════════════════════════════════════════════════════════════════
Odstraní efekt ENTER. Použijee se před RET procedury. Uvolní lokální
proměnné, obnoví (e)bp a nastaví stack zpět.
Viz prostředí 16/32
Instrukce 80386 Instrukce procesoru Registry procesoru
Aritmetické instrukce 80386
ADD Obecný tvar: ADD kam,co
═══════════════════════════════════════════════════════════════════════════
Add přičte k (kam) (co) a výsledek uloží do (kam). Případné přetečení se
objeví v CF.
1. Add reg, reg Add cx,dx
2. Add reg, místo v paměti Add ax, word ptr ds:[si]
3. Add místo v paměti, reg Add byte ptr cs:[bx],ch
4. Add reg, hodnota Add ax,90
5. Add místo v paměti, hodnota Add byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
ADC Obecný tvar: ADC kam,co
═══════════════════════════════════════════════════════════════════════════
Adc přičte k (kam) (co) a CF. Výsledek uloží do (kam). Případné přetečení se
objeví v CF.
1. Adc reg, reg Adc cx,dx
2. Adc reg, místo v paměti Adc ax, word ptr ds:[si]
3. Adc místo v paměti, reg Adc byte ptr cs:[bx],ch
4. Adc reg, hodnota Adc ax,90
5. Adc místo v paměti, hodnota Adc byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
SUB Obecný tvar: SUB kam,co
═══════════════════════════════════════════════════════════════════════════
Sub odečte od (kam) (co) a výsledek uloží do (kam).Případné podtečení se
objeví v CF.
1. Sub reg, reg Sub cx,dx
2. Sub reg, místo v paměti Sub ax, word ptr ds:[si]
3. Sub místo v paměti, reg Sub byte ptr cs:[bx],ch
4. Sub reg, hodnota Sub ax,90
5. Sub místo v paměti, hodnota Sub byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
SBB Obecný tvar: SBB kam,co
═══════════════════════════════════════════════════════════════════════════
Sbb odečte od (kam) (co) a CF. Výsledek uloží do (kam). Případné podtečení se
objeví v CF.
1. Sbb reg, reg Sbb cx,dx
2. Sbb reg, místo v paměti Sbb ax, word ptr ds:[si]
3. Sbb místo v paměti, reg Sbb byte ptr cs:[bx],ch
4. Sbb reg, hodnota Sbb ax,90
5. Sbb místo v paměti, hodnota Sbb byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
INC Obecný tvar: INC co
═══════════════════════════════════════════════════════════════════════════
(Co) zvětší o 1. Případné přetečení se objeví v CF.
1. Inc reg Inc ax
2. Inc místo v paměti Inc byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
DEC Obecný tvar: DEC co
═══════════════════════════════════════════════════════════════════════════
(Co) zmenší o 1. Případné podtečení se objeví v CF.
1. Dec reg Dec ax
2. Dec místo v paměti Dec byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
AAA Obecný tvar: AAA
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po sečtení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aaa Aaa
Mění příznaky CF a AF.
DAA Obecný tvar: DAA
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po sečtení dvou BCD čísel tak, aby výsledek byl opět
BCD. Týká se al.
1. Daa Daa
Mění příznaky CF a AF.
CMP Obecný tvar: SUB co1,co2
═══════════════════════════════════════════════════════════════════════════
Cmp odečte od (co1) (co2). Výsledek nikam neukláda. Nastaví podle něj jen
příznaky.
1. Cmp reg, reg Cmp cx,dx
2. Cmp reg, místo v paměti Cmp ax, word ptr ds:[si]
3. Cmp místo v paměti, reg Cmp byte ptr cs:[bx],ch
4. Cmp reg, hodnota Cmp ax,90
5. Cmp místo v paměti, hodnota Cmp byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
NEG Obecný tvar: NEG co
═══════════════════════════════════════════════════════════════════════════
Do (co) uloží dvojkový doplňek (co). V podstatě násobí -1.
1. Neg reg Neg ax
2. Neg místo v paměti Neg byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
AAS Obecný tvar: AAS
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po odečtení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aas Aas
Mění příznaky CF a AF.
DAS Obecný tvar: DAS
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po odečtení dvou BCD čísel tak, aby výsledek byl opět
BCD.Týká se al.
1. Das Das
Mění příznaky CF a AF.
MUL Obecný tvar: MUL čím
═══════════════════════════════════════════════════════════════════════════
Provede vynásobení AL, AX nebo EAX (čím). Je-li (čím) byte, pak se násobí AL
(čím)a výsledek se objeví v AX. Je-li (čím) WORD, pak se násobí AX (čím) a
výsledekse uloží do DX:AX. Je-li čím DWORD, pak se násobí EAX (čím), výsledek
do EDX:EAX. Předpokládá kladná čísla bez znaménka.
1. Mul reg Mul bl
2. Mul místo v paměti Mul word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
IMUL Obecný tvar: IMUL čím
═══════════════════════════════════════════════════════════════════════════
Provede vynásobení AL, AX nebo EAX (čím). Je-li (čím) byte, pak se násobí AL
(čím) a výsledek se objeví v AX. Je-li (čím) WORD, pak se násobí AX (čím) a
výsledek se uloží do DX:AX. Je-li čím DWORD, pak se násobí EAX (čím), výsledek
do EDX:EAX. Předpokládá, že čísla jsou se znaménkem.
1. Imul reg Imul bl
2. Imul místo v paměti Imul word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
DIV Obecný tvar: DIV čím
═══════════════════════════════════════════════════════════════════════════
Vydělí AX, DX:AX nebo EDX:EAX (čím). Je-li (čím) word, pak dělí DX:AX, podíl
uloží do AX a zbytek do DX. Je-li (čím) byte, pak vydělí AX (čím), podíl do AL a
zbytek do AH. Je-li (čím) DWORD, pak podíl uloží do EAX a zbytek do EDX.
Předpokládá kladná čísla bez znaménka.
1. Div reg Div bl
2. Div místo v paměti Div word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
Dojde-li k přetečení, vyvolá INT 00 .
IDIV Obecný tvar: IDIV čím
═══════════════════════════════════════════════════════════════════════════
Vydělí AX, DX:AX nebo EDX:EAX(čím). Je-li (čím) word, pak dělí DX:AX, podíl
uloží do AX a zbytek do DX. Je-li (čím) byet, pak vydělí AX (čím), podíl do
AL a zbytek do AH. Je-li (čím) byte, pak vydělí AX (čím), podíl do AL a
zbytek do AH. Je-li (čím) DWORD, pak podíl uloží do EAX a zbytek do EDX.
Předpokládá čísla se znaménkem.
1. Idiv reg Idiv bl
2. Idiv místo v paměti Idiv word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
Dojde-li k přetečení, vyvolá INT 00 .
AAM Obecný tvar: AAM
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po násobení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aam Aam
Mění příznaky CF a AF.
AAD Obecný tvar: AAD
═══════════════════════════════════════════════════════════════════════════
Provádí korekci před dělením dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aad Aad
Mění příznaky CF a AF.
CBW Obecný tvar: CBW
═══════════════════════════════════════════════════════════════════════════
Provádí znaménkové rozšíření AL do AX.
1. Cbw Cbw
Nemění příznaky.
CWD Obecný tvar: CWD
═══════════════════════════════════════════════════════════════════════════
Provádí znaménkové rozšíření AX do DX:AX.
1. CWD CWD
Nemění příznaky.
CDQ Obecný tvar: CDQ
═══════════════════════════════════════════════════════════════════════════
Provádí znaménkové rozšíření EAX do EDX:EAX.
1. CDQ CDQ
Nemění příznaky.
BOUND Obecný tvar: BOUND co, mezi
═══════════════════════════════════════════════════════════════════════════
Zadané (co) je porovnáno s mezemi a v případě, že se tam nevejde, pak se
vyvolá INT 05 .
1. BOUND reg, dword BOUND ax,dword ptr ds:[bx]
BOUND EAX,qword ptr ds:[di]
Instrukce 80386 Instrukce procesoru Registry procesoru
Logické instrukce 80386
XOR Obecný tvar: XOR kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické eXclusive or (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace XOR :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 0 │
└──────────┴──────────┴────────────┘
1. Xor reg,reg Xor ax,ax
2. Xor reg, místo v paměti Xor ax,word ptr ds:[di]
3. Xor místo v paměti, reg Xor word ptr ds:[di],reg
4. Xor reg,hodnota Xor dx,0505
5. Xor místo v paměti, hodnota Xor byte ptr es:[bp],15
Poznámka : k nulování registru je nejrychlejší použít Xor reg,reg.
Např.: Xor dx,dx ; nuluje dx
AND Obecný tvar: AND kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické And (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace AND :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 0 │
│ 1 │ 0 │ 0 │
│ 1 │ 1 │ 1 │
└──────────┴──────────┴────────────┘
1. And reg,reg And ax,ax
2. And reg, místo v paměti And ax,word ptr ds:[di]
3. And místo v paměti, reg And word ptr ds:[di],reg
4. And reg,hodnota And dx,0505
5. And místo v paměti, hodnota And byte ptr es:[bp],15
OR Obecný tvar: OR kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické Or (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace OR :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 1 │
└──────────┴──────────┴────────────┘
1. Or reg,reg Or ax,ax
2. Or reg, místo v paměti Or ax,word ptr ds:[di]
3. Or místo v paměti, reg Or word ptr ds:[di],reg
4. Or reg,hodnota Or dx,0505
5. Or místo v paměti, hodnota Or byte ptr es:[bp],15
NOT Obecný tvar: NOT co
═══════════════════════════════════════════════════════════════════════════
Provede logické Not (co), výsledek uloží do (co).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace NOT :
┌──────────┬────────────┐
│ 1. Bit │ Výsledek │
╞══════════╪════════════╡
│ 1 │ 0 │
│ 0 │ 1 │
└──────────┴────────────┘
1. Not reg Not ax
2. Not místo v paměti Not word ptr ds:[di]
TEST Obecný tvar: TEST kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické And (kam) a (co).Výsledek nikam neukládá, nastaví podle něj.
příznaky : CF=0, OF=0, PF, ZF, SF, AF.
1. Test reg,reg Test ax,ax
2. Test reg, místo v paměti Test ax,word ptr ds:[di]
3. Test místo v paměti, reg Test word ptr ds:[di],reg
4. Test reg,hodnota Test dx,0505
5. Test místo v paměti, hodnota Test byte ptr es:[bp],15
Instrukce 80386 Instrukce procesoru Registry procesoru
Instrukce pro práci s řetězci dat 80386
LODS Obecný tvar: LODS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 3 typy :
1. LODSB Do AL BYTE z adresy ds:[si], SI zvětší o 1 ( DF=0 )
SI zmenší o 1 ( DF=1 )
2. LODSW Do AX WORD z adresy ds:[si], SI zvětší o 2 ( DF=0 )
SI zmenší o 2 ( DF=1 )
3. LODSD Do EAX DWORD z adresy ds:[si], SI zvětší o 4 ( DF=0 )
SI zmenší o 4 ( DF=1 )
Segmentový registr lze prefixem změnit na CS, ES nebo SS.
Nemění příznaky.
STOS Obecný tvar: STOS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 3 typy :
1. STOSB AL uloží na adresu es:[di], DI zvětší o 1 ( DF=0 )
DI zmenší o 1 ( DF=1 )
2. STOSW AX uloží na adresu es:[di], DI zvětší o 2 ( DF=0 )
DI zmenší o 2 ( DF=1 )
3. STOSD EAX uloží na adresu es:[di], DI zvětší o 4 ( DF=0 )
DI zmenší o 4 ( DF=1 )
Segment es NELZE změnit.
Nemění příznaky.
MOVS Obecný tvar: MOVS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 3 typy :
1. MOVSB Provede LODSB + STOSB
2. MOVSW Provede LODSW + STOSW
3. MOVSD Provede LODSD + STOSD
Instrukce se používají k přenosu většího množství dat.
Nemění příznaky.
INS Obecný tvar: INS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 3 typy :
1. INSB Z portu zadaného v dx přečte al a uloží ho na es:[di]
Je-li DF = 0, zvýší DI o 1
Je-li DF = 1, sníží DI o 1
2. INSW Z portu zadaného v dx přečte ax a uloží ho na es:[di]
Je-li DF = 0, zvýší DI o 2
Je-li DF = 1, sníží DI o 2
3. INSD Z portu zadaného v dx přečte eax a uloží ho na es:[di]
Je-li DF = 0, zvýší DI o 4
Je-li DF = 1, sníží DI o 4
Instrukce se používají k obsluze DAC registrů VGA a k přímému čtení disku
přes porty.
Nemění příznaky.
INS použitá v PROTECTED MÓDu procesem s CPL > IOPL vyvolá INT 0D .
OUTS Obecný tvar: OUTS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 3 typy :
1. OUTSB Na port zadaný v dx přečte uloží BYTE z ds:[si]
Je-li DF = 0, zvýší SI o 1
Je-li DF = 1, sníží SI o 1
2. OUTSW Na port zadaný v dx přečte uloží WORD z ds:[si]
Je-li DF = 0, zvýší SI o 2
Je-li DF = 1, sníží SI o 2
2. OUTSD Na port zadaný v dx přečte uloží DWORD z ds:[si]
Je-li DF = 0, zvýší SI o 4
Je-li DF = 1, sníží SI o 4
Instrukce se používají k obsluze DAC registrů VGA a k přímému zápisu na disk
přes porty.
Nemění příznaky.
OUTS použitá v PROTECTED MÓDu procesem s CPL > IOPL vyvolá INT 0D .
SCAS Obecný tvar: SCAS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 3 typy :
1. SCASB Porovná AL s BYTEm z adresy es:[di], DI zvětší o 1 ( DF=0 )
DI zmenší o 1 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
2. SCASW Porovná AX s WORDem z adresy es:[di], DI zvětší o 2 ( DF=0 )
DI zmenší o 2 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
3. SCASD Porovná EAX s DWORDem z adresy es:[di], DI zvětší o 4 ( DF=0 )
DI zmenší o 4 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
CMPS Obecný tvar: CMPS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 3 typy :
1. CMPSB BYTE z ds:[si] s BYTE z es:[di], SI a DI zvětší o 1 ( DF=0 )
SI a DI zmenší o 1 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
2. CMPSW WORD z ds:[si] s WORD z es:[di], SI a DI zvětší o 2 ( DF=0 )
SI a DI zmenší o 2 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
3. CMPSD DWORD z ds:[si] s DWORD z es:[di], SI a DI zvětší o 4 ( DF=0 )
SI a DI zmenší o 4 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
REP Obecný tvar: REP
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím STOS a MOVS (i k LODS,
ale tam to je jen zdržování ..). Zaručuje, že se následující instrukce
provede (E)CX - krát. Na konci je tedy (e)cx 0.
Viz Prostředí 16/32
Následující kód vyčistí celý data segment :
Xor di,di
Xor ax,ax
Push ds
Pop es
Mov cx,8000h
Cld
Rep Stosw
REPZ Obecný tvar: REPZ
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím SCAS a CMPS . Zaručuje,
že se následující instrukce provede (E)cx - krát, pokud zároveň bude ZF=1.
Viz Prostředí 16/32
Při používání s CMPS pozor ! Nulové (E)CX po skončení práce nezaručuje shodu.
Kontrola se provádí :
....... es,di,ds,si,cx inicializováno ....
Cld
REPZ CMPSB
Jz @srovnání_ok
Jnz @srovnáná_neok
REPNZ Obecný tvar: REPNZ
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím SCAS a CMPS . Zaručuje,
že se následující instrukce provede (E)cx - krát, pokud zároveň bude ZF=0.
Viz Prostředí 16/32
! POZOR !
Při práce s instrukcemi pro řetězce dat VŽDY nastavujte správně DF.
Cld nebo Std by mělo být před každou takovou instrukcí.
Instrukce 80386 Instrukce procesoru Registry procesoru
Instrukce řídící 80386
Prefixy změny segmentu Obecný tvar: CS:, ES:, SS:, FS:, GS:
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k ostatním instrukcím. Zaručuje,
že se následující instrukce provede v jiném, než implicitním segmentu.
Assembler je doplňuje automaticky.
Obsazení implicitních segmentů :
┌───────────────────┬───────────┬───────────────┬─────────────────────┐
│ Odkaz │ Impl. seg │ Alt. seg │ Offset │
╞═══════════════════╪═══════════╪═══════════════╪═════════════════════╡
│Výběr instrukce pgm│ CS │ nelze │ (E)IP │
│Práce se zásobníkem│ SS │ nelze │ (E)SP │
│Zdrojový řetězec │ DS │CS,ES,SS,FS,GS │ (E)SI │
│Cílový řetězec │ ES │ nelze │ (E)DI │
│Data obecně │ DS │CS,DS,ES,FS,GS │BX,BP,SI,DI,kombinace│
│BP použit jako báze│ SS │CS,DS,ES,FS,GS │BX,BP,SI,DI,kombinace│
└───────────────────┴───────────┴───────────────┴─────────────────────┘
CLC Obecný tvar: CLC
═══════════════════════════════════════════════════════════════════════════
Nastaví CF na 0.
STC Obecný tvar: STC
═══════════════════════════════════════════════════════════════════════════
Nastaví CF na 1.
CMC Obecný tvar: CMC
═══════════════════════════════════════════════════════════════════════════
Přehodí hodnotu CF.
CLD Obecný tvar: CLD
═══════════════════════════════════════════════════════════════════════════
Nastaví DF na 0. Řetězce se zpracovávají odpředu.
STD Obecný tvar: STD
═══════════════════════════════════════════════════════════════════════════
Nastaví DF na 1. Řetězce se zpracovávají odzadu.
CLI Obecný tvar: CLI
═══════════════════════════════════════════════════════════════════════════
Nastaví IF na 0. Asynchronní přerušení jsou zakázána.
CLI použitá v PROTECTED MÓDu procesem s CPL > 0 vyvolá INT 0D .
STI Obecný tvar: STI
═══════════════════════════════════════════════════════════════════════════
Nastaví IF na 1. Asynchronní přerušení jsou povolena.
STI použitá v PROTECTED MÓDu procesem s CPL > 0 vyvolá INT 0D .
HLT Obecný tvar: HLT
═══════════════════════════════════════════════════════════════════════════
Zastaví činnost procesoru. Tento stav zruší NMI INT 02 nebo RESET.
HLT použitá v PROTECTED MÓDu procesem s CPL > 0 vyvolá INT 0D .
WAIT Obecný tvar: WAIT
═══════════════════════════════════════════════════════════════════════════
Zastaví činnost procesoru. Tento stav zruší NMI INT 02 , RESET nebo aktivní
signál TEST. Používá se pro komunikaci s koprocesorem.
ESC Obecný tvar: ESC
═══════════════════════════════════════════════════════════════════════════
Předává instrukci koprocesoru. Viz INT 06 , INT 07 a Koprocesory .
LOCK Obecný tvar: LOCK
═══════════════════════════════════════════════════════════════════════════
Po dobu následující instrukce se blokuje stav sběrnice. Používá se pro
sdílení jedné sběrnice více CPU.
NOP Obecný tvar: NOP
═══════════════════════════════════════════════════════════════════════════
Chvíli nedělej nic. Jak krásná a jednoduchá instrukce. Používá se
k zarovnávání kódu na 286, 386 a 486, aby CPU běžel rychleji.
Instrukce 80386 Instrukce procesoru Registry procesoru
Instrukce posunů a rotací 80386
SAL Obecný tvar: SAL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Přitom dbá, aby nejvyšší bit zůstal zachován.
Nezničí tedy znaménko.
(kolik) je buď číslo, nebo CL. Je-li užito CL, provede se předem AND CL,1F.
1. Sal reg,kolik Sal ax,4
2. Sal Místo v paměti,kolik Sal word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SAR Obecný tvar: SAR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Přitom dbá, aby nejvyšší bit zůstal
zachován.Nezničí tedy znaménko.
(kolik) je buď číslo, nebo CL. Je-li užito CL, provede se předem AND CL,1F.
1. Sar reg,kolik Sar ax,4
2. Sar Místo v paměti,kolik Sar word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SHL Obecný tvar: SHL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Zničí znaménko.
(kolik) je buď číslo, nebo CL. Je-li užito CL, provede se předem AND CL,1F.
1. Shl reg,kolik Shl ax,4
2. Shl Místo v paměti,kolik Shl word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SHR Obecný tvar: SHR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Zničí znaménko.
(kolik) je buď číslo, nebo CL. Je-li užito CL, provede se předem AND CL,1F.
1. Shr reg,kolik Shr ax,7
2. Shr Místo v paměti,kolik Shr word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
ROL Obecný tvar: ROL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Vypadávající bit vždy dá na místo bitu 0.
(kolik) je buď číslo, nebo CL. Je-li užito CL, provede se předem AND CL,1F.
1. Rol reg,kolik Rol ax,5
2. Rol Místo v paměti,kolik Rol word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
ROR Obecný tvar: ROR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Vypadávající bit vždy dá na místo nevvyššího
bitu .
(kolik) je buď číslo, nebo CL. Je-li užito CL, provede se předem AND CL,1F.
1. Ror reg,kolik Ror ax,2
2. Ror Místo v paměti,kolik Ror word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
RCL Obecný tvar: RCL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Vypadávající bit vždy dá do CF.
Původní CF dá na místo bitu 0.
(kolik) je buď číslo, nebo CL. Je-li užito CL, provede se předem AND CL,1F.
1. Rcl reg,kolik Rcl ax,1
2. Rcl Místo v paměti,kolik Rcl word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
RCR Obecný tvar: RCR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Vypadávající bit vždy dá do CF. Původní
CF umístí na místo nejvyššího bitu.
bitu .
(kolik) je buď číslo, nebo CL. Je-li užito CL, provede se předem AND CL,1F.
1. Rcr reg,kolik Rcr ax,6
2. Rcr Místo v paměti,kolik Rcr word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
Instrukce 80386 Instrukce procesoru Registry procesoru
Instrukce skoků a volání 80386
Podmíněné skoky shrnuje následující tabulka:
┌───────────────────┬────────────────┬─────────────────────────────────┐
│ Instrukce │ Podmínka │ Význam │
╞═══════════════════╪════════════════╪═════════════════════════════════╡
│ Ja / Jnbe │ CF=0▲ZF=0 │ Je nad - ostře větší │
│ Jae / Jnb / Jnc │ CF=0 │Je nad nebo rovno - neostře větší│
│ Jb / Jc / Jnae │ CF=1 │ Je pod - ostře menší │
│ Jbe / Jna │ CF=1▼ZF=1 │Je pod nebo rovno - neostře menší│
│ Je / Jz │ ZF=1 │ Je rovno │
│ Jg / Jnle │(SF<>OF)+ZF = 0 │ Je větší - znaménko se uvažuje │
│ Jge / Jnl │ SF=OF │ Je větší nebo rovno (znaménkově)│
│ Jl / Jnge │ SF<>OF │ Je mensí - znaménko se uvažuje │
│ Jle / Jng │(SF<>OF)+ZF > 0 │ Je menší nebo rovno (znaménkově)│
│ Jne / Jnz │ ZF=0 │ Není rovno │
│ Jno │ OF=0 │ Není přetečení │
│ Jnp / Jpo │ PF=0 │ Není parita - lichá parita │
│ Jns │ SF=0 │ Není záporné - 0 nebo kladné │
│ Jo │ OF=1 │ Je přetečení │
│ Jp / Jpe │ PF=1 │ Je parita - sudá parita │
│ Js │ SF=1 │ Je záporné - není kladné │
│ Jcxz │ CX=0 │ CX je nulové │
└───────────────────┴────────────────┴─────────────────────────────────┘
▲ znamená logické AND
▼ znamená logické OR
Dost značná část podmínek je zbytečná, nejlepší je používat podmíněné skoky,
které mají v názvu jméno příznaku ( Jz místo Je ... ).
LOOP Obecný tvar: LOOP kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží (E)CX o 1 a je-li (E)CX > 0 předá řízení na místo (kam).
Používá se u cyklů s pevným počtem opakování.
Viz Prostředí 16/32
LOOPZ Obecný tvar: LOOPZ kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží (E)CX o 1 . Je-li ((E)CX > 0) a (ZF=1) předá řízení na místo
(kam). Používá se u cyklů s proměnným počtem opakování.
Viz Prostředí 16/32
LOOPNZ Obecný tvar: LOOPNZ kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží (E)CX o 1 . Je-li ((E)CX > 0) a (ZF=0) předá řízení na místo
(kam). Používá se u cyklů s proměnným počtem opakování.
Viz Prostředí 16/32
JMP Obecný tvar: JMP adresa
═══════════════════════════════════════════════════════════════════════════
Instrukce předá řízení na místo určené jako (adresa). Existuje 5 kategorií
skoků :
1. Krátký skok beze změny CS. Cílová adresa leží v rozsahu < -128 ; 127 >
byte od instrukce skoku. JMP short adresa
2. Skok beze změny CS. Cílová adresa leží ve stejném segmentu jako instrukce
skoku. JMP adresa Viz Prostředí 16/32
3. Skok vzdálený (se změnou cs). Změní se jak CS tak IP. V TASMu neexistuje
odpovídající instrukce. Provádím následovně :
db 0EAh
dw nebo dd offset Viz Prostředí 16/32
dw segment
4. Krátký nepřímý skok : Jmp word ptr ds:[si]
(E)IP se načte s udané adresy. Viz Prostředí 16/32
5. Vzdálený nepřímý skok : Jmp (p)dword ptr es:[bx] Viz Prostředí 16/32
(E)IP a CS se načtou s udané adresy. POZOR ! (E)IP je první.
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. JMP je používaný pro všechno možné. Viz Nové registry 386 ,
Deskriptor a Instrukce ochrany paměti 80386
CALL Obecný tvar: CALL adresa
═══════════════════════════════════════════════════════════════════════════
Zavolá procedure na místě určeném adresou. Do zásobníku uloží AKTUÁLNÍ IP
( CS ) , tedy adresu ukazující na následující instrukci.
Existují 4 typy CALL :
1.Krátké přímé volání. Provede se uložení (E)IP na zásobník a do (E)IP se
uloží (adresa). Call podproc Viz Prostředí 16/32
2.Krátké nepřímé volání. Provede se uložení (E)IP na zásobník a do (E)IP se
uloží WORD na specifikované adrese. Call word ptr es:[bx + tabulka]
Viz Prostředí 16/32
3.Vzdálené přímé volání. Uloží se (E)IP a pak CS se uloží na zásobník ,(E)IP
a CS se načte ze zadaných hodnot. Call far Newseg:NewOfs
NewOfs je buď word nebo dword. Viz Prostředí 16/32
4.Vzdálené nepřímé volání. Uloží se (E)IP a pak CS se uloží na zásobník ,
(E)IP a CS se načte ze zadané adresy. Call (p)dword ptr es:[oldproc]
Viz Prostředí 16/32
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. CALL je používaný pro všechno možné. Viz Nové registry 386 ,
Deskriptor a Instrukce ochrany paměti 80386
RET Obecný tvar: RET [n]
═══════════════════════════════════════════════════════════════════════════
Instrukce obnoví IP ( CS ) ze zásobníku. Hodnotu CS a IP uložené na zásobníku
odstraní.
1. RET , RETN - návrat z procedury volané CALL near. Obnoví pouze (E)IP.
2. RETF - návrat z procedure volané jako FAR. Obnoví (E)IP i CS.
Nepovinný parametr n udává počet byte, které má RET nebo RETF ještě odstranit
ze zásobníku. Použije se pro odstranění parametrů předaných proceduře na
stacku. Viz obr.
před RETF 004 Po RETF 004
<---- SS:(E)SP
Parametr 1 CS a (E)IP obnoveno
Parametr 2
Parametr 3
Parametr 4
(E) IP
(0) CS
SS:(E)SP->
Viz Prostředí 16/32
před RET 004 Po RET 004
<---- SS:(E)SP
Parametr 1 (E)IP obnoveno
Parametr 2
Parametr 3
Parametr 4
(E)IP
SS:(E)SP->
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. RET je používaný pro všechno možné. Viz Nové registry 386 ,
Deskriptor a Instrukce ochrany paměti 80386
INT Obecný tvar: INT n
═══════════════════════════════════════════════════════════════════════════
Instrukce INT vyvolá přerušení číslo n. Instrukce uloží na zásobník
příznaky (FLAGS, CS a IP (v tomto pořadí). Pak z tabulky umístěné v segmentu
0000 z offsetu 4*n přečte IP a CS příslušného přerušení.
Instrukce INT n je 2 byte dlouhá , ale INT 3 pouze 1 byte. Používá se
jako breakpoint. Viz INT 03 .
INTO je další mutace INT. Provede INT 4, je-li nastaven OF.
Viz INT 04
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. INT je používaný pro všechno možné. Viz Nové registry 386 ,
Zpracování přerušení a Instrukce ochrany paměti 80386
IRET Obecný tvar: IRET
═══════════════════════════════════════════════════════════════════════════
Ukončí přerušení vyvolané INT. Odstraní ze zásobníku uložené IP, CS a FLAGS,
a obnoví je. Provede se Popf, Pop IP a Pop CS. ( v tomto pořadí );
Situace před IRET Po IRET
<-- SS:SP CS, IP, FLAGS obnoveny.
FLAGS
CS
IP
SS:SP ->
Popsaný algoritmus pracuje jen v REAL MÓDu . V PROTECTED MÓDu je situace
jiná. IRET je používaný pro všechno možné.
Viz Instrukce ochrany paměti 80386 a Nové registry 386 .
Instrukce 80386 Instrukce procesoru Registry procesoru
Instrukce ochrany paměti 80386
S procesorem 80386 přichází další ochrana paměti a I/O zařízení, aby se
zabránilo "hloupým a nedokonalým programátorům" při jejicj pokusech shodit
systém. To se však v praxi nepovedlo, protože ti, co dělali menší chyby, se
naučili dělat chyby takové, aby to nevydržela ani ochrana.
Instrukce ohrany slouží k práci v PROTECTED MÓDu a k přepnutí do něj.
Svévolné užití může vyvolat chybu INT 06 nebo INT 0D . Instrukce povolené
i v REAL MÓDu jsou označeny hvězdičkou.
*LGDT Obecný tvar: LGDT adresa
═══════════════════════════════════════════════════════════════════════════
Naplní obsah GDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Adresace , Nové registry 386 a Privilegované instrukce
*SGDT Obecný tvar: SGDT adresa
═══════════════════════════════════════════════════════════════════════════
Uloží obsah GDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Adresace , Nové registry 386 a Privilegované instrukce
LLDT Obecný tvar: LLDT položka GDT
═══════════════════════════════════════════════════════════════════════════
Naplní obsah LDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Adresace , Nové registry 386 a Privilegované instrukce
SLDT Obecný tvar: SLDT položka GDT
═══════════════════════════════════════════════════════════════════════════
Uloží obsah LDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Adresace , Nové registry 386 a Privilegované instrukce
*LIDT Obecný tvar: LIDT adresa
═══════════════════════════════════════════════════════════════════════════
Naplní obsah IDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Nové registry 386 , Privilegované instrukce a
Zpracování přerušení .
*SIDT Obecný tvar: SIDT adresa
═══════════════════════════════════════════════════════════════════════════
Uloží obsah IDTR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Nové registry 386 , Privilegované instrukce a
Zpracování přerušení .
LTR Obecný tvar: LTR položka GDT
═══════════════════════════════════════════════════════════════════════════
Naplní obsah TR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Nové registry 386 , Privilegované instrukce a
TSS .
STR Obecný tvar: STR položka GDT
═══════════════════════════════════════════════════════════════════════════
Uloží obsah TR registru procesoru. Je povolena jen procesům s CPL =0.
Podrobnosti viz Nové registry 386 , Privilegované instrukce a
TSS .
LAR Obecný tvar: LAR reg,sel
═══════════════════════════════════════════════════════════════════════════
Naplní reg (16 bitů) přístupovými právy Deskriptoru urcčeného Selektore m
sel. Deskriptorů je značné množství, podrobně jsou popsány na jiném místě.
Zde je uveden nejčastěji se vyskytující selektor - datový. (Některé bity jsou
shodné i pro kódový segment.)
Reg :
15 8 7 0
┌────────────────────────┬──────────────────────────┐
│ P DPL S C E W A │ G D 0 0 0 0 0 0 │
└────────────────────────┴──────────────────────────┘
│ │ │ │ │ │ │ │ └───── 1 32 bitový segment
│ │ │ │ │ │ │ │ 0 16 bitový segment
│ │ │ │ │ │ │ │ Důležité hlavně pro CS
│ │ │ │ │ │ │ │ Viz Prostředí 16/32
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ └──────── 0 - Limit je < 1MB
│ │ │ │ │ │ │ Jednotka je byte
│ │ │ │ │ │ │ 1 - Limit je < 4GB
│ │ │ │ │ │ │ Jednotka je stránka (4096 BYTE)
│ │ │ │ │ │ │ Viz Deskriptor .
│ │ │ │ │ │ │
│ │ │ │ │ │ └────── Accesed - v segmentu došlo k R nebo W
│ │ │ │ │ └───────── Writeable - lze zapisovat
│ │ │ │ └──────────── Expand down - rozšíření dolů
│ │ │ └─────────────── Code - 1 kódový segment
│ │ └────────────────── 0=paměťový 1=systémový Deskriptor
│ └────────────────────── CPL , od níž lze použít INT 0D
└────────────────────────── 1=Present 0=Not present INT 0B
Úspěšný pokus nastaví ZF na 1
LSL Obecný tvar: LSL reg,sel
═══════════════════════════════════════════════════════════════════════════
Naplní reg limitem Deskriptoru odpovídajícím sel. Úspěšný pokus nastaví
ZF=1.
VERR Obecný tvar: VERR sel
═══════════════════════════════════════════════════════════════════════════
Testuje Deskriptor určený sel, zda je způsobilý ke čtení.
Je-li OK, nastaví ZF na 1
VERW Obecný tvar: VERW sel
═══════════════════════════════════════════════════════════════════════════
Testuje Deskriptor určený sel, zda je způsobilý k zápisu.
Je-li OK, nastaví ZF na 1
ARPL Obecný tvar: ARPL sel1,sel2
═══════════════════════════════════════════════════════════════════════════
Nastaví RPL sel1 pokud CPL < DPL sel1. Viz Systém ochrany .
Je-li vše OK, nastaví ZF na 1.
CTS Obecný tvar: CTS
═══════════════════════════════════════════════════════════════════════════
Shodí příznak TS v MSW. Používá se při multitaskingu. Viz TSS .
CTS je dostupný jen pro CPL =0.
*LMSW Obecný tvar: LMSW reg
═══════════════════════════════════════════════════════════════════════════
Naplní MSW obsahem reg. Je dostupná jen pro CPL =0.
*SMSW Obecný tvar: SMSW reg
═══════════════════════════════════════════════════════════════════════════
Naplní reg obsahem MSW.
INT Obecný tvar: INT N
═══════════════════════════════════════════════════════════════════════════
Provede přerušení N. Viz Zpracování přerušení . Je-li INT úspěšné,
( Systém ochrany ) pak při změně priotity navíc provede záměnu Stacku podle
aktivního TSS určeného TR. Na zásobníku pak rutina nalezne:
šíře - 32 bitů
0 SS přerušeného procesu
ESP přerušeného procesu
Eflags
0 CS
EIP
SS:ESP-->
IRET Obecný tvar: IRET
═══════════════════════════════════════════════════════════════════════════
V PROTECTED MÓDu má IRET odlišnou funkci, než v REAL MÓDu .
Zjistí-li při procesor při IRET, že dojde ke změně CPL , navíc ještě obnoví
původní SS a ESP.
Před IRET Po IRET SS, ESP, EFLAGS, CS a EIP obnoveno
šíře - 32 bitů ; pro 286 typovou obsluhu INTu 16
0 SS │
(E)SP │
(E)Flags │
0 CS │
(E)IP ──────────────────────────────────┘
SS:(E)SP -->
Zde začínají komplikace typu Prostředí 16/32 . Podle pole TYP v položce
IDT konkrétního INT se provede buď 16 nebo 32 bitová obsluha. (Vytvoření
záznamu.) Viz Zpracování přerušení .
Polde bitu D z Deskriptoru CS obslužné rutiny se provede IRET - buď 16
nebo 32 bitový. TYP brány INT a prostředí CS tedy musí klapnout.
Adresace ve stacku (E)SP se určí podle platného TSS . To je konec ..
Čert a INTEL se v tom vyzná...
Je-li při zpracování IRET nastaven NT příznak ve FLAGS, dojde navíc
k přepnutí úloh podle zpětného ukazatele TSS .
CALL Obecný tvar: CALL adresa
═══════════════════════════════════════════════════════════════════════════
Call v Protected módu pracuje podobně jako v reálném módu. Navíc je při
všech manipulacích s CS kontrolováno, aby nedošlo ke změně CPL .
Podrobnosti - viz Systém ochrany .
Je-li CALL použit při volání před bránu ( Deskriptor ), a je-li změna
CPL bez problémů, dojde ke změně SS a SP. Na SS a SP nové (cílové) priority
CALL vytvoří následující záznam :
šíře - 32 bitů ; záleží na typu brány, je-li 286 stylu, pak 16
0 SS volajícího
(E)SP volajícího
[ patrametr 1 ] ┐
[ patrametr 2 ] │
[ patrametr 3 ] ├─ jen, je-li CNT brány >0
...... │
[ patrametr N ] ┘
(E)IP volajícího
0 CS volajícího
SS:ESP --->
Bylo-li pole CNT použité brány nenulové, jsou před SS uloženy ještě předávané
parametry.
RETF Obecný tvar: RETF N
═══════════════════════════════════════════════════════════════════════════
RET v Protected módu pracuje podobně jako v reálném módu.
Při použití RETF je navíc kontrolováno, aby nedošlo k neoprávněné změně
CPL. Je-li CPL CS, jež má být vyzvednuto < CPL programu, který RET provádí,
provrde se INT 0D .
Program s CPL =0 si může dělat, co uzná za vhodné.
RETF z programu volaného bránou - ( Deskriptor ) MUSÍ vyzvednout všechny
předávané parametry správně, jinak dojde ke špatnému vrácení SS a vyvolá
se INT 0C .
Instrukce 80386 Instrukce procesoru Nové registry 386
Zpracování přerušení PROTECTED MÓD Adresace
Instrukce 80386
Procesor 80386 je nadmnožinou 8086, zná tedy všechny jeho instrukce.
Pracuje-li v REAL MÓDu , pak se chová stejně jako 8086. Navíc pracují
nové instrukce 80386.
Pro REAL MÓD viz :
Instrukce přesunu dat 80386
Aritmetické instrukce 80386
Logické instrukce 80386
Instrukce posunů a rotací 80386
Instrukce pro práci s řetězci dat 80386
Instrukce skoků a volání 80386
Instrukce řídící 80386
Bitově orientované instrukce 80386
Pro PROTECTED MÓD viz :
Instrukce ochrany paměti 80386
Instrukce 8086 Instrukce 80286 Instrukce 80486
Bitově orientované instrukce 80386
SETcc Obecný tvar: SETcc kam
═══════════════════════════════════════════════════════════════════════════
Podle jestliže je splňena podmínka (cc) nastaví (kam) na 1 jinak na 0.
(kam) může mít velikost 1 byte.
┌───────────────────┬────────────────┐
│ Instrukce │ Příznak │
╞═══════════════════╪════════════════╡
│ SETO │ OF = 1 │
│ SETNO │ OF = 0 │
│ SETB │ CF = 1 │
│ SETNB │ CF = 0 │
│ SETC │ CF = 1 │
│ SETNC │ CF = 0 │
│ SETE │ ZF = 1 │
│ SETNE │ ZF = 0 │
│ SETBE │CF = 1 ▼ ZF = 1 │
│ SETNBE │CF = 0 ▲ ZF = 0 │
│ SETS │ SF = 1 │
│ SETNS │ SF = 0 │
│ SETP │ PF = 1 │
│ SETPE │ PF = 1 │
│ SETNP │ PF = 0 │
│ SETPO │ PF = 0 │
│ SETZ │ ZF = 1 │
│ SETNZ │ ZF = 0 │
│ SETG │(SF<>OF)+ZF = 0 │
│ SETNG │(SF<>OF)+ZF > 0 │
│ SETL │ SF<>OF │
│ SETNL │ SF=OF │
│ SETGE │ SF=OF │
│ SETNGE │ SF<>OF │
│ SETLE │(SF<>OF)+ZF > 0 │
│ SETNLE │(SF<>OF)+ZF = 0 │
│ SETAE │ CF=0 ▲ ZF=1 │
│ SETNAE │ CF=1 ▼ ZF=1 │
│ SETA │ CF=0 ▲ ZF=0 │
│ SETNA │ CF=1 ▼ ZF=1 │
└───────────────────┴────────────────┘
▲ znamená logické AND
▼ znamená logické OR
SETNC al ; nastaví al na 0 pro CF=1
1 pro CF=0
BSF Obecný tvar: BSF dest,src
═══════════════════════════════════════════════════════════════════════════
Prohlíží (src) počínaje bitem 0 a hledá první nenulový bit. Jeho číslo
dá do dest. Najde-li , nastaví ZF na 0 jinak na 1.
BSF edx,eax ; pro eax = 00001000 dá edx=0000000C
BSR Obecný tvar: BSR dest,src
═══════════════════════════════════════════════════════════════════════════
Prohlíží (src) počínaje nejvyšším bitem a hledá první nenulový bit. Jeho
číslo dá do dest. Najde-li , nastaví ZF na 0 jinak na 1.
BSR edx,eax ; pro eax = 00001000 dá edx=00000013
BT Obecný tvar: BT src,kolik
═══════════════════════════════════════════════════════════════════════════
Do CF uloží bit (Src) v pořadí (kolik)
BT eax,4 ; eax= 00000008 - CF=1
BTC Obecný tvar: BTC src,kolik
═══════════════════════════════════════════════════════════════════════════
Do CF uloží negaci bitu (Src) v pořadí (kolik)
BT eax,4 ; eax= 00000008 - CF=0
BTR Obecný tvar: BTR src,kolik
═══════════════════════════════════════════════════════════════════════════
Do CF uloží bit (Src) v pořadí (kolik). Pak jej v (src) vynuluje.
BTS Obecný tvar: BTS src,kolik
═══════════════════════════════════════════════════════════════════════════
Do CF uloží bit (Src) v pořadí (kolik). Pak jej v (src) nastaví na 1.
SHLD Obecný tvar: SHLD src1,src2,kolik
═══════════════════════════════════════════════════════════════════════════
Pracuje jako SHL, ale zároveň se 2 operandy : src1 a src2.
před: ax=0, cx=8000h
SHLD ax,cx,2 ;
po: ax=2, cx=0
SHRD Obecný tvar: SHRD src1,src2,kolik
═══════════════════════════════════════════════════════════════════════════
Pracuje jako SHR, ale zároveň se 2 operandy : src1 a src2.
před: ax=01, cx=0000h
SHLD ax,cx,2 ;
po: ax=00, cx=4000h
CWDE Obecný tvar: CWDE
═══════════════════════════════════════════════════════════════════════════
Znaménkově rozšíří AX do EAX.
Pozn.: Prý existuje i IBTS a XBTS (Insert/extract bits.) Ale nalezl jsem to
jen v jednom pochybném prameni (Assembler, BIOS). Neuvedli ani opkód
ani syntaxi. V TD a TA se mi nepovedlo je naasemblovat, a tak si
myslím, že si ze čtenářů někdo vystřelil.
Instrukce 80386 Instrukce procesoru Nové registry 386
Zpracování přerušení PROTECTED MÓD Adresace
Instrukce 80486
Procesor 486 se od 386-ky liší jen minimálně, veškeré staré instrukce
viz Instrukce 80386 .
Nové instrukce jsou popsány v kapitole Nové instrukce 80486 .
Procesory Instrukce 80386 Instrukce 80286 Instrukce 8086
Nové registry 286 Nové registry 386 Nové registry 486
Nové instrukce 80486
Pokud je více než 20 hodin, chce se Vám spát, ale chcete se dozvědět, co
si to INTELové ještě vymysleli, pak nečtěte a radši běžte spát. O nic
nepříjdete. Instrukce 486 nepřinesly nic světobornýho.
BSWAP Obecný tvar BSWAP reg
═══════════════════════════════════════════════════════════════════════════
BSWAP provede korekci reg (16 nebo 32 bitů), aby byl po uložení v konvenci
MOTOROLA (tedy HiLo). Poznamenejme, že INTEL má pořadí LoHi.
Jinak se hodí k témuž, co XCHG. Ale zkuste JEDNOU instrukcí prohodit
bajty v DI. Na to už musí být 486.
XADD Obecný tvar XADD co,kam
═══════════════════════════════════════════════════════════════════════════
Instrukce prohodí co a kam a pak je sečte. Tedy totéž, jako ADD kam, co.
CMPXCHG Obecný tvar CMPXCHG co,kam
═══════════════════════════════════════════════════════════════════════════
Instrukce porovná operandy a pak je prohodí. Na co to je ? Na zmatení lebky !
*INVD Obecný tvar INVD
═══════════════════════════════════════════════════════════════════════════
Vyprázdní CACHE 80486. Proveďte před nastavením CD a NW bitů v CR0.
*WBINVD Obecný tvar WBINVD
═══════════════════════════════════════════════════════════════════════════
Totéž, co INVD. Jen se ještě pokusí data z CACHE zapsat zpět. Díky
hardware 80486 se jí to ale stejně nepodaří.
INVLPG Obecný tvar INVLPG adresa
═══════════════════════════════════════════════════════════════════════════
Označí stránku určenou (adresa) za 'nevalidní' v TLB. Donutí 80486 přečíst
před další operací položku stránky z paměti.
Toť vše. Víc toho 486 nedá. Instrukce označené * jsou kandidáty na INT 0D
při provedení programem s CPL >0. Nejsem si však 100% jist.
Instrukce 80486 Instrukce 80386 Instrukce 80286 Instrukce 8086
Nové registry 286 Nové registry 386 Nové registry 486
Prostředí 16/32
Pokud pracujete jen v módu REAL (V86), pak dopopručuji ESC. Hned teď !
Tento text čtěte jen zrána, jinak hrozí, že v noci hrůzou neusnete. Prefix
16/32 a prostředí 16/32 jsou nejlepším člověkem vymyšleným testem inteligence.
INTEL tak zkoumá, jaké asi průměrné IQ má člověk, který programuje a užívá
nové Instrukce 80386 a nové Instrukce 80486 .
Pokud jste si ještě nepřečetl Deskriptor , pak je nyní ta nejlepší doba
to udělat.
Podle bitu D v deskriptoru určeném Selektore m CS se rozhoduje, je-li
prostředí 16 nebo 32 bitové. Pro REAL MÓD a V86 MÓD je D VŽDY 0.
0 - 16 - bitů
1 - 32 - bitů.
Až posud s 16/32 nejsou problémy (nějaký bit, těch už u INTELu nasekali..)
Ale pozor !!!
Podle bitu D se mění chování téměř všech instrukcí. Možná Vám to maminka
neřekla, ale stejná instrukce pracující s BYTEm a WORDem má stejný opkód.
Liší se jen v 1 bitu :
Třeba: Inc byte ptr ds:[di] a Inc word ptr ds:[di]
V debuggeru se objeví:
cs:0100 FE05 inc byte ptr [di]
cs:0102 FF05 inc word ptr [di]
A co když na 386 zadám : Inc dword ptr ds:[di] ?
A zde je jádro pudla. Co se stane ?
V 16 bitovém prostředí se vypíše :
cs:0102 66FF05 inc dword ptr [di]
└─ Vše zařídil prefix změny prostředí.
V 32 bitovém prostředí se vypíše :
cs:00000102 FF05 inc dword ptr [di]
A prefix nikde.
Prefix 16/32 funguje jako XOR, pracuje tedy i obráceně:
Inc word ptr ds:[di]
16 - bitové prostředí:
cs:0102 FF05 inc word ptr [di]
32 - bitové prostředí:
cs:00000102 66FF05 inc word ptr [di]
Pokud si teď mnete ruce, jak vrazíte prefix 66 před Inc byte ptr ds:[di]
a naskočí tam Inc qword ptr ds:[di], pak Vás musím zchladit. Prefix 16/32
se před BYTovou operací ignoruje. 386 a 486 jsou je dvaatřicítky a o
Qwordech si nechají jen zdát. Na Pentium jsem vskutku zvědav, co si boys
od INTELu vycucají z prstů.
A pak to teprve bude slast ... (Pentium je 16, 32 a 64 bitové)
V souvislosti s prostředím nabývá na významu popisování v TASMu.
Obligádní : Code segment public use16 para 'code' je pro assembler velmi
důležité. Use16 říká, že segment bude 16 bitový a podle toho ASM generuje
prefixy. Co provede Use32 na místě Use16 snad nemusím vysvětlovat.
Kromě velikosti operandů se D bit podílí i na adresaci. Podobně jako pro
Mov ax,word ptr .. a Mov eax, dword ptr .. existuje prefix 16/32
(opkód 66) i pro adresování máme zblbováka.
Jeho opkód je 67 a provede následující :
16 bitů
cs:0100 8B04 mov ax,[si]
cs:0102 678B06 mov ax,[esi]
32 bitů
cs:00000100 8B04 mov ax,[esi]
cs:00000102 678B06 mov ax,[si]
Na D se kouknou i některý instrukce. Jsou to :
Instrukce pro práci s řetězci dat 80386 a Instrukce řídící 80386 .
Tady už zblbovák nepomůže. Podle D se tedy MUSÍME přizpůsobit.
Co konkrétně :
16 32
LODS (E)a?=ds:[si] (E)a?=ds:[esi]
analogicky STOS, CMPS, SCAS, OUTS, MOVS a INS .
REP testuje CX testuje ECX
analogicky REPZ, REPNZ, LOOP, LOOPZ, LOOPNZ
XLAT DS:[BX+AL]=>AL DS:[EBX+AL]=>AL
JMP offset VŽDY 16 bitů Offset vždy 32 bitů
Tady je třeba se trochu zastavit. Když skáču z 16 do 32 ( měním CS a jeho
Deskriptor , samozřejmě tedy FAR ), pak provedu :
db 0eah
dw offset, selektor ;musím skočit do prvních 64 KB nového segmentu
Analogicky z 32 do 16 :
db 0eah
dd (!) offset ; zde musí být horní WORD 0. Jinak INT 0D
dw selektor
Vždy je důležité to prostředí, které je právě aktivní. Co platí pro přímé
skoky platí i pro nepřímé.
CALLům z 16 do 32 a opačně se ROZHODNĚ vyhněte. Jinak se RESET poměje.
( RETF by totiž vždy pracoval špatně - obráceně )
Předposlední slastí a (ne)příjemnou variací jsou přerušení stylu 16 ve 32
bitovém segmentu a naopak. Blíže viz Zpracování přerušení .
A nakonec to nejlepší. Přepínání úloh pomocí 16 (32) bitového TSS z
32 (16) bitového segmentu. Naštěstí tady to tak nebolí. Staré registry
se uloží do původního TSS a z nového TSS se obnoví registry nové. Zároveň
se správně změní bit D a vše je O.K.
Závěrem mohu doporučit jediné - neasemblujte ručně (tak se nedoprefixujete
- krásně české slovo, ne ? ) a měníte-li bitáž cs, pak vždy jen skokem
do jiného segmentu správně označeného Use v TASM.
Jestliže se teď divíte, proč 80386 funguje, pak je to jen tím, že se nachází
v REAL MÓDu nebo maximálně ve V86 MÓDu , kde je všechno 16.
A v prefixech je také vysvětlení slovní říčky o srovnávající funkčnost Windows
a viru.
Vir funguje, prože je jen 16-bitový.
Windows jsou 32 bitové. (A funkčnost si už domyslete sami.)
Procesory Nové registry 386 Instrukce 80386
Nedokumentované instrukce
Jak už napovídá reklamní slogan : "Nic není nemožné ! Toyota ? Ne ! INTEL !
můžeme se na PC setkat s ledasčím. Můžeme-li se setkat nedokumentovanými fcemi
DOSu a BIOSu, tak proč ne procesoru ? Jak by ten INTEL vypadal, kdyby něco
takovýho nepodporoval ? Jako chudý příbuzný.
Zde jsou instrukce, které (snad) podporuje i 8086 .
Instrukce Čnnost instrukce
0D4h hodnota AH := AL div hodnota
AL := AL mod hodnota
0D5h hodnota AL := (AH * hodnota) + AL
AH := 0
0D6h if CF=0 then AL := 0 else AL := 0FFh
Jak sami vidíte, nic moc. Radši použijte standardní DIV, MUL a SETcc.
Tyto instrukce sice fungují téměř všude, ale jistota je jistota.
Patří do kategorie kaskadér (neboli supernedokumentováno). Nepozná je ani
TD v3.2 . Navíc není třeba je používat. Pokud je použijete, bůh s Vámi ...
Něco pro 80286 : Fantóm LOADALL
Tato instrukce byla určena pro tesovací účely INTELů. Nebýt podnikavých
dušiček, který zkoušely, co který opkód provede, nedostala by se na světlo
světa. Po zveřejnění INTELové něco tak na 5% potvrdili. Patří do kategorie
mírně nedokumentováno (neboli téměř volně k použití). TD v3.2 ji sice
nezasembluje, ale podle obsahu jí vypíše.
Instrukcí LOADALL lze jednorázově naplnit všechny registry procesoru včetně
jejich neviditelných částí. Instrukce se smí použít jak v reálném, tak i
v chráněném režimu. Navíc lze pomocí LOADALL v 80286 v rámci chráněného
režimu emulovat program v reálném režimu 8086. V reálném režimu může LOADALL
zajistit adresaci 15MB fyzického adresového prostoru 80286 bez přepnutí
do chráněného režimu.
Instrukce LOADALL je těsně svázána s vnitřní logikou procesoru 80286. Protože
procesor 80386 má jinou vnitřní strukturu, nemůže zde instrukce LOADALL 80286
plnohodnotně pracovat, a proto 80386 má navíc instrukci obdobnou s jinou
definicí (viz dále). Instrukce LOADALL 80286 v procesoru 80386 funguje přesně
podle pravidel pro 80286.
Nemůžu ručit za správnost všech zde uvedených faktů, protože nelze získat
podklady autorizované výrobcem. Poněvadž jde o nedokumentované instrukce, může
i firma Intel přestat tyto instrukce podporovat bez jakéhokoli varování a potom
programy, které tyto instrukce používají, by přestaly fungovat. Programátor,
který tyto instrukce použije ve svém programu, ručí za svůj produkt pouze sám.
Instrukce plní obsahy všech registrů včetně LDTR, TR, GDTR, IDTR a MSW. Také
plní jinak nepřístupné neviditelné části registrů ES, DS, SS, CS, TR a LDTR.
Instrukci lze provést v reálném i chráněném režimu (zde pouze CPL =0). Každý
pokus o provedení LOADALL na jiné úrovni oprávnění než 0 způsobí přerušení
INT 0D (už zase ..) s chybovým kódem 0.
Instrukce LOADALL dovoluje přímo plnit bázi, limit a přístupová práva v
neviditelných částech segmentových registrů bez ohledu na hodnotu selektoru a
tabulky Deskriptorů . Tyto hodnoty lze měnit i v reálném režimu opět bez
ohledu na původní nastavení odpovídající reálnému režimu.
Při plnění neviditelných částí registrů nejsou prováděny žádné kontroly (na
přístupová práva). Jakmile jsou instrukcí LOADALL nové hodnoty zavedeny, jsou
ihned používány pro výpočty bází, kontrolu limitů a přístupových práv
v chráněném režimu a výpočty bází v reálném režimu.
Instrukce LOADALL má operační kód délky dva BYTE : 0Fh 05h (BYTE 0Fh je na
nižší adrese). Trvání instrukce LOADALL je 195 taktů a během té doby je
provedeno 51 cyklů sběrnice.
Instrukcí LOADALL nelze v 80286 provést přepnutí z chráněného režimu do
reálného. Jakmile je v 80286 jednou chráněný režim zapnut ( MSW PE = 1),
musí být instrukcí LOADALL plněn registr MSW tak, že má v bitu PE jedničku.
Jedinou možností jak přepnout zpět do reálného režimu je aktivování signálu
RESET. (Viz PROTECTED MÓD .)
Instrukce LOADALL čte blok paměti začínající na fyzické adrese 000800h
(2048), dlouhý 102 WORDů. Tento blok obsahuje nový stav všech registrů
procesoru 80286 .
800-805 žádný
806-807 MSW
808-815 žádný
816-817 TR
818-819 Registr příznaků (F)
81A-81B IP
81C-81D LDT
81E-81F DS
820-821 SS
822-823 CS
824-825 ES
826-827 DI
828-829 SI
82A-82B BP
82C-82D SP
82E-82F BX
830-831 DX
832-833 CX
834-835 AX
836-83B ES neviditelná část
83C-841 CS neviditelná část
842-847 SS neviditelná část
848-84D DS neviditelná část
84E-853 GDTR
854-859 LDT neviditelná část
85A-85F IDTR
860-865 TR neviditelná část
Instrukce LOADALL nepřistupuje k obsahům tabulek GDT, LDT a IDT, a proto
také neprovádí žádné kontroly na nové obsahy neviditelných částí registrů.
Hodnoty, kterými byly naplněny neviditelné části registrů, jsou v nich
zachovány až do změny selektoru příslušného registru. Potom se přepíší
podle platného obsahu příslušné tabulky. V reálném režimu jsou dolní 4 bity
a horní 4 bity adresy báze nastaveny na nulu (bity 19-4 jsou nastaveny na
adresu segmentu podle pravidel reálného režimu). Limit segmentu je nastaven
na 0FFFFh a přístupvá práva jsou nastavena jako pro segment, do něhož je
povoleno zapisovat. V chráněném režimu jsou báze, limit a přístupová práva
naplněny podle příslušné tabulky deskriptorů.
Neviditelné části mají v tabulce pro LOADALL tento formát:
BYTE 0-2:
24 bitová fyzická adresa báze segmentu. BYTE jsou uloženy ve
vzestupném pořadí (nejnižší významová slabika na nejnižší
adrese).
BYTE 3:
BYTE přístupových práv. Má stejný tvar jako v Deskriptoru
segmentu. Jediný rozdíl je v chápání obsahu bitu P (Present).
Je-li nula, je obsah neviditelné části neplatný a každé jeho
použití vyvolá přerušení INT 0D (Obecná chyba ochrany) s
chybovým kódem nula. Naplnění neviditelné části neplatným
selektorem nezpůsobí okamžité přerušení, nýbrž přeruší se až v
okamžiku použití takového selektoru. Neviditelná část CS může
být instrukcí LOADALL naplněna přístupovými právy deskriptoru
datového segmentu, do kterého lze zapisovat.
BYTE 4-5:
16 bitový limit segmentu. Interpretace obsahu tohoto 16 bitového
WORDu je určena obsahem BYTE přístupových práv (viz E bit).
Datové segmenty rostoucí směrem dolů jsou zpravidla zásobníky.
Registry GDTR a IDTR mají v tabulce pro LOADALL stejný tvar jako
neviditelné části segmentových registrů s tím, že BYTE přístupových práv
(číslo 3) obsahuje nulu.
Aby program po provedení instrukce LOADALL správně fungoval,
musí být při vytváření datové struktury pro LOADALL pamatováno
na to, že:
1. do segmentu se zásobníkem se musí smět zapisovat (W=1) a musí
být přítomen v paměti (P=1),
2. instrukční segment s programem může být těchto tří typů:
pouze proveditelný (instrukční segment s R=0), proveditelný s
povoleným čtením (instrukční segment s R=1) a datový s
povoleným čtením a zápisem (datový segment W=1 a E=0).
Pro chráněný režim navíc musí být zajištěno následující:
3. identifikátor DPL v neviditelné části CS ( CPL ) musí být roven
DPL v neviditelné části SS,
4. Pole DPL z ES a DS by měly být nastaveny zpravidla na 3 (rozhodně>CPL).
Dvě základní využití LOADALL :
1. LOADALL lze zpřístupnit paměť nad 1. MB bez nutnosti nastavit
PROTECTED MÓD . To používal i HIMEM.SYS ! (Bille, ty jseš prostě
na zabití).
2. Emulace REAL MÓDu v PROTECTED MÓDu . Spíše teoretická vize. Nikdo
to nikdy neviděl, ale v jedný pohádce to bylo. Správce měl ale tak
odřený uši, že si je musel nechat amputovat.
I 386 má LOADALL (aneb kompatibilita především)
Instrukce LOADALL pro 80386 má operační kód 0Fh 07h. Používá podobnou tabulku
jako LOADALL pro 80286, ale začátek této tabulky není na absolutní adrese 800h,
nýbrž na adrese umístěné v registrech ES:EDI. Tato instrukce nepovoluje použití
prefixu změny implicitního segmentového registru.
Význam této instrukce pro emulování programu reálného režimu uvnitř režimu
chráněného ustupuje do pozadí, protože 80386 nabízí daleko komfortnější režim
virtuálních 8086 procesů. ( A hlavně dokumentovaný ).
Přesto je stále (skoro) vhodná pro jednorázové plnění všech registrů procesoru.
Protože 80386 má jinou registrovou strukturu než 80286, je také rozložení
jednotlivých informací v datové struktuře v paměti jiné.
Blok dat začíná na libovolné adrese ve fyzické paměti. Adresa začátku bloku
musí být před provedením instrukce uložena do ES:EDI. Pro definici datové
struktury použijeme následující struktury:
NEVIDITELNA_CAST STRUC
DB 0
_PristPrava DB ?
_GD DB ?
DB 0
_Baze DD ?
_Limit DD ?
ENDS
Obsah datového bloku je potom následující:
Offset Přiřazený obsah Typ
0000 CR0 DD
0004 EFLAGS DD
0008 EIP DD
000C EDI DD
0010 ESI DD
0014 EBP DD
0018 ESP DD
001C EBX DD
0020 EDX DD
0024 ECX DD
0028 EAX DD
002C DR6 DD
0030 DR7 DD
0034 TR_REG SELEKTOR ( 0*65536 + Hodnota) , LoHi
0038 LDT_REG SELEKTOR ( 0*65536 + Hodnota) -//-
003C GS_REG SELEKTOR ( 0*65536 + Hodnota) atd.
0040 FS_REG SELEKTOR ( 0*65536 + Hodnota)
0044 DS_REG SELEKTOR ( 0*65536 + Hodnota)
0048 SS_REG SELEKTOR ( 0*65536 + Hodnota)
004C CS_REG SELEKTOR ( 0*65536 + Hodnota)
0050 ES_REG SELEKTOR ( 0*65536 + Hodnota)
0054 TR_DESC NEVIDITELNA_CAST
0060 IDTR_DESC NEVIDITELNA_CAST
006C GDTR_DESC NEVIDITELNA_CAST
0078 LDTR_DESC NEVIDITELNA_CAST
0084 GS_DESC NEVIDITELNA_CAST
0090 FS_DESC NEVIDITELNA_CAST
009C DS_DESC NEVIDITELNA_CAST
00A8 SS_DESC NEVIDITELNA_CAST
00B4 CS_DESC NEVIDITELNA_CAST
00C0 ES_DESC NEVIDITELNA_CAST
00CC Délka tabulky
Struktura NEVIDITELNA_CAST:
95 64 63 32 31 0
┌─────────────────┬──────────────────┬──────────────────┐
│ 32 bitový limit │ 32 bitová báze │ Příst. práva │
└─────────────────┴──────────────────┴──────────────────┘
GDTR a IDTR mají přístupová práva dd 0.
Přístupová práva - popis bitů:
31 24 23 22+21 20 19 18 17 16 15 14 13 0
┌────────┬──────────────────────────────┬───────────────┐
│00000000│ P DPL S C E W A 0 D │ 0000000000000 │
└────────┴──────────────────────────────┴───────────────┘
D - Pro CS typ operandu - 0 : 16 bitů
Prostředí 16/32 1 : 32 bitů
A - Accesed - něco se tam stalo (R/W) Význam viz Deskriptor
C - Kódový - lze provádět (Loadall může i pro CS nekódový)
E - Rozšiřování - 0 : Nahoru
1 : Dolů (stack)
W - Zápis - 0 : Zakázán
1 : Povolen
Význam bitů E, W a C se vzájemně ovlivňuje, viz tabulka
┌─────┬─────┬─────┬──────────────────────────────────────┐
│ C │ E │ W │ Význam pro PROTECTED MÓD │
├─────┼─────┼─────┼──────────────────────────────────────┤
│ 0 │ 0 │ 0 │ Datový, pouze čtení, rozšiř. nahoru │
├─────┼─────┼─────┼──────────────────────────────────────┤
│ 0 │ 0 │ 1 │ Datový, i zápis, rozšiř. nahoru │
├─────┼─────┼─────┼──────────────────────────────────────┤
│ 0 │ 1 │ 0 │ Datový, pouze čtení, rozšiř. dolu * │
├─────┼─────┼─────┼──────────────────────────────────────┤
│ 0 │ 1 │ 1 │ Datový, i zápis, rozšiř. dolu-Stack │
├─────┼─────┼─────┼──────────────────────────────────────┤
│ 1 │ 0 │ 0 │ Kód, lze jen provádět │
├─────┼─────┼─────┼──────────────────────────────────────┤
│ 1 │ 0 │ 1 │ Kód, lze provádět a číst │
├─────┼─────┼─────┼──────────────────────────────────────┤
│ 1 │ 1 │ 0 │ Kód, konformní, lze jen provádět │
├─────┼─────┼─────┼──────────────────────────────────────┤
│ 1 │ 1 │ 1 │ Kód, konformní, lze i číst │
└─────┴─────┴─────┴──────────────────────────────────────┘
Varianta označená * je použita v REAL MÓDu a V86 MÓDu pro všechny
registry (i CS), v PROTECTED MÓDu to nejde ! Viz Systém ochrany a
Deskriptor
S - System - 0 : jedná se o datový Deskriptor
1 : Jedná se o systémovou položku (brána, TSS , ...)
DPL - bity 21 a 22 - privilegovanost Deskriptoru
Viz Systém ochrany
P - Present - 0 : Není (operace způsobí chybu, uvnitř procesoru
INT 0D , jinak INT 0C nebo INT 0B
1 : Je přítomen (Ok)
O LOADALL na 486 nevím, ale určitě existuje. Je-li to třeba, užil bych i tam
386-kovou.
Instrukce procesoru
Detekce procesoru
Pro určité účely je vhodné vědět, kde to vlastně program běží (typ operandů,
instrukcí ,možnosti využití ochrany ... ).
Jestliže běžíte v PROTECTED MÓDu s CPL >0, pak většinou nelze provádět
kontrolu procesoru jinak, než přes služby správce. V REAL MÓDu a V86 MÓDu
lze detekovat procesor následovně :
... DOS aplikace, tedy reálný způsob Adresace , buď REAL nebo V86 ...
1. Předpokládáme 8086. Nezávislé na módu :
Push sp
Pop ax
Cmp ax,sp
Jz Ne_8086
.. je to 8086 (88) a jasně REAL
2. Zjistíme-li 8086 , jsme u konce. Jinak je to 80286 nebo lepší.
(80186 zanedbáme, lze ji poznat podle příznaků)
Smsw ax
Shr ax,1
Jc V86_MODE (tedy jasně 386 nebo 486 )
Jnc Real_mode
3. Dosud je jasné jedno : Jsme určitě na 286 (JNC) nebo na 386,
486 (JC).
Pokud jsme v módu REAL (JNC), provedeme :
Mov ax,0FFFFh
Mov cx,020h
Shl ax,cl ; 386,486 maskuje, provede 0 rotací
; 286 nechá být, ax bude 0
Or ax,ax
Je P_286
.. P_386 ..
4. Pokud máme jasno (386, 486), můžeme zkusit něco od 486 :
.386
And esp,0FFFFh ; Jistota ..
Mov edx,esp ; uložíme
And esp,0FFFCh ; Zarovnáme na 4, nechceme INT 11
Pushfd ; Pushneme Eflags
Pop eax
Mov ecx,eax ; Uložíme
Xor eax,40000h ; Prohodíme AC
Push eax
Popfd
Pushfd
Pop eax
Xor eax,ecx ; Vyhodíme vše kromě AC
Push ecx ; Obnovíme Eflags
Popfd
Mov esp,edx ; a stack
Test eax,40000h ; Je AC set ?
.286
Jz P_386 ; Ne, 386
.. 486 ..
POZOR, Může kolidovat se systémem ochrany !
5. Rozlišení SX a DX. Je to trochu přepych na 386, ale potřeba na 486.
486 (Už máme jasno !)
Smsw ax
Test ax,02 ; test přítomnosti kopru
Jz Je_486_SX
Jnz Je_486_DX
386 (Už je jasno !)
Zde je situace komplikovanější. 386SX a 386DX se liší opravdu jen
minimálně. Pomůže nám časování : port 40h.
Provedeme něco na způsob :
Mov si, 100
cld
Mov cx,10000
<--zahájíme časování 0 na port 40h
REP LODSB
<--přečteme port 40h (jede pozpátku !!!), zaznamenáme čas
Mov si, 101 (!)
cld
Mov cx,10000
<--zahájíme časování 0 na port 40h
REP LODSB
<--přečteme port 40h (jede pozpátku !!!), zaznamenáme čas
Porovnáme oba časy. Je-li jejich poměr více, než 1 : 1.16 , pak je to
386SX, jinak 386DX.
Zde je ještě několik tipů, jak detekovat. Následující program pozná
8086, 80186, 80286 a 80386-486.
Pushf
Xor ax,ax
Push ax
Popf
Pushf
Pop ax
And ax,0F000h
Cmp ax,0F000h
Je @@P_8086
Push sp
Pop bx
Cmp bx,sp
Jne @@P_80186
Mov ax,0F000h
Push ax
Popf
Pushf
Pop ax
And ax,0F000h
Je @@P_80286
Mov ax,0003 ;386 a vic
Jmp @@konec
@@P_80286:
Mov ax,0002 ;286 (AT)
Jmp @@konec
@@P_80186:
Mov ax,0001 ;186 hybrid
Jmp @@ven
@@P_8086:
Mov ax,0000 ;8086,88 (XT)
@@konec:
Popf
100% jistota rozeznání instrukcí je "zahákovat" INT 06 a provádět :
New INT 06 : něco ve stylu :
Pop ax ; stare IP zahodíme
Mov ax,offset konec
Push ax ; a pujdeme jinam
Iret
.486
Xor SI,SI ; SI je výsledek - 0: 8086
Push sp
Pop ax
Cmp ax,sp ; 8086 nepodporuje INT 06
Jnz @konec
Inc si
Inc si ; 2: 80286
Xor eax,eax
Inc si ; 3: 80386
Bswap ax
Inc si ; 4: 80486
Nop
.286
konec:
Pozn.: není problém vybrat i jiný instrukce, ale nedoporučuju ty, co pracují
se stackem, systémem ochrany a působí jinak destruktivně (OUTS a pod.)
Je to moc hezký a jednoduchý, než aby to fungovalo. V REAL MÓDu to
nejspíš pude, PROTECTED MÓD Vám nedovolí alokovat INT 06 a u
V86 MÓDu záleží na náladě správce. Zkoušel jsem na 386MAX, QEMM a EMM,
fungovalo to.
Zde je ještě alternativní test 386SX/DX , nevím ale, jak moc to je spolehlivý
.. jsme na 386 ....
.386
Mov EAX,12345678
Mov EDX, 0
Mov EDI, 0
Pushad
Popad
; Instrukce následující za POPAD je kritické místo. Vložíte-li
; bezprostředně za POPAD instrukci NOP, bude POPAD fungovat správně.
Mov ECX, [EDX+EDI]
Cmp EAX,12345678 ; Je EAX shodné s originálem?
Je OK ; Je, asi (98%) 386SX.
.. ne ! Je to 386DX ..
Jestliže potřebujete detekovat 8088, 80188, V20, V30 a podobné, zašlete
100,- Kč na moji adresu a obratem dostanete kompletní program s detekcí
všeho ( i koprocesoru ). Moje adresa
Zatím od sebe nepoznám 486DX, 486DX/2, 486DX/4 a Pentium .
Detekce koprocesoru Procesory
Adresa autora
Jestliže mi chcete sdělit něco ohledně prohlížecího programu, věcné stránky
nebo Vašich zkušeností při práci s PC, zašlete mi dopis na adresu :
Ladislav Vagner
U splavu 12
Praha 10
───────────────────────
106 00 Česká republika
Nejsem k zastižení nikde na BBS a nemám E-mail adresu.
Jestliže mi chcete vynadat, že program nefunguje, nebo způsobil škodu,
vězte, že mě to je líto, ale je to jen SHAREWARE.
Při kompletaci tohoto systému jsem čerpal : viz Literatura .
Seznam kapitol
Použitá literatura
Kapitolu uvádím jen pro doplnění, žádnou z uvedených knížek nebudete
potřebovat, máte přece tento program ! Ve sloupci vlevo s * jsou užitečné knížky
a zdroje (mohl byste mít), ** Velmi užitečné (musíte mít, vlastníte-li HD více
než 1GB) a bez jsou pochybné zdroje (knihovna ani HD nejsou nekonečné).
* TECH HELP - elektronický manuál (A)
**PRO HELP - elektronický manuál (Č)
* DOS HELP - elektronický manuál (A)
* SYSMAN - elektronický manuál (Č)
* HELP PC - elektronický manuál (A)
**Intervue, seznam všech INTů, Ralf Brown - elektronický manuál (A)
**80386,80387 - Ondřej Čada, PLUS (Č)
**ProHELP - elektronický manuál (Č)
* Assembler 3.0 - ??, GRADA (Č)
* Programování obrazovkových adapterů PC M.Šnorek, P.Slavík , GRADA (Č)
Svazek KONZULT, Z.Vrátil, GETHON (díly 2., 3. a 6.) (Č)
* Assembler 2.5 - User's guide (A)
* Turbo Pascal 6.0 7.0 programátorská příručka, ?? (Č)
* Časopis BAJT (Programátorské perličky, popis služeb EMS, XMS, VGA)(Č)
* Dos Protected Mode Interface (A)
* The Virtual Control Program Interface, Phar Lap Software (A)
(Na místech ??? by měl být autor nebo vydavatelství. Já se velmi omlouvám,
že tomu tak není, ale ty knížky jsem měl půjčený a něco jsem už zapomněl.)
Seznam kapitol Moje adresa
Upper Memory Block - UMB
UMB bloky existují jen na 386 a 486 striojích. Nalézají se v adresním prostoru
B000-FFFF. Chovají se slušně jako paměť BASE (0000-9FFF), lze v nich bez
nutnosti úprav spouštět realmódový software, používat DOS a BIOS.
Jejich alokace je přes DOS Fn 48 s předchozím nastavením DOS Fn 58 .
V repertoáru služeb XMS sice naleznete funkce pro alokaci UMB, ale vězte,
že HIMEM začíná ve stylu :
Cmp ah,0F
Jc @Sluzba_XMS
;..služba UMB ...
Xor ax,ax ;- signalizace chyby
Mov bl,0B1 ; kód chyby - není UMB
retf,
takže se o UMB vůbec nezajímá. Od DOSu v 5.0 existuje podpora UMB ve formě
DEVICEHIGH=driver místo DEVICE=driver a Loadhigh program místo program.
Obě tyto služby se pokusí využít UMB, je-li přítomen.
V dodávce QEMM existují programy pro tutéž funkci - loadhi.com a loadhi.sys.
Dokáží totéž, přičemž samy dokáží optimalizovat umístění TSR v UMB. Proti
nim je DEVICEHIGH= jen čajíček.
Pro krátký rezident se v UMB vždy najde místo, a tak doufám, že AThelp.com
je nahrán také tam (na 486 a 386).
Viz také Mapa paměti XMS EMS MCB Funkce DOSu
Mapa paměti
Jestliže se ocitnete u PC, máte jistotu, že jeho paměť bude organizovavá
pokaždé jinak. Na obrázcích jsou zakresleny stavy paměti (klasické) pro XT,
AT 286 a 38ž-486. V poznámce jsou uvedeny ovladače a fígle.
XT - 8086 procesor.
Segnent:
0 3F 4F 6F 70 9FFF BFFF EFFF FFFF
┌───┬───┬─────┬───────────────────────┬───────────┬─────────────────┬──────────┐
│ V │ B │ DOS │ TSR, DOS, volná paměť │ Video RAM │ XXX (Video ROM) │ ROM BIOS │
└───┴───┴─────┴───────────────────────┴───────────┴─────────────────┴──────────┘
V - Vektory CPU
B - Datová oblast BIOSu
DOS - Datová oblast DOSu
TSR, DOS, .. - Instalované ovladače, jádro DOSu, aplikace ....
Video RAM - podle typu obsazuje :
B800-BFFF - Video text, vždy
B000-B800 - Hercules, grafika
A000-AFFF - VGA, EGA, CGA
XXX - Prázdno, Video ROM nebo Page Frame pro EMS
ROM BIOS - obsluha Přerušení BIOSu
AT - 80286 procesor.
Segnent:
0 3F 4F 6F 70 9FFF BFFF EFFF FFFF
┌───┬───┬─────┬───────────────────────┬───────────┬─────────────────┬──────────┐
│ V │ B │ DOS │ TSR, DOS, volná paměť │ Video RAM │ XXX (Video ROM) │ ROM BIOS │
└───┴───┴─────┴───────────────────────┴───────────┴─────────────────┴──────────┘
10000 11000 ???? (Podle velikosti)
┌─────┬───────────────────────────────────────────┐
│ HMA │ XMS nebo Extended paměť │
└─────┴───────────────────────────────────────────┘
V - Vektory CPU
B - Datová oblast BIOSu
DOS - Datová oblast DOSu
TSR, DOS, .. - Instalované ovladače, jádro DOSu, aplikace ....
Video RAM - podle typu obsazuje :
B800-BFFF - Video text, vždy
B000-B800 - Hercules, grafika
A000-AFFF - VGA, EGA, CGA
XXX - Prázdno nebo Video ROM
ROM BIOS - obsluha Přerušení BIOSu
HMA - High memory area - adresovatelná pomocí přístupu v REAL MÓDu ,
často hnízdiště DOSu. Viz XMS a A20 .
XMS - rozšířená paměť dostupná z REAL MÓDu pomocí ovladače XMS (HIMEM).
Extended - paměť nad 1MB (včetně HMA) přístupná pomocí služeb BIOS INT 15
Pozn.: Celá paměť AT 286 je dostupná pomocí PROTECTED MÓDu . Na 286 nebyl
příliš populární. Celková paměť 286 nebyla nikdy větší než 16MB.
AT - 80386, 486 procesor.
Segnent:
0 3F 4F 6F 70 9FFF BFFF EFFF FFFF
┌───┬───┬─────┬───────────────────────┬───────────┬─────────────────┬──────────┐
│ V │ B │ DOS │ TSR, DOS, volná paměť │ Video RAM │ XXX (Video ROM) │ ROM BIOS │
└───┴───┴─────┴───────────────────────┴───────────┼─────────────────┴──────────┤
│ RAM Shadow │
└─────────────╥──────────────┘
║ Realokace
║
10000 11000 (podle velikosti) ??? ▼
┌─────┬───────────────────────────────────────────┐ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
│ HMA │ XMS , EMS Extended paměť │ Přemapovaná RAM Shadow │
└─────┴───────────────────────────────────────────┘ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
V - Vektory CPU
B - Datová oblast BIOSu
DOS - Datová oblast DOSu
TSR, DOS, .. - Instalované ovladače, jádro DOSu, aplikace ....
Video RAM - podle typu obsazuje :
B800-BFFF - Video text, vždy
B000-B800 - Hercules, grafika, Přemapovaná Video ROM (386MAX)
A000-AFFF - VGA, EGA, CGA (Prodloužená RAM, není-li
použita grafika - QEMM, 386MAX)
XXX - Video ROM, Bloky UMB , Page Frame pro EMS
ROM BIOS - obsluha Přerušení BIOSu
HMA - High memory area - adresovatelná pomocí přístupu v REAL MÓDu ,
často hnízdiště DOSu. Viz XMS a A20 .
XMS - rozšířená paměť dostupná z REAL MÓDu pomocí ovladače XMS (HIMEM,
QEMM, 386MAX).
Extended - paměť nad 1MB (včetně HMA) přístupná pomocí služeb BIOS INT 15
EMS - přídavná paměť mapovatelná do Page Frame
Realokace: Je-li přítomna Shadow RAM, lze ji přemapovat za konec Extended
a zvětšit tak dostupnou paměť o 384 KB. Podporuje to Setup počítače,
pro některé základní desky i QEMM a 386MAX. Realokace je věc
hardware, dosahuje se jí pomocí I/O portů (ne Stránkováním ).
Není-li Shadow RAM realokovaná, kopíruje se do ní ROM, aby rutiny
běžely rychleji. Není to ale moc výrazná změna.
Pozn.: Celá paměť AT 386 je dostupná pomocí PROTECTED MÓDu . Přemapování mají
význam jen pro V86 MÓD , realokace pomocí Setupu i pro ostatní módy.
UMB HMA XMS EMS A20 PROTECTED MÓD Procesory A20
Propojovací kabely pro PC
Pokud zrovna nejste hardwéráři amatéři, nemusíte tuto kapitolu číst. Raději si
přečtěte Máchův Máj nebo podobnou poučnou a češtináři doporučovanou literaturu.
Pokud máte normální PC, naleznete na jeho zadní straně kromě spousty šroubů,
matic, přepínačů, nevyužitých slotů a podobného haraburdí i několik konektorů
tvaru rovnoramenného lichoběžníku se zaoblenými rohy. Ty jsou předmětem zájmu
této kapitoly. V zásadě ( a někdy i v kyselině ) existují tyto porty :
Sériový. Jeho charakteristickým znakem je sameček typu Canon s 9 nebo 25
piny. Jeden bývá použit pro myš, druhý pak pro modem (pokud ho máte).
S modemem je sice legrace, ale s prázdným portem může být větší. Lze jej snadno
využít pro Plotter a sériovou komunikaci. Pak se nechají hrát hry jako
RETAL ve dvou a je víc srandy.
1 1 1 1 2 - TxD 1, 9,10,11,12,13,
1 2 3 4 5 6 7 8 9 0 1 2 3 3 - RxD 14,15,16,17,18,19,
┌───────────────────────────┐ 4 - RTS 21,23,24 a 25 - Rezervováno
│ • • • • • • • • • • • • • │ 5 - CTS ( A mysli si co chceš. Jako
└┐ ┌┘ 6 - DSR vždycky u IBM. )
│ • • • • • • • • • • • • │ 7 - GND
└─────────────────────────┘ 8 - DCD
2 2 2 2 2 2 1 1 1 1 1 1 20- DTR
5 4 3 2 1 0 9 8 7 6 5 4 22- RI
Na pinech 10 a 11 se vám někdy poštěstí najít 5V ze zdroje. Opatrně.
1 2 3 4 5 1 - DCD 8 - CTS
┌───────────┐ 2 - RxD 9 - RI
│ • • • • • │ 3 - TxD
└┐ ┌┘ 4 - DTR
│ • • • • │ 5 - GND
└─────────┘ 6 - DSR
9 8 7 6 7 - RTS Sériové porty
Paraelní. Legrace je o něco méně, protože bývá jen jeden a to trvale obsazen
tiskárnou. Pokud tiskárnu odpojíte a do dvou paraelů vrazíte komunikační kabel,
získáte poměrně rychlou komunikaci 2 počítačů. Programy jako M602 v 2.00 a
Norton Commander v 4.0 to využijí a můžete přenášet data podstatně rychleji než
po sériáku nebo disketě. Rychlost paraelu odhaduji 2x až 3x vyšší než u diskety.
Paraelní port je samice Canon 25.
Velmi jednoduché a přitom výkonné je zapojení D/A převodníku na LPT. PC
pak hraje na Covox skoro jako na SB (...).
1 - ┐STROBE 13 - SLCT
1 1 1 1 2 - D0 14 - ┐AUTOFEED
1 2 3 4 5 6 7 8 9 0 1 2 3 3 - D1 15 - ┐ERROR
┌───────────────────────────┐ 4 - D2 16 - ┐INIT
│ o o o o o o o o o o o o o │ 5 - D3 17 - ┐SELECT
└┐ ┌┘ 6 - D4 18..25 - GND
│ o o o o o o o o o o o o │ 7 - D5
└─────────────────────────┘ 8 - D6 '┐' znamená symbol negace
2 2 2 2 2 2 1 1 1 1 1 1 9 - D7
5 4 3 2 1 0 9 8 7 6 5 4 10 - ┐ACKNOWLEDGE
11 - BUSY
12 - PE Paralelní porty
Game port. Vyskytuje se jen někdy a funguje jen jako vstupní. Použitelný je
opravdu jen na joystick. Bohužel. Je to samice Canon 15.
1 - +5 V 9 - +5 V
1 2 3 4 5 6 7 8 2 - D4 10 - D6
┌─────────────────┐ 3 - D0 11 - D2
│ o o o o o o o o │ 4 - GND 12 - GND
└┐ ┌┘ 5 - GND 13 - D3
│ o o o o o o o │ 6 - D1 14 - D7
└───────────────┘ 7 - D5 15 - +5 V
1 1 1 1 1 1 9 8 - +5 V
5 4 3 2 1 0
Obsluha viz BIOS INT 15 , Porty joysticku .
Nezatěžujte příliš interní zdroj PC. Odběr by neměl přesáhnout 200 mA. Vhodné
je rovněž při použití induktivní zátěže ( relé a pod. ) na napájení umístit
antiparalelní diodu a kondenzátor.
Sériové :
Redukce 9/25 a zpět
9 pin 25 pin
1 8
2 3
3 2
4 20
5 7
6 6
7 4
8 5
9 22
Spojování
Null modem I. Null modem II.
25 pin 25 pin 25 pin 25 pin
1 1 1 1
2 3 2 3
3 2 3 2
4 5 4+5 8
5 4 8 4+5
6 20 6 20
20 6 20 6
7 7 7 7
Null modem III. Null modem IV.
25 pin 25 pin 25 pin 25 pin
1 1 1 1
2 3 2 3
3 2 3 2
4 8 5+6+8 20
8 4 20 5+6+8
5+6 20 7 7
20 5+6 15 17
22 22 17 15
7 7
Paraelní
Kabel - spoj k tiskárně
Počítač tiskárna
1 1
2 2
3 3
4 4
5 5
.....atd. Jak u ....
14 14
15 32
16 31
17 36
18 33
19..25 19..30, 16
Stínění 17
Paraelní kabel - LAPlink
25 pin 25 pin
2 15
3 13
4 12
5 10
6 11
10 5
11 6
12 4
13 3
15 2
18 18
Covox - "D/A" převodník
2 ────████─────┐ R R volím 500 Ω
│
3 ────████─────┤ 2*R
│
4 ────████─────┤ 4*R
│
5 ────████─────┤ 8*R
│
6 ────████─────┤ 16*R
│
7 ────████─────┤ ....
│
8 ────████─────┤ .... C asi 100 nF
│
9 ────████─────┴────────┤├────>
K zesilovači
(Poměrně vysoké napětí, někdy je vhodné
předřadit dělič 1:2 .. 1:5)
18 ────────────────────────────> Zem
8x 20 KΩ 9x 10 KΩ
2 ────████─────┬───████──┐
█ │
3 ────████─────┤ ┴
█
4 ────████─────┤
█
5 ────████─────┤
█
6 ────████─────┤
█
7 ────████─────┤
█
8 ────████─────┤ C asi 100 nF
█
9 ────████─────┼────────┤├────>
█ K zesilovači
18 ─────────────┴──────────────> Zem
Video přípojky
Zapojení VGA monitoru :
5 4 3 2 1 1 - Modulace červené. Napětí odpovídá
┌───────────────────────┐ intenzitě
│ o o o o o │ 2 - Modulace zelené (bílé pro BW)
└┐ 10 9 8 7 6 ┌┘ 3 - Modulace modré.
│ o o o o o │ 6 - červená GND
└┐ 15 14 13 12 11┌┘ 7 - zelená GND (6,7,8 bývají propojené)
│ o o o o o │ 8 - modrá GND
└───────────────────┘ 13 - řádkový SYNC
14 - snímkový SYNC
5,10 - GND
12 - spojeno se zemí - BW, jinak barva
(rozlišení barevný/BW monitor)
Pokud se na monitoru v nepravidelných intervalech nění barvy, je asi poškozen
výstup 1,2 nebo 3. Je-li během POSTu hlášena chyba VIDEO (2C), bývá příčina
zde.
Zapojení EGA monitoru :
1 2 3 4 5 1 - GND - zem
┌───────────┐ 2 - sekundární červená (33% intenzity)
│ o o o o o │ 3 - primární červená (66% intenzity)
└┐ ┌┘ 4 - primární zelená -//-
│ o o o o │ 5 - primární modrá -//-
└─────────┘ 6 - sekundární zelená 33% -//-
9 8 7 6 7 - sekundární modrá 33% -//-
8 - řádková SYNC ▲
9 - snímková SYNC (Jako v paletě EGA)
I/O Porty Seznam kapitol
Přesun dat
MOV Obecný tvar: Mov kam, odkud
═══════════════════════════════════════════════════════════════════════════
Mov přesune byte nebo word z místa (odkud) na místo (kam)
Na 8086 jsou povoleny tyto kombinace :
1. Mov registr, místo v paměti Mov ax,word ptr ds:[di]
2. Mov místo v paměti, registr Mov word ptr ds:[di],ax
3. Mov Seg.Registr, registr Mov ds,ax
Seg.Registr jen DS, ES nebo SS. NE CS !!
4. Mov registr, Seg.registr Mov ax,cs
NBez omezemí
5. Mov registr,hodnota Mov bl,90h
registr není segmentový
6. Mov registr,registr Mov ax,cx
7. Mov místo v paměti, hodnota Mov word ptr es:[di],0
Nemění příznaky.
LEA Obecný tvar: LEA reg, co
═══════════════════════════════════════════════════════════════════════════
Lea přesune offset (co) do registru
Já tím šetřím v TASMu 6 písmen :
místo Mov bx,offset něco napíšu Lea bx,něco
1. Lea reg,místo Lea bx,[bp-09]
reg není Segmentový registr, vždy 16 bitů
Nemění příznaky.
LDS Obecný tvar: LDS reg, odkud
═══════════════════════════════════════════════════════════════════════════
Lds naplní ds a reg ukazatelem (dlouhý realmódový) z (odkud).
1. LDS reg, místo v paměti Lds si,dword ptr es:[bx]
reg je 16 bitů
Nemění příznaky.
LES Obecný tvar: LES reg, odkud
═══════════════════════════════════════════════════════════════════════════
Les naplní es a reg ukazatelem (dlouhý realmódový) z (odkud).
1. LES reg, místo v paměti Les si,dword ptr es:[bx]
reg je 16 bitů
Nemění příznaky.
XCHG Obecný tvar: XCHG co1, co2
═══════════════════════════════════════════════════════════════════════════
Xchg vymění (co1) a (co2)
1. Xchg reg, místo v paměti Xchg ax,word ptr ds:[bx]
Xchg místo v paměti, reg Xchg word ptr ds:[bx],ax
2. Xchg reg1,reg2 Xchg ax,cx
reg1 a reg2 nejsou segmentové registry
Nemění příznaky.
LAHF Obecný tvar: LAHF
═══════════════════════════════════════════════════════════════════════════
Lahf naplní ah příznaky : SF,ZF,0,AF,0,PF,0,CF.
1. Lahf Lahf
Nemění příznaky.
SAHF Obecný tvar: SAHF
═══════════════════════════════════════════════════════════════════════════
Sahf naplní příznaky SF,ZF,0,AF,0,PF,0,CF hodnotou uloženou v ah.
Formát ah - viz LAHF.
1. Sahf Sahf
Mění příznaky SF,ZF,CF,AF a PF.
PUSH Obecný tvar: PUSH co
═══════════════════════════════════════════════════════════════════════════
Uloží (co) na zásobník. (Co) je 16 bitů. Sníží SP o 2.
1. Push reg Push ax
2. Push segreg Push cs
3. Push místo v paměti Push word ptr ds:[bx+di]
Nemění příznaky.
PUSHF Obecný tvar: PUSHF
═══════════════════════════════════════════════════════════════════════════
Uloží obsah FLAGS na zásobník. Sníží SP o 2.
1.Pushf Pushf
Nemění příznaky.
POPF Obecný tvar: POPF
═══════════════════════════════════════════════════════════════════════════
Obnoví FLAGS ze zásobníku. Zvýší SP o 2.
1.Popf Popf
Mění všechny příznaky.
POP Obecný tvar: POP co
═══════════════════════════════════════════════════════════════════════════
Obnoví co ze zásobníku. Zvýší SP o 2.
1. Pop reg Pop ax
2. Pop segreg Pop ds
segreg není CS
3. Pop místo v paměti Pop word ptr ss:[bp+58]
Nemění příznaky.
XLAT Obecný tvar: XLAT
═══════════════════════════════════════════════════════════════════════════
Do al uloží byte z paměti určený ds:[BX+AL]. Hodí se pro výběr z tabulky.
1. XLAT XLAT
Nemění příznaky.
IN Obecný tvar: IN kam,odkud
═══════════════════════════════════════════════════════════════════════════
Přečte port určený (odkud) a výsledek uloží do (kam). Pracuje s 8 a 16 bity.
Kam je buď al nebo ax, odkud je buď číslo < 0FF nebo DX.
1. In reg, hodnota In ax,21
2. In reg, dx In ax,dx
Nemění příznaky.
OUT Obecný tvar: OUT kam,co
═══════════════════════════════════════════════════════════════════════════
Na port (kam) zapíše (co). (Co) může být buď al nebo ax, (kam) je buď číslo
0FF nebo dx.
1. Out hodnota,reg Out 20,al
2. Out dx,reg Out dx,al
Nemění příznaky.
Instrukce 8086 Instrukce procesoru Registry procesoru
Aritmetické instrukce 8086
ADD Obecný tvar: ADD kam,co
═══════════════════════════════════════════════════════════════════════════
Add přičte k (kam) (co) a výsledek uloží do (kam). Případné přetečení se
objeví v CF.
1. Add reg, reg Add cx,dx
2. Add reg, místo v paměti Add ax, word ptr ds:[si]
3. Add místo v paměti, reg Add byte ptr cs:[bx],ch
4. Add reg, hodnota Add ax,90
5. Add místo v paměti, hodnota Add byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
ADC Obecný tvar: ADC kam,co
═══════════════════════════════════════════════════════════════════════════
Adc přičte k (kam) (co) a CF. Výsledek uloží do (kam). Případné přetečení se
objeví v CF.
1. Adc reg, reg Adc cx,dx
2. Adc reg, místo v paměti Adc ax, word ptr ds:[si]
3. Adc místo v paměti, reg Adc byte ptr cs:[bx],ch
4. Adc reg, hodnota Adc ax,90
5. Adc místo v paměti, hodnota Adc byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
SUB Obecný tvar: SUB kam,co
═══════════════════════════════════════════════════════════════════════════
Sub odečte od (kam) (co) a výsledek uloží do (kam).Případné podtečení se
objeví v CF.
1. Sub reg, reg Sub cx,dx
2. Sub reg, místo v paměti Sub ax, word ptr ds:[si]
3. Sub místo v paměti, reg Sub byte ptr cs:[bx],ch
4. Sub reg, hodnota Sub ax,90
5. Sub místo v paměti, hodnota Sub byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
SBB Obecný tvar: SBB kam,co
═══════════════════════════════════════════════════════════════════════════
Sbb odečte od (kam) (co) a CF. Výsledek uloží do (kam). Případné podtečení se
objeví v CF.
1. Sbb reg, reg Sbb cx,dx
2. Sbb reg, místo v paměti Sbb ax, word ptr ds:[si]
3. Sbb místo v paměti, reg Sbb byte ptr cs:[bx],ch
4. Sbb reg, hodnota Sbb ax,90
5. Sbb místo v paměti, hodnota Sbb byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
INC Obecný tvar: INC co
═══════════════════════════════════════════════════════════════════════════
(Co) zvětší o 1. Případné přetečení se objeví v CF.
1. Inc reg Inc ax
2. Inc místo v paměti Inc byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
DEC Obecný tvar: DEC co
═══════════════════════════════════════════════════════════════════════════
(Co) zmenší o 1. Případné podtečení se objeví v CF.
1. Dec reg Dec ax
2. Dec místo v paměti Dec byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
AAA Obecný tvar: AAA
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po sečtení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aaa Aaa
Mění příznaky CF a AF.
DAA Obecný tvar: DAA
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po sečtení dvou BCD čísel tak, aby výsledek byl opět
BCD. Týká se al.
1. Daa Daa
Mění příznaky CF a AF.
CMP Obecný tvar: SUB co1,co2
═══════════════════════════════════════════════════════════════════════════
Cmp odečte od (co1) (co2). Výsledek nikam neukláda. Nastaví podle něj jen
příznaky.
1. Cmp reg, reg Cmp cx,dx
2. Cmp reg, místo v paměti Cmp ax, word ptr ds:[si]
3. Cmp místo v paměti, reg Cmp byte ptr cs:[bx],ch
4. Cmp reg, hodnota Cmp ax,90
5. Cmp místo v paměti, hodnota Cmp byte ptr ds:[di],05
Mění příznaky CF, AF, ZF, OF, SF a PF.
NEG Obecný tvar: NEG co
═══════════════════════════════════════════════════════════════════════════
Do (co) uloží dvojkový doplňek (co). V podstatě násobí -1.
1. Neg reg Neg ax
2. Neg místo v paměti Neg byte ptr es:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
AAS Obecný tvar: AAS
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po odečtení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aas Aas
Mění příznaky CF a AF.
DAS Obecný tvar: DAS
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po odečtení dvou BCD čísel tak, aby výsledek byl opět
BCD.Týká se al.
1. Das Das
Mění příznaky CF a AF.
MUL Obecný tvar: MUL čím
═══════════════════════════════════════════════════════════════════════════
Provede vynásobení AL nebo AX (čím). Je-li (čím) byte, pak se násobí AL (čím)
a výsledek se objeví v AX. Je-li (čím) WORD, pak se násobí AX (čím) a výsledek
se uloží do DX:AX. Předpokládá kladná čísla bez znaménka.
1. Mul reg Mul bl
2. Mul místo v paměti Mul word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
IMUL Obecný tvar: IMUL čím
═══════════════════════════════════════════════════════════════════════════
Provede vynásobení AL nebo AX (čím). Je-li (čím) byte, pak se násobí AL (čím)
a výsledek se objeví v AX. Je-li (čím) WORD, pak se násobí AX (čím) a výsledek
se uloží do DX:AX. Předpokládá, že čísla jsou se znaménkem.
1. Imul reg Imul bl
2. Imul místo v paměti Imul word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
DIV Obecný tvar: Div čím
═══════════════════════════════════════════════════════════════════════════
Vydělí AX nebo DX:AX (čím). Je-li (čím) word, pak dělí DX:AX, podíl uloží
do AX a zbytek do DX. Je-li (čím) byet, pak vydělí AX (čím), podíl do AL a
zbytek do AH. Předpokládá kladná čísla bez znaménka.
1. Div reg Div bl
2. Div místo v paměti Div word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
Dojde-li k přetečení, vyvolá INT 00 .
DIV Obecný tvar: Div čím
═══════════════════════════════════════════════════════════════════════════
Vydělí AX nebo DX:AX (čím). Je-li (čím) word, pak dělí DX:AX, podíl uloží
do AX a zbytek do DX. Je-li (čím) byet, pak vydělí AX (čím), podíl do AL a
zbytek do AH. Předpokládá čísla se znaménkem.
1. Idiv reg Idiv bl
2. Idiv místo v paměti Idiv word ptr ds:[di]
Mění příznaky CF, AF, ZF, OF, SF a PF.
Dojde-li k přetečení, vyvolá INT 00 .
AAM Obecný tvar: AAM
═══════════════════════════════════════════════════════════════════════════
Provádí korekci po násobení dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aam Aam
Mění příznaky CF a AF.
AAD Obecný tvar: AAD
═══════════════════════════════════════════════════════════════════════════
Provádí korekci před dělením dvou ASCII čísel tak, aby výsledek byl opět
ASCII. Týká se al.
1. Aad Aad
Mění příznaky CF a AF.
CBW Obecný tvar: CBW
═══════════════════════════════════════════════════════════════════════════
Provádí znaménkové rozšíření AL do AX.
1. Cbw Cbw
Nemění příznaky.
CWD Obecný tvar: CWD
═══════════════════════════════════════════════════════════════════════════
Provádí znaménkové rozšíření AX do DX:AX.
1. CWD CWD
Nemění příznaky.
Instrukce 8086 Instrukce procesoru Registry procesoru
Logické instrukce 8086
XOR Obecný tvar: XOR kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické eXclusive or (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace XOR :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 0 │
└──────────┴──────────┴────────────┘
1. Xor reg,reg Xor ax,ax
2. Xor reg, místo v paměti Xor ax,word ptr ds:[di]
3. Xor místo v paměti, reg Xor word ptr ds:[di],reg
4. Xor reg,hodnota Xor dx,0505
5. Xor místo v paměti, hodnota Xor byte ptr es:[bp],15
Poznámka : k nulování registru je nejrychlejší použít Xor reg,reg.
Např.: Xor dx,dx ; nuluje dx
AND Obecný tvar: AND kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické And (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace AND :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 0 │
│ 1 │ 0 │ 0 │
│ 1 │ 1 │ 1 │
└──────────┴──────────┴────────────┘
1. And reg,reg And ax,ax
2. And reg, místo v paměti And ax,word ptr ds:[di]
3. And místo v paměti, reg And word ptr ds:[di],reg
4. And reg,hodnota And dx,0505
5. And místo v paměti, hodnota And byte ptr es:[bp],15
OR Obecný tvar: OR kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické Or (kam) a (co).Výsledek uloží do (kam).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace OR :
┌──────────┬──────────┬────────────┐
│ 1. Bit │ 2. Bit │ Výsledek │
╞══════════╪══════════╪════════════╡
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 1 │
└──────────┴──────────┴────────────┘
1. Or reg,reg Or ax,ax
2. Or reg, místo v paměti Or ax,word ptr ds:[di]
3. Or místo v paměti, reg Or word ptr ds:[di],reg
4. Or reg,hodnota Or dx,0505
5. Or místo v paměti, hodnota Or byte ptr es:[bp],15
NOT Obecný tvar: NOT co
═══════════════════════════════════════════════════════════════════════════
Provede logické Not (co), výsledek uloží do (co).
Mění příznaky : CF=0, OF=0, PF, ZF, SF, AF.
Operace NOT :
┌──────────┬────────────┐
│ 1. Bit │ Výsledek │
╞══════════╪════════════╡
│ 1 │ 0 │
│ 0 │ 1 │
└──────────┴────────────┘
1. Not reg Not ax
2. Not místo v paměti Not word ptr ds:[di]
TEST Obecný tvar: TEST kam,co
═══════════════════════════════════════════════════════════════════════════
Provede logické And (kam) a (co).Výsledek nikam neukládá, nastaví podle něj.
příznaky : CF=0, OF=0, PF, ZF, SF, AF.
1. Test reg,reg Test ax,ax
2. Test reg, místo v paměti Test ax,word ptr ds:[di]
3. Test místo v paměti, reg Test word ptr ds:[di],reg
4. Test reg,hodnota Test dx,0505
5. Test místo v paměti, hodnota Test byte ptr es:[bp],15
Instrukce 8086 Instrukce procesoru Registry procesoru
Instrukce pro práci s řetězci dat 8086
LODS Obecný tvar: LODS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. LODSB Do AL BYTE z adresy ds:[si], SI zvětší o 1 ( DF=0 )
SI zmenší o 1 ( DF=1 )
2. LODSW Do AX WORD z adresy ds:[si], SI zvětší o 2 ( DF=0 )
SI zmenší o 2 ( DF=1 )
Segmentový registr lze prefixem změnit na CS, ES nebo SS.
Nemění příznaky.
STOS Obecný tvar: STOS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. STOSB AL uloží na adresu es:[di], DI zvětší o 1 ( DF=0 )
DI zmenší o 1 ( DF=1 )
2. STOSW AX uloží na adresu es:[di], DI zvětší o 2 ( DF=0 )
DI zmenší o 2 ( DF=1 )
Segment es NELZE změnit.
Nemění příznaky.
MOVS Obecný tvar: MOVS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. MOVSB Provede LODSB + STOSB
2. MOVSW Provede LODSW + STOSW
Instrukce se používají k přenosu většího množství dat.
Nemění příznaky.
SCAS Obecný tvar: SCAS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. SCASB Porovná AL s BYTEm z adresy es:[di], DI zvětší o 1 ( DF=0 )
DI zmenší o 1 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
2. SCASW Porovná AX s WORDem z adresy es:[di], DI zvětší o 2 ( DF=0 )
DI zmenší o 2 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
CMPS Obecný tvar: CMPS
═══════════════════════════════════════════════════════════════════════════
Tato instrukce má 2 typy :
1. CMPSB BYTE z ds:[si] s BYTE z es:[di], SI a DI zvětší o 1 ( DF=0 )
SI a DI zmenší o 1 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
2. CMPSW WORD z ds:[si] s WORD z es:[di], SI a DI zvětší o 2 ( DF=0 )
SI a DI zmenší o 2 ( DF=1 )
Podle výsledku srovnání nastaví ZF a ostatní příznaky.
REP Obecný tvar: REP
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím STOS a MOVS (i k LODS,
ale tam to je jen zdržování ..). Zaručuje, že se následující instrukce
provede cx - krát. Na konci je tedy cx 0.
Následující kód vyčistí celý data segment :
Xor di,di
Xor ax,ax
Push ds
Pop es
Mov cx,8000h
Cld
Rep Stosw
REPZ Obecný tvar: REPZ
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím SCAS a CMPS . Zaručuje,
že se následující instrukce provede cx - krát, pokud zároveň bude ZF=1.
Při používání s CMPS pozor ! Nulové CX po skončení práce nezaručuje shodu.
Kontrola se provádí :
....... es,di,ds,si,cx inicializováno ....
Cld
REPZ CMPSB
Jz @srovnání_ok
Jnz @srovnáná_neok
REPNZ Obecný tvar: REPNZ
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k instrukcím SCAS a CMPS . Zaručuje,
že se následující instrukce provede cx - krát, pokud zároveň bude ZF=0.
! POZOR !
Při práce s instrukcemi pro řetězce dat VŽDY nastavujte správně DF.
Cld nebo Std by mělo být před každou takovou instrukcí.
Instrukce 8086 Instrukce procesoru Registry procesoru
Instrukce řídící 8086
Prefixy změny segmentu Obecný tvar: CS:, ES:, SS:
═══════════════════════════════════════════════════════════════════════════
Tato instrukce se používá jako prefix k ostatním instrukcím. Zaručuje,
že se následující instrukce provede v jiném, než implicitním segmentu.
Assembler je doplňuje automaticky.
Obsazení implicitních segmentů :
┌───────────────────┬───────────┬───────────┬─────────────────────┐
│ Odkaz │ Impl. seg │ Alt. seg │ Offset │
╞═══════════════════╪═══════════╪═══════════╪═════════════════════╡
│Výběr instrukce pgm│ CS │ nelze │ IP │
│Práce se zásobníkem│ SS │ nelze │ SP │
│Zdrojový řetězec │ DS │ CS,ES,SS │ SI │
│Cílový řetězec │ ES │ nelze │ DI │
│Data obecně │ DS │ CS,DS,ES │BX,BP,SI,DI,kombinace│
│BP použit jako báze│ SS │ CS,DS,ES │BX,BP,SI,DI,kombinace│
└───────────────────┴───────────┴───────────┴─────────────────────┘
CLC Obecný tvar: CLC
═══════════════════════════════════════════════════════════════════════════
Nastaví CF na 0.
STC Obecný tvar: STC
═══════════════════════════════════════════════════════════════════════════
Nastaví CF na 1.
CMC Obecný tvar: CMC
═══════════════════════════════════════════════════════════════════════════
Přehodí hodnotu CF.
CLD Obecný tvar: CLD
═══════════════════════════════════════════════════════════════════════════
Nastaví DF na 0. Řetězce se zpracovávají odpředu.
STD Obecný tvar: STD
═══════════════════════════════════════════════════════════════════════════
Nastaví DF na 1. Řetězce se zpracovávají odzadu.
CLI Obecný tvar: CLI
═══════════════════════════════════════════════════════════════════════════
Nastaví IF na 0. Asynchronní přerušení jsou zakázána.
STI Obecný tvar: STI
═══════════════════════════════════════════════════════════════════════════
Nastaví IF na 1. Asynchronní přerušení jsou povolena.
HLT Obecný tvar: HLT
═══════════════════════════════════════════════════════════════════════════
Zastaví činnost procesoru. Tento stav zruší NMI INT 02 nebo RESET.
WAIT Obecný tvar: WAIT
═══════════════════════════════════════════════════════════════════════════
Zastaví činnost procesoru. Tento stav zruší NMI INT 02 , RESET nebo aktivní
signál TEST. Používá se pro komunikaci s koprocesorem.
ESC Obecný tvar: ESC
═══════════════════════════════════════════════════════════════════════════
Předává instrukci koprocesoru. Viz INT 06 , INT 07 a Koprocesory .
LOCK Obecný tvar: LOCK
═══════════════════════════════════════════════════════════════════════════
Po dobu následující instrukce se blokuje stav sběrnice. Používá se pro
sdílení jedné sběrnice více CPU.
NOP Obecný tvar: NOP
═══════════════════════════════════════════════════════════════════════════
Chvíli nedělej nic. Jak krásná a jednoduchá instrukce. Používá se
k zarovnávání kódu na 286, 386 a 486, aby CPU běžel rychleji.
Instrukce 8086 Instrukce procesoru Registry procesoru
Instrukce posunů a rotací 8086
SAL Obecný tvar: SAL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Přitom dbá, aby nejvyšší bit zůstal zachován.
Nezničí tedy znaménko.
(kolik) je buď 1, nebo CL.
1. Sal reg,kolik Sal ax,1
2. Sal Místo v paměti,kolik Sal word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SAR Obecný tvar: SAR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Přitom dbá, aby nejvyšší bit zůstal
zachován.Nezničí tedy znaménko.
(kolik) je buď 1, nebo CL.
1. Sar reg,kolik Sar ax,1
2. Sar Místo v paměti,kolik Sar word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SHL Obecný tvar: SHL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Zničí znaménko.
(kolik) je buď 1, nebo CL.
1. Shl reg,kolik Shl ax,1
2. Shl Místo v paměti,kolik Shl word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
SHR Obecný tvar: SHR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Zničí znaménko.
(kolik) je buď 1, nebo CL.
1. Shr reg,kolik Shr ax,1
2. Shr Místo v paměti,kolik Shr word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
ROL Obecný tvar: ROL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Vypadávající bit vždy dá na místo bitu 0.
(kolik) je buď 1, nebo CL.
1. Rol reg,kolik Rol ax,1
2. Rol Místo v paměti,kolik Rol word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
ROR Obecný tvar: ROR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Vypadávající bit vždy dá na místo nevvyššího
bitu .
(kolik) je buď 1, nebo CL.
1. Ror reg,kolik Ror ax,1
2. Ror Místo v paměti,kolik Ror word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
RCL Obecný tvar: RCL co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vlevo. Vypadávající bit vždy dá do CF.
Původní CF dá na místo bitu 0.
(kolik) je buď 1, nebo CL.
1. Rcl reg,kolik Rcl ax,1
2. Rcl Místo v paměti,kolik Rcl word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
RCR Obecný tvar: RCR co,kolik
═══════════════════════════════════════════════════════════════════════════
Posune (co) (kolik) krát vpravo. Vypadávající bit vždy dá do CF. Původní
CF umístí na místo nejvyššího bitu.
bitu .
(kolik) je buď 1, nebo CL.
1. Rcr reg,kolik Rcr ax,1
2. Rcr Místo v paměti,kolik Rcr word ptr ds:[si],cl
Mění příznaky CF, OF, AF, ZF, PF.
Instrukce 8086 Instrukce procesoru Registry procesoru
Instrukce skoků a volání 8086
Podmíněné skoky shrnuje následující tabulka:
┌───────────────────┬────────────────┬─────────────────────────────────┐
│ Instrukce │ Podmínka │ Význam │
╞═══════════════════╪════════════════╪═════════════════════════════════╡
│ Ja / Jnbe │ CF=0▲ZF=0 │ Je nad - ostře větší │
│ Jae / Jnb / Jnc │ CF=0 │Je nad nebo rovno - neostře větší│
│ Jb / Jc / Jnae │ CF=1 │ Je pod - ostře menší │
│ Jbe / Jna │ CF=1▼ZF=1 │Je pod nebo rovno - neostře menší│
│ Je / Jz │ ZF=1 │ Je rovno │
│ Jg / Jnle │(SF<>OF)+ZF = 0 │ Je větší - znaménko se uvažuje │
│ Jge / Jnl │ SF=OF │ Je větší nebo rovno (znaménkově)│
│ Jl / Jnge │ SF<>OF │ Je mensí - znaménko se uvažuje │
│ Jle / Jng │(SF<>OF)+ZF > 0 │ Je menší nebo rovno (znaménkově)│
│ Jne / Jnz │ ZF=0 │ Není rovno │
│ Jno │ OF=0 │ Není přetečení │
│ Jnp / Jpo │ PF=0 │ Není parita - lichá parita │
│ Jns │ SF=0 │ Není záporné - 0 nebo kladné │
│ Jo │ OF=1 │ Je přetečení │
│ Jp / Jpe │ PF=1 │ Je parita - sudá parita │
│ Js │ SF=1 │ Je záporné - není kladné │
│ Jcxz │ CX=0 │ CX je nulové │
└───────────────────┴────────────────┴─────────────────────────────────┘
▲ znamená logické AND
▼ znamená logické OR
Dost značná část podmínek je zbytečná, nejlepší je používat podmíněné skoky,
které mají v názvu jméno příznaku ( Jz místo Je ... ).
LOOP Obecný tvar: LOOP kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží CX o 1 a je-li CX > 0 předá řízení na místo (kam).
Používá se u cyklů s pevným počtem opakování.
LOOPZ Obecný tvar: LOOPZ kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží CX o 1 . Je-li (CX > 0) a (ZF=1) předá řízení na místo (kam).
Používá se u cyklů s proměnným počtem opakování.
LOOPNZ Obecný tvar: LOOPNZ kam
═══════════════════════════════════════════════════════════════════════════
Instrukce sníží CX o 1 . Je-li (CX > 0) a (ZF=0) předá řízení na místo (kam).
Používá se u cyklů s proměnným počtem opakování.
JMP Obecný tvar: JMP adresa
═══════════════════════════════════════════════════════════════════════════
Instrukce předá řízení na místo určené jako (adresa). Existuje 5 kategorií
skoků :
1. Krátký skok beze změny CS. Cílová adresa leží v rozsahu < -128 ; 127 >
byte od instrukce skoku. JMP short adresa
2. Skok beze změny CS. Cílová adresa leží ve stejném segmentu jako instrukce
skoku. JMP adresa
3. Skok vzdálený (se změnou cs). Změní se jak CS tak IP. V TASMu neexistuje
odpovídající instrukce. Provádím následovně :
db 0EAh
dw offset,segment
4. Krátký nepřímý skok : Jmp word ptr ds:[si]
IP se načte s udané adresy.
5. Vzdálený nepřímý skok : Jmp dword ptr es:[bx]
IP a CS se načtou s udané adresy. POZOR ! IP je první.
CALL Obecný tvar: CALL adresa
═══════════════════════════════════════════════════════════════════════════
Zavolá procedure na místě určeném adresou. Do zásobníku uloží AKTUÁLNÍ IP
( CS ) , tedy adresu ukazující na následující instrukci.
Existují 4 typy CALL :
1.Krátké přímé volání. Provede se uložení IP na zásobník a do IP se uloží
(adresa). Call podproc
2.Krátké nepřímé volání. Provede se uložení IP na zásobník a do IP se uloží
WORD na specifikované adrese. Call word ptr es:[bx + tabulka]
3.Vzdálené přímé volání. Uloží se IP a pak CS se uloží na zásobník , IP a CS
se načte ze zadaných hodnot. Call far Newseg:NewOfs
4.Vzdálené nepřímé volání. Uloží se IP a pak CS se uloží na zásobník , IP a
CS se načte ze zadané adresy. Call dword ptr es:[oldproc]
RET Obecný tvar: RET [n]
═══════════════════════════════════════════════════════════════════════════
Instrukce obnoví IP ( CS ) ze zásobníku. Hodnotu CS a IP uložené na zásobníku
odstraní.
1. RET , RETN - návrat z procedury volané CALL near. Obnoví pouze IP.
2. RETF - návrat z procedure volané jako FAR. Obnoví IP i CS.
Nepovinný parametr n udává počet byte, které má RET nebo RETF ještě odstranit
ze zásobníku. Použije se pro odstranění parametrů předaných proceduře na
stacku. Viz obr.
před RETF 004 Po RETF 004
<---- SS:SP
Parametr 1 CS a IP obnoveno
Parametr 2
Parametr 3
Parametr 4
IP
CS
SS:SP->
před RET 004 Po RET 004
<---- SS:SP
Parametr 1 IP obnoveno
Parametr 2
Parametr 3
Parametr 4
IP
SS:SP->
INT Obecný tvar: INT n
═══════════════════════════════════════════════════════════════════════════
Instrukce INT vyvolá přerušení číslo n. Instrukce uloží na zásobník
příznaky (FLAGS), CS a IP (v tomto pořadí). Pak z tabulky umístěné v segmentu
0000 z offsetu 4*n přečte IP a CS příslušného přerušení.
Instrukce INT n je 2 byte dlouhá , ale INT 3 pouze 1 byte. Používá se
jako breakpoint. Viz INT 03 .
INTO je další mutace INT. Provede INT 4, je-li nastaven OF.
Viz INT 04
IRET Obecný tvar: IRET
═══════════════════════════════════════════════════════════════════════════
Ukončí přerušení vyvolané INT. Odstraní ze zásobníku uložené IP, CS a FLAGS,
a obnoví je. Provede se Popf, Pop CS a Pop IP. ( v tomto pořadí );
Situace před IRET Po IRET
<-- SS:SP CS, IP, FLAGS obnoveny.
FLAGS
CS
IP
SS:SP ->
Instrukce 8086 Instrukce procesoru Registry procesoru
Fyzická adresa
Tímto pojmem se v rámci AThelpu myslí číslo byte (Wordu, Dwordu...) od počátku
RAM. Pojem fyzické adresy většinou splývá s pojmem Lineární adresa , tedy
s reprezentací intuitivního chápání paměti jak ji "vidí" procesor.
Přepočet :
Lineární adresa ═══════════════► Fyzická adresa
( tak ji 'vidí' procesor ) Stránkování ( jak je paměť na desce )
V pojem Fyzická a Lineární adresa splývá, je-li bit PG v CR0 nastaven na 0,
nebo při práci na 286 (8086).
V REAL MÓDu PG = 0 vždy.
V PROTECTED MÓDu 386 a 486 podle PG.
Ve V86 MÓDu podle PG.
Důležité je, že ve V86 MÓDu nesplývá fyzická a lineární adresa. Lze tak
snadno mapovat RAM tam, kde bylo 'prázdno' nebo nepotřebná ROM. Toho
využívají EMM (EMM 386, QEMM, 386MAX..) pro vytvoření Page Frame pro EMS
a realizaci bloků UMB . Viz též Mapa paměti .
Lineární adresa Adresace
Lineární adresa
Lineární adresa představuje pozici v RAM, jak ji vidí procesor. Tedy
např. v REAL MÓDu 1234:0005 představuje lineární adresu 012345. Na
procesorech 8086, 286 je lineární adresa VŽDY shodná s fyzickou. Na
386 a 486 pokud je bit PG v CR0 nastaven na 1 probíhá přepočet lineární
adresy na fyzickou pomocí Stránkování . Pro proces je jedno, jaká je jeho
Fyzická adresa , důležité je, jaká je jeho lineární adresa. Pojem
fyzická adresa je důležitý jem pro správce stránkování.
Lineární adresa ( tak ji vidí aplikace, procesor atd. )
KB
200 204 208 212 216 220 224 228
┌─────────┬─────────┬────────┬────────┬────────┬────────┬────────┐
│ │ │ │ │ │ │ │
└─────────┴─────────┴────────┴────────┴────────┴────────┴────────┘
▲ ▲ ▲ ▲ ▲ ▲ ▲
│ │ │ └────┐ └─────┐ └─────┐ └────┐
Překlad pomocí Stránkování
│ │ │ │ │ │ │
│ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼
┌─────────┬─────────┬────────┬────────┬────────┬────────┬────────┬────────┐
│ │ │ │ XXXXXX │ │ │ │ │
└─────────┴─────────┴────────┴────────┴────────┴────────┴────────┴────────┘
1000 1004 1008 1012 1016 1020 1024 1028 1032
(Obsazeno)
Fyzická adresa
Obrázek ilustruje další vhodné použití Stránkování - vytvoření dlouhých
souvislých bloků RAM. Proces X vyobrazený nahoře potřebuje 28KB souvislé RAM.
Tak velké množství nemusí být volné vcelku ( obsazen je zde blok 1012-1016 KB).
Bez stránkování by nebylo možno tak velký blok poskytnout. Programu je však
JEDNO, jaká je Fyzická adresa bloku přidělené RAM, důležitá je jeho lineární
adresa. A v rámci lineárních adres je blok souvislý.
Fyzická adresa Stránkování
HMA - High Memory Area
Tento dodatečný prostor je dostupný na počítačích 286, 386 a 486 , pokud
je instalováno více než 1 MB paměti ( a pokud je přítomem XMS ovladač ).
Lineární adresa ( v 99.99% případech stejná jako Fyzická adresa ) HMA
je 0100000 - 010FFF0, její velikost je tedy 65520 BYTE.
Nachází se těsně nad 1. MB paměti. Je důležitá neboť se nechá adresovat
I PROSTŘEDKY REAL MÓDu ( V86 MÓDu ). Při výpočtu lineární adresy sytémem
segment:offset dostaneme 010FFF0 možností, ale 8086 využíval pouze 0100000
z nich ( 20 bitů adresní sběrnice na víc nestačilo ). Pro kombinaci FFFF:0011
8086 vyločetl lineární adresu 0100001, ale 20 linek ořízlo na 00001. Promítalo
se tedy zpět.
286, 386 a 486 problémy se sběrnicí neměly a HMA adresují od adresy
FFFF:0010 - FFFF:FFFF. Potud vše OK.
Přehnaná starostlivost velké modré ale nenechala dopustit, aby došlo ke
konfliktu programů psaných pro 8086 na 286 a vyšších. Pokud by nějaký program
na XT prováděl změnu vektoru INT 00 (není důležité jakého INTu, ale v 1. 64KB)
následujícím způsobem :
.... ax:bx .. nová adresa intu
Mov cx,0FFFFh
mov ds,cx
mov si,0010
cli
mov ds:[si],bx
mov ds:[si+2],ax
sti
je vše OK na XT. Ale 286 by přepsala první 4 byte v HMA a změna by se
neprovedla. A tak IBM zavedla bránu A20 , která v poloze (disabled) na 286 a
vyšších blokuje přístup do HMA a provádí efekt 8086. Normální program samozřejmě
nemusí pracovat s XT efektem a může mít A20 povolenou (enabled).
Z výše uvedeného vyplývá jediné : pro práci s HMA je třeba mít A20 povolenu.
Služby okolo A20 zajišťuje XMS driver.
Je-li program spuštěn v HMA, měl by tam běžet OK, ale nedoporučuje se provádět
přímý přístup do HMA s operacemi I/O BIOSu a DOSu. (např nastavit tam DTA).
DOS je rád umístěn ve HMA (má tam své buffery) a tak je HMA často obsazena.
Nemá moc smyslu vyvíjet pogramy, které vyžadují být spuštěny ve HMA.
XMS Mapa paměti EMS VCPI Adresace DPMI A20
A20 - blokování adresní linky A20 procesoru
Jedná se o dodatečnou záležitost PC 286 a vyšších pro práci s pamětí nad
prvním MB. V oddíle HMA a Adresace je vysvětlena příčina vzniku.
Pokud pracujete s pamětí nad lineární adresu 1048576, je třeba povolit A20.
Jinak hardware provede následující :
Fyzická adresa := Fyzická adresa and FFEFFFFF.
Je to zrádné při práci v PROTECTED MÓDu lze snadno přepsat celý první
megabyte. Sám jsem to zažil a teprve pak jsem pochopil význam A20.
A20 lze ovládat 2 způsoby :
XMS driverem :
XMSCall dd 0
► Mov ax,4300h
Int 2fh
Cmp al,80h
Jnz @chyba
mov ax,4310
Int 2Fh
Mov word ptr cs:[XMSCall],bx
Mov word ptr cs:[XMSCall+2],es
; režijní práce es:bx - vstupní bod XMS ovladače
;Povol a20
Mov ah,05h
call dword ptr cs:[xmscall]
;Zakaž a20
Mov ah,06h
call dword ptr cs:[xmscall]
;zjisti stav
Mov ah,07h
call dword ptr cs:[xmscall]
; al - 0 zakázáno
; 1 povoleno
Pomocí portů - FUNGUJE jen na PC kompatibilních, ne PS/2 !!!!!
HIMEM má asi 10 různých ovládání A20 !!!!
Sync8042 PROC NEAR
xor CX, CX
S8InSync: in AL, 64h
and AL, 2
LOOPNZ S8InSync
ret
Sync8042 ENDP
; Vstup: AX = 0 --> Zakaž A20
; AX = 1 --> Povol A20
; Výstup: AX = 1 --> Úspěšné ukončení operace
; AX = 0 --> Chyba při operaci
AT_A20Handler PROC NEAR
or AX, AX ; Zapnout nebo vypnout A20?
jz AAHDisable ; =0 ... vypnout
; Zapnutí A20
; ----------------
AAHEnable: call Sync8042 ; Synchronizuj obvod 8042
jnz AAHErr ; Detekována chyba.
mov AL, 0D1h
out 64h, AL
call Sync8042
jnz AAHErr
mov AL, 0DFh
out 60h, AL
call Sync8042
jnz AAHErr
mov AL, 0FFh
out 64h, AL
call Sync8042
jnz AAHErr
jmp AAHExit
; Vypnutí A20
AAHDisable: call Sync8042
jnz AAHErr
mov AL, 0D1h
out 64h, AL
call Sync8042
jnz AAHErr
mov AL, 0DDh
out 60h, AL
call Sync8042
jnz AAHErr
mov AL, 0FFh
out 64h, AL
call Sync8042
AAHExit: mov AX, 1 ; Návrat O.K.
ret
AAHErr: xor AX, AX ; Chybový návrat
ret
AT_A20Handler ENDP
Je-li k dispozici XMS driver, použijte jej. Ten způsob přes porty snadno
zablokuje klávesnici.
A20 je třeba zapnout před voláním DPMI a VCPI .
HMA Mapa paměti UMB XMS EMS
XMS - Extended memory specification
Tato specifikace umožňuje programům v REAL MÓDu a V86 MÓDu pracovat
s pamětí nad 1MB. Náznem XMS se často označuje paměť na AT nad 1. MB
( a je pravdou, že XMS je fyzicky nad 1.MB), ale v AT helpu je to striktně
odděleno, aby nedocházelo k mnohoznačnostem.
XMS zajišťuje tyto služby :
Alokace a správa HMA
Ovládání A20
Přesuny a alokace v extended paměti
Správu UMB (v pohádkách)
Drivery zajišťující XMS jsou : HIMEM, QEMM, 386MAX atd.
XMS bývá dostupná i na 286 a proto jí lze s výhodou využívat všude,kde je
třeba odkládat bloky dat mimo BASE paměť. Pokud pracujete přímo
v PROTECTED MÓDu , je lepší využít služeb VCPI a DPMI .
Detekce XMS :
Mov ax,4300h
Int 2Fh
Cmp al,80h
Jnz @není_XMS
Mov ax,4310h
Int 2Fh
; es:bx jsou vstupním bodem XMS. Doporučuji uschovat do CS.
Dalsí služby jsou dostupné po zavolání call dword ptr na adresu udanou es:bx.
Číslo služby je v AH, pokud je vše OK, je AX po ukončení 1. Je-li ax 0, je kód
chyby v BL.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
00 Vrať stav XMS.
Vrací : AX - verze XMS (BCD)
BX - verze ovladače XMS (BCD)
DX - 0 : není HMA
1 : je HMA
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
01 Alokuj HMA
Vstup DX - počet byte
Výstup AX=1 je-li OK, jinak Bl kód chyby
v DX maximálně 65520 (0FFF0 h)
HMA se stejně alokuje celá, DX se udává jen aby se použila pro
dostatečně velkou alokaci... (jak užitečné ..)
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
02 Uvolni HMA
Výstup AX= 1 je-li OK, jinak Bl kód chyby
HMA by měla být uvolněna před ukončením aplikace, která ji alokovala.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
03 Globální uvolnění A20
Výstup AX= 1 je-li OK, jinak Bl kód chyby
Je-li A20 globálně povolena, lokálně ji nezakážete.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
04 Globální zákaz A20
Výstup AX= 1 je-li OK, jinak Bl kód chyby
A20 lze globálně zakázat jen, je-li počet lokálních povolení 0.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
05 Lokální uvolnění A20 .
Výstup AX= 1 je-li OK, jinak Bl kód chyby
Je-li A20 globálně uvolněna a je-li počet lokálních uvolnění 0,
povolí A20 a zvětší počítadlo uvolnění o 1.
Jinak pouze zvětší počítadlo o 1.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
06 Lokální zákaz A20
Výstup AX= 1 je-li OK, jinak Bl kód chyby
Sníží počet lokálních povolení A20 o 1.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
07 Zjisti stav A20
Výstup : AX stav A20 .
1 - povolena
0 - zakázána
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
08 Zjisti velikost XMS.
Výstup : DX - Velikost XMS celkem
AX - Největší souvislý blok XMS
Velikost v KB.
Je-li existující (nezávisle na alokaci) HMA , není do velikosti XMS
započtena.
Pozn.: HIMEM vrací v BX A900h (OK). Není to důležité, ale
Wolfenstein 3-D jinak XMS nedetekuje.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
09 Alokuj XMS
Vstup : DX - počet KB (chci)
Výstup : Výstup AX= 1 je-li OK
DX - handle XMS bloku
jinak Bl kód chyby
Není-li handle uvolněno před ukončením aplikace, není alokovaná paměť
do restaru dostupná.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
0A Uvolni XMS
Vstup : DX - handle XMS bloku
Výstup : AX= 1 je-li OK, jinak Bl kód chyby.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
0B Přesuň blok XMS
Vstup : ds:si - blok požadavku o přesun
Výstup : AX= 1 je-li OK, jinak Bl kód chyby.
Blok požadavku o přesun:
Offset Velikost Význam
───────────────────────────────────────────────────
00 DWORD Velikost bloku dat k přesunutí
04 WORD Handle zdrojového bloku
06 DWORD Offset uvnitř handle
0A WORD Handle cílového bloku
0C DWORD Offset uvnitř handle
Pozn.: Je-li handle (zdroj/cíl) rovno 0, pak je blok v nejnižsím
megabyte a offset je adresa zxačátku uložená jako ukazatel
tvary segment:offset.
Tuto funkci lze s výhodou využít i pro přesuny v rámci handle.
(i uvnitř BASE paměti.)
Velikost je sice DWORD, ale např HIMEM zpracuje jen délku bloku
max. 64 KB, jinak hlásí chybu.
Některé ovladače vyžadují délku bloku sudou !
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
0C Zamkni blok
Vstup : DX handle bloku
Výstup : AX= 1 je-li OK, jinak Bl kód chyby.
DX:BX - Lineární adresa bloku
Po provedení této funkce je garantováno, že blok nebude
přesunut a tudíž může být adresován přímo v PROTECTED MÓDu .
Řeší se tak sdílení Extended paměti více aplikacemi.
Uzamknutý blok nenůže být uvolněn a nemůže měnit svou velikost.
Zamykání může být násobné.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
0D Odemkni blok
Vstup : DX handle bloku
Výstup : AX= 1 je-li OK, jinak Bl kód chyby.
Lineární adresa bloku udaná fcí 0c nemusí být platná.
Sníží počet zámků. Teprve je-li blokj uzamknut 0x, lze
ho uvolnit.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
0E Vrať info o bloku.
Vstup : DX handle bloku
Výstup : AX= 1 je-li OK, jinak Bl kód chyby.
BH - počet zámků
BL - počet volných handle
DX - velikost bloku (KB)
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
0F Realokuj blok
Vstup : DX handle bloku
BX nová velikost
Výstup : AX= 1 je-li OK, jinak Bl kód chyby.
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
10 Alokuj UMB
Vstup : DX veliokost bloku (paragrafy)
Výstup : AX = 1 je-li OK
BX - Segment
DX - velikost (paragrafy),
jinak Bl kód chyby a DX největší volný UMB .
AH Popis
═══ ══════════════════════════════════════════════════════════════════════
11 Uvolni UMB
Vstup : DX - segment bloku
Výstup : AX = 1 je-li OK, jinak BL kód chyby.
Pozn.: Poslední 2 funkce nebývají implementovány. UMB ovládá DOS funkcemi
DOS Fn 58 a DOS Fn 48 .
════════════════════════════════════════════════════════════════════════════════
Následují služby někdy označované jako XXMS, dostupné jan na 386
Doplňují služby XMS tak, aby obsáhly celé 4GB paměti, které je
386-ka schopná adresovat. Handle vrácená těmiti službami lze využít
ve funkcích 0A a 0B.
AH
══ ═════════════════════════════════════════════════════════════════════════════
88 (XMS v3.0) Dotaz na extended paměť
Výstup : EAX = největší volný blok Extended paměti
BL = status
00 OK
80 není implementováno
81 VDISK instalován
A0 vše již alokováno
ECX = Fyzická adresa nejvyššího byte paměti (nezávisle
na BL)
EDX = Celkem Kbytes extended paměti volno (0 pro BL A0)
AH
══ ═════════════════════════════════════════════════════════════════════════════
89 (XMS v3.0) Alokuj extended paměť
Vstup : EDX = Počet KB
Výstup : AX = 0001h OK
DX = handle bloku (uvolnit AH=0A)
= 0000h chyba
BL = kód chyby
AH
══ ═════════════════════════════════════════════════════════════════════════════
8E (XMS v3.0) Zjisti informace o bloku
Vstup : DX = handle
Výstup: AX = 0001h OK
BH = počet zámků
CX = počet volných handle
EDX = velikost bloku v KB
= 0000h chyba
BL =kód chyby
AH
══ ═════════════════════════════════════════════════════════════════════════════
8F (XMS v3.0) Reallocate any extended memory block
Vstup : DX = handle nezamčeného bloku
EBX = nová velikost bloku v KB
Výstup: AX = 0001h OK
= 0000h chyba
BL = kód chyby
Pozn.: HIMEM vyžaduje alespoň 256 BYTE volno na stacku. Služby 8Xh nesmějí
být volány na 286 (jinak ztvrdne)
Chybové kódy v BL :
═══════════════════════════════════════════════════════════════════════════════
00h OK
80h Neznámá funkce
81h VDISK instlován
82h Chyba hradlování A20
8Eh Obecná chyba ovladače (spadnutí za 9 .. 8 .. 7 .. )
8Fh Ovladač je KO.
90h HMA neexistuje
91h HMA je již alokovaná
92h DX je menší než /HMAMIN= parametr
93h HMA není allokovaná
94h A20 je již povolena
A0h Celá extended paměť je již alokovaná
A1h Nejsou volná XMS handle
A2h Špatné handle
A3h Zdrojové handle je neplatné
A4h Zdrojový offset offset je neplatný
A5h Cílové handle je neplatné
A6h Cílový offset offset je neplatný
A7h Neplatná délka ( u HIMEM > 64KB )
A8h Špatný překryv (historie i XMS v 1.0)
A9h Chyba parity
AAh Blok není zamčen
ABh Blok je zamčen
ACh Překročen počet zámků
ADh Chyba zámku
B0h Není dostupný tak velký UMB
B1h UMB neexistuje
B2h UMB segment je neplatný
Mapa paměti EMS UMB VCPI DPMI HMA
Přerušení DOSu
DOS zabírá tyto INTy:
INT 20 - Ukonči
INT 21 - Funkce DOSu
INT 22 - Terminate adres
INT 23 - Ctrl+break
INT 24 - Chyby
INT 25 - Absolutní diskové čtení
INT 26 - Absolutní diskový zápis
INT 27 - Ukonč a zůstaň rezidentní
INT 28 - DOS odpočívadlo
INT 29 - Rychlý výstup znaku
INT 2A - Lantastic network
INT 2B - RESERVED
INT 2C - RESERVED
INT 2D - RESERVED
INT 2E - RESERVED
INT 2F - Multiplex
Seznam kapitol Seznam přerušení Datová oblast DOSu
Ovladače zařízení
INT 20H: Ukončení programu
Toto přerušení je použito k opuštění programu a navrácení řízení nadřízenému
procesu (obvykle COMMAND.COM, interpreter příkazů DOSu)
Obnovuje hodnoty vektorů přerušení DOSu INT 22 , INT 23 a INT 24 .
Dále zapíše na disk všechny buffery (pokud se mění délka souboru, měli byste
ho ale napřed uzavřít).
Pozor: Pro ukončení procesu musí registr CS obsahovat hodnotu PSP .
Jestliže se CS a PSP nerovnají, můžete JMP nebo RET na PSP:0000.
Je záhodno použít funkci DOS Fn 4C Ukonči program, abyste předešli problémům,
které se vyskytnou, není-li CS rovno PSP. To vám také umožní nastavit výstupní
kód.
Programy ve formátu COM obvykle běží s CS=PSP, takže mohou kdykoli používat
INT 20. Programy typu EXE mohou používat FAR JMP nebo FAR RET k předání
řízení na PSP:0000, kde je instrukce INT 20H.
Funkce DOSu Přerušení DOSu
INT 21 - Volání funkce DOSu
Toto přerušení je úvodem k většině funkcí DOSu.
Program požadující služby DOSu musí připravit všechny registry, obsah řídícího
bloku, nastavit AH na požadované číslo funkce DOSu a pak provést INT 21H.
Viz též: Funkce DOSu
Přerušení DOSu
Dále jsou uvedeny služby DOSu nebo vektory, které se nevolají přes INT 21H:
INT 20 Ukončení programu
INT 22 Ukončovací adresa
INT 23 Ctrl Break
INT 25 Absolutní čtení z disku
INT 26 Absolutní zápis na disk
INT 27 Ukončení ale zůstaň residentní
INT 28 Odpočívadlo DOSu
INT 2F Multiplexní přerušení (řízení spoolingu tisku)
Funkce DOSu
INT 25H: Přímé čtení z disku
Jsou použity dvě volací konvence, jedna pro partition < 32 Mbyte, druhá pro
partition větší (zavedené v DOS 4.0)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AL ║ číslo drive (0=A, 1=B, atd.) [ < 32Mbyte ]
└─────────╢ CX ║ počet sektorů pro čtení
║ DX ║ počáteční sektor (logické číslo sektoru)
║ DS:BX ║ adresa přenosu (místo určení)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastavena příznak CF, kód chyby (viz dále)
└─────────╢ ║ jsou zrušeny všechny hodnoty registrů kromě DS, ES, SS, SP
║ ║ POZOR: tato služba nechá jedno 16-bitové slovo v zásobníku
╙───────╨─────────────────────────────────────────────────────────────
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AL ║ číslo drive (0=A, 1=B, atd.) [ > 32Mbyte ]
└─────────╢ BX ║ ukazatel na seznam parametrů
║ CX ║ -1 indikuje rozšířený >32Mbyte formát
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastavena příznak CF, kód chyby (viz dále)
└─────────╢ ║ jsou zrušeny všechny hodnoty registrů kromě DS, ES, SS, SP
║ ║ POZOR: tato služba nechá jedno 16-bitové slovo v zásobníku
╙───────╫─────────────────────────────────────────────────────────────
║ Struktura seznamu parametrů:
║ rba dd ? ;první sektor (32 bitů, počítáno od 0)
║ count dw ? ;počet sektorů číst
║ buffer dd ? ;buffer pro data
╙─────────────────────────────────────────────────────────────
Tato služba DOSu poskytuje přímý přístup k libovolnému sektoru dosažitelnému
přes DOS, a to BIOS nebo vestavěný driver zařízení
INT 25 čte sektory
INT 26 zapisuje sektory
Logické sektory DOSu začínají boot-sektorem. První sektor segmentu DOSu je
logický sektor DOSu 0. Logická čísla sektorů se zvyšují nejprve po sektorech
na cylindru, pak po hlavách a nakonec po cylidrech na disku.
Všimněte si, že Master Boot Record a každý další sektor mimo segment DOSu
nejsou touto službou dosažitelné. Jedinou službou, která má kompletní
přístup ke všem částem hard disku, je Disk INT 13 .
File Allocation Table popisuje, jak DOS přiřazuje logické sektory seskupením
clusterů používaným při všech I/O operacích DOSu s diskem.
┌────────┐
│ Chyby │ Chyby, které se vyskytnou během INT 25 nejsou obsluhovány
└────────┘ obsluhou kritické chyby INT 24 . Při odchodu z INT 25
se DOS-BIOS vrací s příznakem carry (CF=1), objeví-li se chyba.
Když je CF nastavena:
AL = chyba zařízení (0-0cH) což je totéž, jako bity 0-7 DI při INT 24H (to je
jeden z chybových kódů 13H-1fH (minus 13H), viz Chybové kódy DOSu
AH = jedna z hodnot:
80H = zařízení neodpovídá
40H = chyba při vystavení hlavy (hlava se neposunula na stopu)
20H = chyba řadiče
10H = špatný CRC při čtení z diskety
08H = přetečení DMA přes hranici 64K
04H = požadovaný sektor nenalezen
02H = pokus o zápis na disketu chráněnou proti zápisu
01H = nepoužito
┌─────────┐
│ Příklad │ Jednoduché využití INT 25 na přečtení boot sektoru diskety:
└─────────┘
mov al,0 ;urči drive A
mov dx,0 ;urči boot sector DOSu a BPB
mov cx,1 ;načti jeden sektor ..
lea bx,my_buf ; ... do zásobníku na DS:BX
int 25H
pop dx ;vypustit zbytečné slovo na zásobníku
jnc no_err
...atd... ;zpracování libovolné diskové chyby (kód v AX)
no_err: ...atd... ;pokračuj, je - li vše O.K.
Pozn.: Nedá se předpokládat, že sektor je přesně 512 bytů. Měla by se použít
funkce DOS Fn 1C , DOS Fn 32 nebo přečíst boot sektor k nalezení
jeho skutečné velikosti
┌───────────────┐
│ 32 Megabytů ? │ Tvrdí se, že DOS (před verzí 4.0) umí obsloužit maximálně
└───────────────┘ 32 megabytů, ale přesně vzato to není pravda. Driver stan-
dardního zařízení má sektor disku o velikosti 512-bytů. Je pravdou, že jelikož
nejvyšší číslo sektoru, které se dá strčit do DX pro INT 25H je 65535, pak je
maximální velikost disku 32767K neboli 32M.
Avšak drivery jiné, než IBM (nebo budoucí drivery IBM) mohou pracovat se
sektorem větším, než 512 bytů. Takže prakticky neexistuje mez velikosti disku.
Přesto je se současnými drivery hodnota 32M maximum pro jednoduchý segment DOSu.
Další podrobnosti viz FAT .
Přerušení DOSu Funkce DOSu
INT 26H: Přímý zápis na disk
Jsou použity dvě volací konvence, jedna pro partition < 32 Mbyte, druhá pro
partition větší (zavedené v DOS 4.0)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AL ║ číslo drive (0=A, 1=B, atd.) [ < 32Mbyte ]
└─────────╢ CX ║ počet sektorů pro zápis
║ DX ║ počáteční sektor (logické číslo sektoru)
║ DS:BX ║ adresa přenosu (zdrojový buffer)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastavena příznak CF, kód chyby (viz dále)
└─────────╢ ║ jsou zrušeny všechny hodnoty registrů kromě DS, ES, SS, SP
║ ║ POZOR: tato služba nechá jedno 16-bitové slovo v zásobníku
╙───────╨─────────────────────────────────────────────────────────────
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AL ║ číslo drive (0=A, 1=B, atd.) [ > 32Mbyte ]
└─────────╢ BX ║ ukazatel na seznam parametrů
║ CX ║ -1 indikuje rozšířený >32Mbyte formát
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastavena příznak CF, kód chyby (viz dále)
└─────────╢ ║ jsou zrušeny všechny hodnoty registrů kromě DS, ES, SS, SP
║ ║ POZOR: tato služba nechá jedno 16-bitové slovo v zásobníku
╙───────╫─────────────────────────────────────────────────────────────
║ Struktura seznamu parametrů:
║ rba dd ? ;první sektor (32 bitů, počítáno od 0)
║ count dw ? ;počet sektorů číst/psát
║ buffer dd ? ;buffer pro data
╙─────────────────────────────────────────────────────────────
Tato služba DOSu poskytuje přímý přístup k libovolnému sektoru dosažitelnému
přes DOS, a to BIOS nebo vestavěný driver zařízení
INT 25 čte sektory
INT 26 zapisuje sektory
Logické sektory DOSu začínají boot-sektorem. První sektor segmentu DOSu je
logický sektor DOSu 0. Logická čísla sektorů se zvyšují nejprve po sektorech
na cylindru, pak po hlavách a nakonec po cylidrech na disku.
Všimněte si, že Master Boot Record a každý další sektor mimo segment DOSu
nejsou touto službou dosažitelné. Jedinou službou, která má kompletní
přístup ke všem částem hard disku, je Disk INT 13 .
File Allocation Table popisuje, jak DOS přiřazuje logické sektory seskupením
clusterů používaným při všech I/O operacích DOSu s diskem.
┌────────┐
│ Chyby │ Chyby, které se vyskytnou během INT 26 nejsou obsluhovány
└────────┘ obsluhou kritické chyby INT 24 . Při odchodu z INT 26
se DOS-BIOS vrací s příznakem carry (CF=1), objeví-li se chyba.
Když je CF nastavena:
AL = chyba zařízení (0-0cH) což je totéž, jako bity 0-7 DI při INT 24 (to je
jeden z chybových kódů 13H-1fH (minus 13H), viz Chybové kódy DOSu
AH = jedna z hodnot:
80H = zařízení neodpovídá
40H = chyba při vystavení hlavy (hlava se neposunula na stopu)
20H = chyba řadiče
10H = špatný CRC při čtení z diskety
08H = přetečení DMA přes hranici 64K
04H = požadovaný sektor nenalezen
02H = pokus o zápis na disketu chráněnou proti zápisu
01H = nepoužito
Pozn.: Nedá se předpokládat, že sektor je přesně 512 bytů. Měla by se použít
funkce DOS Fn 1C , DOS Fn 32 nebo přečíst boot sektor k nalezení
jeho skutečné velikosti
┌───────────────┐
│ 32 Megabytů ? │ Tvrdí se, že DOS (před verzí 4.0) umí obsloužit maximálně
└───────────────┘ 32 megabytů, ale přesně vzato to není pravda. Driver stan-
dardního zařízení má sektor disku o velikosti 512-bytů. Je pravdou, že jelikož
nejvyšší číslo sektoru, které se dá strčit do DX pro INT 26 je 65535, pak je
maximální velikost disku 32767K neboli 32M.
Avšak drivery jiné, než IBM (nebo budoucí drivery IBM) mohou pracovat se
sektorem větším, než 512 bytů. Takže prakticky neexistuje mez velikosti disku.
Přesto je se současnými drivery hodnota 32M maximum pro jednoduchý segment DOSu.
Další podrobnosti viz FAT .
Přerušení DOSu Funkce DOSu
INT 27H: Ukonči, ale zůstaň rezidentní
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Očekává ║ DX ║ poslední adresa+1 na uchování residentu
└─────────╢ ║ (Pozn.: DX je ofset z PSP (DS nebo ES při startu)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Vrací ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Tato služba odejde do DOSu, přičemž nechá přidělenou část paměti, takže
následující programy nepřepíšou program nebo data.
INT 27 je klasická metoda používaná k instalaci obslužných programů přerušení
a uživatelem definovatelných polí dat. Viz též funkci DOS Fn 31 KEEP.
INT 27 (a všechny ukončovací služby DOSu) obnovují vektory pro INT 22H-24H
z PSP opouštěného programu. Proto tato služba nemůže být využita pro instalaci
stálé obsluhy kritické chyby nebo Ctrl-Breaku.
Přerušení DOSu Funkce DOSu
INT 28H: Odpočívadlo DOSu
Toto NEDOKUMENTOVANÉ přerušení provádí DOS, když čeká na klávesu a jako
předzvěst k většině funkcí DOSu nižších nebo rovných 0CH. V literatuře bývá
označováno různě: DOS Scheduler (Plánovač DOSu) nebo DOS Safe - DOS je bezpečný.
Tímto vektorem je vyvoláván PRINT (spooler DOSu), kterému toto přerušení říká,
že může provést diskové operace ke čtení souborů a odeslání na tiskárnu. Také se
používá ve spoustě rezidentních (TSR) programů. Abychom jmenovali některé úspěš-
né, je to třeba Norton Guides.
Klasicky používají TSR přerušení INT 28 jako jeden z několika vstupních bodů.
To jest hlídá se stisk aktivační klávesy. Je-li zjištěn požadavek na aktivaci,
nastaví se příznak. Pak se během zpracovávání INT 28 zavolá orginální obsluha
tohoto přerušení, čímž se zajistí správná funkce všech rezidentů, které již
na tomto vektoru "sedí" a je-li příznak požadavku nastaven, aktivujeme náš re-
zident.
POZOR: Takto aktivovaný program nesmí použít žádnou funkci DOSu pod 0CH včetně.
▀▀▀▀▀▀ Ale zato můžeme používat diskové operace. NEDOKUMENTOVÁNO
Přerušení DOSu DOS Fn 34 Funkce DOSu
INT 2EH: Proveď příkaz DOSu NEDOKUMENTOVÁNO
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ DS:SI ║ ofset řetězce příkazu DOSu, který má být proveden
└─────────╢ ║ (a taky musíme mít dost paměti pro program)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ ?? ║ není zřejmé, jak získat stav požadavku
└─────────╢ SS,SP ║ jsou zničeny
╙───────╨─────────────────────────────────────────────────────────────
Tato NEDOKUMENTOVANÁ služba provádí příkaz DOSu tak, jako by byl zadán na
příkazovém řádku.
Na vstupu ukazuje DS:SI na řetězec, jež začíná bytem s údajem o délce a končí
bytem 0dH (tento není zahrnut do délky řetězce). Např:
DB 0fH, "set PROMPT=$p$g", 0dH ; ** řetězec je dlouhý 0fH bytů **
Tento příklad ukazuje hlavní použití služby - je schopná nastavit hodnoty
do prostředí DOSu. Ve všech ostatních případech se doporučuje použít funkci
DOS Fn 4B EXEC, (např. EXEC COMMAND.COM, předáním řádku "/c dos_cmd")
protože to je plně zdokumentováno.
Pozn.: Nezapomeňte nejdříve zmenšit Řídící blok paměti funkcí DOSu
DOS Fn 4A Zmenši/zvětši blok paměti .
Nechte dost místa pro zásobník - DOS to určitě sežere.
SS a SP musí být uschovány před voláním a obnoveny hned poté.
Jinak je tato služba záhada. Viditelně není použita v žádném programu
DOSu, včetně COMMAND.COMu. Jelikož je tak neznámá, doporučovali bychom
ji raději nepoužívat.
Funkce DOSu Přerušení DOSu
INT 2FH: Multiplexní přerušení
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ číslo multiplexního procesu. Viz Multiplex
└─────────╢ AL ║ číslo podfunkce
║ jiné ║ podle definice podfunkcí pro specifické multiplexní procesy
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastavena příznak CF, kód chyby (pro procesy DOSu)
└─────────╢ AL ║ instalační stav (pro procesy DOSu)
║ ║ 00H = neinstalováno. Připraveno k instalaci
║ ║ 01H = neinstalováno, nepřipraveno k instalaci
║ ║ ffH = instalováno
╙───────╨─────────────────────────────────────────────────────────────
Tento vektor (0000:00bc) je vyhrazen k obsluze mnoha procesů, které jsou
přístupné z libovolné aplikace.
Každý proces se napřed musí nainstalovat do řetězu přerušení a každý článek
řetězu musí zjišťovat v AH své číslo multiplexního procesu. Požadují-li se
různé procesy, musí předat řízení originálnímu vektoru INT 2fH (adresu najde na
0:00bc než se nainstaluje).
┌──────────────┐
│ Verze DOSu │ INT 2fH není definováno pro verze nižší, než DOS 3.0 V DOSu
└──────────────┘ verze 3.0 je INT 2fH definováno pouze pro spooler tisku a
hodnota AH (což je nyní kritické) nemá význam. V DOSu 3.2 je tento vektor
popsán tak, jak zde uvádíme.
┌───────────────────────────────┐
│ Vytvoření vašeho mult. procesu│ Technický manuál DOSu říká, že na instalaci
└───────────────────────────────┘ a zpřístupnění vašeho vlastního residentního
programu můžete použít INT 2fH. Je to asi takhle: Jestliže náhodně vyvoláte
vektor přerušení kvůli vašemu přístupu, dosti silně riskujete, zvláště když
používáte multi-tasking. Použijete-li multiplexní řetěz, DOS o vás ví a zabrání
tomu, aby byl váš vektor přepsán nějakým jiným obslužným programem.
Je zde jeden problém: Není možné předem rozhodnout o číslu multiplexního
procesu pro AH. Zadáte-li číslo natvrdo, riskujete možnost výskytu jiného
procesu, který používá stejné číslo. Dalo by se stavět na nějakém testování,
které by zaručovalo, že vyvoláváte proces, který jste předtím naistalovali.
Váš proces může přinejmenším použít podfunkci AL=0 (sděl stav instalace),
abyste zjistili, zda byl dříve nainstalován.
Pozn: Jestliže vaše multiplexní procesy používají služby DOSu nebo běží
s povoleným přerušením, měl byste udělat váš proces reentrantní.
Funkce DOSu Multiplex Přerušení DOSu
INT 22H: Adresa ukončení
Adresa na tomto vektoru (0000:0088) obsahuje adresu, na kterou bude předáno
řízení poté, co se právě probíhající program ukončí některou z možností:
INT 20 (klasický odchod do DOSu)
DOS Fn 00 Ukonči proces
DOS Fn 4C Ukonči program (EXIT)
INT 27 (TSR: Ukončení ale zůstaň residentní)
DOS Fn 31 Skonči a zůstaň rezident (KEEP)
DOS používá tento vektor při žádosti o zrušení INT 24 (kritická chyba).
Adresa na tomto vektoru se kopíruje do PSP položky Adresa ukončení pomocí
funkce DOS Fn 26 Vytvoř PSP a funkce DOS Fn 4B EXEC.
Nepoužívejte INT 22H nebo volání jeho adresy přímo.
Přerušení DOSu Funkce DOSu
INT 23H: Adresa ukončení přes Ctrl-Break
Adresa na tomto vektoru (0000:008c) je adresou, která převezme řízení, když
DOS zjistí, že uživatel stiskl Ctrl-Break.
Adresa na vektoru INT 23 se kopíruje do PSP položky Adresa Ctrl-Breaku
pomocí funkce DOS Fn 26 Vytvoř PSP a funkce DOS Fn 4B EXEC. Původní
hodnota ošetřování Ctrl-Breaku se obnoví z PSP po ukončení programu. Tak se
ošetření z Ctrl-Breaku nadřazeného procesu obnoví po odchodu z procesu
podřízeného.
┌───────────────┐
│ Test breaku │ DOS vyvolá INT 23 , jakmile zjistí, že uživatel stiskl
└───────────────┘ Ctrl-Break. Úroveň testování Ctrl-Breaku DOSem se dá
zjistit nebo nastavit funkcí DOS Fn 33 Kontrola Ctrl-Break takto:
Je-li testování zapnuto, DOS testuje Ctrl-Break během všech funkcí kromě 06H
a 07H. Je-li kontrola vypnuta, DOS testuje Ctrl-Break pouze v průběhu I/O
operací klavesnice, tiskárny nebo vnějšího zařízení
┌───────────────────┐
│ Vnitřní ošetření │ Normální ošetření breaku DOSem okamžitě ukončí program.
└───────────────────┘ Aby mohl Ctrl-Break ošetřit váš program sám, je nutné
následující:
Použijte funkci DOS Fn 25 Nastav vektor přerušení k nastavení INT 23H
vektoru na vaši obslužnou rutinu.
Na vstupu vašeho obslužného programu Ctrl-Breaku jsou všechny registry
nastaveny tak, jak byly na počátku funkce DOSu, která Ctrl-Break testuje.
Chcete-li Ctrl-Break ignorovat, použijte pouze ukončení IRET.
Chcete-li něco udělat, (např. zastavit určitou akcí), musíte uschovat
všechny registry, než akci spustíte a poté je zase obnovit. Akci opouštějte
přes IRET. Neexistují žádná omezení na to, co může vaše obsluha breaku dělat
- jsou dostupné všechny funkce DOSu. Používá-li ovšem obslužná rutina sama
I/O operace a uživatel znovu stiskne Ctrl-Break, DOS se zhroutí.
Chcete-li rutinu ukončit (odejít do volajícího procesu), nastavte příznak carry
a odejděte FAR RET. Tehdy DOS provede normální regeneraci a předá řízení tomuto
nadřazenému procesu.
Jednoduchá cesta, jak se ujistit, že proces objevil stisk Ctrl-Breaku, je
zavolat čas od času funkci DOS Fn 0B Vstupní status .
Přerušení DOSu Funkce DOSu
INT 24H: Obsluha kritické chyby
Tento vektor (0000:0090) je nastaven na adresu, která převezme řízení, když
driver zařízení DOSu objeví kritickou chybu. Adresa tohoto vektoru se kopíruje
do PSP funkcí DOS Fn 26 Vytvoř PSP a DOS Fn 4B EXEC .Při opuštění
nadřazeného procesu jsou hodnoty jeho vektoru INT 24 obnoveny z jeho PSP.
Normální ošetření INT 24 je rutina, která zobrazuje zprávu:
Abort, Retry, Ignore? _
kterou vidíte, jsou-li otevřená dvířka mechaniky nebo je-li tiskárna off-line.
Profesionální programy ji nahrazují rutinou, která zabrání DOSu, aby odroloval
pečlivě rozvrženou obrazovku.
┌───────┐
│ Vstup │ Při vstupu do obsluhy INT 24 vypadají registry následovně:
└───────┘
BP:SI => Hlavička zařízení, která pomáhá objevit vadné zařízení
DI = bity 0-7 obsahují kód chyby (bity 8-15 jsou nedefinované)
AL = je-li AH bit 7=0, AL je číslo drive (0=A, 1=B, atd.)
AH = informace o chybě:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │0│ │ │ │ │ ║ Pozor: je-li bit 7=1, bity 0-6 nejsou definovány
╙╥┴─┴╥┴╥┴╥┴─┴─┴╥╜ bit
║ ║ ║ ║ ╚╦╝ ╚═> 0: typ práce: 0=čtení, 1=zápis
║ ║ ║ ║ ╚════> 1-2: postižené místo na disku:
║ ║ ║ ║ 00=systémové soubory, 01=FAT
║ ║ ║ ║ 10=adresář, 11=pole dat
║ ║ ║ ╚═══════> 3: 1=FAIL exit je povolen ────┐
║ ║ ╚═════════> 4: 1=RETRY exit je povolen ╞═ pouze DOS 3.x
║ ╚═══════════> 5: 1=IGNORE exit je povolen ──┘
╚═══════════════> 7: typ zařízení: 0=disk, 1=jiné
Chybu můžete ošetřit zprávou pro uživatele (např. zavři dvířka mechaniky
nebo zapni tiskárnu). Funkce DOSu nad 0cH nemohou být použity (kromě funkce
DOS Fn 59 Zjisti rozšířenou chybu , která je přípustná).
Pomocí funkce DOSu 59H můžete získat další informace a/nebo blok hlavičky
driveru zařízení na který ukazuje BP:SI.
┌──────┐
│ Exit │ Po ošetření nebo po pokusu o odstranění chyby můžete nastavit
└──────┘ AL na kód akce a vrátit jej DOSu s některou z hodnot:
AL=0: ignoruj chybu
AL=1: zkus operaci znovu
AL=2: skonči. Odejdi přes INT 23 (jako při Ctrl-Breaku)
AL=3: návrat k aplikaci indikující chybovou funkci DOSu
Pro DOS 3.x: Prozkoumejte na začátku AH, abyste zjistili,
které akce nejsou povoleny.
Ideální je AL=3. Například jestliže operace "Otevři soubor" způsobila chybu,
protože v mechanice nebyla disketa, můžete nechat váš program, aby se o to
postaral normální obsluhou této chyby. Jsou tu ale nevýhody:
AL=3 není povoleno na nižších verzích DOSu, než DOS 3.0
DOS vždy vrátí kód chyby 53H, což není příliš informativní
┌──────────┐
│ Zásobník │ Na vstupu do obsluhy přerušení INT 24H je zásobník ve známém,
└──────────┘ dále popsaném stavu:
IP Návratová adresa do DOSu
CS pomocí IRET
Flags
AX,BX,CX,DX,SI,DI,BP,DS,ES Registry aplikačního programu před INT 21
IP Adresa návratu přímo do
CS aplikačního programu
Flags Příznakový registr aplikace
Tato informace může být použita při rozhodování, která funkce DOSu zhavarovala
(AH v zásobníku) a o hodnotách ostatních registrů. Hlavní význam je však v tom,
že máte možnost nechat obsluhu INT 24H obnovit registry a vrátit řízení přímo
aplikačnímu programu.
Budete asi chtít předstírat, že jste DOS, nastavit AX na chybový kód DOSu
a nastavit CF=C k indikaci chyby (nejlepší software tuto techniku používá).
Na použití tohoto způsobu manuál říká, že DOS bude v "nestabilním" stavu
dokud se nepoužije funkce vyšší, než 0cH. Přesto se tato technika používá
v mnoha úspěšných programech.
Vektor INT 24 se nepoužívá pro diskové chyby, objevené během INT 25 a INT 26
Přerušení DOSu Chybové kódy DOSu Funkce DOSu
Seznam funkcí DOSu
DOS Fn 00 Ukonči proces
DOS Fn 01 Vstup z klávesnice
DOS Fn 02 Zobraz znak
DOS Fn 03 Vstup z AUX
DOS Fn 04 Výstup na AUX
DOS Fn 05 Výstup na tiskárnu
DOS Fn 06 I/O přes konzoli
DOS Fn 07 Nefiltrovaný vstup bez echa
DOS Fn 08 Vstup bez echa
DOS Fn 09 Zobraz řetězec
DOS Fn 0A Bufferovaný vstup řetězce
DOS Fn 0B Vstupní status
DOS Fn 0C Vstup s výmazem bufferu
DOS Fn 0D Reset disku
DOS Fn 0E Vyber disk
DOS Fn 0F Otevři soubor přes FCB
DOS Fn 10 Zavři soubor přes FCB
DOS Fn 11 Najdi první soubor přes FCB
DOS Fn 12 Najdi další soubor přes FCB
DOS Fn 13 Zruš soubor přes FCB
DOS Fn 14 Sekvenční čtení přes FCB
DOS Fn 15 Sekvenční zápis přes FCB
DOS Fn 16 Založ soubor přes FCB
DOS Fn 17 Přejmenuj soubor přes FCB
DOS Fn 18 Vyhrazeno
DOS Fn 19 Zjisti vybraný disk
DOS Fn 1A Nastav DTA
DOS Fn 1B Čti FAT info vybraného disku
DOS Fn 1C Čti FAT info libovolného disku
DOS Fn 1D Vyhrazeno
DOS Fn 1E Vyhrazeno
DOS Fn 1F Zjisti parametry implicitního disku
DOS Fn 20 Vyhrazeno
DOS Fn 21 Čti libovolnou větu
DOS Fn 22 Zapiš libovolnou větu
DOS Fn 23 Velikost souboru přes FCB
DOS Fn 24 Nastav libovolný blok
DOS Fn 25 Nastav vektor přerušení
DOS Fn 26 Vytvoř Prefix programového segmentu
DOS Fn 27 Čti libovolný blok
DOS Fn 28 Zapiš libovolný blok
DOS Fn 29 Rozbor jména souboru
DOS Fn 2A Čti systémové datum
DOS Fn 2B Nastav systémové datum
DOS Fn 2C Čti systémový čas
DOS Fn 2D Nastav systémový čas
DOS Fn 2E Nastav verifikaci
DOS Fn 2F Čti DTA
DOS Fn 30 Čti verzi systému
DOS Fn 31 Skonči a zůstaň rezident
DOS Fn 32 Informace o disku
DOS Fn 33 Kontrola Ctrl-Break
DOS Fn 34 Příznak aktivity DOSu
DOS Fn 35 Čti vektor přerušení
DOS Fn 36 Volné místo na disku
DOS Fn 37 Znak pro přepínač
DOS Fn 38 Informace o státu
DOS Fn 39 Vytvoř adresář
DOS Fn 3A Zruš adresář
DOS Fn 3B Vyber adresář
DOS Fn 3C Založ soubor
DOS Fn 3D Otevři soubor
DOS Fn 3E Zavři soubor
DOS Fn 3F Čti ze souboru
DOS Fn 40 Zápis do souboru
DOS Fn 41 Zruš soubor
DOS Fn 42 Nastav pozici v soub
DOS Fn 43 Atributy souboru
DOS Fn 44 Ovládání I/O zařízení
DOS Fn 45 Duplikuj HANDLE
DOS Fn 46 Přesměrování
DOS Fn 47 Čti vybraný adresář
DOS Fn 48 Alokuj paměť
DOS Fn 49 Uvolni paměť
DOS Fn 4A Realokuj blok paměti
DOS Fn 4B Spusť program
DOS Fn 4C Exit
DOS Fn 4D Wait
DOS Fn 4E Najdi první soubor
DOS Fn 4F Najdi další soubor
DOS Fn 50 Nastav PSP
DOS Fn 51 Zjisti implicitní PSP
DOS Fn 52 Zjisti proměnné DOSu
DOS Fn 53 Transformuj BPB
DOS Fn 54 Čti režim verifikace
DOS Fn 55 Vytvoř PSP
DOS Fn 56 Přejmenuj soubor
DOS Fn 57 Čas a datum souboru
DOS Fn 58 Strategie alokace paměti
DOS Fn 59 Rozšířený kód chyby
DOS Fn 5A Dočasný soubor
DOS Fn 5B Vytvoř nový soubor
DOS Fn 5C Zamkni soubor
DOS Fn 5D Interní fce DOSu
DOS Fn 5E Různé síťové funkce
DOS Fn 5F Přesměrování v síti
DOS Fn 60 Rozšiř cestu na plný tvar
DOS Fn 61 Vyhrazeno
DOS Fn 62 Čti adresu PSP
DOS Fn 63 Interní služby
DOS Fn 64 Vyhrazeno
DOS Fn 65 Rozšířené info o nár. zvyklostech
DOS Fn 66 Dej/Nastav kódovou stránku
DOS Fn 67 Nastav počet HANDLE
DOS Fn 68 Zapiš buffery
DOS Fn 69 Zjisti sériové číslo disku
DOS Fn 6A Vyhrazeno
DOS Fn 6B Vyhrazeno
DOS Fn 6C Rozšířené otevření souboru
DOS Fn 6D Vyhrazeno
DOS Fn 6E Vyhrazeno
DOS Fn 6F Vyhrazeno
Chybové kódy DOSu I/O přes FCB I/O přes HANDLE
Ovladače zařízení
DOS Fn 00H - Ukončení programu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 00H
└─────────╢ CS ║ Prefix programového segmentu končícího procesu
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║ (není použitelné)
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Předá kontrolu vektoru Terminate v PSP (vrací se do rodičovského proce─
su). Identické funkci INT 20 Terminate. Segmentový registr CS musí
být nastaven na PSP .
Nastaví vektory přerušení DOSu 22─24H (Terminate, Ctrl─Break a Critical
Error) na hodnoty uložené v rodičovském PSP. Vyprázdní souborové buffe─
ry, ale jestli se délka souborů změnila, měly by být uzavřeny.
Poznámka: Je snadnější a čistší použít funkci DOS Fn 4C .
Funkce DOSu
DOS Fn 01H : Vstup z klávesnice
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 02H
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstupo ║ AL ║ znak načtený ze standardního vstupu
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Čte (s čekáním) znak ze standardního vstupního zařízení.
Opíše tento znak na standardní výstupní zařízení.
Je─li zjištěno Ctrl-Break, je vyvoláno přerušení INT 23 .
Pozn : Rozšířené kódy kláves (tj. F1─F12, PgUp, kurzorové šipky atd.)
vyžadují dvě volání této funkce. První volání vrátí AL=0. Druhé
volání vrátí AL s rozšířeným ASCII kódem.
Funkce DOSu Klávesnice INT 16
DOS Fn 02H: Výstup na displej
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 02H
└─────────╢ DL ║ znak, který má být zobrazen na standardním výstupu
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vyšle znak v DL na standardní výstup.
Backspace (ASCII 8) způsobí posunutí kurzoru doleva.
Je─li zjištěno Ctrl-Break, je vyvoláno přerušení INT 23 .
Funkce DOSu Video INT 10
DOS Fn 03H: Přídavný vstup (Auxiliary Input)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 03H
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ Znak načtený ze standardního přídavného zařízení
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Čte (s čekáním) znak ze standardního přídavného zařízení, COM1 nebo
AUX, a tento znak vrátí v AL.
Poznámka : Vstup není bufferován a musí být periodicky testován (není řízen
přes přerušení). Po startu DOSu je port AUX (COM1) inicializován na:
2400 baudů
bez parity
1 stop bit
8─bitové slovo
Pro jiné nastavení lze použít příkaz DOSu MODE.
Funkce DOSu COM INT 14
DOS Fn 04H: Přídavný výstup (Auxiliary Output)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 04H
└─────────╢ DL ║ znak, který má být vyslán na standardní přídavné zařízení
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vyšle znak v DL na standardní přídavné zařízení, COM1 neboli AUX.
Pro další informace viz DOS Fn 03 Vstup z AUX .
Funkce DOSu COM INT 14
DOS Fn 05H: Výstup na tiskárnu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 05H
└─────────╢ DL ║ znak, který má být vypsán na standardní tiskárně
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vyšle znak v DL na zařízení standardní tiskárny, normálně LPT1.
Poznámka : Příkaz DOSu MODE může přesměrovat tento výstup na sériový port.
Funkce DOSu LPT INT 17
DOS Fn 06H: Konzolový vstup a výstup
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 06H
└─────────╢ DL ║ 0 až 0feH znak pro výstup na standardním výstupu
║ ║ 0ffH požadavek na vstup se standardního vstupu
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ ZF ║ nula (NZ), je─li znak připraven ══╦═► při vstupu
└─────────╢ AL ║ čtený znak, je─li ZF nulová ════╝ (když DL=0ffH)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Jestliže je DL=0ffH, tato funkce provede vstup z konzoly bez čekání,
a vrátí příznak ZF=1, jestliže není připravený znak.
Jestliže znak připravený je, vrátí příznak ZF=0 a přečtený
znak je v AL.
Jestliže DL je cokoliv kromě 0ffH, DL je vyslán na standardní výstup.
Poznámka : Nekontroluje Ctrl─Break. Volat dvakrát pro rozšířené ASCII.
Funkce DOSu Video INT 10 Klávesnice INT 16
DOS Fn 07H: Nefiltrovaný vstup z konzoly bez echa
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 07H
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ znak načtený ze standardního vstupního zařízení
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Čte (s čekáním) znak ze standardního vstupního zařízení, a tento
znak vrátí v AL.
Nefiltrovaný : Nedetekuje Ctrl-Break, backspace atd.
Poznámky : Volat dvakrát pro znakový vstup rozšířeného ASCII. Použijte
DOS Fn 0B pro kontrolu statusu (nechcete─li čekat na klávesu).
Funkce DOSu Klávesnice INT 16
DOS Fn 08H: Vstup z konzoly bez echa
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 08H
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ Znak načtený ze standardního vstupu
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Čte (s čekáním) znak se standardního vstupu, a tento znak vrací v AL.
Je─li zjištěno stisknutí Ctrl-Break, je vyvolán INT 23 .
Poznámka : Volejte dvakrát pro vstup rozšířených ASCII kódů.
Funkce DOSu Klávesnice INT 16
DOS Fn 09H: Zobraz řetězec
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 09H
└─────────╢ DS:DX ║ adresa řetězce zakončeného '$' (ASCII 24H)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Řetezec až po zakončovací znak '$' je vyslán na standardní výstup
Backspace je ošetřováno stejně jako ve funkci 02H Zobraz znak.
Normální postup pro zobrazení nového řádku je zahrnout dvojici CR/LF
(ASCII 0dH následovaný znakem 0aH) do řetězce.
Řetězce obsahující znak '$' mohou být tisknuty přes funkci
DOS Fn 40 Zápis do souboru (BX=0).
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 0aH: Bufferovaný vstup řetězce
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 0aH
└─────────╢ DS:DX ║ adresa vstupního bufferu (viz níže)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║ buffer obsahuje vstup zakončený CR (ASCII 0dH)
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Před voláním je třeba připravit buffer na adrese DS:DX takto:
┌───┬───┬───┬───┬───┬───┬─ ─ ─
│max│ ? │ ? ? ? ? ? MAX je maximální počet znaků
└───┴───┴───┴───┴───┴───┴ ─ ─ (rozsah: 1 až 254)
Po provedení funkce je buffer naplněn takto:
┌───┬───┬───┬───┬───┬───┬─ ─ ─
│max│len│ T E X T 0dH LEN skutečná délka vstupu (není
└───┴───┴───┴───┴───┴───┴ ─ ─ počítán závěrečný CR (tj. 04H).
Znaky jsou čteny ze standardního vstupu až do CR (ASCII 0dH) nebo až
do hodnoty MAX─1. Je─li dosaženo MAX─1, konzola pípne pro každý znak
tak dlouho, dokud není čten znak Enter (CR).
Druhý byte v bufferu je naplněn skutečnou délkou vstupu, zmenšenou
o ukončovací CR. Poslední znak v bufferu je vždycky CR (který není
započítán do délkového bytu).
Znaky v bufferu (včetně LEN) před voláním jsou použity jako "šablona"
a editovací klávesy DOSu mají tyto významy:
ESC zobrazí "\" a restartuje editaci,
F3 zobrazí do konce šablony,
F5 zobrazí "@" a uloží aktuální řádek jako šablonu atd.
Většina rozšířených ASCII kódů je ignorována.
Je─li zjištěno Ctrl-Break, provede se INT 23 a buffer zůstane
nezměněn.
Funkce DOSu Klávesnice INT 16
DOS Fn 0BH: Kontrola statusu vstupu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 0bH
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0ffH jestliže je připraven znak ve standardním vstupu
└─────────╢ ║ 0 není─li znak připraven
╙───────╨─────────────────────────────────────────────────────────────
Popis : Kontroluje status standardního vstupu
Je─li zjištěno Ctrl-Break, je provedeno INT 23 .
Poznámky : Použij před funkcemi 01H 07H a 08H , aby DOS nezůstal čekat na
klávesu.
Toto je jednoduchá, nedestruktivní metoda kontroly na Ctrl─Break
při dlouhých výpočtech nebo jiném zpracování, které se normálně neobrací
na vstup. Dovoluje uživateli ukončit takovouto sekvenci.
Funkce DOSu Klávesnice INT 16
DOS Fn 0cH: Vstup s výmazem bufferu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 0cH
└─────────╢ AL ║ Číslo vstupní funkce DOSu (01H, 06H, 07H, 08H nebo 0aH)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Vrací ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Maže buffer standardního vstupu, kde mohou být stisknuté, ale ještě
nezpracované klávesy. Potom provede vstupní funkci DOSu určenou AL.
Tím je systém donucen čekat na vložení klávesy.
AL může mít tyto hodnoty:
DOS Fn 01 Vstup z klávesnice
DOS Fn 06 I/O přes konzolu
DOS Fn 07 Nefiltrovaný vstup bez echa
DOS Fn 08 Vstup bez echa
DOS Fn 0A Bufferovaný vstup řetězce
Funkce DOSu Klávesnice INT 16
DOS Fn 0DH: Reset disku
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 0dH
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vymaže všechny souborové buffery. Jestliže soubor změnil velikost,
měl by být uzavřen ještě před použitím této funkce (pro uzavření můžete
použít DOS Fn 10 nebo DOS Fn 3E ).
Funkce DOSu
DOS Fn 0EH: Nastav vybraný disk
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 0eH
└─────────╢ DL ║ číslo disku (0=A, 1=B, atd.)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ celkový počet diskových jednotek
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Disku uvedený v DL se stane vybraným diskem DOSu. Chybu je možno ověřit
tak, že se zavolá DOS Fn 19 Zjisti vybraný disk, čímž se ujistíme, že
jsme byli úspěšní.
Návratová hodnota v AL je počet disků libovolného typu, včetně pevného
disku a logických disků (jako je B: v jednodisketovém systému).
Verze : DOS 3.0+ AL je totéž jako hodnota LASTDRIVE v souboru CONFIG.SYS ,
implicitní hodnota je 5.
Funkce DOSu
DOS Fn 0FH: Otevři soubor přes FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 0fH
└─────────╢ DS:DX ║ adresa neotevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 je-li soubor otevřen bez chyby a FCB doplněn
└─────────╢ ║ 0ffH nastala chyba a soubor nejde otevřít
╙───────╨─────────────────────────────────────────────────────────────
Popis : Soubor určený neotevřeným FCB musí již existovat ve vybraném adresáři
na disku určeném ve FCB (0 vybraný, 1=A, 2=B atd.). Není-li soubor
nalezen, je vráceno AL=0ffH.
Soubor je otevřen v kompatibilním přístupovém režimu.
Je-li pole Drv ve FCB před voláním 0, je doplněno číslem vybraného
disku (1=A, 2=B, atd.).
Pole CurBlk ve FCB je nastaveno na 0
Pole RecSize je nastaveno na 80H
Velikost a datum ve FCB jsou doplněny z adresáře.
Poznámka : Funkce orieontavné na HANDLE od DOS 2.0+ jsou daleko snadnější
k používání.
Funkce DOSu I/O přes FCB I/O přes HANDLE
DOS Fn 10H: Uzavření souboru přes FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 10H
└─────────╢ DS:DX ║ adresa otevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 je-li soubor uzavřen bez chyby
└─────────╢ ║ 0ffH není-li soubor tam, kde byl při otevření funkcí Fn 0fH
╙───────╨─────────────────────────────────────────────────────────────
Popis : Soubor musí být na svém původním místě v aktuálním vybraném adresáři na
disku, kde byl otevřen.
Jestliže je soubor nelezen, adresář je aktualizován, souborové buffery
jsou vyprázdněny a po návratu je AL=00H.
Jestliže soubor není nalezen, adresář není aktualizován a je vráceno
AL=0ffh.
Funkce DOSu I/O přes FCB I/O přes HANDLE
DOS Fn 11H: Najdi první soubor přes FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 11H
└─────────╢ DS:DX ║ adresa neotevřeného FCB (název může obsahovat otazníky)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 byl-li nalezen odpovídající soubor (a DTA je naplněna)
└─────────╢ ║ 0ffH nebyla nalezena žádná shoda
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vybraný adresář DOSu je prohledán pro soubor, který se shoduje s FCB
na adrese DS:DX. V AL se vrací 0ffH, nebyla-li nalezena shoda.
Je-li nalezena shoda, AL vrátí 00h a DTA je naplněna prvním bytem jako
číslem disku (A=1, B=2, atd.) a adresářová položka tohoto souboru je
uložena v následujících 32 bytech.
Při volání můžete použít Extended FCB pro výběr souborů s určenými
atributy. V tomto případě je DTA naplněna 0ffH, 7 bytů nul, číslo
disku a položka adresáře.
V každém případě je DTA vyplněna platným neotevřeným FCB.
Můžete použít DOS Fn 12 Najdi další FCB pro hledání dalších shod.
Poznámky : Máte-li v úmyslu hledat více souborů, neprovádějte žádné I/O operace
s nalezeným souborem. Nejprve si zkopírujte FCB někam jinam.
Funkce DOS Fn 4E Najdi první soubor je snadnější k použití, mů-
žete použít běžný formát d:\path\filespec, který bývá očekáván při
vstupu od uživatele.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 12H: Najdi další soubor přes FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 12H
└─────────╢ DS:DX ║ adresa neotevřeného FCB (v názvu mohou být otazníky)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 byl-li nalezen odpovídající soubor (a DTA je naplněna)
└─────────╢ ║ 0ffH nebyla-li nalezena žádná shoda
╙───────╨─────────────────────────────────────────────────────────────
Popis : Použijte tuto funkci po volání DOS Fn 11 Najdi první soubor přes FCB
s obecným jménem souboru. Každé další volání doplní DTA další shodnou
adresářovou položkou a vrátí AL=00H jestliže byl další soubor nalezen,
nebo AL=0ffH, jestliže již nebyl nalezen žádný další vyhovující soubor.
Rezervovaná oblast FCB nese informace pro pokračování hledání, takže
neotvírejte ani neměňte FCB mezi voláními.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 13H: Zrušení souboru přes FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 13H
└─────────╢ DS:DX ║ adresa neotevřeného FCB (jméno může obsahovat otazníky)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 jestliže byl soubor zrušen
└─────────╢ ║ 0ffH soubor nebyl nalezen nebo zákaz přístupu
╙───────╨─────────────────────────────────────────────────────────────
Popis : Všechny soubory vyhovující specifikaci v aktuálním vybraném adresáři
jsou zrušeny.
Není-li nalezena žádná shoda nebo je-li přístup k souboru zakázán (např.
při pokusu o zrušení souboru s atributem ochrany proti zápisu), v AL
se vrátí 0ffH.
Funkce DOSu I/O přes FCB I/O přes HANDLE
DOS Fn 14H: Sekvenční čtení prostřednictvím FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 14H
└─────────╢ DS:DX ║ adresa otevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 bylo-li čtení úspěšné a DTA obsahuje data
└─────────╢ ║ 1 bylo-li dosaženo EOF a žádná data přečtena
║ ║ 2 jestliže DTA+FCB RecSiz by přesáhla segment (bez čtení)
║ ║ 3 jestliže EOF část věty byla čtena (doplněno nulami)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Čte FCB RecSize bytů z pozice v souboru určené hodnotami CurBlk a
CurRec do DTA. Potom zvětší počitadla bloku a věty.
Nezapomeňte nastavit CurRec na 0 před tím, než začnete sekvenční opera-
ce, protože DOS Fn 0F Otevři soubor přes FCB je neinicializuje.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 15H: Sekvenční zápis prostřednictvím FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 15H
└─────────╢ DS:DX ║ adresa otevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 jestliže byl zápis úspěšný
└─────────╢ ║ 1 plný disk a žádná data nebyla zapsána
║ ║ 2 jestliže DTA+FCB RecSize by přesáhlo segment (žádný zápis)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Zapíše FCB Recsize bytů z DTA do souboru na pozici určenou CurBlk a
CurRec. Potom zvětší počitadla bloku a věty.
Nezapomeňte nastavit CurRec na 0 před zahájením sekvenčních operací,
protože DOS Fn 0F Otevři soubor přes FCB je neinicializuje.
Poznámka : DOS bufferuje data, dokud se nedá zapsat celý sektor naráz.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 16H: Založ soubor prostřednictvím FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 16H
└─────────╢ DS:DX ║ adresa neotevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 soubor založen bez chyby (a FCB doplněn)
└─────────╢ ║ 0ffH jestliže nastala chyba a soubor nejde založit/otevřít
╙───────╨─────────────────────────────────────────────────────────────
Popis : Soubor specifikovaný neotevřeným FCB je vytvořen ve vybraném adresáři
na disku určeném ve FCB (0=vybraný, 1=A, atd.).
FCB je doplněn stejně jako u DOS Fn 0F Otevři soubor přes FCB.
Jestliže před voláním soubor již existoval, je využita jeho adresářová
položka a délka souboru je nastavena na 0.
Poznámka : Funkce orietované na HANDLE od DOSu 2.0 jsou mnohem snadnější
k použití.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 17H: Přejmenuj soubor prostřednictvím FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 17H
└─────────╢ DS:DX ║ adresa FCB se speciálním formátem
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 soubor byl přejmenován úspěšně
└─────────╢ ║ 0ffH soubor nenalezen, nové jméno již existuje a podobně
╙───────╨─────────────────────────────────────────────────────────────
Popis : Přejmenuje soubor ve vybraném adresáři.
Položka pro přejmenování má tento tvar:
╔══► 0=vybraný, 1=A, 2=B, atd.
ofset délka ┌─╨─┬───────────────────────────────┬───────────┐
+0 0cH │drv│ F I L E N A M E │ E X T │ ◄═════ staré
├───┴───┴───┴───┴───┴───┼───┴───┴───┴───┴───┴───┘ jméno
+0cH 6 │ rezervováno │
├───┴───┴───┴───┴───┴───┴───────┬───────────┐
+11H 0bH │ F I L E N A M E │ E X T │ ◄═══════ nové
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ jméno
Oba názvy mohou obsahovat substituční znak '?':
• Ve starém jménu hledá všechny shody ve vybraném adresáři
a přejmenuje všechny vyhovující názvy.
• V novém jménu to znamená: Použij stejný znak, jaký se nachází
na této pozici ve starém jménu.
Poznámka : Tato funkce vám dovoluje přejmenovat adresář použitím
rozšířeného FCB se správným atributem pro staré jméno.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 19H: Zjisti vybraný disk
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 19H
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ číslo vybraného disku (0=A, 1=B, atd.)
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vrátí číslo právě vybraného disku DOSu.
Viz DOS Fn 0E .
Funkce DOSu
DOS Fn 1AH: Nastav přenosovou adresu disku
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 1AH
└─────────╢ DS:DX ║ adresa DTA
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Vrací ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Tato funkce nastaví přenosovou adresu disku.
• všechny souborové operace používající FCB probíhají na DTA
• DOS nenechá souborové přístupy překročit kolem hranice segmentu
• Hledací funkce DOS Fn 11 DOS Fn 12 DOS Fn 4E a
DOS Fn 4F probíhají na DTA
• DTA je globální, takže pozor při jejím nastavování v rekurzivních
nebo reentrantních procedurách
• po startu programu je DTA nastavena na ofset 80H v aktuálním PSP
DOS Fn 2F Čti DTA I/O přes HANDLE I/O přes FCB Funkce DOSu
DOS Fn 1bH: Čti informace o FAT (vybraný disk)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 1BH
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ DS:BX ║ adresa identifikačního byte FAT (indikuje typ disku)
└─────────╢ DX ║ celkový počet alokačních jednotek (clusterů) na disku
║ AL ║ počet sektorů na cluster
║ CX ║ počet bytů na sektor
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vrací informace o velikosti a typu vybraného disku. Velikost disku
v bytech je (DX * AL * CX)
Volné místo zjistíte pomocí DOS Fn 36 Volné místo na disku nebo pomocí
DOS Fn 32 Informace o disku
Verze : DOS 1.x držel FAT v paměti a vrátil DX:BX => FAT
DOS 2.0+ může držet pouze část FAT v paměti
POZOR : Tato funkce mění hodnotu segmentového registru DS.
DOS Fn 1C DOS Fn 36 DOS Fn 32 Funkce DOSu
DOS Fn 1CH: Čti informace o FAT (libovolný disk)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 1cH
└─────────╢ DL ║ číslo disku (0=vybraný, 1=A, atd).
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ DS:BX ║ adresa identifikačního bytu FAT (indikuje typ disku)
└─────────╢ DX ║ celkem clusterů (alokačních jednotek)
║ AL ║ sectorů na cluster
║ CX ║ bytů na sektor
╙───────╨─────────────────────────────────────────────────────────────
Popis : Totéž jako DOS Fn 1B Čti informace o FAT kromě toho, že v DL je
číslo disku, pro který chcete informace.
Verze : Není implementováno v DOS 1.x
Funkce DOSu
DOS Fn 21H: Čti libovolnou větu souboru
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 21H
└─────────╢ DS:DX ║ adresa otevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 čtení bylo úspěšné a DTA je naplněna daty
└─────────╢ ║ 1 bylo dosaženo EOF a žádná data přečtena
║ ║ 2 DTA + FCB RecSize by překročilo segment(nic načteno)
║ ║ 3 dosaženo EOF a část věty načtena (doplněno nulami)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví FCB CurBlk a CurRec tak, aby bylo v souladu s RandomRec,
potom čte RecSize bytů ze specifikované pozice v souboru a data
umístí do paměti na adresu DTA.
Nezapoměňte nastavit RecSize na délku věty a RandomRec ve FCB na poža-
dované číslo věty.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 22H: Zápis libovolné věty do souboru
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 22H
└─────────╢ DS:DX ║ adresa otevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 zápis byl úspěšný
└─────────╢ ║ 1 disk je plný
║ ║ 2 DTA + FCB RecSize by překročilo segment (bez zápisu)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví FCB CurBlk a CurRec do souladu s RandomRec, potom zapíše
RecSize bytů z DTA na disk na určenou pozici do souboru.
Nezapomeňte nastavit RecSiz na délku věty a RandomRec ve FCB na
požadované číslo věty.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 23H: Zjisti velikost souboru přes FCB
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 23H
└─────────╢ DS:DX ║ adresa neotevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 soubor byl nalezen
└─────────╢ ║ 0ffH soubor nebyl ve vybraném adresáři
╙───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví pole RandomRec ve FCB tak, že ukazuje, kolik vět o RecSize bytů
je obsaženo v souboru.
Nezapomeňte nastavit RecSize před voláním. Nastavíte-li RecSize na 1,
RandomRec bude obsahovat 4-bytovou hodnotu velikosti souboru v bytech.
Může pro vás být snadnější zjistit velikost souboru použitím DOS Fn 3d
Otevři HANDLE a následným použitím DOS Fn 42 Posuň pozici v souboru
s AL=2.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 24H: Nastav přímo blokovou adresu v souboru
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 24H
└─────────╢ DS:DX ║ adresa neotevřeného FCB
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví pole RandomRec ve FCB na pozici v souboru, která odpovídá
hodnotám CurBlk a CurRec.
DOS Fn 42 SEEK I/O přes HANDLE I/O přes FCB Funkce DOSu
DOS Fn 25H Nastav vektor přerušení
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 25H
└─────────╢ AL ║ číslo přerušení
║ DS:DX ║ vektor přerušení: adresa kódu pro obsluhu přerušení
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví položku tabulky vektorů přerušení pro interrupt číslo AL
na DS:DX.
Je to totéž, jako uložení 4-bytové adresy na 0000:(AL*4), ale uvědomíte
DOS o tom, co děláte, a zajistíte, že neproběhne žádné hardwarové pře-
rušení během ukládání.
Pozor - nezapomeňte změnit DS zpátky, je-li to potřeba, po provedení služby.
DOS Fn 35 Čti vektor přerušení Funkce DOSu
DOS Fn 26H: Vytvoř Prefix programového segmentu (PSP)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 26H
└─────────╢ DX ║ segmentová adresa (paragraf) nového PSP
║ CS ║ segment PSP, který má být použit jako šablona pro nový PSP
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví PSP pro podřízený proces na DX:0000.
• aktuální PSP (100H bytů s počátkem na CS:0) je přenesen na DX:0.
• je nastaveno nové pole MemTop.
• Vektory Ukonči, Ctrl-Break, a Kritická chyba jsou zkopírovány do PSP
z vektorů pro INT 22 INT 23 a INT 24
Potom můžete nahrát z disku program a spustit jej přes FAR JMP.
Viz Hlavička EXE pro informace o čtení souboru v EXE-formátu.
Poznámky : Jestliže přepisujete INT 21 , nezapomeňte nechat správné CS:IP
na stacku. Obecně se tomuto volání vyhněte; místo toho raději použijte
DOS Fn 4B EXEC .
Funkce DOSu
DOS Fn 27H: Čti libovolný blok souboru
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 27H
└─────────╢ DS:DX ║ adresa otevřeného FCB
║ CX ║ počet vět, které mají být přeěteny
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 čtení bylo úspěšné a DTA obsahuje data
└─────────╢ ║ 1 dosaženo EOF a žádná data nenačtena
║ ║ 2 DTA + FCB (RecSize * CX) by překročilo segment
║ ║ 3 dosaženo EOF a část věty načtena (doplněna nulami)
║ CX ║ skutečný počet čtených vět
╙───────╨─────────────────────────────────────────────────────────────
Popis : Čte více vět ze souboru s počátkem na pozici v souboru určené polem
RandomRec ve FCB. Uloží data v paměti s počátkem na DTA. Počet přečte-
ných bytů = FCB RecSize * CX.
Pole RandomRec a CurBlk jsou nastavena tak, že ukazují na další větu
(první větu, která nebyla čtena).
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 28H: Zapiš libovolný blok souboru
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 28H
└─────────╢ DS:DX ║ adresa otevřeného FCB
║ CX ║ počet vět k zápisu (je-li CX=0, nastav velikost souboru)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 zápis byl úspěšný
└─────────╢ ║ 1 disk je plný
║ ║ 2 jestliže DTA + FCB (RecSize * CX) by překročily segment
║ CX ║ skutečný počet zapsaných vět
╙───────╨─────────────────────────────────────────────────────────────
Popis : Zapíše více vět do souboru s počátkem na pozici určené polem RandomRec
ve FCB. Data jsou brána z paměti počínajíce DTA. Skutečný počet zapsa-
ných bytů = (RecSize * CX).
Je-li při volání CX = 0, velikost souboru je zmenšena nebo zvětšena na
RandomRec * RecSize a žádná data nejsou zapsána.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 29H: Rozbor jména souboru
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 29H
└─────────╢ DS:SI ║ adresa zdrojového textu řádku pro rozbor
║ ES:DI ║ adresa buffer pro umístění výsledného neotevřeného FCB
║ AL ║ bitové příznaky pro nastavení parametrů rozboru (viz níže)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Returns ║ AL ║ 0 výsledný FCB nemá zástupné znaky
└─────────╢ ║ 1 výsledný FCB obsahuje zástupné znaky
║ ║ 0ffH nesprávné číslo disku ve specifikaci souboru
║ DS:SI ║ změněn: ukazuje na znak právě za jménem souboru
║ ES:DI ║ nezměněn: ukazuje na neotevřený FCB
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vytvoří neotevřený FCB z textového řádku nebo příkazového parametru.
Text začínající na DS:SI je prohledáván na jméno souboru ve tvaru
D:FILENAME.EXT a buffer na adrese ES:DI je naplněn správně formátovaným
FCB.
Tato funkce NENÍ užitečná pro rozbor textového řádku obsahujícího jméno
cesty. Základní použití této funkce je rychlý způsob odstranění tečky
(.) ze jména souboru zadaného z klávesnice. Převede '*' na posloupnost
'?', což vám dovoluje snadno přednastavovat předdefinované hodnoty
v cílovém FCB (např. přípona = "TXT").
Provedení akce závisí na něchto bitech příznaků v AL:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0 0 0 0│ │ │ │ ║ hodnota
╙─┴─┴─┴─┴╥┴╥┴╥┴╥╜ bit masky
║ ║ ║ ╚═► 0: 1=odstaň vedoucí separátory (a & 01H)
║ ║ ╚═══► 1: 1=předdefinuj číslo disku z FCB (a & 02H)
║ ╚═════► 2: 1=předdefinuj jméno z FCB (a & 04H)
╚═══════► 3: 1=předdefinuj příponu z FCB (a & 08H)
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 2AH: Čti systémové datum DOSu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 2aH
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ den v týdnu (0 neděle, 1 pondělí,...,6 sobota) DOS 3.0+
└─────────╢ CX ║ rok (1980 až 2099)
║ DH ║ měsíc (1 až 12)
║ DL ║ den (1 až 31)
╙───────╨─────────────────────────────────────────────────────────────
Vrací datum tak, jak je nastaveno v systému.
Verze : Technické manuály DOSu 2.x sice nezaručují vrácení dne v AL, avšak
všechny verze (1.0+) to dělají.
Funkce DOSu DOS Fn 2B Nastav datum
DOS Fn 2BH: Nastav systémové datum DOSu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 2bH
└─────────╢ CX ║ rok (1980 až 2099)
║ DH ║ měsíc (1 až 12)
║ DL ║ den (1 až 31)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 datum bylo platné
└─────────╢ ║ 0ffH datum bylo neplatné
╙───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví systémové datum DOSu.
Funkce DOSu DOS Fn 2A Čti datum
DOS Fn 2CH: Čti systémový čas
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 2cH
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ CH ║ hodina (0 až 23)
└─────────╢ CL ║ minuta (0 až 59)
║ DH ║ sekunda (0 až 59)
║ DL ║ setina sekundy (0 až 99)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vrací aktuální čas, známý systému.
Poznámka : Protože systémové hodiny tikají rychlostí 18.2 "tiků" za sekundu
(55 ms interval), DL má přesnost zhruba 4/100 sekundy.
Funkce DOSu DOS Fn 2D Nastav čas
DOS Fn 2DH: Nastav systémový čas
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 2dH
└─────────╢ CH ║ hodina (0 až 23)
║ CL ║ minuta (0 až 59)
║ DH ║ sekunda (0 až 59)
║ DL ║ setina sekundy (0 až 99)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 jestliže čas byl platný
└─────────╢ ║ 0ffH čas byl neplatný
╙───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví systémový čas DOSu.
Funkce DOSu DOS Fn 2C Čti čas
DOS Fn 2EH: Nastav/vypni přepínač verifikace
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 2eH
└─────────╢ AL ║ 0 vypne verifikaci
║ ║ 1 zapne verifikaci
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Vrací ║ nic ║
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Volba, zda má DOS verifikovat, tj. číst zpátky, každý sektor po jeho
zápisu na disk.
Toto sice velice zpomalí operace zápisu na disk, ale zajistí maximální
integritu dat.
DOS Fn 54 Čti režim verifikace vrací nastavený režim verifikace.
Funkce DOSu
DOS Fn 2FH: Čti přenosovou adresu disku (DTA)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 2fH
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ ES:BX ║ adresa začátku nastavené DTA
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vrací adresu začátku přenosové oblasti diskových operací.
Protože DTA je globální hodnota pro všechny procesy, v rekurzivní
proceduře (např. při cestování stromem adresářů) může být vhodné
pomocí této procedury uschovat DTA a později ji nastavit zpátky pomocí
DOS Fn 1aH Nastav přenosovou adresu disku.
Poznámka : Tato funkce mění segmentový registr ES.
DOS Fn 1A Nastav DTA Funkce DOSu
DOS Fn 30H: Zjisti číslo verze DOSu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 30H
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ Hlavní číslo verze
└─────────╢ AH ║ Vedlejší číslo verze
║ BX,CX ║ 0000H DOS 3.0+
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vrací AX naplněné hodnotou aktuální verze DOSu. Například je-li aktivní
DOS 3.2, v AL se vrátí 3 a v AH se vrátí 2.
Poznámka : Vrátí-li se v AL 0, můžete předpokládat, že aktivní verze DOSu je
menší než 2.0.
Verze : DOS 2.x nezajišťuje nulování CX a BX po návratu.
Funkce DOSu
DOS Fn 31H: Skonči a zůstaň rezidentní - KEEP
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 31H
└─────────╢ AL ║ výstupní kód
║ DX ║ velikost paměti, která má zůstat rezidentní v 16-bytech
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║ (není aplikovatelné)
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vrátí se do rodičovského procesu, výstupní kód je vrácen v AL.
Výstupní kód se dá získat pomocí DOS Fn 4D WAIT
DOS nastaví počáteční alokaci paměti na velikost určenou v DX a vrátí
řízení do rodičovského procesu, čímž je toto množství paměti ponecháno
rezidentní (rezidentních zůstane 16 * DX bytů).
Tato funkce nahrazuje INT 27 , které nevracelo výstupní kód a není
schopno instalovat rezidentní programy větší než 64K.
Funkce DOSu
DOS Fn 32H: Zjisti informace o disku (nedokumentováno)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 32H NEDOKUMENTOVÁNO
└─────────╢ DL ║ číslo disku (0=vybraný, 1=A, atd.)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 jestliže DL bylo platné číslo disku
│ ║ FF ║ 0ffH neplatné číslo disku
│ ║ DS:BX ║ Blok popisu disku
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vrací blok informací, který je užitečný pro aplikace a pomocné programy,
které provádějí přístup k diskům, podporovaným pomocí driverů zařízení,
na sektorové úrovni.
Některé diskové mechaniky (zejména disky, ze kterých nelze provést stu-
dený start systému) pracují přes přístupy k jejich instalovatelným dri-
verům. Tyto disky nemusí obsahovat platné informace v zaváděcím sektoru
a tabulce rozdělení disku, což velice komplikuje lokalizaci např. veli-
kosti kořenového adresáře nebo počet FAT atd. Informační blok disku
obsahuje všechny tyto informace v hezky formátované struktuře.
To může být jediný způsob, jak zjistit adresu driveru zařízení.
Pozor : Mění hodnotu segmentového registru DS. Tato nedokumentovaná verze se
může změnit v budoucích verzích DOSu.
Funkce DOSu
DOS Fn 33H: Nastav/zjisti režim testování klávesy Break
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 33H
└─────────╢ AL ║ 0 zjistit režim testování Ctrl-Break
║ ║ 1 nastavit režim testování Ctrl-Break
║ DL ║ žádaný režim (0=vypnuto, 1=zapnuto) (jen když AL=1)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ DL ║ nastavený režim (0=vypnuto, 1=zapnuto)
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Je-li AL=0, v DL je vrácen právě nastavený režim testování Ctrl-Break.
Je-li AL=1, nastavený režim je vrácen v DL.
Je-li testování zapnuto, DOS kontroluje Ctrl-Break z konzoly během vět-
šiny funkcí (kromě 06H a 07H). Když je Ctrl-Break zjištěno, je
provedeno INT 23 (není-li zachyceno uživatelským procesem, je proces
ukončen).
Je-li Break vypnuto, DOS hlídá Ctrl-Break pouze během standardního I/O,
obsluhy standardní tiskárny a standardních AUX operací.
INT 23 Funkce DOSu
DOS Fn 34H: Adresa příznaku činnosti DOSu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 34H NEDOKUMENTOVÁNO
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ ES:BX ║ adresa příznaku aktivity DOSu
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Tato nedokumentovaná funkce je používána PRINTem (program DOSu pro tisk
na pozadí), takže je možno zjistit, je-li možné používat služby DOSu
pro otevírání/čtení/zavírání souborů.
Po návratu z této funkce je v ES:BX adresa interního příznaku DOSu, který
ukazuje, zda je právě prováděna nějaká funkce DOSu. Když PRINT potřebu-
je otevřít soubor (nebo používat služby DOSu), podívá se na tento příznak.
Je-li ES:[BX] různé od nuly, proces na pozadí (rezidentní program neboli
TSR) NESMÍ používat žádné funkce DOSu.
RAM-rezidentní programy se často aktivují na časové nebo klávesnicové
přerušení. Protože toto může nastat kdykoliv, může to nastat i během
přerušení. Protože toto může nastat kdykoliv, může to nastat i během
provádění funkce DOSu. V tom případě, jestliže se aktivovaný rezident
pokusí provést jakoukoliv funkci DOSu, přeteče zásobník DOSu a pravdě-
podobně nastane katastrofa.
Testováním tohoto příznaku může rezident zjistit, zda je možné volat DOS
bez nutnosti oblékání protiradiačního obleku. Ovšem věc je komplikována
tím, že COMMAND.COM a některé podobné programy stráví většinu času če-
káním na klávesnici pomocí funkce DOS Fn 0aH Čti řetězec z konzoly.
Tím pádem je příznak reentrance nastavena skoro pořád a služby DOSu jsou
tabu.
Můžete to obejít zachycením INT 21 a hlídáním použití DOS Fn 0A .
Přijde-li požadavek na čtení řetězce, neprovádějte je hned. Místo toho
začněte provádět smyčku skládající se z pauzy následované voláním funkce
DOS Fn 0B Čti vstupní status. Čekejte tak dlouho, než zjistíte, že
byla stisknuta klávesa. Když je klávesa připravena, musíte pokračovat
voláním Fn 0aH. Avšak před tímto prvním stisknutím klávesy existuje ča-
sový interval, během kterého je možno odstartovat rezident a používat
DOS bez obav z kolize. Můžete také obsadit INT 28 .
Pozor : Protože toto je NEDOKUMENTOVÁNO , nemusí být bezpečné na to příliš
spoléhat. Většina rezidentních programů obsazuje INT 21 a sleduje
stav DOSu inidividuálně (protože stejně musí chytat funkci Fn 0aH).
Poznámka: Oděvy, kde DOS prodává protiradiační obleky najdete na INT 21
DOS Fn 5D . NEDOKUMENTOVÁNO . Není nad možnost volby.
Funkce DOSu
DOS Fn 35H: Čti vektor přerušení
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 35H
└─────────╢ AL ║ číslo interruptu (00H až 0ffH)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ ES:BX ║ adresa programu pro obsluhu přerušení
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vrátí hodnotu vektoru přerušení pro vektor INT (AL); tj. naplní BX
hodnotou 0000:[AL*4] a ES hodnotou 0000:[(AL*4)+2].
Pozor - mění se hodnota segmentového registru ES.
DOS Fn 25 Nastav vektor přerušení Funkce DOSu
DOS Fn 36H: Zjisti volné místo na disku
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 36H
└─────────╢ DL ║ číslo disku (0=vybraný, 1=A, atd.)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ 0ffffH jestliže v AL bylo neplatné číslo disku
└─────────╢ ║ sektorů na cluster v případě platnosti
║ BX ║ počet volných clusterů
║ CX ║ bytů na sektor
║ DX ║ celkem clusterů na disku
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vrací informace pro výpočet celkového a volného místa na disku.
Jestliže se v AX vrátí 0ffffH, poslal jste v AL špatné číslo disku.
Jinak volné místo v bytech = (AX * BX * CX)
celkové místo v bytech = (AX * CX * DX)
Funkce DOSu FAT
DOS Fn 37H: Nastav/čti znak pro přepínač (nedokumentováno)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 37H NEDOKUMENTOVÁNO
└─────────╢ AL ║ 0 dotaz na znak přepínače
║ ║ 1 nastavení znaku přepánače
║ DL ║ je-li AL 1, znak, který má být používán pro přepínač
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ DL ║ Nastavený přepínač DOSu
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Nastaví nebo zjišťuje globální proměnnou DOSu "znak přepínače".
Znak přepínače je znak v příkazovém řádku, který označuje začátek pře-
pínače nebo volby. Implicitní je '/' (např. DIR /w/p), ale můžete změ-
nit tento znak na '-' (např. DIR -w-p), jestliže chcete, aby váš systém
dával pocit UNIXu.
Je běžná praxe zjistit znak přepínače před rozborem neformátované
oblasti parametrů v PSP .
Pozor - tato NEDOKUMENTOVANÁ funkce DOSu se může v budoucích verzích DOSu
změnit. A nakonec se stejně nedoporučuje měnit tuto hodnotu, protože
mnoho programů tuto hodnotu při rozboru příkazového řádku nezjišťuje.
Funkce DOSu
DOS Fn 38H: Čti/Nastav informace o národním prostředí
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 38H
└─────────╢ DX ║ 0ffffH nastaví státní kód na AL (nebo BX)
║ DS:DX ║ adresa bufferu pro uložení Country Info Bloku
║ AL ║ 0 pro zjištění informací o státu
║ ║ 1 to 0feH zjistit informace o určitém státu < 255
║ ║ 0ffH zjistit informace pro kód země ≥ 255
║ BX ║ (je-li AL=0ffH) 16-bitový kód země
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ chybový kód, je-li CF nastaveno
└─────────╢ BX ║ kód země (je-li AL při volání 0)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Je-li DX=0ffffH, číslo státu (viz níže) je nastaveno na AL (nebo je-li
AL=0ffH, je kód nastaven na BX). Za normálních okolností je kód země
nastaven v souboru CONFIG.SYS.
Je-li DX < 0ffffH, DS:DX ukazuje na buffer, který bude naplněn 20H-byto-
vým Country Info Blokem pro zvolený stát.
Verze : DOS 2.x nedovoluje nastavovat kódy státu. Volací kódy jsou jednodušší:
Vstup: AL=0
DS:DX = adresa 20H-bytového lokálního bufferu
Výstup: naplní paměť na adrese DS:DX DOS 2.x Country Info Blokem
╔═══════════════════════════════ Kódy států ════════════════════════════════╗
║ Hex Dec Země Kláv. Datum Čas Formát měny DS ║
║ ▀▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ║
║ 3dH 061 Austrálie DD-MM-RR 13:00:00 $1,000.00 , ║
║ 20H 032 Belgie DD/MM/RR 13:00:00 1 000,00 F ; ║
║ 2 002 Kanada-francouzská RR-MM-DD 13:00:00 1 000,00 $ ; ║
║ 2dH 045 Dánsko DD/MM/RR 13.00:00 1.000,00 DKR ; ║
║ 166H 358 Finsko DD-MM-RR 13:00:00 1 000,00 MK ; ║
║ 21H 033 Francie keybFR DD/MM/RR 13:00:00 1 000,00 F ; ║
║ 31H 049 VelkoNěmecko keybGR DD.MM.RR 13.00.00 DM1.000,00 ; ║
║ 27H 039 Itálie keybIT DD/MM/RR 13:00:00 1.000,Lit. ; ║
║ 3ccH 972 Izrael DD/MM/RR 13:00:00 Ö 1,000.00 , ║
║ 311H 785 Střední východ DD/MM/RR 01:00:00 PM 1.000,000 $ ; ║
║ 1fH 031 Nizozemí DD-MM-RR 13:00:00 ť1.000,00 ; ║
║ 2fH 047 Norsko DD/MM/RR 13.00.00 KR 1.000,00 ; ║
║ 15fH 351 Portugalsko DD/MM/RR 13:00:00 1.000$00 ; ║
║ 22H 034 Španělsko keybSP DD/MM/RR 13:00:00 1.000,00 Ř ; ║
║ 2eH 046 Švédsko RR-MM-DD 13.00.00 SEK 1.000,00 ; ║
║ 29H 041 Švýcarsko DD.MM.RR 13.00.00 Fr 1,000.00 , ║
║ 2cH 044 Velká Británie keybUK DD-MM-RR 13:00:00 Ľ1,000.00 , ║
║ 1 001 Spojené státy MM-DD-RR 01:00:00 PM $1,000.00 , ║
╚══════════════════════════════════════════════════════════════════════════════╝
Funkce DOSu
DOS Fn 39H: Vytvoř nový adresář -- MKDIR
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 39H
└─────────╢ DS:DX ║ adresa ASCIIZ řetězce jména adresáře
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastavena příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\dirname",0
Jestliže je vynecháno označení disku a/nebo předcházející cesty, jsou
předpokládány nastavené hodnoty. Je vytvořen podadresář a včleněn do
existujícího stromu.
Je-li při návratu nastaven příznak CF, je v AX chybový kód a adresář
nebyl vytvořen.
Funkce DOSu DOS Fn 47 Čti aktuální adresář DOS Fn 0E NAstav Disk
DOS Fn 3aH Zruš adresář -- RMDIR
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 3AH
└─────────╢ DS:DX ║ adresa ASCIIZ řetězce jména adresáře
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastavena příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\dirname",0.
Jestliže je vynecháno označení disku a/nebo vedoucí cesty, jsou před-
pokládány nastavené hodnoty. Podkatalog je odstraněn ze struktury
adresářů.
Je-li při návratu nastaven příznak CF, je v AX chybový kód a adresář
nebyl zrušen.
Poznámka : Adresář MUSÍ být prázdný, nesmí obsahovat ani soubory, ani podkata-
logy a nesmí platit ani jiná omezení (žádné aktivní 'Join' nebo 'Subst'
atd.).
Funkce DOSu
DOS Fn 3BH: Nastav vybraný adresář DOSu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 3bH
└─────────╢ DS:DX ║ adresa ASCIIZ řetězce jména adresáře
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastavena příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\dirname",0
Není-li uven disk a/nebo vedoucí cesta, jsou předpokládány nastavené
hodnoty. Uvedený adresář uvedeného disku se stane vybraným adresářem
DOSu pro tento disk (nebo pro vybraný disk).
Je-li po návratu nastaven příznak CF, je v AX kód chyby a vybraný adre-
sář pro daný disk se nezměnil.
Funkce DOSu
DOS Fn 3CH: Vytvoř soubor přes HANDLE
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 3cH
└─────────╢ DS:DX ║ adresa ASCIIZ řetězce se jménem souboru
║ CX ║ atributy souboru
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ ║ nebyla-li chyba, HANDLE souboru
╙───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\filespec",0
Není-li uveden disk a/nebo cesta, jsou použity nastavené hodnoty.
• soubor je vytvořen v určeném (nebo vybraném) adresáři
• soubor je otevřen s přístupovým režimem čtení/zápis
• musíte si HANDLE schovat pro následné přístupy k souboru a jeho
uzavření
• jestliže již soubor existuje:
• je-li otevřen, je zkrácen na délku 0
• je-li atribut tohoto souboru "pouze čtení", nelze otevřít
atribut se dá změnit pomocí Fn 43H Změň atribut
• CONFIG.SYS určuje, kolik HANDLE se dá použít ( DOS Fn 67 ).
• Jestli si chcete být jist, že nepřepíšete existující soubor, je
lepší použít DOS Fn 5B Vytvoř nový soubor
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 3DH: Otevři soubor přes HANDLE
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 3dH
└─────────╢ DS:DX ║ adresa ASCIIZ řetězce jména souboru
║ AL ║ způsob otevření
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ ║ jinak HANDLE souboru
╙───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\filespec",0
Není-li uveden disk nebo cesta, jsou předpokládány nastavené hodnoty.
• soubor nesmí existovat. Viz DOS Fn 3C Založ soubor
• soubor je otevřen ve zvoleném přístupovém režimu. Pro kompatibilitu
s DOSem 2.x a neuvažování sítí použijte:
AL = 0 otevřít pro čtení
AL = 1 otevřít pro zápis
AL = 2 otevřít pro čtení a zápis
• čtecí/zápisový pointer je nastaven na 0. Viz DOS Fn 42 SEEK
• musíte si schovat HANDLE pro další přístupy a uzavření
• sdílení souborů (program DOSu SHARE) musí být nahráno před otevře-
ním v některém sdíleném režimu
• CONFIG.SYS určuje, kolik HANDLE se dá použít ( DOS Fn 67 )
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 3EH: Zavři soubor přes HANDLE
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 3eH
└─────────╢ BX ║ HANDLE souboru
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : BX obsahuje HANDLE souboru vrácenou z operace otevření. Soubor repre-
zentovaný tímto HANDLE je uzavřen, jeho buffery jsou vyprázdněny a
adresář je aktualizován správnou velikostí, časem a datem.
Máte-li málo HANDLE, můžete se snažit přidat ( DOS Fn 67 ) nebo
využít některé z předdefinovaných (např. handle 3 standard AUX).
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 3fH: Čti ze souboru přes HANDLE
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 3fH
└─────────╢ BX ║ HANDLE souboru
║ DS:DX ║ adresa bufferu pro příjem dat
║ CX ║ počet čtených bytů
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ AX ║ počet skutečně přečtených bytů
╙───────╨─────────────────────────────────────────────────────────────
Popis : CX bytů dat je čten se souboru z HANDLE číslo BX. Data jsou čtena
z aktuální pozice čtecího/zápisového ukazatele a jsou umístěna do buf-
feru, na který ukazuje adresa DS:DX.
Chcete-li před čtením změnit pozici čtecího/zápisového pointeru, použij-
te DOS Fn 42 SEEK (Otevření nastavuje čtecí/zápisový pointer na 0).
Vždycky by se měla testovat návratová hodnota v AX (počet čtených bytů)
vůči CX (počet požadovaných bytů):
• je-li AX = CX, (a CF=0), čtení bylo úspěšné a bez chyby
• je-li AX = 0, bylo dosaženo konce souboru (EOF)
• je-li AX < CX (ale ne nula):
při čtení ze zařízení vstupní řádek je AX znaků dlouhý
při čtení ze souboru bylo čteno za EOF.
Poznámky : Tato funkce nahrazuje komplikované a těžko použitelné funkce pro
práci přes FCB. Efektivně kombinuje přímý a sekvenční přístup,
což volajícímu dovoluje dělat si vlastní blokování dat.
Je výhodné použít tuto funkci pro čtení z předdefinovaných HANDLE
(např. standardní I/O HANDLE) místo různých bufferovaných nebo
nebufferovaných vstupních funkcí.
Čtete-li ze zařízení, AX vrací délku řádku včetně zakončovacího
CR (ASCII 13).
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 40H: Zápis do souboru přes HANDLE
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 40H
└─────────╢ BX ║ HANDLE souboru
║ DS:DX ║ adresa bufferu obsahujícího data pro zápis
║ CX ║ počet bytů k zápisu
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li příznak CF, kód chyby
└─────────╢ AL ║ jinak počet skutečně zapsaných bytů - nejlepší test chyby
╙───────╨─────────────────────────────────────────────────────────────
Popis : CX bytů dat je zapsáno do souboru nebo zařízení s číslem HANDLE v BX.
Data jsou brána z bufferu, na který ukazuje DS:DX. Data jsou zapsána na
aktuální pozici čtecího/zápisového pointeru.
Je-li třeba, můžete použít DOS Fn 42 SEEK pro nastavení pozice
v souboru (OPEN nastaví pozici na 0).
Tato operace nastaví čtecí/zápisový pointer tak, že je připraven pro
následující sekvenční čtení nebo zápis.
Vždycky byste měl porovnat návratovou hodnotu v AX (počet bytů skuteč-
ně zapsaných) a CX (požadovaná velikost zápisu).
• je-li AX = CX, zápis byl úspěšný
• if AX < CX, nastala chyba (pravděpodobně plný disk)
Poznámky : Toto nahrazuje složité a nepříjemné používání funkcí s FCB .
Efektivně kombinuje přímý a sekvenční přístup, což umožňuje volajícímu
si dělat vlastní blokování dat.
Je praktické používat tuto funkci i pro zápis do předdefinovaných HANDLE
(např. standardní výstup) místo používání různých jiných funkcí pro
výstup textu.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 41H: Zruš soubor
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 41H
└─────────╢ DS:DX ║ adresa ASCIIZ řetězce jména souboru
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li CF nastavena, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ce tvaru "d:\path\filespec",0
Je-li vynechán disk a/nebo cesta, jsou předpokládány nastavené hodnoty.
Jméno souboru nesmí obsahovat zástupné znaky.
Soubor je zrušen z určeného disku a adresáře.
Má-li soubor atribut ochrany proti zápisu, můžete jej změnit pomocí
DOS Fn 43 CHMOD a potom zrušit.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 42H: Nastav ukazatel v souboru -- SEEK
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 42H
└─────────╢ BX ║ HANDLE souboru
║ CX:DX ║ velikost posunu ukazatele v souboru - (CX * 65536) + DX
║ AL ║ 0 posuň ukazatel na začátek souboru + CX:DX
║ ║ 1 posuň ukazatel na aktuální pozici + CX:DX
║ ║ 2 posuň ukazatel na konec souboru + CX:DX
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ DX:AX ║ nová pozice čtecího/zápisového ukazatele (není-li chyba)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Tato funkce posunuje logický čtecí a zápisový ukazatel na požadovanou
adresu. Všechna čtení a zápisy začnou od této nové adresy.
Poznámka : Volání s AL=2, CX=0, DX=0 vrací délku souboru v DX:AX. DX je význam-
nější slovo - skutečná délka je (DX * 65536) + AX.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 43H: Nastav/zjisti atributy souboru -- CHMOD
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 43H
└─────────╢ DS:DX ║ adresa ASCIIZ řetězce se jménem souboru
║ AL ║ Kód podfunkce: 0 = zjisti atributy souboru
║ ║ 1 = nastav atributy souboru
║ CX ║ atribut pro nastavení (pro SubFn 1)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ CX ║ hodnota atributu (pro SubFn 00H)
╙───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\filespec",0
Není-li uveden disk a cesta, jsou předpokládány nastavené hodnoty.
Atribut souboru je přečten nebo nastaven podle hodnoty v AL.
Poznámka : Pro "schování" adresáře použijte CX=02H (ne 12H, jak byste asi
předpokládal).
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 44H: Ovládání I/O zařízení -- IOCTL
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 44H
└─────────╢ AL ║ Kód podfunkce:
║ ║ 00H=čti informace o zařízení 08H=dotaz na vyměnitelnost
║ ║ 01H=nastav info o zařízení 09H=dotaz na místní/vzdálené
║ ║ 02H=čti ze znakového zařízení 0aH=dotaz na HANDLE míst/vzd
║ ║ 03H=zápis do znakového zař. 0bH=počet opak.při sdílení
║ ║ 04H=čti z blokového zařízení 0cH (rezervováno)
║ ║ 05H=zápis do blok. zařízení 0dH=generic IOCTL DOS 3.2+
║ ║ 06H=čti vstupní status 0eH=čti logický drive 3.2+
║ ║ 07H=čti výstupní status 0fH=nastav logický drive 3.2+
║ další ║ (podle podfunkce)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ ║ jinak jiná hodnota (podle SubFn)
╙───────╨─────────────────────────────────────────────────────────────
Popis : IOCTL dává metodu pro komunikaci se zařízeními a pro zjištění informací
o souborech. Vstupní parametry a výstupní hodnoty se mění v závislosti
na kódu podfunkce v registru AL.
Verze : Podfunkce 0-7 ............ DOS 2.1+
Podfunkce 8,0bH .......... DOS 3.0+
Podfunkce 9,0aH .......... DOS 3.1+
Podfunkce 0dH,0eH,0fH .... DOS 3.2+
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 00H: Zjisti příznaky informací o zařízení
Vstup : BX= HANDLE souboru (zařízení nebo diskový soubor)
Výstup: DX= IOCTL info o zařízení
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 01H: Nastav informační příznaky o zařízení
Vstup : BX= HANDLE souboru (zařízení nebo diskový soubor)
DX= IOCTL info o zařízení (DH musí být 0)
Výstup: DX= IOCTL info o zařízení
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 02-03: Čtení (AL=02H) nebo zápis (AL=03H) IOCTL řetězce z/do ZNAKOVÉHO
zařízení
Vstup : DS:DX=> adresa bufferu (čtení) nebo dat (zápis)
CX= počet bytů pro přenos
BX= HANDLE souboru (jen zařízení -- ne diskový soubor)
Výstup: AX=je-li nastaven příznak CF, kód chyby
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 04-05: Čtení (AL=04H) nebo zápis (AL=05H) IOCTL řetězce z/do BLOKOVÉHO
zařízení
Vstup : DS:DX=> adresa bufferu (čtení) nebo dat (zápis)
CX= počet přenášených bytů
BL= číslo disku (0=vybraný, 1=A, atd.)
Výstup: AX= je-li nastaven příznak CF, kód chyby
AX= skutečný počet přenesených bytů (není-li nastavena CF)
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 06-07: Čti vstupní status (AL=06H) nebo čti výstupní status (AL=07H)
Vstup : BX= HANDLE souboru (zařízení nebo diskový soubor)
Výstup: AL= 0ffH=není konec souboru; 0=EOF (pro diskové soubory)
AL= 0ffH=připravenost; 0=nepřipravenost (pro zařízení)
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 08H: Zjisti, zda blokové zařízení používá vyměnitelné médium DOS 3.0+
Vstup : BL= číslo disku (0=vybraný, 1=A, atd.)
Výstup: AX= 00H= médium je vyměnitelné (např. disketová mechanika)
01H= není vyměnitelné (např. pevný disk, RAM-disk)
0fH chybový kód jestliže BL označovalo nesprávný disk
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 09H: Zjisti, je-li zařízení vzdálený disk v síti DOS 3.1+
Vstup : BL=číslo disku
Výstup: DX=atribut zařízení pro mechaniku. Je-li bit 12=1
(tj. DX & 1000H = 1000H), jedná se o vzdálený disk v síti
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 0aH: Zjisti, patří-li HANDLE lokálnímu zařízení nebo vzdálenému zaří-
zení v síti. DOS 3.1+
Prý nemáme tuto podfunkci používat. Místo toho zkuste brát vzdálené
disky stejně jako lokální.
Vstup : BX= HANDLE souboru (pouze zařízení -- ne diskový soubor)
Výstup: DX= atribut zařízení. Je-li bit 15=1,
(tj. DX & 8000H = 8000H) zařízení je vzdálené.
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 0bH: Řídí počet opakování pro sdílení a zamykání souborů. DOS 3.0+
Vstup : DX= počet opakovaných pokusů před kritickou chybou INT 24H
CX= počet cyklů mezi pokusy
Výstup: AX= je-li nastaven příznak CF, kód chyby
Poznámka : Implicitní nastavení je 3 opakování a počet cyklů 1
(minimální čekání)
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 0dH: Generic IOCTL se používá pro mnoho funkcí, souvisejících s ovládá-
ním zařízení. Počínaje DOSem 3.2 se dají psát drivery, které mohou
formátovat stopu a provádět čtení/zápis celé stopy. DOS 3.2+
Kód akce (Podpodfunkce ?) v CL určují tuto podfunkci:
Vstup : CL = kód akce
40H = Nastav parametry zařízení
60H = Čti parametry zařízení
41H = Zápis stopy na logickém zařízení
61H = Čtení stopy na logickém zařízení
42H = Formátuj a verifikuj stopu na logickém zařízení
62H = Verifikace stopy na logickém zařízení
DS:DX=> adresa datového paketu IOCTL.
Popis datových paketů pro jednotlivé akční kódy viz:
Generic IOCTL 40/60
Generic IOCTL 41/61
Generic IOCTL 42/62
Výstup: AX = je-li nastaven příznak CF, kód chyby
DS:DX=> datový paket může obsahovat návratovou informaci.
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 0eH: Zjisti, zda driver zařízení má více než jedno logické zařízení pro
jednu fyzikou mechaniku. DOS 3.2+
Vstup : BL = číslo disku (0=vybraný, 1=A, atd.)
Výstup: AX = je-li nastaven příznak CF, kód chyby
AL = 0 je-li jen jedno označení disku přiřazeno disku BL
AL = (1=A, 2=B, atd.) jsou podporovány logické disky a AL
vrací právě vybrané číslo disku přiřazené této mecha-
nice.
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 0fH: Sdělí driveru blokového zařízení, se kterým diskem chce pracovat.
Hlášení DOSu "Insert diskette for drive X:..." ("Vložte disketu
pro drive X:...") se zobrazí v případě, že fyzický disk je sdružen
s více než jedním logickým diskem.
Tato funkce vám dovoluje sdělit DOSu, že disketa pro vybrané číslo
disku je již na místě, čímž obejdete hlášení. DOS 3.2+
Vstup : BL = číslo disku (0=vybraný, 1=A, atd.)
Výstup: AX = je-li nastaven příznak CF, kód chyby
AL = 0, je-li disku BL přiřazen pouze jeden logický disk.
Poznámka : Tato funkce by se měla provést před jakoukoliv I/O ope-
rací prováděnou s logickým diskem. Jinak DOS může zobrazit
zmíněné hlášení.
Informace zařízení IOCTL
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 45H: Duplikuj HANDLE souboru -- DUP
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 45H
└─────────╢ BX ║ existující HANDLE souboru
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ nové HANDLE souboru, které duplikuje originální
└─────────╢ ║ je-li nastaven příznak CF, kód chyby
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vytvoří další HANDLE souboru, které se vztahuje k témuž I/O streamu
jako existující HANDLE.
Všechny pohyby čtecího/zápisového ukazatele v jednom HANDLE rovněž
ovlivní duplikát, to jest všechno čtení, zápis nebo posun pomocí
DOS Fn 42 SEEK.
Nové HANDLE má tentýž režim otevření a tatáž omezení jako originál.
Tato funkce má jedno hlavní využití : Můžete zavřít duplikátní HANDLE,
což donutí DOS vyprázdnit buffery tohoto souboru. Tato sekvence
DUP/CLOSE je rychlejší než uzavření a znovuotevření diskového souboru.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 46H: Přesměruj HANDLE -- FORCDUP
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 46H
└─────────╢ BX ║ HANDLE cílového souboru (musí již existovat)
║ CX ║ HANDLE zdrojového souboru (musí již existovat)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Donutí HANDLE souboru vztahovat se k jinému souboru nebo zařízení.
HANDLE v CX (zdroj) je uzavřena (je-li právě otevřena) a potom se
stane duplikátem HANDLE v BX (cíl).
Jinými slovy, jak CX, tak BX se budou vztahovat k témuž fyzickému sou-
boru nebo zařízení. Všechny přístupy k HANDLE CX přejdou k BX.
Tuto funkci můžete použít k přesměrování standardního I/O. Např.:
• Otevřete soubor "C:\STDOUT.TXT" přes DOS Fn 3D Otevři soubor
a přečtěte HANDLE (např. 05).
• Nastavte BX=05, CX=01 a zavolejte funkci. (Poznámka: HANDLE
01 je předdefinované HANDLE "standardní výstupní zařízení").
• Jestli chcete, můžete použít DOS Fn 3E Zavři soubor, abyste
uzavřel HANDLE 05.
Nyní se můžete na soubor STDOUT.TXT odvolávat přes HANDLE 01.
• Nyní bude diskový soubor "C:\STDOUT.TXT" přijímat všechen výstup
od kteréhokoliv procesu (aktuální proces a/nebo jeho podřízené
procesy) přes jakoukoliv znakovou I/O funkci DOSu úplně stejně
jako zápis do souboru s HANDLE 01 přes DOS Fn 40 .
• Až odejdete do COMMAND.COMu, předdefinovaná HANDLE jsou vrácena
normálním zařízením (např. HANDLE 01 je vrácena "CON").
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 47H: Zjisti vybraný adresář DOSu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 47H
└─────────╢ DS:SI ║ adresa bufferu pro uložení jména cesty (64 bytů)
║ DL ║ číslo disku (0=vybraný, 1=A, atd.)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Uživatelský byffer začínající na DS:SI je naplněn jménem cesty (ASCIIZ)
právě vybraného adresáře pro disk určený v DL.
Jméno cesty je vráceno ve tvaru "path\dirname",0. Není uvedeno žádné
označení disku, takže je-li právě vybraný adresář kořen, vše co dostane-
te, je nulový řetězec (DS:[SI] = 0).
Funkce DOSu DOS Fn 3B Nastav adresář
DOS Fn 48H: Alokuj paměť (zjisti velikost paměti)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 48H
└─────────╢ BX ║ žádané množství paměti (v 16-bytových paragrafech)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ BX ║ velikost volné paměti v paragrafech, jestli nastala chyba
║ AX ║ segmentová adresa přiděleného bloku (není-li chyba)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Alokuje (přidělí) blok paměti BX paragrafů dlouhý, a jeho segmentovou
adresu vrátí v AX (blok začíná na adrese AX:0000).
Je-li alokace neúspěšná, je nastaven příznak CF, v AX je vrácen kód
chyby a BX obsahuju maximální možnou velikost pro alokaci v paragrafech.
Běžná praxe pro zjištění největšího volného bloku je před voláním nasta-
vit BX=0ffffH. Alokace neprojde, ale v BX se vrátí největší možná veli-
kost alokace.
Poznámka : Když je procesu předáno řízení přes DOS Fn 4B EXEC, byla mu již
přidělena všechna dostupná paměť.
Funkce DOSu
DOS Fn 49H Uvolni přidělený blok paměti
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 49H
└─────────╢ ES ║ segmentová adresa (paragraf) alokované paměti pro uvolnění
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Dealokuje (uvolní) blok paměti počínající na ES:0000. Tento blok je
přístupný jiným systémovým zdrojům.
Obecně řečeno, můžete uvolnit pouze ty bloky paměti, které jste vytvo-
řil přes DOS Fn 48 Alokuj paměť. Pro podřízený proces je za uvolnění
paměti zodpovědný rodič. Ovšem nic vám nemůže zabránit dealokovat paměť
patřící jinému procesu.
Funkce DOSu
DOS Fn 4aH: Zmenši nebo zvětši blok paměti
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 4aH
└─────────╢ ES ║ Segment alokovaného bloku paměti
║ BX ║ Požadovaná velikost bloku v paragrafech (16-bytů)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ BX ║ největší volný blok (neprojde-li požadavek na zvětšení)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Změna velikost existujícího bloku paměti.
Před předáním řízení procesu již DOS Fn 4B EXEC alokovala blok paměti
začínající PSP, který obsahuje všechnu volnou paměť. Abychom uvolnili
paměť pro podřízený proces, musíme nejprve zmenšit blok paměti počínají-
cí PSP .
Poznámka : DOS Fn 31 KEEP a INT 27 (TSR) zmenšují blok počínající PSP.
Funkce DOSu
DOS Fn 4bH Proveď nebo nahrej program -- EXEC
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 4bH
└─────────╢ DS:DX ║ adresa ASCIIZ jména programu pro nahrání/spuštění
║ ES:BX ║ adresa EPB (EXEC Parameter Block)
║ AL ║ 0 = Nahrej a spusť
║ AL ║ 3 = Nahrej překryvnou část (overlay)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Dává prostředek programu (rodiči) vyvolat jiný program (v anglické
dokumentaci child, překládáme podřízený), který po provedení předá říze-
ní rodiči.
DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\filespec",0
Není-li uveden disk nebo cesta, jsou předpokládány nastavené hodnoty.
ES:BX ukazuje na blok paměti připravený jako EPB, jehož formát závisí
na požadované podfunkci v AL.
AL=0 EXEC: Protože rodičovský program nejprve dostává všechnu volnou paměť
pro svoje vlastní účely, musíte nejprve před procedením EXEC nějakou
paměť uvolnit přes DOS Fn 4A Zmenši/zvětši blok paměti. Normální
postup je :
1. Zavolat Fn 4aH s ES=segment PSP a BX=minimální množství paměti, které
váš program potřebuje (v paragrafech).
2. Připravte ASCIIZ řetězec programu, který má být vyvolán, a nastavte
DS:DX ukazatel na jeho první znak.
3. Připravte EXEC Parameter Block obsahující všechna požadovaná pole
4. Uložte aktuální hodnoty SS, SP, DS, ES a DTA v proměnných relativ-
ních k CS (CS je jediný vztažný bod po návratu z podřízeného procesu,
který je zachován).
5. Proveďte EXEC s AL=0.
6. Vraťte SS a SP původní lokální hodnoty.
7. Zkontrolujte příznak CF, jestli EXEC naskončilo s chybou
8. Je-li třeba, obnovte DS, ES a místní DTA.
9. Je-li třeba, zkontrolujte výstupní kód přes DOS Fn 4D WAIT.
Všechny otevřené HANDLE jsou duplikovány, takže podřízený proces může
zpracovávat data přes HANDLE a/nebo používat standardní I/O pro vstup
a výstup. Přístupový režim je duplikován, avšak zamykání se na podřízený
proces nepřenáší. Viz DOS Fn 5C Zamkni soubor
Po návratu z podřízeného procesu jsou vráceny hodnoty INT 22 Terminate,
INT 23 Ctrl-Break a INT 24 Kritická chyba na své původní hodnoty.
AL=3 LOAD: Tuto podfunkci můžete použít pro nahrání překryvného modulu (over-
lay). DS:DX ukazuje na ASCIIZ jméno souboru a ES:BX ukazuje na "nahrá-
vací" verzi EXEC Paramater Block. Hlavní cena této podfunkce spočívá
v tom, že čte EXE hlavičku a provede relokace segmentů, potřebné pro
.EXE programy. Viz Hlavička EXE
Poznámky : Tato funkce používá zavaděčovou část COMMAND.COM, která je v DOS 2.x
tranzientní (programy ji mohly přepsat). Tím pádem může tato funkce
zhavarovat v případě, že DOS nenajde COMMAND.COM. Proto zajistěte plat-
nost COMSPEC= v prostředí před vlastním voláním.
Místo rozboru vašich vlastních FCB (což je potřeba pro EPB ), můžete
považovat za pohodlnější nahrát a spustit sekundární kopii COMMAND.COM
s použitím přepínače /C. Například pro spuštění programu FORMAT.COM
nastavte DS:DX na adresu ASCIIZ řetězce:
"\command.com",0
a nastavte EPB+2 na segment a ofset příkazového řádku:
0eH,"/c format a:/s/4",0dH
Tento sekundární příkazový interpreter zabere jen velmi málo paměti
(kolem 4K). Chcete-li najít disk a cestu pro COMMAND.COM, můžete pro-
hledat Prostředí DOSu pro řetězec COMSPEC=.
Funkce DOSu
DOS Fn 4CH: Ukonči program -- EXIT
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 4CH
└─────────╢ AL ║ výstupní kód
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║ (nemá smysl)
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Vrátí řízení podřízeného procesu jeho rodiči s nastavením výstupního
kódu, který se dá zjistit přes DOS Fn 4D WAIT
Řízení je předáno na adresu Terminate v PSP končícího programu. Vektory
Ctrl-Break a Kritická chyba jsou vráceny na adresy z rodičovského PSP.
Poznámka : Hodnota ERRORLEVEL (používaná v dávkových souborech DOSu) se dá
využít pro testování výstupního kódu naposledy volaného programu.
Funkce DOSu
DOS Fn 4DH Zjisti výstupní kód programu -- WAIT
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 4dH
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ Výstupní kód posledního skončeného procesu
└─────────╢ AH ║ 0 = normální ukončení DOS Fn 4C , INT 20 , DOS Fn 00
║ ║ 1 = ukončení přes Ctrl-Break INT 23
║ ║ 2 = ukončení přes kritickou chybu zařízení INT 24
║ ║ 3 = ukončení přes DOS Fn 31 KEEP
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vrací výstupní kód posledního ukončeného procesu
Tato funkce vrátí platnou informaci pouze jednou pro každý ukončený
proces.
Funkce DOSu
DOS Fn 4eH: Najdi první soubor
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 4eH
└─────────╢ DS:DX ║ adresa ASCIIZ jména hledaného souboru (může obsahovat * a ?)
║ CX ║ atributy souboru, které se mají shodovat
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ DTA ║ není-li chyba, je naplněna daty
╙───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\filespec",0
Je-li vynechán disk a/nebo cesta, jsou použity nastavené hodnoty.
Zástupné znaky * a ? jsou povoleny jak ve jménu, tak v příponě.
DOS hledá jméno prvního souboru na disku a v adresáři, který vyhovuje
jménu a atributu, a toto jméno a další informace umístí na adrese DTA
následovně :
DTA
Ofset Vel. Obsah DTA
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌──── ─ ─ ─ ────┐
+0 15H │ rezervováno │ použije se při dalších voláních
├───┼ ─ ┴ ─ ┴───┘ DOS Fn 4F Najdi další soubor
+15H 1 │atr│ atribut souboru, který byl nalezen
├───┴───┐
+16H 2 │ čas │ čas vytvoření/modifikace ve formátu filetime
├───┴───┤
+18H 2 │ datum │ datum vytvoření/modifikace ve formátu filetime
├───┴───┼───────┐
+1aH 4 │ low high │ DWORD velikost souboru v bytech
├───┴───┴───┴───┴───┐
+1eH 0dH │ │ 13-bytů ASCIIZ jméno souboru: "filename.ext",0
└───┴ ─ ┴ ─ ┴───┴───┘ (nedoplněno mezerami, např. DOIT.BATΘ____)
2cH požadovaná velikost bufferu
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Poznámky : Atributy souboru jsou obecně použity pro inkluzivní hledání. Jestli-
že chcete hledat jména souborů včetně jmen adresářů, bit 4 atributů by
měl být nastaven (tj. attr | 10H). Viz Atributy souboru pro úplné
informace.
Typická sekvence, která se používá pro nalezení všech vyhovujících souborů
v adresáři :
• použít DOS Fn 1A Nastav DTA pro nastavení DTA na lokální buffer
(nebo lze použít implicitní DTA na PSP ofset 80H)
• nastavit CX=atributy, DS:DX => ASCIIZ jméno souboru
• vyvolat DOS Fn 4E Najdi první soubor
• indikuje-li CF chybu, hotovo (žádná shoda)
• nastavit DS:DX => DTA nebo na data, které jste zkopíroval z DTA
po použití Fn 4eH)
• repeat
zpracuj jméno souboru a data na DS:DX
vyvolej DOS Fn 4F Najdi další soubor
until chyba indikuje, že není shoda (nastaven příznak CF)
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 4FH: Najdi další soubor
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 4fH
└─────────╢ DS:DX ║ adresa informace z předchozího volání Fn 4eH Najdi soubor
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ DTA ║ je naplněna daty
╙───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na 2bH-bytový buffer obsahující informace vrácené funkcí
DOS Fn 4E Najdi první soubor (buď DTA nebo buffer zkopírovaný z DTA).
Tuto funkci použijte po volání Fn 4eH Najdi první soubor pro nalezení
dalšího jména souboru vyhovujícího dané specifikaci (s použitými zástup-
nými znaky) bude zkopírováno do bufferu na adrese DS:DX společně s dal-
šími informacemi (viz DOS Fn 4E Najdi první soubor pro popis
informačního bufferu naplněného DOSem).
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 54H: Zjisti stav přepínače verifikace
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 54H
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AL ║ 0 verifikace vypnuta
└─────────╢ ║ 1 verifikace zapnuta
╙───────╨─────────────────────────────────────────────────────────────
Popis : Vrací nastavený režim verifikace diskového zápisu DOSu.
Jestliže se v AL vrátí 1, DOS zpětně čte každý sektor po zápisu, čímž
verifikuje, že data byla v pořádku zapsána.
DOS Fn 2eH Nastav verifikaci dovoluje nastavit/zrušit režim verifikace.
Funkce DOSu
DOS Fn 56H: Přejmenuj/přesuň soubor
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 56H
└─────────╢ DS:DX ║ adresa ASCIIZ starého jména (jméno existujícího souboru)
║ ES:DI ║ adresa ASCIIZ nového jména (nová cesta/jméno souboru)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ jestliže je nastaven příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX a ES:DI ukazují na ASCIIZ řetězec "d:\path\filespec",0
Staré jméno DS:DX musí existovat a nesmí obsahovat zástupné znaky, ozna-
čení disku a cesty není povinné (předpokládají se nastavené hodnoty).
Nové jméno ES:DI NESMÍ existovat. Je-li použito označení disku, musí být
stejné jako ve starém jménu. Není-li uveden disk nebo cesta, jsou před-
pokládány nastavené hodnoty.
Jestliže staré a nové jméno obsahují různé cesty (explicitně nebo vyplý-
vající z nastavených hodnot), soubor bude přesunut do adresáře uvedeného
v novém jménu.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 57H: Zjisti/nastav čas/datum souboru
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 57H
└─────────╢ AL ║ 0 pro dotaz na čas/datum souboru
║ ║ 1 pro nastavení času/data souboru
║ BX ║ HANDLE souboru
║ CX ║ (je-li AL=1) nová časová známka ve tvaru filetime / date
║ DX ║ (je-li AL=1) nová datová známka ve tvaru filetime / date
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, chybový kód
└─────────╢ CX ║ časová známka souboru ve tvaru filetime / date
║ DX ║ datová známka souboru ve tvaru filetime / date
╙───────╨─────────────────────────────────────────────────────────────
Popis : BX je nastaveno na HANDLE otevřeného souboru ( DOS Fn 3C nebo
DOS Fn 3D ).
Podfunkci 0 nebo 1 nastavte do registru AL.
DX a CX jsou v paměťovém formátu, tj. dolních 8 bitů data je v DH.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 59H: Zjisti rozšířenou chybovou informaci
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 59H DOS 3.0+
└─────────╢ BX ║ 0000H (podle verze: 0000H pro DOS 3.0, 3.1, a 3.2)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ rozšířený kód chyby (0, když žádná chyba nenastala)
└─────────╢ BH ║ třída chyby
║ BL ║ doporučená akce
║ CH ║ lokalizace (kde nastala chyba)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Tuto funkci použijte pro zjištění co dělat po havárii funkce DOSu z dů-
vodu chyby. Pouze DOS 3.0+ . Toto lze použít:
• v rutině pro ošetření INT 24H Kritická chyba
• po kterékoliv funkci DOSu volané INT 21 , která signalizuje chybu
nastavením příznaku CF
• po funkcích pracujících s FCB, které signalizují chybu vrácením
AL=0ffH
Viz Chybové kódy DOSu pro úplný výpis možných chybových kódů, tříd,
navrhovaných akcích a lokalizací, které mohou být touto funkcí vráceny.
Verze : Tato funkce není implementována před DOS 3.00. U DOS 2.x, kde CF indiku-
je chybu, musíte použít vlastní programovou logiku pro rozhodnutí, jakou
akci podniknout. V případě DOS 3.0+, jestliže funkce vrátí CF=1, doporu-
čuje se ignorovat kód chyby vrácený v AX, zavolat tuto funkci a provést
akci doporučenou v BL.
Funkce DOSu
Chybové kódy DOSu
Chybové kódy DOSu 2.0+ vrácené v AX (při nastaveném příznaku Carry)
č.chyby č.chyby
Hex Dec Význam Hex Dec Význam
▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1 1 Neplatné číslo funkce 0aH 10 Neplatné prostředí
2 2 Soubor nenalezen 0bH 11 Neplatný formát
3 3 Cesta nenalezena 0cH 12 Neplatný kód přístupu
4 4 Příliš mnoho otevřených souborů 0dH 13 Neplatná data
5 5 Přístup znemožněn 0eH 14 (nepoužito)
6 6 Neplatná obsluha 0fH 15 Specifikován neplatný drive
7 7 Zničeny bloky řízení paměti 10H 16 Nelze odstranit daný adresář
8 8 Nepostačující paměť 11H 17 Nestejné zařízení
9 9 Neplatná adresa bloku paměti 12H 18 Další takové soubory neexistují
■■■ ■■■ ■■■■■■■■■■■■■■■■ DOS 3.x rozšíření Fn 59H ■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0 0 Žádná chyba se nevyskytla (nečekejte 0 před prvním výskytem chyby)
13H 19 Pokus o zápis na chráněný disk ──┐
14H 20 Neznámé ID jednotky │
15H 21 Diskový drive není připraven │
16H 22 Neznámý příkaz │
17H 23 Chyba dat disku (chyba CRC) ╞═► Toto odpovídá chybám 0-0cH
18H 24 Špatná délka struktury požadavku │ uloženým v registru DI pro
19H 25 Chyba vystavení hlavy │ INT 24 - obsluha kritické
1aH 26 Neznámý typ média │ chyby, dále odpovídají také
1bH 27 Diskový sektor nenalezen │ hodnotám v AL po chybách
1cH 28 Tiskárna nemá papír │ INT 25 a INT 26
1dH 29 Chyba zápisu │
1eH 30 Chyba čtení │
1fH 31 Celkový neúspěch ────────────────┘
20H 32 Porušení sdílení souboru
21H 33 Porušení uzamčení souboru
22H 34 Neplatná změna disku
23H 35 Neplatný FCB (příliš mnoho FCB )
24H-49H (rezervováno)
50H 80 Soubor již existuje
51H 81 (rezervováno)
52H 82 Nemohu udělat (těžko říci, k čemu to je)
53H 83 chyba přerušení kritické chyby INT 24
┌─────────────┐
│ Třída chyby │ Tyto kódy služí k poskytnutí hlubší informace pro obsluhu chyb.
└─────────────┘ Vrací je DOS Fn 59 Zjisti rozšířenou chybu v registru BH.
Č.třídy
Hex Dec Význam (vráceno v BH Fcí 59H)
▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1 1 Došly prostředky: nejsou další FCB, paměť, kanály, HANDLE atd.
2 2 Přechodný stav: to za chvilku zmizí (např. uzamčený soubor)
3 3 Problém s oprávněním: musíte mít vyšší souhlas
4 4 Vnitřní chyba: DOS má dost
5 5 Chyba hardware
6 6 Chyba systému: DOS má dost
7 7 Chyba aplikace: DOSu byla předána chybná info, nesprávný požadavek atd.
8 8 Nenašli: požedovaný soubor/položka nebyla nalezena
9 9 Neplatný formát: soubor/položka v nepl. formátu (EXE soubor, disk atd.)
0aH 10 Uzamčeno: soubor/položka uzamčena
0bH 11 Chyba média: špatný disk, chyba CRC atd.
0cH 12 Již existuje: kolize s již existujícím souborem/položkou
0dH 13 Neznámá třída chyby: klasifikace neexistuje nebo je nevhodná
┌────────────────┐
│ Naznačená akce │ Tyto kódy naznačují vhodnou akci, která by se měla provést
└────────────────┘ při chybovém stavu. Myšlenkou je možnost programování bez
zjišťování konkrétních chyb. Místo toho se dá rovnou použít doporučená akce.
DOS Fn 59 vrací tento kód v registru BL.
Č. akce
Hex Dec Význam (vráceno v BL Fcí 59H)
▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1 1 Zkus znovu: Zkus operaci několikrát opakovat. Trvá-li při tom stále
chybový stav, zeptej se uživatele, zda chce pokračovat nebo odejít.
2 2 Počkej a zkus znovu: Totéž, jako předchozí, jen napřed chvilku počká.
3 3 Uživatelský vstup: Jestli byla data předána DOSu uživatelem, požádej
ho o nový vstup (např neplatná specifikace drive nebo cesty)
4 4 Zruš: Zruš aplikaci, ale je dobré zajistit "čisticí operace", jako je
uzavírání souborů, doplnění indexů, uvolnění bloků paměti atd.
5 5 Okamžitý odchod: Okamžité zrušení bez dalšího zdržování. Systém je
v nezdravém stavu, takže rychle pryč.
6 6 Ignoruj: Chyba nezpůsobí vážnější potíže
7 7 Opakuj po akci uživatele: Uživatel musí něco udělat, třeba vložit dis-
ketu. Takže ho o to požádáme a zkusíme operaci znovu.
┌─────────────────────┐
│ Místo výskytu chyby │ Tyto kódy vám pomohou nalézt místo výskytu chyby.
└─────────────────────┘ DOS Fn 59 vrací tyto informační kódy v CH.
Č.místa
Hex Dec Význam (vráceno v CH Fcí 59H)
▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1 1 Neznámé: Neexistuje místo, které by se dalo určit jako zdroj chyby
2 2 Blokové zařízení: Chyba na disku (nebo na drive pásky)
3 3 (rezervováno)
4 4 Znakové zařízení
5 5 Paměť
┌────────────┐
│ Verze DOSu │ Obsluha chyb je shora kompatibilní pro všechny verze DOSu.
└────────────┘ Platí tato obecná pravidla:
• DOS 1.x: indikuje při návratu některé chyby umístěním 0ffH do AL.
• DOS 2.x: Nové funkce 2.x indikují chyby nastavením příznaku Carry (CF=1)
a umístěním kódu chyby do AX.
• DOS 3.x: 2.x a 3.x volání stále vrací kódy v AX při CF=CY, ale neexistuje
záruka, že to budou příští verze dodržovat. Lépe je použít
DOS Fn 59 a získat tak o chybě informace.
DOS Fn 5AH Vytvoř jednoznačný dočasný soubor
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 5aH DOS 3.0+
└─────────╢ DS:DX ║ adresa ASCIIZ disku a cesty (zakončeno \)
║ CX ║ atribut souboru
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ ║ HANDLE souboru (nenastala-li chyba)
║ DS:DX ║ (beze změny) se stane plným ASCII názvem nového souboru
╙───────╨─────────────────────────────────────────────────────────────
Popis : Otevře (vytvoří) soubor s jednoznačným jménem v adresáři určeném ASCIIZ
jménem cesty, na které ukazuje DS:DX. COMMAND.COM tuto funkci používá
pro sřetězení souborů při přesměrování vstupu a výstupu.
Specifikace cesty musí být připravena tak, aby na svém konci mohla přij-
mout jméno souboru. Musíte zajistit, aby na konci řetězce bylo nejméně
12 bytů volných a řetězec musí být ve tvaru
"d:\path\",0 (určení disku a cesty)
nebo "d:",0 (vybraný adresář disku)
nebo "d:\",0 (kořenový adresář disku)
nebo "",0 (vybraný disk a adresář)
Po návratu je k řetězci na adrese DS:DX připojen nový název.
Poznámky : DOS vyrábí jméno souboru z hexa cifer získaných z nastaveného data
a času. Jestliže jméno již existuje, DOS zkouší dál nová jména, dokud
nemůže být soubor vytvořen.
Vytvořené soubory ve skutečnosti nejsou dočasné a musí být zrušeny
pomocí DOS Fn 41 Zruš soubor, jestliže si nechcete zaplácat adresáře.
Verze : Dostupné nejdříve u DOS 3.0
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 5bH: Vytvoř nový soubor
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 5bH DOS 3.0+
└─────────╢ DS:DX ║ adresa ASCIIZ řetězce se jménem souboru
║ CX ║ atribut souboru
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li chyba, nastaven příznak CF
└─────────╢ ║ není-li chyba, HANDLE souboru
╙───────╨─────────────────────────────────────────────────────────────
Popis : DS:DX ukazuje na ASCIIZ řetězec ve tvaru "d:\path\filespec",0
Není-li uveden disk a/nebo cesta, jsou předpokládíny nastavené hodnoty.
Tato funkce je identická DOS Fn 3C Založ soubor s jedinou výjimkou, že
ohlásí chybu, jestliže na uvedeném disku a v uvedeném adresáři již
existuje soubor tohoto jména.
Soubor je otevřen pro čtení/zápis v kompatibilním přístupovém režimu.
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 5cH: Zamkni/odemkni přístup k souboru
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 5cH DOS 3.0+
└─────────╢ AL ║ SubFn: 0 = zamkne oblast souboru
║ ║ 1 = odemkne dříve zamknutou oblast
║ BX ║ HANDLE souboru
║ CX:DX ║ ofset souboru ((CX * 65536) + DX) od začátku souboru
║ SI:DI ║ délka zamykané oblasti ((SI * 65536) + DI) bytů
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Zamyká nebo odmyká přístup do oblasti souboru, určeného HANDLE v BX.
Oblast souboru, která začíná od logického ofsetu CX:DX a má délku SI:DI
je zamčena nebo odemčena. Jsou potřeba oba parametry, ofset i délka.
MUSÍ být instalováno sdílení souborů(přes příkaz DOS SHARE), nebo se
vrátí z volání s chybovým kódem "neplatné číslo funkce".
Zamykání se aplikuje pouze na čtení, zápis a otvírání souboru podříze-
ným nebo souběžným procesem. Pokusí-li se jiný proces o takový přístup
(a přístupový režim definovaný při otevření souboru je "sdílený režim",
který takový přístup nepovoluje), DOS operaci ukončí po třech pokusech
přes INT 24 Kritická chyba. DOS zobrazí hlášení "Abort, Retry,
Ignore".
Doporučená akce je nezkoušet číst a čekat na chybu. Místo toho, zkuste
zamknout oblast a zkoumat výsledný chybový kód. Tím se vyhnete relativně
nestabilnímu stavu DOSu, který nastane vyvoláním rutiny pro kritickou
chybu.
Zamykání za konec souboru není chyba. Můžete zamknout celý soubor nasta-
venám CX=0, DX=0, SI=0ffffH, DI=0ffffH, a AL=0.
Když odmykáte, ofset a délka se musí přesně shodovat s ofsetem a délkou,
kterou jste zamykal.
Poznámky : Duplikace HANDLE přes DOS Fn 45 Duplikuj HANDLE a DOS Fn 46
Přesměrování duplikuje rovněž všechny zámky. Dokonce i když je při
otevření použit dědičný přístupový režim, zamykací mechanismus nedává
žádná přístupová privilegia podřízeným procesům vytvořeným funkcí
DOS Fn 4B EXEC (je to chápáno jako samostatný proces).
Je důležité, aby byly všechny zámky ze souboru odstraněny před skončením
procesu. Při zamykání souborů věnujte obzvláštní péči zachycení INT 23H
(Ctrl-Break) a INT 24 (Kritická chyba), abyste i při těchto způsobech
opuštění procesu odstranili zámky souboru před skutečným ukončením pro-
gramu.
Doporučuje se odmykat vždy co nejdříve, jakmile je to možné. Vždy zam-
kněte, proveďte přístup a odemkněte v jedné operaci.
Verze : Nejdříve se vyskytuje u DOS 3.0
Funkce DOSu I/O přes HANDLE I/O přes FCB
DOS Fn 5eH: Různé síťové funkce
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 5eH DOS 3.1+
└─────────╢ AL ║ SubFn: 0=zjisti jméno stroje (uzlu), jak je známo v síti
║ ║ 2=nastav inicializační řetězec síťové tiskárny
║ ║ 3=čti inicializační řetězec síťové tiskárny
║ostatní║ (podle popisu u podfunkcí)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ostatní║ (podle popisu u podfunkcí)
╙───────╨─────────────────────────────────────────────────────────────
Popis : Tyto funkce jsou přístupné, je-li nahrán síťový IBM PC Network Program.
Verze : Poprvé u DOS 3.1
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 00H: Čti jméno stroje (uzlu), jak je známo síti
Vstup : AX = 5e02H číslo služby
DS:DX=> uživatelský buffer pro uložení ASCIIZ řetězce jména
CL = číslo jména NetBIOSu (není-li CH nula)
AX = je-li nastaven příznak CF, kód chyby
Poznámka : Síťové jméno je 15-znakový mezerami doplněný ASCIIZ
řetězec (celkem maximálně 16 bytů). Většinou to bývá
jméno, pod kterým se uživatel přihlásil (LOGIN). Aby
tato služba správně fungovala, musíte být přihlášen.
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 02H: Definuje inicializační řetězec, který je poslán do tiskárny pokaž-
dé, když stroj tiskne na síťovou tiskárnu.
Vstup : AX = 5e02H
DS:SI=> uživatelský buffer s nastavovacím řetězcem (až 64
znaků)
CX = délka nastavovavcího řetězce (max=64)
BX = index v přesměrovacím seznamu, identifikující tiskárnu
Výstup : je-li nastaven příznak CF, kód chyby
Poznámka : Pro metodu zjištění indexu tiskárny viz
DOS Fn 5F Přesměrování v síti, SubFn 02H Čti jeden
prvek přesměrovacího seznamu.
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 03H: Čti nastavovací řetězec tiskárny určený předchozím voláním
DOS Fn 5eH SubFn 02H.
Vstup : AX= 5e03H
ES:DI=> 64-bytový uživatelský buffer pro uložení nasta-
vovacího řetězce
BX= číslo sekvence v přesměrovacím seznamu.
CX= délka nastavovacího řetězce
ES:DI= ukazatel na buffer obsahující nastavovací řetězec
tiskárny.
Poznámky:
• Protože index v přesměrovacím seznamu se může kdykoliv změnit,
vždy by se mělo použít DOS Fn 5F SubFn 02H pro zjištění indexu
těsně před voláním této funkce.
• Pro metodu zjištění indexu tiskárny viz DOS Fn 5F Přesměrování
v síti, SubFn 02H Čti jeden prvek přesměrovacího seznamu.
DOS Fn 5F Přesměrování zařízení v síti Funkce DOSu
DOS Fn 5FH: Přesměrování zařízení v síti
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 5fH DOS 3.1+
└─────────╢ AL ║ SubFn: 2=zjisti položku přesměrovacího seznamu
║ ║ 3=přesměruj síťové zařízení
║ ║ 4=zruš přesměrování síťového zařízení
║ostatní║ (podle popisu podfunkcí)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ je-li nastaven příznak CF, kód chyby
└─────────╢ostatní║ (podle popisu podfunkcí)
╙───────╨─────────────────────────────────────────────────────────────
Popis: Tato funkce je použitelná jen tehdy, je-li nahrán IBM PC Network Program
Verze: Poprvé v DOS 3.1
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 02H: Čti jeden prvek přesměrovacího seznamu
Vstup : AX = 5f02H číslo služby
BX = index v přesměrovacím seznamu
DS:SI=> 128-bytové ASCIIZ jméno místního zařízení
(např. "LPT1",0)
ES:DI=> 128-bytový ASCIIZ jméno sítě
Výstup: AX= je-li nastaven příznak CF, kód chyby
BL= typ zařízení: 3=tiskárna,4=souborové zařízení (disk)
BH= status zařízení: bit 0=1 při neplatném zařízení,
0 platné zařízení
CX= uložený parametr (u NetBIOSu vždy 0)
DS:SI=> ASCIIZ jméno místního zařízení (např. "LPT1",0)
ES:DI=> ASCIIZ jméno sítě
DX,BP (změněno)
Poznámky : Typicky budete volat s BX=0, pak zvětšovat BX a opakovat
volání, dokud DOS nevrátí chybu 12H (není další soubor).
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 03H: Připoj zařízení
Tato funkce definuje jména adresářů v síti a přesměruje přístup
k síťovým tiskárnám. Přístup k tiskárnám se provádí na úrovni
LPT INT 17
Vstup : AX= 5F03H
BL= typ zařízení: 3=tiskárna, 4=souborové zařízení
CX= parametr pro uložení (pro NetBIOS použijte 0)
DS:SI=> ASCIIZ jméno zdrojového lokálního zařízení
ES:DI=> ASCIIZ cílové jméno (síťová cesta s heslem)
Výstup: AX= je-li nastaven příznak CF, kód chyby
Poznámky: Je-li BL=03, jméno lokálního zdrojového zařízení musí být
ASCIIZ jméno tiskárny ("PRN","LPT1","LPT2","LPT3") zakončeno
nulovým bytem. Cíl je ve tvaru:
\\computername\{shortname|printdevice}],0,[password],0
Heslo začínající 00 se chápe jako 'bez hesla'.
Je-li BL=04, zdroj je ASCIIZ jméno disku (např. "F:",0)
a cíl je ASCIIZ cesta v síti ve tvaru
\\computername\resourcename,0,[password],0
Po volání této funkce se všechny odkazy na tento disk
přesměrovávají na zvolený počítač a cestu. Heslo (password)
může být 0 až 8 bytů dlouhé.
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 04H: Zruš síťové přesměrování zadaného zařízení
Vstup : AX= 5F04H
DS:SI=> ASCIIZ jméno zařízení nebo označení disku
Výstup: AX= je-li nastaven příznak CF, kód chyby
Poznámky: Jestliže DS:SI ukazuje na PRN, LPT1, LPT2, nebo LPT3 a
zařízení je přesměrováno na síť, síťová obsluha tohoto za-
řízení je ukončena.
Když DS:SI ukazuje na označení disku a hesla (např."F:",0,
"heslo",0) přesměrování tohoto disku je ukončeno a jménu
disku je vrácen původní význam.
Po volání této funkce se všechny odkazy na tento disk
přesměrovávají na zvolený počítač a cestu. Heslo (password)
může být 0 až 8 bytů dlouhé.
■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SubFn 04H: Zruš síťové přesměrování zadaného zařízení
Vstup : AX= 5F04H
DS:SI=> ASCIIZ jméno zařízení nebo označení disku
Výstup: AX= je-li nastaven příznak CF, kód chyby
Poznámky: Jestliže DS:SI ukazuje na PRN, LPT1, LPT2, nebo LPT3 a
zařízení je přesměrováno na síť, síťová obsluha tohoto za-
řízení je ukončena.
Když DS:SI ukazuje na označení disku a hesla (např."F:",0,
"heslo",0) přesměrování tohoto disku je ukončeno a jménu
disku je vrácen původní význam.
Funkce DOSu
DOS Fn 62H: Čti adresu Prefixu programového segmentu (PSP)
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 62H DOS 3.0+
├─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ BX ║ segmentová adresa PSP právě spuštěného programu
└─────────╨───────╨─────────────────────────────────────────────────────────────
Popis : Tato funkce vrací v BX PSP volajícího programu.
Využití pro získání parametrů příkazového řádku, prostředí DOSu a všech
dalších užitečných informací obsažených v PSP.
Verze : Poprvé v DOS 3.0
Funkce DOSu
FAT - Alokační tabulka souborů
FAT je lineární tabulka, kterou DOS používá pro udržení informací o fyzické
pozici dat na disku a pro nalezení volného místa na uložení nových souborů.
Slovo na ofsetu 1aH v záznamu adresáře je číslo prvního clusteru v řetězu
přidělených clustrů. Když najdete tento záznam ve FAT, uvidíte zároveň
informaci o konci řetězu nebo pozici dalšího záznamu atd. Prohlédněte si:
počáteční cluster číslo ══╗
Záznam ╓───────────────────┬─┬───────────────────┬───┬───┬─▼─┬───────╖
adresáře ║T E S T A B C│a│ │čas│dat│08 │velik. ║
╙─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─╫─┴─┴─┴─┴─╜
╔═════════════════════════╝
00 01 02 03 04 05 06 07 ║8 09 0a 0b 0c 0d 0e 0f
┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌▼─┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐
00 │ID││ff││03═►04═►05═►ff││00││00││09═►0a═►0b═►15││00││00││00││00│
└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└╫─┘└──┘└──┘└──┘└──┘
╔═══════════════════════╝
┌──┐┌──┐┌──┐┌──┐┌──┐┌▼─┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐
10 │00││00││00││00││00││16═►17═►19││f7││1a═►1b═►ff││00││00││00││00│
└──┘└──┘└──┘└──┘└──┘└──┘└──┘└╫─┘└──┘└▲─┘└──┘└──┘└──┘└──┘└──┘└──┘
╚═══════╝
Toto schéma ukazuje hlavní způsob čtení FAT. Zde:
• TEST.ABC je 10 clusterů dlouhý. První byte je na clusteru 08 a poslední
je na clusteru 1bH. Řetěz je 8,9,0a,0b,15,16,17,19,1a,1b. Každý záznam
ukazuje další záznam v řetězu, poslední záznam obsahuje speciální hodnotu.
• Cluster 18H je označen jako špatný a není článkem řetězu.
• Clustery 6,7, 0cH-14H, a 1cH-1fH jsou prázdné, připravené k použití.
• Další řetěz začíná na clusteru 2 a končí na clusteru 5. Na to, abyste
zjistili jméto tohoto souboru, musíte vyhledat záznam adr. pro cluster 02.
┌─────────────┐
│ Údaje o FAT │ Normálně FAT začíná na logickém sektoru 1 segmentu DOSu (takže
└─────────────┘ se dá číst např. přes INT 25 s DX=1). Jediný jistý způsob je
přečíst boot sektor (DX=0), a prozkoumat ofset 0eH. Tak budete vědět, kolik
boot a obsazených sektorů je před FAT. Jestliže čtete FAT přes INT 25H, vložte
toto číslo (obvykle 1) do DX.
Může existovat více kopií FAT. Většinou jsou k dispozici dvě kompletní kopie.
Jsou-li dvě nebo více, budou sousedit. (druhá FAT následuje hned za prvou).
Ke zjištění informací o FAT se dají použít následující služby:
• INT 25H k přečtení Boot sektoru a prozkoumání jeho datových záznamů
• funkce DOS Fn 36 nebo DOS Fn 1C ke zjištění celkového počtu sektorů a
clusterů
• funkce dosu DOS Fn 44 IOCTL (když driver zajistí generický IOCTL)
DOS 3.2
• DOS Fn 32 k získání různých užitečných informací. NEDOKUMENTOVÁNO
Pozn.: Zkoumání Boot sektorů nebootovatelných (ach, ta čeština) disků
(jako např. starší verze hard disků) je pochopitelně nesmysl.
┌─────────────────┐
│ 12-bitů/16-bitů │ FAT se skládá z 12-bitových nebo 16-bitových položek. První
└─────────────────┘ jsou velmi efektivní pro média s menší kapacitou, než 384K,
záznam FAT se vejde do jednoduchého sektoru o 512 bytech. Pro větší média musí
záznam FAT zmapovat větší a větší velikost clusteru - až do bodu, kde 20M hard
disk bude potřebovat na každou jednotku 16 sektorů, jestliže stále pracuje s
12-bitovým formátem (jinými slovy 1 bytový soubor zabere přes 8K na disku).
16-bitový záznam FAT se objevil s DOSem 3.0 s potřebou obsloužit 20M disky
počítačů typu AT. Přesto diskety a 10M hard disky stále požívají 12 bitovou
strukturu. Můžete zjistit, zda se FAT skládá z 12ti nebo 16ti bitových záznamů:
DOS 3.0 říká: Má-li disk víc, než 4086 (0ff6H) clusterů, používá 16 bitů
(4096 je maximum pro 12ti bitové číslo a >0ff6H je reservováno)
DOS 3.2 říká: Má-li disk víc, než 20740 (5104H) SEKTORŮ, používá 16 bitů
(jinými slovy každý disk nad 10M používá 16ti bitovou FAT)
Pozn.: Běžným omylem je domněnka, že 16-bitová FAT dovolí DOSu pracovat s disky
většími, než 32M. Ve skutečnosti je limitující faktor v tom, že INT 25
a INT 26 (pomocí nichž DOS provádí diskové I/O operace) nemůže
zpřístupnit SEKTOR větší, než 65535. Protože jsou sektory normálně 512
bytů velké, dostáváme limit 32M. Nic nám ovšem nebrání obsluhovat
sektory tak, aby byly větší, takže DOS může teoreticky obsloužit
jakkoliv velký disk.
┌───────────┐
│ Čtení FAT │ Než budete číst libovolný záznam FAT (jako třeba při sledování
└───────────┘ řetězu FAT), načtěte napřed záznam FAT do paměti a zjistěte z
adresáře číslo počátečního clusteru. Pak pro 12ti bitové záznamy:
• Vynásobte číslo clusteru třemi ═╗
• Výsledek podělte dvěma ═════════╩═► každý záznam je 1.5 (3/2) bytů dlouhý
• Načtěte WORD z výsledné adresy (jako ofset od pořátku FAT)
• Bylo-li číslo clusteru sudé, vymaskujte hodnotu 0fffH (ber spodních 12 bitů)
Bylo-li liché, posuňte hodnotu o čtyři bity vpravo (ber horních 12 bitů)
• Výsledkem je záznam dalšího clusteru v řetězu (0fffH=konec).
Pozn.:12ti bitový záznam může zabrat dva sektory, takže se raději
vystříhejte jednosektorovým schematům ukládání FAT.
16ti bitové záznamy jsou jednodušší - každý záznam obsahuje 16ti bitový ofset
(od počátku FAT) dalšího záznamu v řetězu (ffffH indikuje konec).
┌───────────┐
│ Obsah FAT │ První byte FAT se nazývá Deskriptor média nebo též
└───────────┘ identifikační byte FAT. Dalších 5 bytů (12b FAT) nebo 7 bitů
(16b FAT) jsou samé 0ffH. Zbytek FAT se skládá z 12ti nebo 16ti bitových buněk,
které reprezentují jeden cluster disku. Tyto buňky budou obsahovat jednu
z těchto hodnot:
• (0)000H .................. přístupný cluster
• (f)ff0H až (f)ff7H ....... obsazený cluster
• (f)ff7H .................. špatný cluster
• (f)ff8H až (f)fffH........ konec alokačního řetězu
• (0)002H až (f)fefH ....... číslo clusteru další buňky řetězu
Pozn.: horní polovina bytu se používá pouze pro 16ti bitovou FAT, takže např.
špatný cluster je označen 0ff7H v 12b FAT a fff7H v 16b FAT.
┌───────────────────────────────────────┐
│ Změna čísla clusteru na číslo sektoru │ Jakmile získáte počáteční cluster
└───────────────────────────────────────┘ souboru ze záznamu adresáře, budete
chtít najít skutečný sektor, kde se nachází data souboru nebo data podadresáře.
Disketa (nebo segment DOSu hard disku) vypadá asi takto:
• Boot a reservované sektory
• FAT #1
• FAT #2 (volitelné - nepoužito na RAM discích)
• kmenový adresář
• pole dat (zde jsou veškerá data, včetně adresářových souborů)
Každá část této struktury je proměnná a tak pro konverzi clusteru na sektor
musíte znát jejich velikost. Následující vzorec je jedinou zdokumentovanou
metodou, jak zjistit číslo logického sektoru DOSu, znáte-li číslo clusteru:
SektorůKořenAdr = BytůSektor / (ZáznamůKořenAdr * 32)
SektorůFAT = PočetFAT * SektorůVeFat
PočátekDat = RezervovanéSektory + SektorůFAT + SektorůKořenAdr
LogickýSektor = PočátekDat + ((PrvníCluster - 2) * SektorůNaCluster)
Kde proměnné: BytůSektor SektorůVeFAT PočetFAT
ZáznamůKořenAdr RezervovanéSektory SektorůNaCluster
dostanete z Boot sektoru nebo z BPB (dá-li se zpřístupnit). Výsledné číslo
sektoru se dá použít jako hodnota do DX pro INT 25 INT 26 - absolutní
přístup na disk.
Jestli patříte mezi smělé lidi, můžete si ušetřit spoustu problémů použitím
NEDOKUMENTOVANÉ funkce DOS Fn 32 Informace o disku , která poskytuje spoustu
informací, které jsou vždy předem spočítány, včetně převodu čísla sektoru na
počátek datové oblasti.
Pozn. autora: Nejlepší použití pro všechny tyto informace o FAT je nepoužívat
služby DOSu na hledání souboru a udělat si vlastní. V programu používajícím
seznam všech souborů a adresářů poběží přímý přístup na sektory adresáře více
než dvakrát tak rychle, jak služby DOSu
Struktura položky adresáře INT 25 INT 26 Disk INT 13
BPB - Blok parametrů BIOSu
Je to podmnožina dat, které se nacházejí ve struktuře boot sektoru. Požadavek
ovladače 'Vytvoř BPB' způsobí vyplnění bloku v této struktuře.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 2 │VelSekt│ počet bytů na sektor
├───┼───┘
+2 1 │VelClust počet sektorů na alokační jednotku (cluster)
├───┴───┐
+3 2 │RezSekt│ boot a rezervované sektory
├───┼───┘
+5 1 │PočFat počet Alokačních tabulek souboru Viz FAT
├───┴───┐
+6 2 │VelRoot│ max. počet 32-bytových adresářových položek v kořenovém
├───┴───┤ adresáři
+8 2 │CelSekt│ celkový počet sektorů na médiu (Partition DOSu)
├───┼───┘
+0aH 1 │Medium Deskriptor média (stejný, jako první byte ve FAT)
├───┴───┐
+0bH 2 │VelFat │ počet sektorů v jedné FAT
└───┴───┘
0dH délka BPB je 13 bytů
Struktura boot-sektoru FAT DOS Fn 32 Tabulka rozdělení disku
Deskriptor média
DOS definuje 1-bytový kód, který můžeme (někdy) použít k identifikaci typu
média, které používá diskové zařízení. Deskriptor média (nazývaný též ID byte
FAT ) lze získat několika postupy:
• jako hodnota získaná z DOSem DOS Fn 1b , Dos Fn 1c a DOS Fn 32
• jako první byte FAT (logický sektor DOSu 1)
• na ofsetu 0aH z BPB
• na ofsetu 15H z boot sektoru (logický sektor DOSu 0)
• v datovém bloku použitém DOS Fn 44 IOCTL podfce 0dH (Generický IOCTL)
Hodn. Typy médií definované v DOS 3.2
▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
feH 1 strana, 8 sektorů na stopu, 40 stop (5.25")
fcH 1 strana, 9 sektorů na stopu, 40 stop
ffH 2 strany, 8 sektorů na stopu, 40 stop
fdH 2 strany, 9 sektorů na stopu, 40 stop
fah 1 strana, 8 sektorů na stopu, 80 stop (3.5")
fch 2 strany, 9 sektorů na stopu, 80 stop
fbh 2 strany, 8 sektorů na stopu, 80 stop
f9H 2 strany, 15 sektorů na stopu, 80 stop (1.2 M)
f8H pevný disk
8-palcové formáty (77 stop)
feH (formát IBM 3740) 1 strana, jedn. hustota, 26 sektorů na stopu
feH 2 strany, dvojitá hustota, 26 sektorů na stopu
fdH (formát IBM 3740) 2 strany, jedn. hustota, 26 sektorů na stopu
╓7┬6┬5┬4┬3┬2┬1┬0╖
║1 1 1 1 1│ │ │ ║ Bitové příznaky deskriptoru média
╙─┴─┴─┴─┴─┴╥┴╥┴╥╜ bit
║ ║ ╚═► 0: 1=2-stranné; 0=není 2-stranné
║ ╚═══► 1: 1=8 sektorové; 0=není 8 sektorové
╚═════► 2: 1=vyměnitelné; 0=není vyměnitelné
Jak vidíte, dskriptor média není ani informativní ani spolehlivý. Technický
manuál DOSu přináší rozporuplné informace a pak doporučí deskriptor nepoužívat.
A to je dobrá rada. Například boot sektor VDISK.SYS RAM disku obsahuje deskrip-
tor média indikující, že se jedná o 360K disketu (nezávisle na velikosti RAM-
disku). Deskriptor média 0f8H se zase používá pro všechny typy hard disků, což
je užitečné tak na dvě věci.
DOS Fn 1b DOS Fn 32 FAT Struktura boot-sektoru
BPB Funkce DOSu
EPB - Blok parametrů EXECu
Blok parametrů EXECu pro DOS Fn 4B Spusť program (kde AL=0)
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 2 │ │ segment prostředí podřízeného procesu (0000=dědí aktuál.)
├───┴───┴───────┐
+2 4 │ofset segment│ adresa příkazového řádku, která bude umístěna
├───┴───┼───┴───┤ na PSP+80H
+6 4 │ofset segment│ adresa FCB, který bude umístěn na PSP + 5cH
├───┴───┼───┴───┤
+0ah 4 │ofset segment│ adresa FCB, který bude umístěn na PSP + 6cH
└───┴───┴───┴───┘
0eH délka EPB pro EXEC když AL=0
Poznámky:
• připravte prostředí a nastavte EPB+0 na jeho paragraf (nebo nastavte EPB+0 na
0000, a proces zdědí aktuální prostředí).
• připravte příkazový řádek, který bude předán podřízenému procesu. Není-li
potřeba, měl by obsahovat 00H 0dH (Viz Prefix progr. segmentu ofset 80H
pro formát, který je očekáván).
• nastavte EPB+2 na ofset a segment tohoto příkazového řadku
Jestliže nejsou potřeba žádné FCB (např. když voláte COMMAND.COM), můžete
následující kroky ignorovat. Voláte-li funkci, která potřebuje FCB (např.
FORMAT.COM):
• připravte dva neotevřené FCB, které budou předány podřízenému procesu
• nastavte EPB+6 na ofset a segment prvního FCB
• nastavte EPB+0aH na ofset a segment druhého FCB
Blok parametrů EXECu pro DOS Fn 4B Spusť program (kde AL=3)
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 2 │ │ segment, kam bude nahrán soubor
├───┴───┤
+2 4 │ │ relokační faktor pro fixování segmentových odkazů
└───┴───┘
04H délka EPB pro EXEC kde AL=3
Funkce DOSu
FCB Řídící blok souboru (FCB)
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═╗
-7 1 │ffH│příznak rozšíř. FCB ║
├───┴───────────────────┐ ║
-6 5 │ rezervováno pro DOS │ ╠═► použito pouze při rozšířeném FCB
├───┼───┴───┴───┴───┴───┘ ║ ==============
-1 1 │ │ atribut souboru ║
└───┘ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═╝
┌───┐
+0 1 │Drv│ drive ID - před otevřením: 0=vybraný,1=A, atd., po volání
├───┴───────────────────────────┐ 0=A, 1=B, atd.
+1 8 │'F' 'I' 'L' 'E' 'N' 'A' 'M' 'E'│ Název souboru; 1 až 8 znaků, zleva
├───┴───┴───┼───┴───┴───┴───┴───┘ zarovnáno, doplněno mezerami
+9 3 │'E' 'X' 'T'│ Přípona; 0 až 3 znaky, zleva
├───┴───┼───┘ zarovnáno, doplněno mezerami
+0cH 2 │CurBlk │ Číslo daného bloku
├───┴───┤
+0eH 2 │RecSize│ velikost logického záznamu v bytec
├───┴───┼───┬───┐
+10H 4 │velikost soub. │ délka souboru (nižší byte první)
├───────┼───┴───┘
+14H 2 │ datum │ datum modifikace
├───┴───┴───────────────────────────────┐
+16H 0aH │ rezervováno pro DOS │
├───┼───┴───┴───┴───┴───┴───┴───┴───┴───┘
+20H 1 │CRc│ číslo záznamu relativně k bloku (0-7fH)
├───┴───┬───┬ ─ ┐
+21H 4 │RandomRec | | číslo záznamu relativně v souboru
└───┴───┴───┴ ─ ┘ (poslední byte je použit jen při rec_size < 64)
25H počet otevřených FCB
Poznámky:
• před otevřením souboru musíte pouze vyplnit pole Drv a 11 bytů názvu souboru
a přípony (např.: db 0,'MYFILE TXT') a nechat místo DOSu na vyplnění ostat-
ních položek.
'Neotevřený' FCB je prvních 12 bytů (Drv, Filename, Ext) plus místo na ostatní
položky. 'Otevřený' FCB musí mít vyplněny i ostatní pole. Je-li pole Drv=0,
DOS jej nastaví na číslo právě používaného drive (0=A, 1=B, atd.)
• všechny funkce související s FCB se týkají rovněž rozšířeného FCB. Adresa FCB
je tatáž; je-li FCB-7 0ffH, předpokládá se rozšířený FCB
• použijte rozšířený FCB chcete-li specifikovat atribut souboru, který otvíráte
vytvářite, přejmenováváte nebo vyhledáváte přes funkce FCB
I/O přes FCB I/O přes HANDLE Funkce DOSu
PSP - Prefix programového segmentu
Na počátku provádění programu ukazují DS:0000 a ES:0000 na začátek PSP programu
Informace z PSP se používají při analýze názvu souboru a jeho parametrů z příka-
zového řádku, ke zjištění dostupné paměti, k nalezení stavu prostředí atd.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 2 │INT 20H│ programy .EXE sem mohou JMP nebo RET (PSP:0) k ukončení
├───┴───┤
+2 2 │MemTop │ maximum dostupné systémové paměti v paragrafech
├───┼───┘
+4 1 │ │ (rezervováno)
├───┼───────┬───────┐
+5 5 │CALL ofset segment│ FAR CALL na dispečera funkcí DOSu
└───┼───┴───┼───┴───┘
+6 │ Avail │ dostupné byty programového segmentu
┌───┴───┼───┼───┐ (pouze pro soubory .COM)
+0aH 4 │ ofset segment│ Adresa ukončení. Viz INT 22
├───┴───┼───┴───┤
+0eH 4 │ ofset segment│ Adresa obsluhy Ctrl-Breaku. Viz INT 23
├───┴───┼───┴───┤
+12H 4 │ ofset segment│ Adresa obsluhy Kritické chyby.Viz INT 24
├───┴───┼───────┘
+16H 2 │Par PSP│ Segment rodičovského PSP
├───┴───┴─── ─ ┐ (Nedokumentováno ?)
+18h 14h │ Reserved │ Rezervováno pro DOS.
├───┴───┼─── ─ ┘
+2cH 2 │EnvSeg │ Adresa segmentu Prostředí DOSu
├───┴───┴──────── ─ ─────┐
+2eH 2eH │ rezervováno pro DOS │
├───┴───┴───┴───┴ ─ ─┴───┤
+5cH 10H │ pole parametrů 1 │ Nastavení jako FCB pro 1.parametr
├───┴───┴───┴───┴ ─ ─┴───┤ příkazu
+6cH 14H │ pole parametrů 2 │ Nastavení jako FCB pro 2.parametr příkazu
├───┼───┴───┴───┴ ─ ─┴───┘
+80H 1 │len│ Počet znaků v UPA na 81H, ofset pro DTA
├───┴──────────── ─ ─────┐
+81H 7fH │ neformátované pole par.│ Znaky z příkazového řádku
└───┴───┴───┴───┴ ─ ─┴───┘ (kromě direktiv přesměrování)
100H Prefix programového segmentu
DOS Fn 26 Vytvoř PSP DOS Fn 4B EXEC Funkce DOSu
Struktura položky adresáře
Ofset vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────────────────────────────┐
+0 8 │'F' 'I' 'L' 'E' 'N' 'A' 'M' 'E'│ zleva zarovnáno, doplněno mezerami
├───┴───┴───┼───┴───┴───┴───┴───┘
+8 3 │'E' 'X' 'T'│ zleva zarovnáno, doplněno mezerami
├───┼───┼───┘
+0bH 1 │atr│ atribut souboru
├───┴──────── ─ ─ ────┐
+0cH 0aH │ rezervováno │
├───┴───┼───┴ ─ ─ ┴───┘
+16H 2 │ čas │ čas vytvoření nebo poslední modifikace
├───┴───┤ Viz Formát času a data souboru
+18H 2 │ datum │ datum vytvoření nebo poslední modifikace
├───┴───┤
+1aH 2 │ClstrČ.│ číslo clusteru počátku dat souboru (do FAT )
├───┴───┴───────┐
+1cH 4 │velikost soub. │ velikost souboru v bytech
└───┴───┴───┴───┘
+20H velikost položky adresáře
DOS Fn 11 Najdi první soubor přes FCB Funkce DOSu
Atributy souboru
Některé služby DOSu požadují jako parametr atribut souboru. Atribut souboru
je 1-bytová bitová příznaková struktura spřažená s každým souborem, která se
nachází v položce adresáře každého souboru. Jsou definovány následující bity:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │a│d│v│s│h│r║
╙─┴─┴╥┴╥┴╥┴╥┴╥┴╥╜ bit hodnota masky
║ ║ ║ ║ ║ ╚═► 0: 1=Read-only (nedá se přepsat ani smazat) (a & 01H)
║ ║ ║ ║ ╚═══► 1: 1=Hidden (skrytý) (a & 02H)
║ ║ ║ ╚═════► 2: 1=System (systémový) (a & 04H)
║ ║ ╚═══════► 3: 1=Volume label entry (název média) (a & 08H)
║ ╚═════════► 4: 1=subDirectory entry (název podadresáře) (a & 10H)
╚═══════════► 5: Archive. 1=soubor NEBYL archivován (a & 20H)
DOS Fn 11 nebo DOS Fn 4E Najdi první soubor - vyhledávání v adresáři jsou
inkluzivní. Můžete nastavit jeden či více atributových bitů na Hidden, System,
Directory a Archive chcete-li najít soubory s těmito atributy. Vynecháte-li
některý bit, nenajde se žádný soubor s tímto atributem.
Například, chcete-li nalézt pouze adresářové záznamy, můžete použít atribut 10H
a tak získat množinu všech souborů, včetně adresářů. Potom se dají všechny
záznamy, které nejsou adresáře vypustit (mají bit 4=0).
Jestliže specifikujete atribut s nastaveným bitem názvu média, bude vyhledávání
exkluzivní a najdou se pouze záznamy názvu média.
DOS Fn 43 CHMOD umožní nastavit nebo shodit bity Read-only, Hidden, System
nebo Archive. Nedá se měnit bit označení adresáře, ale dají se přidat nebo ubrat
ostatní bity atributu adresáře a to použitím Fn 43H CHMOD specifikací atributu,
který bude mít nastavené všechny požadované bity kromě čtvrtého.
Funkce DOSu
Formát času a data souboru
1 1 1 1 1 1 Vložte slovo z DIR_ENTRY (adr. položka)+16H
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖ do 16-bitového registru a pomocí maskování
║ hodina │ minuta │ sek/2 ║ a posouvání bitů získáte složky času
╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜ souboru.
╚═══╦═══╝ ╚════╦════╝ ╚═══╦═══╝
║ ║ ╚════► dvousekundový přírůstek (0-30) (t & 001fH)
║ ╚═══════════════► minuta (0-59) ((t & 07e0H) >> 5)
╚══════════════════════════► hodina (0-23) ((t & 0f800H) >> 11)
1 1 1 1 1 1
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
║ rok │ měsíc │ den ║ Použijte slovo z DIR_ENTRY+18H. Po maskování
╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜ a posunech k roku přičtěte 1980 (07bcH).
╚═════╦═════╝ ╚══╦══╝ ╚═══╦═══╝
║ ║ ╚════► den (0-31) (d & 001fH)
║ ╚═════════════► měsíc (1-12) ((d & 01e0H) >> 5)
╚════════════════════════► rok (0-119) ((d & f800H) >> 9)
DOS Fn 11 Struktura položky adresáře Funkce DOSu
Informace zařízení IOCTL
Některé podfunkce DOS Fn 44 IOCTL používají tuto strukturu pro hodnoty do DX:
1 1 1 1 1 1 ╔═════════╦═► 0-5: když bit 7=0, drive ID (0=A, 1=B, atd.)
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
║ │I│ reserv. ║d│e│b│ │C│N│O│I║
╙─┴╥┴─┴─┴─┴─┴─┴─╨╥┴╥┴╥┴─┴╥┴╥┴╥┴╥╜ bit hodnota maskování
║ ║ ║ ║ ║ ║ ║ ╚═► 0: 1= Zařízení vstupu z konzoly (DX & 0001H)
║ ║ ║ ║ ║ ║ ╚═══► 1: 1= Zařízení výstupu na konz. (DX & 0002H)
║ ║ ║ ║ ║ ╚═════► 2: 1= Nulové zařízení (DX & 0004H)
║ ║ ║ ║ ╚═══════► 3: 1= Časové zařízení (DX & 0008H)
║ ║ ║ ╚═══════════► 5: 1= binární mód; 0=ASCII mód (DX & 0020H)
║ ║ ╚═════════════► 6: 1= není EOF 0=EOF na vstupu (DX & 0040H)
║ ╚═══════════════► 7: 1= zařízení 0=diskový soubor (DX & 0080H)
╚═════════════════════════════► 14: 1= akceptovány řetězce ASCII (DX & 4000H)
0= nemůže zpracovat řetězce IOCTL
DOS Fn 44 IOCTL Funkce DOSu
Parametry generického IOCTL (CL=40H,60H)
Tato struktura se používá ve funkci DOS 3.2+ Generic IOCTL ( DOS Fn 44 IOCTL
SubFn 0dH, když CL=40H nebo 60H (čti/nastav parametry zařízení) a u ovladačů
zařízení, které podporují Generic IOCTL.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐
+0 1 │ │ Speciální funkce
├───┤
+1 1 │ │ Typ zařízení (vráceno z driveru)
├───┴───┐
+2 2 │ │ Atributy zařízení (vráceno z driveru)
├───┴───┤
+4 2 │ │ Počet cylindrů (vráceno z driveru)
├───┼───┘
+6 1 │ │ Typ média
├───┴ ─ ┬ ─ ┬───┐
+7 1fH │ │ BPB zařízení totéž jako BPB +12H bytů (viz níže)
├───┴ ─ ┴ ─ ┴───┤
+28H ? │ │ Rozložení stop (proměnná délka. Viz níže)
└ ─ ┴ ─ ┴ ─ ┴ ─ ┘
┌──────────────────┐
│ Speciální funkce │ je bitové pole. Pro kód akce 60H Čti parametry zařízení
└──────────────────┘ je definován pouze bit 0:
Bit 0=1 znamená načíst BPB, jak je vrácen Požadavkem na zařízení 02H
(Vytvoř BPB)
0 znamená načíst implicitní BPB (jak je vytvořen funkcí Nastav para-
metry zařízení)
Pro kód služby 40H Nastav parametry zařízení jsou definována tři bitová pole:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0 0 0 0 0│ │ │ ║
╙─┴─┴─┴─┴─┴╥┴╥┴╥╜ bit
║ ║ ╚═► 0: 1=vrať BPB zařízení v požadavcích Vytvoř BPB zařízení
║ ║ 0=použij BPB zařízení z tohoto paketu jako implicitní
║ ╚═══► 1: 1=ignoruj všechna pole tohoto paketu kromě Rozložení stop
╚═════► 2: 1=všechny sektory na stopě mají tutéž velikost
┌──────────────┐
│ Typ zařízení │ může být:
└──────────────┘ 00 = 320/360K 5.25" drive
01 = 1.2M 5.25" drive
02 = 720K 3.5"
03 = 8 inch single density drive
04 = 8 inch double density drive
05 = harddisk
06 = pásková mechanika
07 = jiné
┌──────────────────┐
│ Atribut zařízení │ je bitové pole se dvěma definovanými bity:
└──────────────────┘
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0 0 0 0 0 0│ │ ║
╙─┴─┴─┴─┴─┴─┴╥┴╥╜ bit
║ ╚═► 0: 1=médium NENÍ vyměnitelné; 0=médium je vyměnitelné
╚═══► 1: 1=signál výměny disku je podporován 0=není podporován
┌────────────────┐
│ Počet cylindrů │ vrátí maximální počet cylindrů, které má fyzický drive,
└────────────────┘ bez ohledu na typ média.
┌───────────┐
│ Typ média │ se používá pro specifikaci typu média pro Typ zařízení, který
└───────────┘ podporuje více typů média. Například mechanika 1.2M:0=1.2M médium,
1=360K médium
┌──────────────┐
│ BPB zařízení│ je 31-bytová datová struktura definovaná takto:
└──────────────┘
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌──── ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ────┐
+0 0dH │ normální BPB - tentýž jako je definován pro boot sektor │
├───┴ ─ ┼ ─ ┴ ─ ┴ ─ ┼ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴───┘
+0dH 2 │TrkSect│ sektorů na stopu (cylindr)
├───┴───┤
+0fH 2 │ hlav │ počet hlav (povrvhů) mechaniky
├───┴───┼───────┐
+11H 4 │skryté sektory │ sektory nepoužité driverem (pro rozdělení)
├───┴───┴───┴───┤
+15H 4 │ rezervováno │
├───┴───┴───┴───┴───────┐
+19H 6 │ rezervováno │
└───┴───┴───┴───┴───┴───┘
1fH délka BPB zařízení (31 bytů)
┌─────────────────┐
│ Rozložení stopy │ je pole proměnné délky, které popisuje fyzické rozložení
└─────────────────┘ sektorů na diskové stopě. Viz též INT 13H SubFn 05H.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 02H │PočSekt│ celkem sektorů na stopě (cylindru) (např. 0fH)
├───┴───┼───────┐
+2 4 │Sec1no │Sec2vel│ číslo sektoru, velikost sektoru (např. 1,200h)
├───┴───┼───┴───┤
+6 4 │Sec2no │Sec2vel│ číslo sektoru, velikost sektoru (např. 2,200H)
├───┴───┼───┴───┤
...
├───┴───┼───┴───┤
+? 4 │SecNno │SecNsiz│ číslo sektoru, velikost sektoru (např. 0fH,200H)
└───┴───┴───┴───┘
Poznámka : Je-li nastaven bit 2 Speciálních funkcí, všechny velikosti sektorů
musí být stejné.
Instalovatelné ovladače zařízení DOSu si neudržují tabulky rozložení
stopy pro každou mechaniku. Při změně atributů média musí být voláno
Generic IOCTL Nastav parametry.
DOS Fn 44 IOCTL Funkce DOSu
Parametry generického IOCTL (CL=41H/61H)
Tato struktura se používá v DOS 3.2+ Gemerické IOCTL ( DOS Fn 44 IOCTL
SubFn 0dH, kde CL=41H nebo CL=61H -- Čtení/zápis stopy na logickém zařízení).
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐
+0 1 │ 0 │ Speciální funkce (vždy 0)
├───┴───┐
+1 2 │hlava │ hlava pro čtení/zápis
├───┴───┤
+3 2 │stopa │ stopa (cylindr) pro čtení/zápis
├───┴───┤
+5 2 │sektor │ počáteční sektor (počítáno od 0, tj. sektor 1=0,
├───┴───┤ 2=1 atd...)
+7 2 │PočSekt│ počet sektorů (počítáno od 0. Pro 9-sektorovou
├───┴───┴───────┐ stopu použijte 8)
+9 1fH │ofset segment│ Přenosová adresa. Adresa uživatelského bufferu.
└───┴───┴───┴───┘
DOS Fn 44 IOCTL Funkce DOSu
Parametry generického IOCTL (CL=42H,62H)
Tato struktura se používá ve funkcích generického IOCTL ( DOS Fn 44 SubFn 0dH,
kde CL=42H nebo 62H -- Formát/verifikace stopy na logickém zařízení).
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐
+0 1 │ │ Speciální funkce (viz níže)
├───┴───┐
+1 2 │hlava │ hlava pro formát/verifikaci
├───┴───┤
+3 2 │stopa │ stopa (cylindr) pro formát/verifikaci
└───┴───┘
┌──────────────────┐
│ Speciální funkce │ je bitové pole. Je definován pouze bit 0:
└──────────────────┘
Při vstupu je bit 0 definován:
Bit 0=0: formátování stopy
Bit 0=1: zjisti, jsou-li podporována neobvyklá rozložení stop
Při výstupu je bit 0 definován:
Bit 0=0: Neobvyklá rozložení stop jsou podporována a pole Rozložení stopy
z Nastav parametry (kód 40H) je OK. Viz Generic IOCTL 40H/60H
Bit 0=1: Neobvyklé rozložení stop není akceptovatelné.
DOS Fn 44 IOCTL Funkce DOSu
Hlavička souborů typu EXE
Standardní soubory ve formátu EXE začínají tímto záhlavím:
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 2 │4Dh 5aH│ Signatura .EXE souboru ('MZ')
├───┴───┤
+2 2 │PartPag│ počet bytů v poslední stránce (většinou nepoužito, uži-
├───┴───┤ tečné pro čtení overlayů)
+4 2 │PageCnt│ délka souboru v 512-bytových stránkách včetně hlavičky
├───┴───┤
+6 2 │ReloCnt│ počet položek v relokační tabulce
├───┴───┤
+8 2 │HdrSize│ velikost záhlaví v 16-bytových paragrafech. Užitečné pro
├───┴───┤ nalezení počátku zaváděného modulu v souboru.
+0aH 2 │MinMem │ minimální paměť potřebná za koncem programu (v paragr.)
├───┴───┤
+0cH 2 │MaxMem │ maximální paměť potřebná za koncem programu (v paragr.)
├───┴───┤ Je-li MinMem = MaxMem = 0, program je nahrán co nejvýše
+0eH 2 │ReloSS │ počáteční hodnota SS (musí být relokována)
├───┴───┤
+10H 2 │ExeSP │ počáteční hodnota pro registr SP
├───┴───┤
+12H 2 │ChkSum │ kontrolní součet (záporný součet všech slov v souboru)
├───┴───┤
+14H 2 │ExeIP │ počáteční hodnota registru IP (instruction pointer)
├───┴───┤
+16H 2 │ReloCS │ počáteční hodnota pro nastavení CS (musí být relokována)
├───┴───┤
+18H 2 │TablOff│ ofset v souboru první relokační položky (často 001cH)
├───┴───┤
+1aH 2 │Overlay│ číslo overlay (0 pro základní modul) (generováno LINKem)
└───┴───┘
1cH velikost formátované části EXE záhlaví
┌───────┬───────┬ ─ ─ ┬───────┬───────┐ Relokační tabulka. Začíná
+ ? 4*? │ofset segment│ ••• │ofset segment│ na souborovém ofsetu
└───┴───┴───┴───┴ ─ ─ ┴───┴───┴───┴───┘ [EXE+18H] a má [EXE+6]
+ ? ? výplň po hranici paragrafu 4-bytových položek.
+ ? ? začátek obrazu programu
Protože EXE soubor může být nahrán do libovolného segmentu, všechny absolutní
segmentové odkazy (např. všechny FAR CALLy, dlouhé adresové ukazatele a odkazy
typu MOV AX,data_seg) musí být nastaveny tak, aby pracovaly na těch adresách,
na kterých jsou nahrány. Zde je postup, který používá zavaděč DOS Fn 4B EXEC
pro nahrání EXE souboru:
1. vytvoří Prefix programového segmentu přes DOS Fn 26 Vytvoř PSP
2. čte 1C bytů z EXE souboru (formátovaná část EXE hlavičky) do lokální paměti
3. určí velikost zaváděného modulu = ((PageCnt*512)-(HdrSize*16)) - PartPag
4. zjistí ofset v souboru zaváděného modulu = (HdrSize * 16)
5. zvolí segmentovou adresu, START_SEG, pro nahrávání (obvykle PSP+10H)
6. čte zaváděný modul do paměti počínaje adresou START_SEG:0000
7. DOS Fn 42 SEEK (nastav ukazatel v souboru) na začátek relokační tabulky
(TablOff)
8. pro každou relokační položku (ReloCnt):
a. čte položku jako dva WORDy (I_OFF,I_SEG)
b. sečte RELO_SEG=(START_SEG+I_SEG) (zjistí adresu relokačního odkazu)
c. čti WORD na RELO_SEG:I_OFF (čte aktuální hodnotu)
d. přičte START_SEG k tomuto WORDu (provede nastavení segmentu)
e. uloží součet zpátky na původní adresu (RELO_SEG:I_OFF)
9. alokuje paměť pro program podle MaxMem a MinMem
10. inicializuje registry a spustí program:
a. ES = DS = PSP
b. nastaví AX pro indikaci platnosti označení drive v příkazovém řádku
c. SS = START_SEG+ReloSS, SP = ExeSP
d. přičte START_SEG k tomuto slovu (provede nastavení segmentu)
e. uloží součet zpátky na původní adresu (RELO_SEG:I_OFF)
9. alokuje paměť pro program podle MaxMem a MinMem
10. inicializuje registry a spustí program:
a. ES = DS = PSP
b. nastaví AX pro indikaci platnosti označení drive v příkazovém řádku
c. SS = START_SEG+ReloSS, SP = ExeSP
d. CS = START_SEG+ReloCS, IP = ExeIP (použije: PUSH seg; PUSH offset; RETF)
Poznámka: Poslední přídavky k EXE formátu, zejména verze EXE souboru "CodeView"
a "Windows", obsahují další informace. Tyto přídavky nejsou v této verzi
popsány.
DOS Fn 4B EXEC EXE COM EPB Funkce DOSu
Informační blok struktury disku
K tomuto bloku informací vede NEDOKUMENTOVANÁ DOS Fn 32 Informace o disku
Teoreticky se k těmto informacím dostanete čtením boot sektoru a využijete je
pak pomocí spousty dalších funkcí DOSu a výpočtů, ale tento blok vám podá
všechny informace najednou. Je to jediné volání funkce vracející adresu hlavičky
zařízení.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐
+0 1 │drv│ číslo drive (0=A, 1=B, atd.)
├───┤
+1 1 │ │ číslo podjednotky z hlavičky zařízení
├───┴───┐
+2 2 │ │ velikost sektoru v bytech
├───┼───┘
+4 1 │ │ počet sektorů na cluster-1 (nejvyšší sektor v clusteru)
├───┤
+5 1 │ │ posunutí cluster na sektor (cluster je 2ⁿ sektorů)
├───┴───┐
+6 2 │BootSiz│ rezervované sektory (boot sektory, poč. kmenového adr.)
├───┼───┘
+8 1 │ │ počet FAT
├───┴───┐
+9 2 │MaxDir │ počet adresářových položek v kořenovém adresáři
├───┴───┤
+0bH 2 │DataSec│ číslo sektoru clusteru #2 (první datový cluster)
├───┴───┤
+0dH 2 │HiClust│ počet clusterů +2 (číslo nejvyššího clusteru)
├───┼───┘
+0fH 1 │ │ velikost FAT: počet sektorů pro 1 FAT
├───┴───┐
+10H 2 │RootSec│ číslo sektoru počátku kmenového adresáře
├───┴───┼───────┐
+12H 4 │ofset segment│ adresa hlavičky zařízení
├───┼───┴───┴───┘
+16H 1 │ │ deskriptor média
├───┤
+17H 1 │ │ přístupové příznaky: 0 je-li drive zpřístupněno
├───┴───┬───────┐
+18H 4 │offset segment│ adresa dalšího bloku info (0ffffH pro poslední)
└───┴───┴───┴───┘
DOS Fn 32 Informace o disku Funkce DOSu
Boot sektor disku (zaváděcí sektor) se očekává v tomto tvaru:
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┬───┬───┐
+0 3 │JMP│ xx xx │ NEAR skok na počátek rutiny bootu
├───┴───┴───┴───────────────────┐
+3 8 │'I' 'B' 'M' '3' '.' '2'│ název výrobce (OEM) a verze
├───┴───┼───┴───┴───┴───┴───┴───┘
+0bH 2 │VelSekt│počet bytů na sektor◄═══════════════════ počátek BPB ════╗
├───┼───┘ ║
+0dH 1 │VelClust počet sektorů na alokační jednotku (cluster) ║
├───┴───┐ ║
+0eH 2 │RezSekt│ rezervované sektory (sektory před první FAT) ║
├───┼───┘ ║
+10H 1 │PočFat počet Alokačních tabulek souboru Viz FAT ║
├───┴───┐ ║
+11H 2 │VelRoot│ max. počet adr. položek zákl. adresáře (32 bytů každá) ║
├───┴───┤ ║
+13H 2 │CelSekt│ celkový počet sektorů na médiu (partition DOSu) ║
├───┼───┘ ║
+15H 1 │Medium deskriptor média (totéž, jako první byte ve FAT) ║
├───┴───┐ ║
+16H 2 │VelFat │ počet sektorů v jedné FAT ◄═════════ konec BPB ════╝
├───┴───┤
+18H 2 │StpSekt│ počet sektorů na stopě (cylinder)
├───┴───┤
+1aH 2 │PočHlav│ počet záznamových hlav (povrchů)
├───┴───┤
+1bH 2 │SkrySek│ počet skrytých sektorů
└───┴───┘
1eH velikost formátované části boot sektoru
počátek rutiny a dat bootu
Od MS-DOS 4.0 je struktura poněkud rozšířena:
┌───────┬───────┐
+1eH 4 │ SpecHidSec │ Speciální skryté sektory (Special Hidden
├───────┼───────┤ Sectors)
+20H 4 │ BitTotNumSec │ Velký celkový počet sektorů (Big Total
├───────┼───────┘ Number of Sectors)
+24H 2 │ PhDrv │ Fyzické číslo disku (128 pro drive 0...)
├────┬──┘
+26H 1 │ ExtSign Signatura rozšířeného boot-sektoru
├────┴──────────┐ (Extended Boot Record Signature)
+27H 4 │ SerialNumber │ Sériové číslo svazku (Volume Serial No.)
├───────────────┴─────┐ (např. 1234-89AB je AB 89 34 12)
+2bH 12 │ Volume Label │ Název svazku, doplněný mezerami
├──────────────────┬──┘
+36H 8 │ File System ID │ Název systému souborů (např. FAT16),
└──────────────────┘ doplněno mezerami
Poznámky:
• K přečtení tohoto sektoru použijte INT 25 (DX=0) - absolutní čtení z disku
nebo v případě:
- diskety: boot sektor je na BIOS Disk INT 13 hlava 0, stopa 0, sektor 1
- hard disky: přečtěte Tabulku rozdělení a určete hlavu, stopu a sektor BIOSu
• název OEM může obsahovat libovolných 8 bytů, DOS jej k ničemu nepoužívá.
(většinou se tam podepisuje formátovací program)
• podmnožinu BPB boot sektoru používají ovladače zařízení.
• poslední tři položky struktury jsou požadovány až od verze DOS 3.0 , ovladače
verze DOS 2.0 je nepotřebovaly.
• pro získání abolutního čísla sektoru z čísla clusteru (které získáte z pole
ClustNo adresářové položky nebo z řetězce FAT), můžete použít nedokumentovanou
DOS Fn 32 nebo přečíst boot sektor a použít vzorec:
kořen_sekt = (VelKmen * 32) / VelSekt
první_data = RezSekt + (VelFat * PočFat) + kořen_sekt
abs_sektor = první_data + ((číslo_clust - 2) * VelClust)
Nastavte DX=abs_sektor při čtení nebo zápisu INT 25H/26H
DOS Fn 32 FAT Tabulka rozdělení disku Funkce DOSu
Tabulka rozdělení disku (partition)
Úplně první sektor hard disku obsahuje tzv. Master Boot Record, který se zavede
do paměti a spustí.
Poslední část tohoto sektoru obsahuje tabulku rozdělení (partition), která
obsahuje čtyři záznamy, každý 16 bytů dlouhý. S touto tabulkou pracuje FDISK
(nebo ekvivalent na operačních systémech jiného typu, než IBM).
V okamžiku bootu zavede ROM-BIOS Master Boot Record a skočí na jeho adresu.
Tato rutina přečte Tabulku partition a rozhodne, které partition je označeno
jako aktivní. Potom načte správný boot sektor do paměti a spustí jej.
Tato tabulka je také oblíbeným terčem obtížně odstranitelných virů.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌──── ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ───┐
+0 1beH │rutina zavedení a spuštění boot sektoru aktivní partition │
├───┴ ─ ┴ ─ ┴ ─ ┴ ─ ┼ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴──┘
+1beH 10H │ │ záznam 1 (viz níže)
├───┴ ─ ┴ ─ ┴ ─ ┴───┤
+1ceH 10H │ │ záznam 2
├───┴ ─ ┴ ─ ┴ ─ ┴───┤
+1deH 10H │ │ záznam 3
├───┴ ─ ┴ ─ ┴ ─ ┴───┤
+1eeH 10H │ │ záznam 4
├───┴ ─ ┼ ─ ┴ ─ ┴───┘
+1feH 2 │ 55 aa │ označení tabulky partition (0aa55H)
└───┴───┘
Struktura záznamu partition
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐
+0 1 │Boot příznak bootu: 0 = není aktivní, 80H = aktivní
├───┤
+1 1 │Hl │ Začíná: číslo hlavy
├───┼───┐
+2 2 │Sek Cyl│ Začíná: sektor a cylinder boot sektoru (viz poznámky)
├───┼───┘
+4 1 │Sys│ Kód systému: 0=neznámý, 1=DOS 12-bitová FAT, 4=16-bit
├───┤ (další kódy viz níže)
+5 1 │Hl │ Končí: číslo hlavy
├───┼───┐
+6 2 │Sek Cyl│ Končí: sektor a cylinder posledního sektoru
├───┴───┼───┬───┐
+8 4 │ nižší vyšší │ Číslo počátečního relativního sektoru
├───┴───┼───┴───┤
+0cH 4 │ nižší vyšší │ Velikost (celkem sektorů)
└───┴───┴───┴───┘
+10H začátek dalšího záznamu partition (nebo 0aa55H pro poslední záznam)
Poznámky:
• Hodnoty sektoru a cylinderu jsou 6-bitové respektive 10-bitové
1 1 1 1 1 1
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
║c c c c c c c c C c S s s s s s║
╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜
Je to tak uspořádané proto, aby když naplníte CX touto 16-bitovou hodnotou,
bylo vše připraveno pro Disk INT 13 a přečetlo se rovnou požadované
partition disku. Tak po načtení Master Boot Recordu do paměti do
'sek_buf',kód
CMP byte ptr sek_buf[01beH],80H
otestuje, zda je první partition aktivní a
MOV CX,sek_buf[01c0H]
nastaví CX pro volání INT 13H a načtení boot sektoru z partition č.1.
• Hodnota "relativní sektor" na ofsetu 08H každé partition je ekvivalentní
hlavě, sektoru a cylinderu počáteční adresy partition. Relativní sektor 0
je roven cylinderu 0, hlavě 0, sektoru 1. Číslo relativního sektoru vzrůstá
nejdříve podle sektoru hlavy, pak po hlavách a nakonec podle cylinderů.
Vzorec tedy vypadá takto:
rel_sek=(č.cyl*sektorů_na_cyl*hlav)+(č.hlavy*sektorů_na_cyl) + (č.sek - 1)
• Partition začínají na sudých číslech cylindrů, kromě prvního partition
které může začínat na cylinderu 0, hlavě 0, sektoru 2 (protože sektor 1
zabírá Master Boot Record).
• Když boot record partitionu převezme řízení, ukazuje na jeho tabulku
partition DS:SI.
• Kódy operačních systémů, které se nám podařilo zjistit:
01H DOS-12 bit FAT
02H Xenix
03H Xenix
04H DOS-16 bit FAT
05H Extended
06H BIGDOS (partition nad 32 Mbyte)
07H HPFS (High Performance File System)
08H split
50H Disk Manager (Ontrack/Seagate)
51H Disk Manager
56H GB
61H Speed
63H 386/ix
64H Novell Netware
75H PCIX
DBH CP/M
E1H Speed
E3H Speed
E4H Speed
F1H Speed
F4H Speed
FFH BBT
Poznámka: DR-DOS 6.0 přepisuje typ bootovacího disku z DOS-12, DOS-16 nebo
BIGDOS na nesmysl po zadání systém security. Stačí nabootovat pod
Billem, spustit DE, zobrazit Partition table a přepsat. Jak prosté.
Ale moc to neroztrubujte.
Disk INT 13 Struktura boot-sektoru
INT 2A - NETWORK (Microsoft, LANtastic) Test instalace
Vstup: AH = 00h
Výstup AH <> 00h Je-li instalován.
CF=1 je-li NetWare v2.15 NetBIOS emulátor instalován
Viz též Přerušení DOSu
Jinak INT 2A směřuje na IRET.
Funkce DOSu Přerušení DOSu
INT 29H: RYCHLÝ VÝSTUP ZNAKU
Tento vektor přerušení se volá z výstupových rutin DOS, pokud jde výstup
na zařízení a ne do souboru, a pokud slovo atributů řídícího programu
zařízení má bit 3 (04H) nastaven na '1'. Služba je interní pro DOS 2+.
Viz též: Funkce DOSu Přerušení DOSu
INT 2B - Rezervován pro DOS.
Do verze DOSu 6.2 ukazuje na IRET
Viz též: Funkce DOSu Přerušení DOSu
INT 2C - Rezervován pro DOS.
Do verze DOSu 6.2 ukazuje na IRET
Viz též: Funkce DOSu Přerušení DOSu
INT 2D - Rezervován pro DOS.
Do verze DOSu 6.2 ukazuje na IRET
Viz též: Funkce DOSu Přerušení DOSu
DOS Fn 1FH: DEJ DPB PRO IMPLICITNÍ DISK
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 1F
└─────────╢ ║
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AH ║ FF - chyba
└─────────╢ ║
║ DS:BX ║ Blok popisu disku (implicitního)
║ ║ DOS Fn 32 dělá totéž
╙───────╨─────────────────────────────────────────────────────────────
Požaduje: AH = 1FH
Výstup: AH = 0FFH: došlo-li k chybě
DS:BX => adresa DPB implicitního disku
Popis: Funkce vrací blok informací, které jsou použitelné v aplikacích
vyžadujících přístup na úrovni sektorů k diskům podporovaným
řídícími programy zařízení (device drivers).
Vrací pointer na data pro implicitní disk. Lepší je použít
modifikaci této funkce DOS Fn 32 .
Varování: Mění hodnotu segmentového registru DS.
Tato funkce byla ve verzích DOS starších než DOS 5.0
nedokumentována.
Viz též: Blok popisu disku Funkce DOSu INT 25 INT 26
DOS Fn 50 - Nastav PSP
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 50
└─────────╢ BX ║ segment nového PSP
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ nic ║
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Popis: Tato funkce oznámí DOS, že identifikace procesu v BX
identifikuje implicitní aktivní proces (Poznámka: PID je
segment adresy PSP).
Tuto funkci potřebují TSR programy, jestliže se chtějí
zaktivovat a alokovat paměť nebo otevřít soubory. DOS v těchto
případech používá vlastní vnitřní implicitní PID a jsou-li TSR
programy aktivovány, DOS nemá možnost zjistit, že je aktivní
jiný proces.
Například, jestliže váš TSR program se zaktivuje a chtěl by
alokovat paměť, byla by tato paměť přidělena přerušenému
programu, a byl-li by tento ukončen, jeho paměťové bloky by
byly uvolněny včetně těch, které alokoval váš TSR program.
Obdobně, jestliže byste otevřeli soubor, handle by byl přidán
k seznamu handlů vytvořenému pro přerušený program.
TSR program by měl volat DOS Fn 62 a uložit si vlastní
PSP během inicializace. Je-li později zaktivován, může
použít DOS Fn 62H k uschování PSP přerušeného programu a
volat DOS Fn 50H pro nastavení sama sebe jako aktivního
procesu. Před deaktivací by měl znovu zavolat DOS Fn 50H
k obnovení PID přerušeného programu.
Poznámka: Pro DOS 2.x nesmí být tato funkce volána zevnitř obsluhy
INT 28 (Obsluha kritické chyby) bez nastavení příznaku
kritické chyby.
Pro verze starší než DOS 5.0 byla tato funkce
NEDOKUMENTOVANÁ .
Viz též: Prostředí DOS Funkce DOSu
DOS Fn 51
DOS Fn 51H: DEJ SEGMENT IMPLICITNÍHO PSP
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 51
└─────────╢ ║
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ BX ║ segment PSP
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Popis: Tato funkce vrátí identifikaci procesu v BX, která
identifikuje implicitní aktivní proces (Poznámka: PID je
segment adresy PSP).
Poznámka: Pro DOS 2.x nesmí být tato funkce volána zevnitř obsluhy
INT 28H (Obsluha kritické chyby) bez nastavení příznaku
kritické chyby.
Pro verze starší než DOS 5.0 byla tato funkce
nedokumentována.
Viz též: Prostředí DOS Funkce DOSu
DOS Fn 50
DOS FN 52H: DEJ PROMĚNNÉ DOSu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 52 NEDOKUMENTOVÁNO
└─────────╢ ║
║ ║
║ ║
║ ║
║ ║
║ ║
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ ES:BX ║ adresa bloku proměnných DOS
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Popis: Vrátí adresu nedokumentovaného bloku vnitřních proměnných.
Některé z těchto proměnných jsou užitečné.
Na adrese ES:[BX-2] naleznete segment adresy hlavního MCB .
Ten vám může poskytnout další informace o uspořádání paměti
včetně informací o PID majitelů jednotlivých bloků. Jestliže
naleznete korektní PSP, můžete zjistit z prostředí DOS
jméno vlastníka a parametry, které byly známy při jeho spuštění.
Varování: Ničí segmentový registr ES.
Tato nedokumentovaná funkce může být v budoucích verzích DOS
změněna.
Viz též: MCB Blok proměnných DOSu Funkce DOSu
DOS FN 53H: TRANSFORMUJ BPB NA BLOK DISKOVÝCH PARAMETRŮ DOSu
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 53 NEDOKUMENTOVÁNO
└─────────╢ DS:SI ║ Blok parametrů BIOSu (BPB)
║ ES:DI ║ Blok popisu disku
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ Nic ║
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Popis: Transformuje BPB do bloku diskových parametrů DOS (viz též
DOS Fn 32 ).
Viz též: BPB Funkce DOSu Blok popisu disku
DOS FN 55H: VYTVOŘ PSP
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 55 (interní)
└─────────╢ DX ║ segment, kde se má objevit PSP
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ NIC ║
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Popis: Funkce vykonává podobnou činnost jako DOS Fn 26 s tím
rozdílem, že vytvoří dceřinný PSP místo toho, aby zkopírovala
stávající. Tzn.:
Nastaví PSP dceřinného procesu na adresu DX:0000.
■ Vytvoří nový PSP (100H bytů začínajících na adrese DX:0000).
■ Bude upravena položka MemTop.
■ V novém PSP budou nastaveny vektory přerušení INT 22
(Ukončení), INT 23 (Ctrl-Break) a INT 24 (Kritická
chyba).
Nyní můžete načíst program z disku a spustit jej pomocí FAR JMP.
Viz Hlavička EXE programu pro informace o načítání souboru
v EXE formátu.
Poznámka: Vyvarujte se této funkce i funkce 26H; použijte DOS Fn 4B !
Varování: Tato nedokumentovaná funkce může být v budoucích verzích DOS
změněna.
Viz též: Prefix segmentu programu ( PSP ) DOS Fn 26
Funkce DOSu
DOS FN 58H: DEJ/NASTAV STRATEGII ALOKACE PAMĚTI
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 58 DOS 3.0+
└─────────╢ AL ║ 0=Zjisti strategii
║ ║ 1=Nastav strategii
║ ║ 2=Zjisti připojení UMB
║ ║ 3=Nastav připojení UMB
║ BX ║ Pro al= 1 a 3 typ strategie
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ Chyba pro CF=1
└─────────╢ ║ Kód strategie
║ AL ║ Pro UMB : 0 - UMB nepřipojen (nelze alokovat)
║ ║ 1 - UMB připojen (lze alokovat)
╙───────╨─────────────────────────────────────────────────────────────
Popis: Funkce nastaví nebo zjistí strategii alokace paměti.
Kódy strategie jsou následující:
00H: použij první dostatečně veliký blok konvenční paměti
01H: použij nejmenší dostatečně veliký blok konvenční paměti
02H: použij zbytek posledně použitého bloku konvenční paměti
DOS 5.0+:
80H: použij volný blok UMB na nejnižší adrese; nebude-li k
dispozici v UMB, bude prohledávána konvenční paměť
81H: použij nejmenší dostatečně veliký blok UMB; nebude-li k
dispozici v UMB, bude prohledávána konvenční paměť
82H: použij volný blok UMB na nejvyšší adrese; nebude-li k
dispozici v UMB, bude prohledávána konvenční paměť
40H: použij volný blok UMB na nejnižší adrese
41H: použij nejmenší dostatečně veliký blok UMB
42H: použij volný blok UMB na nejvyšší adrese
Poznámka: Pro AL=1 funkce akceptuje všechny hodnoty BL, přičemž hodnoty
BL >= 2 jsou považovány za 2.
Subfunkce AL=0 vrátí poslední nastavenou hodnotu, takže programy
mohou testovat i hodnoty vyšší než 2.
Bloky UMB jsou zlato ukryté v DOSu. Pro práci v TP tak lze získat
až o 192 KB (maximum) HEAPu více. Je-li k dispozici blok UMB,
můžete tam přesunout Data segment, Stack segment a Overlay buffer.
(Nejlépe MOVSW), změňte DS, SS, OVRHeapXXX tak, aby ukazovaly
do UMB a posuňte HeapOrg. Popsaná akce se MUSÍ provést před první
alokací na HEAPu (a před OVRInit). Pro ladění se 192 KB hodí, ne ?
Zásadně neprovádět s TSR programy (leda změnit všechny SEG @DATA,
provést prohledání relokační tabulky EXE, porovnat s původním DS
a případně změnit. To platí i pro programy, které pracují se seg
@data)
Viz též: Blok správy paměti MCB Funkce DOSu DOS Fn 48
DOS Fn 49 DOS Fn 4A
DOS FN 5DH: INTERNÍ FUNKCE DOS
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 5D (interní)
└─────────╢ AL ║ číslo subfunkce
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║dle AL║
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Poznámka: Tato funkce je částečně nedokumentovaná.
══════════════════════════════════════════════════════════════════════════
SubFn 00H: Nepřímé volání funkce
Požaduje: AX = 5D00H
DS:DX => buffer obsahující hodnoty registrů
AX, BX, CX, DX, SI, DI, DS, ES, které
jsou použity pro volání INT 21H.
Výstup: odpovídá funkci, která je nepřímo volána
Poznámka: Není testována hodnota odpovídající registru AH.
Nesprávná hodnota může způsobit zhroucení systému.
SubFn 01H: Disková synchronizace
Požaduje: AX = 5D01H
Poznámka: Upravuje diskové soubory zaznamenané v systémové
tabulce souborů. Je-li soubor vzdálený, provádí
volání INT 2FH s nastaveným AX=1107H (proč ???).
U otevřených souborů upravuje čas a datum.
SubFn 02H-05H: Síť
Požaduje: AX = 5D0xH
Poznámka: Subfunkce nepracují dokud není natažena síť.
Jejich činnost je však úspěšně zatajena.
SubFn 06H: Dej adresu příznaku kritické chyby
Požaduje: AX = 5D06H
Výstup: DS:SI => adresa interních dat ( stacků ) DOSu
CX - počet BYTE ke swapování, je-li DOS aktivní
DX - počet BYTE ke swapování, není-li DOS aktivní
Poznámka: Tato funkce je volána INT 28 a měl by jí
volat TSR, než se zarezidentní a pak začne pracovat
s INT 21 . Obnoví - li před svou prací vrácený buffer,
může neomezeně volat INT 21, i když DOS Fn 34 vrací
InDos. Po skončení své práce je třeba obnovit původní
obsah. Vlastně udělá DOS reentrantním. NEDOKUMENTOVÁNO .
SubFn 07H-09H: COMMAND.COM
Požaduje: AX = 5D0xH
Poznámka: Subfunkce využívá COMMAND.COM. Subfunkce provádí
volání INT 2F s nastaveným AX=1125H (proč ???).
SubFn 0AH: Nastav parametry pro DOS Fn 59
Požaduje: AX = 5D0AH
DS:DX => 22-bytový buffer obsahující hodnoty
registrů AX, BX, CX, DX, SI, DI, DS, ES,
které pak vrací funkce 59H. Zbývající
byty musí být vynulovány.
Viz též: INT 2F Přerušení DOSu INT 28
Funkce DOSu
DOS FN 60H: ROZŠIŘ CESTU NA PLNÝ TVAR
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 60 (interní)
└─────────╢ DS:SI ║ částečná cesta
║ ES:DI ║ buffer pro plnou cestu
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ ES:DI ║ plná cesta
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Popis: Jestliže cesta ukazuje na disk, který je obsluhován programem
JOIN, funkce dosadí to jméno disku, které byste použili, kdyby
disk nebyl pod vlivem JOIN. Totéž platí pto SUBST. Proto tedy
pozor, označení disků jsou tedy správná, ale nemusí být platná
pro momentální situaci JOIN a SUBST.
Na CD-ROM řízené MSCDEX krachuje. Na prvním místě nechá "\\".
Síťové disky zanechají tuto vizitku :
Server/Svazek:\adresář1\ ... \soubor.ext
Viz též: Funkce DOSu
DOS Fn 63 - Interní služby
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 63 JEN NĚKTERÉ VERZE DOS 2.x
└─────────╢ AL ║ 0: dej tabulku úvodních bytů
║ ║ 1: nastav/smaž dočasný příznak zařízení (který je vracen
║ ║ některými konzolovými funkcemi)
║ ║ 2: dej dočasný příznak zařízení
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ Chybový kód, jestliže CF je nastaven na 1
└─────────╢ DS:SI ║ DS:SI => tabulka ůvodních bytů (AL=0)
║ DL ║ dočasný příznak zařízení (AL=2)
╙───────╨─────────────────────────────────────────────────────────────
Poznámka: Funkce ničí všechny registry mimo SS a SP !
Stupeň nedokumentovanosti je tu příliš vysoký i pro MS-DOS.
Viz též: Funkce DOSu
DOS FN 65H: DEJ ROZŠÍŘENÉ INFORMACE O NÁRODNÍM PROSTŘEDÍ
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 65 DOS 3.3+
└─────────╢ AL ║ 1: dej rozšířené informace o národním prostředí
║ ║ 2: dej tabulku převodu písmen
║ ║ 4: dej tabulku převodu písmen pro názvy souborů
║ ║ 5: dej tabulku písmen pro názvy souborů DOS 5.0
║ ║ 6: dej tabulku paralelních sekvencí
║ ║ 7: dej rozšířenou znakovou sadu DOS 5.0+
║ ║ 20H: převeď znak DOS 5.0+
║ ║ 21H: převeď řetězec DOS 5.0+
║ ║ 22H: převeď ASCIIZ řetězec DOS 5.0+
║ DX ║ kód země
║ BX ║ kódová stránka (0FFFFH = konzole)
║ CX ║ velikost dat, která mají být vrácena (nejméně 5)
║ ES:DI ║ buffer pro data
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ Chybový kód, jestliže CF je nastaven na 1
└─────────╢ ES:DI ║ buffer s vrácenými informacemi
╙───────╨─────────────────────────────────────────────────────────────
Popis: Tato funkce vrací informace o národních variacích. Používá se
pro zjištění formátu data, symbolu měny, desetinného oddělovače
nebo informací nutných pro třídění v národním prostředí.
Jestliže kódová stránka neexistuje nebo byla špatně zadaná,
nastane chyba.
Jestliže CX je nastaveno na <= 5 a data zabírají více místa,
budou oříznuta a nebude generována chyba.
Verze: Tato funkce je přístupná pouze ve verzi 3.3. Pro verze
DOS 3.3+ použijte DOS Fn 38 .
══════════════════════════════════════════════════════════════════════════
SubFn 01H: Dej rozšířené informace o národním prostředí
Nastavte CX >= 29H. Buffer na adrese ES:DI bude vyplněn takto:
Offset Velikost Popis
▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H 1 identifikace informace (jako AL na vstupu)
01H 2 délka informací
03H 2 kód země
05H 2 kódová stránka
07H 2 * formát data
09H 5 * znak měny
0EH 2 * oddělovač tisíců
10H 2 * oddělovač desetin
12H 2 * oddělovač data
14H 2 * oddělovač času
16H 1 * příznak formátu měny
17H 1 * počet desetin ve měně
18H 1 * formát času
19H 4 * adresa rutiny pro převod písmen (FAR CALL)
1DH 2 * oddělovač seznamu dat
1FH 10 * vyplněno nulami
───────────────────────────────────────────────────────────────
Poznámka: informace označené * popisuje
blok národních informací.
SubFn 02H: Dej tabulku převodu písmen
Vrátí adresu tabulky pro zjištění velkých písmen ekvivalentních
k malým. Nastavte CX = 5.
Hodnoty znaků nižší než 128 jsou transformovány odečtením 32.
To ale neplatí pro hodnoty nad 128, kde tento vzoreček neplatí.
Zde musíte hledat v tabulce. například v Kamenických (CP=895)
ekvivalentem hodnoty č (135) je Č (128), pro é (130) je
odpovídající hodnota É (144).
Offset Velikost Popis
▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H 1 identifikace informace (jako AL na vstupu)
01H 4 pointer na 130-bytovou tabulku ve tvaru:
Offset Velikost Popis
────── ──────── ───────────────────────────
00H 2 délka tabulky
02H 80H převodní tabulka (viz níže)
───────────────────────────────────────────────────────────────
Příklad:
cmp AL,80H ; je třeba transformovat ?
jc neměň ; ne, přeskoč
.......
.. nastav parametry pro Fn 65H ..
.......
int 21H ; dej informaci, ty jeden...
lds bx,es:[di+1] ; DS:BX = adresa tabulky
add bx,2 ; ukaž na první znak
sub al,80H ; offset v tabulce je
; hodnota-délka_tabulky
xlat ; dej velké písmeno v AL
neměň: .......
SubFn 04H: Dej tabulku převodu písmen pro názvy souborů
Subfunkce pracuje stejně jako SubFn 02H, ale vrátí tabulku pro
převod písmen pro jména souborů.
SubFn 05H: Dej tabulku písmen pro názvy souborů DOS 5.0
Subfunkce pracuje stejně jako SubFn 02H, ale vrátí tabulku
znaků pro jména souborů (viz též kódy zemí).
SubFn 06H: Dej tabulku paralelních sekvencí
Vrátí adresu tabulky paralelních sekvencí pro všechny znaky
(0-255). Tj. např.: O o Ó ó Ô ô Ö ö apod.
Používá se pro třídění.
Offset Velikost Popis
▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H 1 identifikace informace (jako AL na vstupu)
01H 4 pointer na 258-bytovou tabulku ve tvaru:
Offset Velikost Popis
────── ──────── ──────────────────────────
00H 2 délka tabulky
02H 100H převodní tabulka (viz níže)
───────────────────────────────────────────────────────────────
Převodní tabulka:
Offset Velikost Popis
▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 1 00H
1 1 hodnota nejnižšího použitelného znaku
2 1 hodnota nejvyššího použitelného znaku
3 1 00H
4 1 hodnota prvního znaku výlučné oblasti
5 1 hodnota posledního znaku výlučné oblasti
6 1 00H
7 1 počet nepřípustných znaků v poli
8 ? pole nepřípustných znaků
──────────────────────────────────────────────────────────────────────────
SubFn 07H: Dej rozšířenou znakovou sadu DOS 5.0+
Subfunkce pracuje stejně jako SubFn 02H, ale vrátí rozšířenou
tabulku znaků pro dvoubytové kódy (DBCS).
SubFn 20H: Převeď znak DOS 5.0+
Požaduje: AX = 6520H
DL = znak
Výstup: DL = zkonvertovaný znak
SubFn 21H: Převeď řetězec DOS 5.0+
Požaduje: AX = 6521H
CX = délka řatězce
DS:DX => řetězec
Výstup: DS:DX => zkonvertovaný řetězec
SubFn 22H: Převeď ASCIIZ řetězec DOS 5.0+
Požaduje: AX = 6522H
DS:DX => ASCIIZ řetězec
Výstup: DS:DX => zkonvertovaný ASCIIZ řetězec
Viz též: Kód země Kódová stránka Funkce DOSu
DOS FN 66H: DEJ/NASTAV GLOBÁLNÍ KÓDOVOU STRÁNKU
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 66H (musí být aktivní NLSFUNC) DOS 3.3+
└─────────╢ AL ║ 1: dej běžnou globální kódovou stránku
║ ║ 2: nastav aktivní globální kódovou stránku
║ ║ BX = kódová stránka (pro AL=2)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ chybový kód, jestliže CF je nastaven na 1
└─────────╢ BX ║ aktivní kódová stránka
║ DX ║ systémová kódová stránka (nastavená při spuštění systému)
╙───────╨─────────────────────────────────────────────────────────────
Popis: Funkce vrací nebo nastavuje stránku národního prostředí.
Funkce vykonává správnou činnost pouze tehdu, byl-li
před jejím použitím spuštěn program NLSFUNC. Tato funkce
je použita v průniku s DOS Fn 65H a 38H.
Poznámka: Při instalaci nové kódové stránky si DOS načítá data ze souboru
COUNTRY.SYS. Volání pskončí s chybou, jestliže nastane chyba
při alokaci nebo čtení souboru. Také skončí chybou, jestliže
není spuštěn program NLSFUNC.
Systémová kódová stránka je nastavena při startu systému
v souboru CONFIG.SYS.
Viz též: Kód země Kódová stránka Funkce DOSu
DOS FN 67H: NASTAV POČET HANDLE
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 67h DOS 3.3+
└─────────╢ BX ║ požadovaný maximální počet handlů (až 0FFFFH)
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ Chybový kód, jestliže CF je nastaven na 1
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Popis: Funkce nastaví maximální počet handlů souborů, které mohou být
otevřeny najednou.
Jestliže je BX menší než 20, je nastaveno 20 handlů.
Jestliže je BX menší než stávající maximum a více než BX souborů
je otevřeno, změna bude provedena až nastane situace, kdy nebude
použito více než požadovaný počet handle.
Jestliže je BX větší než stávající maximum, DOS musí mít
k dispozici dostatek volné paměti pro alokaci bufferů pro mové
handle. Použijte DOS Fn 4A (nastav blok) k uvolnění paměti.
Poznámka: Příkaz FILES= v souboru CONFIG.SYS povoluje maximálně 255
handlů, ale jestliže je nastaveno málo, některé databázové
aplikace poběží s problémy.
Viz též: I/O přes HANDLE Funkce DOSu
DOS Fn 46
DOS FN 68H: ZAPIŠ BUFFERY
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 68h DOS 3.3+
└─────────╢ BX ║ handle souboru
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ Chybový kód, jestliže CF je nastaven na CY
└─────────╢ ║
╙───────╨─────────────────────────────────────────────────────────────
Popis: Funkce okamžitě vyčistí systémové I/O buffery souboru (flush).
DOS normálně čeká na zaplnění sektoru nebo na zavření souboru.
Touto funkcí jej přinutíte k okamžitému fyzickému zápisu na
disk. Je to rychlejší než začátečníky používaná sekvence
zavření a opětovného otevření souboru.
Poznámka: DOS zdá se nereaguje na tuto funkci pro BX < 20.
Pro DOS 2.0 až 3.2 můžete použít DOS Fn 45 (Duplikuj
handle).
Viz též: Funkce DOSu DOS Fn 0D a DOS Fn 6C
DOS FN 69H: DEJ SÉRIOVÉ ČÍSLO DISKU
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AH ║ 68h interní DOS 4.x
└─────────╢ AL ║ 0
║ DS:DX ║ Buffer
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ Chybový kód, jestliže CF je nastaven na 1
└─────────╢ DS:DX ║ Naplněný buffer
╙───────╨─────────────────────────────────────────────────────────────
Popis: Funkce má vracet data ve formátu:
Offset Velikost Popis
▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H 2 0
02H 4 sériové číslo disku
06H 11 jméno (volume label) nebo 'NO NAME '
11H 8 typ FAT : 'FAT12 ' nebo 'FAT16 '
────────────────────────────────────────────────────────────────
Poznámka: Tato funkce není podporována všemi variantami DOS 4.x ! (Např.
ve verzi MS-DOS 4.01 ze 4.7.1989 není zabudována.)
Viz též: Funkce DOSu
DOS FN 6CH: ROZŠÍŘENÁ FUNKCE OTEVŘI/VYTVOŘ
┌─────────╥───────╥─────────────────────────────────────────────────────────────
│ Vstup ║ AX ║ 6C00h DOS 4.0+
└─────────╢ BX ║ Rozšířený přístupový mód
║ CX ║ Atributy souboru
║ DX ║ 00x0H: jestliže soubor existuje, ohlaš chybu
║ ║ 00x1H: jestliže soubor existuje, otevři jej
║ ║ 00x2H: jestliže soubor existuje, přepiš a otevři jej
║ ║ 000xH: jestliže soubor neexistuje, ohlaš chybu
║ ║ 001xH: jestliže soubor neexistuje, vytvoř a otevři jej
║ DS:SI ║ Jméno souboru ASCIIZ
┌─────────╫───────╫─────────────────────────────────────────────────────────────
│ Výstup ║ AX ║ Chybový kód, jestliže CF je nastaven na 1 jinak
└─────────╢ ║ handle souboru
║ CX ║ výsledek akce: 0 - soubor byl otevřen
║ ║ 1 - soubor byl vytvořen a otevřen
║ ║ 2 - soubor byl přepsán a otevřen
╙───────╨─────────────────────────────────────────────────────────────
Popis: Tato funkce otevře (vytvoří a otevře) soubor. Funguje jako
DOS Fn 3D a DOS Fn 3C najednou.
Funkce nepoužívá standardní INT 24 (kritická chyba)
a urychluje přímý zápis na disk.
Registr BX na vstupu obsahuje rozšířený příznak módu otevření:
1 1 1 1 1 1
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
║0│w│f│0│0│0│0│0║i│ shr │0│ r/w ║
╙─┴╥┴╥┴─┴─┴─┴─┴─╨╥┴─┴╥┴─┴─┴─┴╥┴─╜ bit
║ ║ ║ ║ ╚═ 0-2: přístupový mód čtení
║ ║ ║ ║ a zápisu
║ ║ ║ ╚═════════ 4-6: mód sdílení (sharing)
║ ║ ╚═════════════ 7: dědičnost
║ ╚═════════════════════════ 13: 0 = použij INT 24
╚═══════════════════════════ 14: 1 = okamžitý zápis na disk
Jestliže je nastaven bit 13 (2000H), přístup k tomuto handlu
nikdy nepoužije obsluhu kritické chyby na INT 24 . Funkce ohlásí
pouze standardní chybu DOS pomocí CF a AX. Jestliže se tak
stane, použijte DOS Fn 59 .
Jestliže je nastaven bit 14 (4000H), bude potlačeno standardní
systémové bufferování a bude prováděn přímý zápis na disk jako
kdybyste použili DOS Fn 68 po každém zápisu. Zpomaluje to
diskové operace, ale nemusíte mít takový strach o data.
Jestliže vytváříte nový soubor, nastavte atributy souboru
do CX. Je-li soubor pouze otevírán, registr CX je ignorován.
Poznámka: Tato funkce překrývá DOS Fn 3C , DOS Fn 3D a DOS Fn 5B . Také
může odstranit standardní obsluhu kritické chyby. Je však
použitelná až od DOS 4.0.
Viz též: I/O přes HANDLE INT 24
Funkce DOSu
NEDOKUMENTOVÁNO
Vše, co je označeno tímto nápisem, je funkční jen na půl. Lepší je se takovým
funkcím vyhnout, ale nedokumentované funkce bývají, jako na potvoru, vždy
potřeba. Někdy zcela akutně : DOS Fn 32 , DOS Fn 5D a na 80286 také
Nedokumentované instrukce .
Použijete-li něco, co je nedokumentované, vystavujete se riziku, že to
možná v budoucnosti nebude funkční. Pak si za to můžete sám. Ale to riziko
není až tak velké .... Já sám nedokumentované funkce používám.
Funkce DOSu Seznam kapitol
NEDOKUMENTOVÁNO
Vše, co je označeno tímto nápisem, je funkční jen na půl. Lepší je se takovým
funkcím vyhnout, ale nedokumentované funkce bývají, jako na potvoru, vždy
potřeba. Někdy zcela akutně : DOS Fn 32 , DOS Fn 5D a na 80286 také
Nedokumentované instrukce .
Použijete-li něco, co je nedokumentované, vystavujete se riziku, že to
možná v budoucnosti nebude funkční. Pak si za to můžete sám. Ale to riziko
není až tak velké .... Já sám nedokumentované funkce používám.
Funkce DOSu Seznam kapitol
I/O přes HANDLE
Tyto funkce jsou preferovány před tradičním I/O přes FCB pokud nemusíte
zachovávat kompatibilitu s DOS 1.10. Snadněji se používají. Handle je číslo,
které nám vrátí nějaká inicializační služba (např. otevření), a s tímto číslem
jako parametrem identifikujícím soubor pak voláme všechny ostatní funkce.
DOS Fn 3C Založ soubor
DOS Fn 5B Vytvoř nový soubor (nesmí existovat)
DOS Fn 5A Vytvoř dočasný soubor
DOS Fn 3D Otevři soubor
DOS Fn 3E Zavři soubor
DOS Fn 41 Zruš soubor
DOS Fn 42 SEEK nastav pozici v souboru (I pro zjištění velikosti soub.)
DOS Fn 3F Čti ze souboru/zařízení
DOS Fn 40 Zápis do souboru
DOS Fn 44 IOCTL (lze použít pro test konce souboru)
DOS Fn 45 Duplikuj HANDLE
DOS Fn 46 Přesměrování
DOS Fn 6C Rozšířené otevření souboru
I/O přes FCB Funkce DOSu
I/O přes FCB
Tyto funkce pracují ve vybraném adresáři DOSu. Ve většině případů je lepší pou-
žívat I/O přes HANDLE .
DOS Fn 16 Založ soubor přes FCB
DOS Fn 0F Otevři soubor přes FCB
DOS Fn 10 Zavři soubor přes FCB
DOS Fn 13 Zruš soubor přes FCB
DOS Fn 14 Sekvenční čtení přes FCB
DOS Fn 15 Sekvenční zápis přes FCB
DOS Fn 29 Rozbor jména souboru do FCB
DOS Fn 11 Najdi první soubor přes FCB
DOS Fn 12 Najdi další soubor přes FCB
DOS Fn 21 Čti libovolnou větu (přímý přístup do souboru)
DOS Fn 27 Čti libovolný blok
DOS Fn 22 Zapiš libovolnou větu
DOS Fn 28 Zapiš libovolný blok (rovněž lze změnit velikost souboru)
DOS Fn 24 Nastav libovolný blok
I/O přes HANDLE Funkce DOSu
Memory Control Block
Toto je NEDOKUMENTOVANÁ struktura řídícího bloku, který používá DOS
k přiřazení, modifikaci a uvolnění bloků systémové paměti.
Ofset Vel. Obsah
┌───┐ je-li 'M'(4dH), pak následuje další blok ('middle' blok)
+0 1 │Typ│ je-li 'Z'(5aH), pak je to poslední blok (?)
├───┴───┐
+1 2 │Vlastní│ paragraf vlastníka bloku (pro FreeMem) 0 = sám sebe
├───┴───┤
+3 2 │Velik. │ počet paragrafů v alokačním bloku
├───┴───┴──────── ─ ────┐
+5 0bH │rezervováno │
└───┴───┴───┴───┴ ─ ┴───┘
+10H ? Zde začíná blok paměti a končí (Velik*10H) bytů odsud.
Paragraf na této adrese je hodnota vrácená Fn 48H AllocMem.
Poznámky:
• bloky paměti jsou vždy řazeny v rámci paragrafu (blok_seg)
• bloky typu M: další blok je na (blok_seg+Velik):0000
• bloky typu Z: (block_seg+Velik):0000 je konec paměti (přitom: a000H=640K)
• po DOS Fn 4B EXEC začíná Z-blok na (PSP - 1):0000 nového procesu (Někdy)
• blok označený Z má někdy následníka, jeho jméno je UMB a DOS tak spravuje
paměť od B000:0 do 0F000. Jinak je struktura stejná. Bloky UMB - viz obr.
Je-li UMB, pak Z-blok není posledním MCB.
MCB (9FFX:0000) v BASE paměti (0000:0000-9FFF:000F)
Z-blok.
Velikost :XX KB───┐
Program (data) │
┌─────────────────┘
▼
MCB asi (9FFX:0000)
M-blok.
Velikost :64 KB───┐
A000:0000 Video │
┌─────────────────┘
▼
MCB UMB (B000:0000)
M-blok.
Velikost :XX KB───┐
M-MCB 1.programu │
M-MCB 2.programu │
M-MCB 3.programu │
Z-MCB 4.programu │
Video ROM │
┌─────────────────┘
▼
MCB UMB (D000:0000)
Z-blok (doopravdy)
Velikost :XX KB───┐
M-MCB 1.programu │
M-MCB 2.programu │
M-MCB 3.programu │
M-MCB 4.programu │
Z-MCB 5.programu │
KONEC RAM ◄──────┘
BIOS ROM.
Za posledním Z blokem v BASE je tedy ještě šňůra MCB v UMB. Jejich jméno
bývá UMB , UMB1 ... atd (není zdaleka pravidlo). Teprve Z-MCB je pak poslední.
V rámci každého bloku definovaného MCB v hlavní řadě je vlastní struktura MCB
o přidělení paměti jednotlivým programům.
1. podřízené MCB v každém bloku začíná na adrese SEGxx+1:0000, kde SEGXX:0000
je adresa MCB spravujícího bloky UMB v hlavní řadě. Jedná se tedy o dvojnásobnou
hierarchii.
Nalézt první MCB v RAM není jednoduché. DOS na to nemá dokumentovanou funkci.
Buď lze prohledávat všechny segmenty XXXX:0000 a hledat M, vzít jako MCB a
zkusit návaznost, nebo použít nedokumentované služby DOS Fn 52 .Jeho segment
je na vrácené adrese es:[bx-2]. NEDOKUMENTOVÁNO .
První MCB oznámeno DOS Fn 52 v sobě skrývá mnoho užitečných informací o DOSu.
Je rozděleno na další úseky struktury stejně jako UMB. Každý nainstalovaný
ovladač v CONFIG.SYSu má v tomto bloku (č.1) své vlastní MCB, ve kterém
je uvedeno :
0 BYTE :
typ bloku (jako M a Z)
D - DEVICE =
I - INSTALL=
B - BUFFERS=
X - FCBS=
L - LASTDRIVE=
F - FILES=
C - BUFFERS= (/X)
S - STACKS=
+ 1 WORD Segment ovladače (bloku paměti)
+ 3 WORD Velikost bloku v paragrafech
+ 5 3 byte nepoužity
+ 8 Jméno ( jen D a I )
Bloky dále navazují na hlavní linii. (M bloky).
Příklad použití :
Var Mujseg:Word;
Function Vypismcb(var segm:word):Boolean;
var i:integer;
begin
VypisMcb:=true;
If char(mem[segm:0])='Z' then Vypismcb:=false else {Zde zkuste odpojit Z}
begin {Máte-li UMB, vypíše se i jeho obsah.
(Ale program neskončí)}
case char(mem[segm:0]) of
'D':Write('Device ');
'I':Write('Install ');
'S':Write('Stacks ');
'L':Write('LastDrive ');
'B':Write('Buffers ');
'F':Write('Files ');
'X':Write('FCBs ');
'C':Write('Buffers /X ');
'Z','M':Write('Aplikace ');
end;
write(longint (memw[segm:3]) shl 4 :6,' Byte ') ;
i:=8;
If char(mem[segm:0]) in ['D','I','M','Z'] then
while (mem[segm:i]<>0) and (i<16) do
begin
write(chr(mem[segm:i]));
inc(i);
end;
writeln;
segm:=segm+memw[segm:03]+1;
end;
end;
begin
asm
mov ax,5200h
int 21h
Mov ax,word ptr es:[bx+0FFFEh]
inc ax
mov mujseg,ax
end;
while vypismcb(mujseg) do ;
end.
Funkce DOSu UMB DOS Fn 48 DOS Fn 58
Blok proměnných DOSu
NEDOKUMENTOVÁNO
Zatím je struktura platná vč. DOS 5.0.
Offset Velikost Obsah
-2 2 segment prvního MCB
00H 4 "offset segment" - adresa prvního DPT
04H 4 "offset segment" - adresa první FAT
08H 4 "offset segment" - adresa hlavičky řídícího programu
zařízení CLOCK
0CH 4 "offset segment" - adresa hlavičky řídícího programu
zařízení CON
10H 2 největší velikost sektoru blokových zařízení
12H 4 "offset segment" - adresa cache-bufferu
16H 4 "offset segment" - adresa seznamu implicitních adresářů
pro každý disk
1AH 4 "offset segment" - adresa tabulky FCB souborů
1EH 2 velikost tabulky FCB souborů
20H 1 počet disků v systému
21H 1 poslední disk (LASTDRIVE v CONFIG.SYS)
Poznámka: Můžete použít segment adresy prvního MCB pro vyhledání
všech paměťových bloků. Poté je můžete porovnat s PSP
(na první ukazuje INT 20 ) a z nich vyzískat jejich
adresu prostředí DOS a zjistit jména procesů atd.
Implicitní seznam adresářů je složen z ASCIIZ řetězců
s plným jménem adresáře (vč. disku) + několik mně nejasných
dat. Každá položka je dlouhá 93 bytů.
Číslo posledního disku je zároveň počet položek v seznamu
adresářů. Jestliže ve vašem CONFIG.SYS specifikujete
"LASTDRIVE=Z", bude tato hodnota 18H.
Hodnota počtu disků v systému je počet všech blokových
zařízení včetně RAM-disku apod.
Viz též: Funkce DOSu DOS Fn 52
KÓDOVÁ STRÁNKA
Od verze DOS 3.3 dává DOS mechanismus na úrovni systému pro nastavení
alternativních typů písma pro obrazovku (EGA a LCD) a tiskárny. Jednoduše
řečeno je stránka kódu tabulka s 256 položkami, jedna pro každou hodnotu
ASCII.
Přepínání stránky kódu je potřebné v zemích jiných než USA, kde
klávesnice, obrazovka a typy písma tiskárny nesouhlasí se standardem
definovaným v hardware. Stránky kódu definované a podporované v DOS 3.3
obsahují :
╒══════════════════╤═════╤══════════╕╒══════════════════╤═════╤══════════╕
│ Země │ kód │ str.kódu ││ Země │ kód │ str.kódu │
╞══════════════════╪═════╪══════════╡╞══════════════════╪═════╪══════════╡
│ Arabské země │ 785 │ 864, 850 ││ Kanada (Franc.) │ 002 │ 863, 850 │
│ Austrálie(mezin.)│ 061 │ 437, 850 ││ Korea │ 082 │ 934, 437 │
│ Belgie │ 032 │ 850, 437 ││ Latinská Amerika │ 003 │ 437, 850 │
│ Brazílie │ 055 │ 850, 437 ││ Maďarsko │ 036 │ 852, 850 │
│*Československo *│ 042 │ 852, 850 ││ Německo │ 049 │ 437, 850 │
│ Čína (tradiční) │ 088 │ 938, 437 ││ Norsko │ 047 │ 865, 850 │
│ Čína (zjednoduš.)│ 086 │ 936, 437 ││ Nizozemí │ 031 │ 437, 850 │
│ Dánsko │ 045 │ 850, 865 ││ Polsko │ 048 │ 852, 850 │
│ Finsko │ 358 │ 850, 437 ││ Portugalsko │ 351 │ 850, 860 │
│ Francie │ 033 │ 437, 850 ││ Španělsko │ 034 │ 437, 850 │
│ Hebrejsky mluv. │ 972 │ 862, 850 ││ Švédsko │ 046 │ 437, 850 │
│ Itálie │ 039 │ 437, 850 ││ Švýcarsko │ 041 │ 850, 437 │
│ Japonsko │ 081 │ 932, 437 ││ USA │ 001 │ 437, 850 │
│ Jugoslávie │ 038 │ 852, 850 ││ Velká Británie │ 044 │ 437, 850 │
└──────────────────┴─────┴──────────┘└──────────────────┴─────┴──────────┘
Implementace stránky kódu je pro různá zařízení velmi odlišná. Každopádně
na úrovni uživatele je to jakýsi filtrující systém překládající vstupní
znak na výstupní. Sdílím s vámi odpor k nic neříkajícímu názvu
'stránka kódu', ale jde o standard začleněný i do OS/2. Koneckonců pro
DOS je to standardní způsob, jak předefinovat znaky na EGA a IBM
Proprinteru, a je natolik flexibilní, aby zaručoval nezávislost a
flexibilitu i při změnách hardware.
Informace relevantní pro stránky kódu:
■ Soubor CONFIG.SYS obsahuje direktivu COUNTRY=, která vybírá
implicitní stránku kódu a soubor informací o zemi. Viz též DOS Fn 65
■ Jedna nebo více direktiv DEVICE= v CONFIG.SYS instaluje řídící
programy zařízení 'vědomé si stránky kódu' DISPLAY.SYS nebo
PRINTER.SYS.
■ Soubory '.CPI', které jsou slučitelné s DOS, obsahují 'informaci o
stránce kódu' (Code Page Information) pro vybraná zařízení. Viz též
Soubory typu písma stránky kódu (Code Page Font Files).
■ Příkaz NLSFUNC instaluje přepínání kódu stránky (volitelně mající
přednost před souborem informací o zemi nastaveném v CONFIG.SYS)
a musí být použit před jakoukoli činností stránky kódu.
■ Příkazy DOS 3.3 MODE a CHCP mohou připravit a vybrat stránku kódu.
■ 'Připravujete-li' stránku kódu pomocí příkazu MODE, je informace
v souboru .CPI použita k předefinování typu písma. Například znak
'$' může být změněn na libru. Děje se tak na úrovni řídícího programu
zařízení pomocí příkazů Fn 44H (IOCTL). Pro EGA mají příslušná
volání BIOS INT 10H za účel předefinování sady znaků. Pro tiskárnu
může být zavedena sada znaků a zvolena jako implicitní.
■ DOS Fn 44 SubFn 0CH dává řídícím programům zařízení rozhraní IOCTL,
které může obstarávat přepínání stránky kódu.
■ DOS Fn 66 vám dovoluje vybrat připravenou stránku kódu nebo získat
hodnotu aktuální aktivní stránky kódu.
Soubor typu písma stránky kódu popisuje strukturu souboru definice
typu písma používaného řídícím programem zařízení, který si je vědom
stránky kódu.
Viz též: Funkce DOSu DOS Fn 44 , DOS Fn 65 a DOS Fn 66
KÓDY ZEMÍ
Standardní kódy zemí, s nimiž je počítáno ve většině programů pracujících
s národním prostředím (vč. DOS):
Kód Kód Země Kódov0 Formát Formát Formát Odd.
Hex Dec stránky data času měny dat
▄▄▄▄ ▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄
001H 001 Spojené Státy 437,850 MM/DD/YY 01:00:00 PM $1,000.00 ,
002H 002 Kanada 863,850 YY-MM-DD 13:00:00 1 000,00 $ ;
003H 003 Latiská Amerika 850,437 DD/MM/YY 01:00:00 PM
01FH 031 Holandsko 850,437 DD-MM-YY 13:00:00 ť1.000,00 ;
020H 032 Belgie 850,437 DD/MM/YY 13:00:00 1 000,00 F ;
021H 033 Francie 850,437 DD.MM.YY 13:00:00 1 000,00 F ;
022H 034 Španělsko 850,437 DD/MM/YY 13:00:00 1.000,00 Ř ;
024H 036 Maďarsko 852,850 YY-MM-DD 13:00:00
026H 038 Jugoslávie 852,850 YY-MM-DD 13:00:00
027H 039 Itálie 850,437 DD/MM/YY 13:00:00 1.000,Lit. ;
029H 041 Švýcarsko 850,437 DD.MM.YY 13.00.00 Fr 1,000.00 ,
02AH 042 Československo 852,850 YY-MM-DD 13:00:00
02CH 044 Velká Británie 437,850 DD/MM/YY 13:00:00 Ľ1,000.00 ,
02DH 045 Dánsko 850,865 DD-MM-YY 13.00:00 1.000,00 DKR ;
02EH 046 Švédsko 850,437 YY-MM-DD 13.00.00 SEK 1.000,00 ;
02FH 047 Norsko 850,865 DD.MM.YY 13.00.00 KR 1.000,00 ;
030H 048 Polsko 852,850 YY-MM-DD 13:00:00
031H 049 Německo 850,437 DD.MM.YY 13.00.00 DM1.000,00 ;
037H 055 Brazílie 850,437 DD/MM/YY 13:00:00
03DH 061 Mezinár.angl. 437,850 DD/MM/YY 13:00:00 $1,000.00 ,
15FH 351 Portugalsko 850,860 DD-MM-YY 13:00:00 1.000$00 ;
166H 358 Finsko 850,437 DD.MM.YY 13:00:00 1 000,00 MK ;
311H 785 Blízký východ DD/MM/YY 01:00:00 PM 1.000,000 $ ;
3CCH 972 Izrael DD/MM/YY 13:00:00 Ö 1,000.00 ,
Viz též: Funkce DOSu DOS Fn 38 a DOS Fn 65
Prostředí DOS
Termínem "prostředí DOSu" se v rámci AThelpu nemyslí to, že hovoříme o tom, že
pracujeme v prostředí operačního systému MS-DOS (DR-DOS), ale zcela konkrétní
datová struktura (DOS Environment, jak ji hlásí MEM).
DOS udržuje pole paměti obsahující řadu ASCII řetězců, které mohou být využity
k získání informací na systémové úrovni a k předání dat jiným programům.
• Prostředí DOSu se nastavuje příkazem DOSu 'SET'.
• Jeho obsah také ovlivňují příkazy 'PATH' a 'PROMPT'.
• V batch souborech je každý text uzavřený symboly procenta nahrazen hodnotou
prostředí, odpovídající tomuto názvu. Například:
1 ► SET PATH=c:\my_dir;%PATH%
2 ► IF .%USER%. == .dan. GOTO dan_label
3 ► ECHO %CMPRS% > %CUR_LPT%
To poskytuje spoustu možného využití, přesto však DOS postrádá možnosti
skutečně pružného jazyka dávkového zpracování.
Prostředí je omezeno jistou velikostí, která se však dá zvětšit direktivou
'SHELL=' v CONFIG.SYSu nebo příkazem 'COMMAND /e:NNNNN', který definuje
interpret příkazů s NNNN byty prostředí.
Struktura Příklad v ASM mnemonice:
name_1=value_1◄0► db 'COMSPEC=c:\command.com',0
name_2=value_2◄0► db 'PROMPT=$p$g',0
: db 'WP=c:\wordproc',0
name_N=value_N◄0► db 'PATH=d:\;c:\dos;c:\utils',0
◄0► db 0
┌─ ◄xxxx► ───────────┐ pouze ┌─ dw 1 ───────────────────────┐
│ EXEC_string_1◄0► ╞═► DOS ◄═╡ db 'C:\ACCTNG\AR001.EXE',0 │
│ : │ 3.0+ └─ db 0 ───────────────────────┘
│ EXEC_string_NN◄0► │
└─ ◄0► ─────────────┘
kde ◄0► je ASCII znak NUL (00H) a ◄xxxx► je 16-bitová binární hodnota.
┌───────────────────┐
│ Použití prostředí │ Prostředí je menší, než 32K bytů a začíná na hranici
└───────────────────┘ paragrafu. Ofset 2CH z PSP daného programu obsahuje
číslo paragrafu prostředí.
Najít vybranou proměnnou můžete pomocí srovnávání ASCII řetězců, dokud
nenarazíte na nulový řetězec (nulové délky), který indikuje konec prostředí.
Obvykle je název proměnné prostředí psán velkými písmeny, ale není to zaručené.
Standardní operaci vykonávají s prostředím programy typu shell, které spouštějí
sekundární kopii COMMAND.COMu. Shelly hledají "COMSPEC" a jeho hodnotu pak
používají jako drive, cestu a specifikaci interpretru příkazů DOSu
Některé programy požadují po uživateli, aby uložil příkazem SET jisté informace
do prostředí DOSu. Aplikace pak tuto informaci může využít při každém běhu.
Například textový editor může hledat proměnnou DICTIONARY a použít její hodnotu
jako specifikaci souboru slovníku.
┌────────────────────┐
│ Základní prostředí │ Každý program si vytváří statickou kopii původního pro-
└────────────────────┘ středí. Takže všechny změny, které v prostředí uděláte
se budou týkat každého vnořeného procesu, ale ztratí se po předání řízení
procesu nadřazenému.
Neexistuje popsaná metoda nalezení kmenového (původního, DOSovského) prostředí,
NEDOKUMENTOVANÁ technika je použití INT 2e . Užitečné může být spuštění
kopie COMMAND.COMu s nadefinovaným prostředím. Všechny procesy, které pod ním
poběží budou potom pracovat s kopií tohoto prostředí.
┌─────────────────────────┐
│ Nalezení zaváděcí cesty │ Počínaje DOSem 3.0 ukládá DOS za konec formálního
└─────────────────────────┘ prostředí přídavný řetězec, který umožňuje nalezení
drive a adresáře, odkud byl program zaveden. Aplikace tak může snadněji nalézt
své overlaye a datové soubory.
Je to velmi důležité, poněvadž DOS 3.0 už dovoluje operátorovi vyvolat program
tak, že se názvu souboru programu předřadí popis cesty.
Po posledním řetězci prostředí následuje byte 0, který indikuje konec
formálního prostředí. Další dva byty jsou 16ti bitové počítadlo přídavných
řetezců (obvykle bývá tato hodnota 0001H). Dále se dá očekávat ASCII řetězec
specifikace souboru, který se zaváděl a spouštěl DOS Fn 4B (EXEC).
I když se program nenachází v implicitním adresáři a DOS potřebuje použít
specifikaci cesty ( PATH= ) k jeho nalezení, přesto se za konec prostředí
uloží plná specifikace souboru (d:\cesta\jsouboru.pří,0).
Nejrychleji své jméno naleznete :
.... začátek progeamu, ds ke segment PSP , jsme na 3.0+ ..
les di,dword ptr ds:[02A]
Xor di,di ;es:[di] je začátek prostředí
Mov ax,di
Mov cx,8000h ; max velikost
@Hledej_dál:
Repnz Scasb
Scasb
Jnz @hledej_dál
Add di,2
;na es:[di] je ASCIIZ jméno spuštěného souboru
V TP 6.0 jsou v jednotce DOS připraveny funkce pro práci s prostředím.
Např. : Writeln(GetEnv('COMSPEC')); vypíše cestu ke COMMAND.COMu.
Paramstr(0) obsahuje jméno spuštěného souboru.
Funkce DOSu Přerušení DOSu
Soubory typu COM
Jedná se o přežitek z dob CP/M. Soubor typu COM má podstatně jednodušší
strukturu. Jeho velikost je maximálně 64KB. Neobsahuje žádnou hlavičku.
Po spuštění souboru typu COM se celý načte do paměti od offsetu 100h prvního
volného segmentu. Do adresy 0100h DOS vystaví strukturu jakoby PSP . COM
dostane celou volnou paměť, tedy často více než potřebuje. CELOU přidělenou
paměť tedy může využít, ale program sám se musí starat o správné nastavení
segmentů.
Po spuštění jsou CS, DS, ES a SS nastaveny na stejný segment ( na jeho počátku
je i PSP ). SP má hodnotu FFFC a ne vrcholu zásobníku je uložen WORD 0000.
Řízení je předáno na první byte v COMu (často JMP).
Programy COM mohou se mohou ukončit RET ( vyberou ze segmentu 0 a na adrese
cs:0 je instrukce INT 20 ), nebo lépe DOS Fn 4C .
Pokud je COM rezident, měl by před voláním INT 27 realokovat svůj blok
paměti, aby bylo možno spustit COMMAND.COM, nebo lépr použít DOS Fn 31 .
Soubory typu COM bývají snadným cílem útoku virů, protože je snadnější je
infikovat. Snadnou a jednoduchou prevencí proti nakažení ja nastavení délky
COM na velikost asi 65510 byte. Inteligentní vir spočte, že po nakažení by
soubor měl více než 64 KB a DOS by bojkotoval. (Zkuste napsat vir na 25 byte.)
Hloupější vir COM sice napadne, ale DOS ho nespustí. Pak lze snadno
rozeznatelné, jaký soubor je nakažen. A virus hlavně NEDOSTANE ŘÍZENÍ !!
Některé COMy si hlídají svojí velikost a tak uvedený systém selže. Ale při
testu své délky se nutně musí objevit i virus. Nepřepisovací viry tedy ani tady
nemají šanci.
DOSu je putna, jestli je soubor COM nebo EXE ( 5.0 +). Rozlišuje je podle
hlavičky. ( Hlavička EXE ) Např. WIN.COM je klasickým EXE souborem
přejmenovaným na COM. DOS však zabrání spuštění COM souboru bez hlavičky
s délkou větší než 64 KB.
COM vytvořený TASM musí začínat ve stylu :
Code segment public use16 para 'Code'
Assume cs:code;ds:code
Org 100h ;!!!!!!!
Start :Jmp install
Install:
Mov ax, 4C00h ; 3100h
Int 21h
code ends
end START
DOS Fn 4B EXE DOS Fn 4C
Soubory typu EXE
Soubor typu EXE je charakteristický svojí hlavičkou - Hlavička EXE .
Podle této hlavičky se provede přidělení paměti, obsazení Stack segmentu
a hlavně RELOKACE. (viz algoritmus v části Hlavička EXE )
Hlavním rysem EXE souborů je, že nemají limit své délky (omezuje pouze RAM)
Virus, který chce nakazit EXE soubor musí provést dekódování jeho hlavičky
a upravit jí tak, aby zahrnovala svojí délkou i jeho jádro. Tato činnost je
poměrně komplikovaná, proto je virů - infektorů EXE méně než infektorů COM .
Snadná obrana protio nakažení EXE souboru je zvětšení jeho délky. 1 BYTE stačí !
Virus si přečte velikost souboru a délku kódu podle hlavičky. Zjistí-li rozdíl,
neinfikuje EXE soubor. Zde rozdíl vzniká. (1 byte) Je-li virus hloupý, neprovádí
tento test, ale DOS při zavádění EXE zajímá JEN jeho hlavička a ne délka
souboru (zde může být overlay). Proto NEZAVEDE přidaný kód viru do paměti
a virus se neprovede. NEDOSTANE ŘÍZENÍ. Exe soubor je však po takovém útoku
většinou ztracen, důležité je ale zjištění přítomnosti viru a zabránění jeho
šíření.
Některé EXE si hlídají svojí velikost a tak uvedený systém selže. Ale při
testu své délky se nutně musí objevit i virus. Nepřepisovací viry tedy ani tady
nemají šanci.
DOSu je putna, jestli je soubor COM nebo EXE ( 5.0 +). Rozlišuje je podle
hlavičky. ( Hlavička EXE ) Např. WIN.COM je klasickým EXE souborem
přejmenovaným na COM . DOS však zabrání spuštění COM souboru bez hlavičky
s délkou větší než 64 KB.
EXE musí mít definovaný svůj vlastní STACK. ( na rozdíl od COMu )
COM DOS Fn 4B DOS Fn 4C
Přerušení BIOSu
BIOS poskytuje základní služby pro práci s periferiemi na úrovni volání
pomocí instrukce INT. Po svém startu se inicializuje, provede ROM-SCAN ,
POST , zaalokuje některá přerušení a provede BOOT .
Přerušení alokovaná BIOSem - obslužné rutiny :
Video INT 10
Konfigurace INT 11
Paměť INT 12
Disk INT 13
COM INT 14
BIOS INT 15
Klávesnice INT 16
LPT INT 17
ROM Basic INT 18
BOOT INT 19
Časovač INT 1A
Break INT 1B
Uživatelský časovač INT 1C
Budík INT 4A
Přerušení sloužící jako ukazatele na tabulky :
Video parametry INT 1D
Parametry diskety INT 1E
Tabulka znaků INT 1F
Parametry HD 1. INT 41
Parametry HD 2. INT 46
Datová oblast BIOSu
Přerušení DOSu Přerušení CPU IRQ Seznam přerušení
I/O Porty
BOOT - Natažení OS
Protože BIOS většinou funguje, je teda třeba spustit něco, co tuto vlastnost
nemá. (Murphyho zákon, upraveno.) Tím je např. (MS-)DOS.
Velká modrá šlápla hodně vedle, když splašila malou modrou (tenkrát
před krachem), aby pro ni sepsala DOS. Malá modrá k tomu přišla jak slepý
k houslím a od té doby v OS na PC kraluje. (Bohužel.)
Natahování OS je poslední činností BIOSu. Provede se přibližně toto :
BIOS zkusí, je-li disketa v mechanice A (některé i B, podle Setupu lze pořadí
i zaměnit). Je-li, načte 1.sektor 0. stopy 0.povrchu do paměti na adresu
0000:7C00. Zkontroluje, je-li WORD na adrese 0000:7DFE (poslední 2 přečtené
BYTE) roven 0AA55 (v paměti 55 AA). Pokud ano, a předá řízení na adresu
0000:7C00. Tam je buď vir, nebo systémová disketa. Pokud test na AA55 nevyjde,
vypíše BIOS něco jako :
Non system disk or disk error.
Replace and press any key ...
a buď pokračuje pokusem s disketou v A (inteligentní) nebo provede rovnou boot
z C (ten můj). Tam se celý proces zopakuje a v případě výskytu chyby (test
AA55) vydá opět výše uvedenou hlášku. Tak pořád dokola, dokud nevypnou proud,
nebo nenabootuje.
Boot sektor natáhne IO.SYS (jen část) provede se vytvoření blokových
ovladačů přítomných disků, dotáhne se IO.SYS, vystaví služby DOSu, natáhne
MSDOS.SYS (DOS je komplet už nyní) a zpracuje CONFIG.SYS. Pokud CONFIG.SYS
obsahuje SHELL=..., použije se tento příkazový interpret. Jestliže ne,
dos předpokládá COMMAND.COM v rootu bootovacího disku. (Pokud použijete
SHELL=, ale specifikovaný soubor neexistuje, máte smůlu. DOS ani nenapadne
v případě výskytu chyby natáhnout COMMAND.COM. Jen suše oznámí :
Missing command interpreter. System halted.)
COMMAND.COM provede AUTORXEC.BAT v rootu bootovacího disku a pokud
AUTOEXEC nekončí zrovna u WINDOWS, objeví se známá DOSovská řádka. Jestliže
AUTOEXEC neexistuje, DOS se zeptá na datum a čas ( stejně vždy 2x Enter )
a opět nahodí DOSovskou řádku.
Bootuje-li se z HD, načte se jako první MASTER BOOT SECTOR , tam se
přečte rozdělení partition a zjistí se, který disk je bootovací. Teprve
pak se přečte boot sektor příslušného disku a provede celá anabáze nad.
Bootovací disk bývá C. FDISK sice umožní vybrat bootovací disk jakýkoliv,
ale s jiným než C to nefunguje ( DOS 5.0 ). Další krásný opšn (option pro
nerusofily) nanic.
Struktura boot-sektoru MBR - Tabulka rozdělení disku
POST Přerušení BIOSu ROM-SCAN
POST - Power On Self Test
Po zapnutí počítače před ROM-SCANe m se provede POST. Není nad jistotu, že vše
funguje OK. Bios provádí kontroly v tomto pořadí :
Procesor (kontroluje se sám po zapnutí)
ROM BIOS (kontrolní součet)
Prvních 64KB RAM
Systémový řadič
Řadič paměti
Řadič I/O
Jednotlivé periferie (motherboard) :
DMA
Časovač
Řadič přerušení
CMOS čas
Deska video
Pokud se dosud vyskytne nějaká chyba, BIOS o ní pomlčí. Jen ji zapíše na
porty klávesnice, kde se nechá měřit (a určit, co je na věčnosti). To samozřejmě
jen pokud je procesor OK. Některé BIOSy si k práci pípají do noty.
Odtud se chyby zobrazují i na obrazovce :
Paměť
Externí periferie :
Klávesnice
Sériové porty
Paraelní porty
Game port
Řadič FDD
Řadič HDD
Pokud systém neselže, je pravděpodobné, že bude OK. Provede se tedy ROM-SCAN
a později i BOOT .
'Pípání do noty' jsou pro lidi s hudebním sluchem šifrované zprávy o testech,
které selhaly. Kódování morseovky je následující (PHOENIX BIOS) :
┌─────┬──────────┬──────────────────────────────────────────────────────────┐
│ Kód │ BEEP kód │ Popis (chyby) │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 01h │ není │ Test registrů CPU │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 02h │ 1-1-3 │ Chyba R/W paměti RAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 03h │ 1-1-4 │ Chybný CRC BIOS ROM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 04h │ 1-2-1 │ Chyba časovače (8254) │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 05h │ 1-2-2 │ Chyba inicializace DMA (8237) │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 06h │ 1-2-3 │ Chyba R/W DMA registrů │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 08h │ 1-3-1 │ Chyba obnovování DRAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 09h │ není │ Test 1. 64 KB RAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 0Ah │ 1-3-3 │ Chyba datové sběrnice 1. 64 KB RAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 0Bh │ 1-3-4 │ Chyba parity 1. 64 KB RAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 0Ch │ 1-4-1 │ Chyba adresní sběrnice 1. 64 KB RAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 0Dh │ 1-4-2 │ Chyba parity 1. 64 KB RAM │
├─────┴──────────┼──────────────────────────────────────────────────────────┤
│ 10h - 1Fh │ Chyba pameti DRAM │
├─────┬──────────┼──────────────────────────────────────────────────────────┤
│ 20h │ 3-1-1 │ Chyba SLAVE DMA │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 21h │ 3-1-2 │ Chyba MASTER DMA │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 22h │ 3-1-3 │ Chyba MASTER řadiče přerušení │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 23h │ 3-1-4 │ Chyba SLAVE řadiče přerušení │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 25h │ není │ Čtení vektorů přerušení │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 27h │ 3-2-4 │ Chyba řadiče klávesnice │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 29h │ není │ Čtení CMOS │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 2Bh │ 3-3-4 │ Chyba Video RAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 2Ch │ 3-4-1 │ Chyba řadiče Video RAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 2Dh │ 3-4-2 │ Chyba plnění Video RAM │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 34h │ 4-2-1 │ Chybí pulsy časovače │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 35h │ 4-2-2 │ Chyba Shutdown (Pryč z PROTECTED MÓDu ) │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 36h │ 4-2-3 │ Chyba hradlování A20 │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 37h │ 4-2-4 │ Přerušení CPU v PROTECTED MÓDu nastalo mimo plán │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 38h │ 4-3-1 │ Chyba linky A20 │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 3Ah │ 4-3-3 │ Chyba druhého kanálu časovače │
├─────┼──────────┼──────────────────────────────────────────────────────────┤
│ 3Bh │ 4-3-4 │ Zastavily se hodiny (chtějí natáhnout) │
└─────┴──────────┴──────────────────────────────────────────────────────────┘
Některé chyby nejsou závažné, jiné jsou i pro opraváře problém. V případě
chyby vždy zkontrolujte obsah CMOS paměti. Odstraní se tak 90% chyb.
Chyby jako 'Key stuck detected' klidně ignorujte. Jen jste se opřel o
klávesnici během POSTu.
Většina chyb VIDEO souvisí s kabelem monitoru. Viz Kabely .
ROM-SCAN BOOT
Struktura paměti CMOS
PC řady AT obsahují zálohované hodiny reálného času (RTC) a stálou 64-bytovou
paměť CMOS s nízkou spotřebou energie.( Někdy i 127 BYTE - enhanced )
Tato paměť obsahuje různé informace včetně času a data, konfigurace hardware
a stavového byte "shut-down" (ten se používá v mechanismech, které dovolí AT
provést restart tam, kde skončil při resetu procesoru během odchodu z chráněného
režimu).
Vidíte-li hlášku "Run Setup" během POSTu, je to proto, že nějaký hardware
neodpovídá konfiguračnímu záznamu nebo kvůli jiným problémům s CMOS RAM.
Adresa Přehled (detailní informace níže)
▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H-0dH použito hodinami reálného času
0eH stavový byte POSTu
0fH stavový byte spadnutí (shutdown)
10H typ mechaniky ─────┐
11H rezervováno │
12H typ hard disku │
13H rezervováno ╞═► konfigurační záznam chráněný
14H byte vybavení │ kontrolním součtem (10H-20H)
15H-16H velikost základní paměti │
17H-18H přídavná paměť nad 1M │
19H typ hard disku 1 ( > 15) │
1aH typ hard disku 2 ( > 15) │
1bH-2dH rezervováno ─────┘
2eH-2fH místo kontrolního součtu paměti CMOS adres 10H až 20H
30H-31H přídavná paměť nad 1M
32H století v BCD (např. 19H)
33H různé
34H-3fH rezervováno
┌────────────────┐
│Použití dat CMOS│
└────────────────┘
K načtení dat z CMOS proveďte OUT 70H,adr; a potom IN 71H.
K zápisu byte do CMOS proveďte OUT 70H,adr; a potom OUT 71H,hodnota.
Příklad: ;------- čti typ instalovaného hard disku
mov al,12H
out 70H,al ;urči adresu CMOS 12H
jmp $+2 ;chvilička, aby to stihnul
in al,71H ;v AL je nyní typ drive (0-15)
Adresy 10H až 20H jsou chráněny kontrolním součtem, aby se dal indikovat stav,
kdy odcházejí baterie nebo kdy někdo zapsal neplatné informace do konfiguračního
záznamu. Je to jednoduchý 16-bitový součet chráněných bytů. (Většinou.)
Při práci s CMOS OPATRNĚ !!!
┌───────────────────────┐
│Struktura CMOS detailně│
└───────────────────────┘
Adr Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 sekunda reálného času ┌────────────────────────────┐
1 sekunda alarmu │ Pozn.:Více info o hodinách │
2 minuta reálného času │ reálného času získáte v │
3 minuta alarmu │ popisu Motorola MC 146818 │
4 hodina reálného času └────────────────────────────┘
5 hodina alarmu
6 den v týdnu reálného času
7 den v měsíci reálného času
8 měsíc reálného času
9 rok reálného času
0aH stavový registr RTC A
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ ║
╙╥┴─┴─┴─┴─┴─┴─┴─╜
║ ╚═╦═╝ ╚═════╩═► selektor rychlosti (nastaven na 0110)
║ ╚═══════════► 22-úrovňová dělička (nastavena na 010)
╚═══════════════► Příznak možnosti změny UIP. 0 znamená připraveno
ke čtení
0bH stavový registr RTC B
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │ │ │ ║
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜
║ ║ ║ ║ ║ ║ ║ ╚═► letní čas. 0=standardní čas (nastaveno na nulu)
║ ║ ║ ║ ║ ║ ╚═══► 12 nebo 24 hodin. 0=12hodin (nastaveno na 1)
║ ║ ║ ║ ║ ╚═════► režim BCD dat. 1=binárně, 0=BCD. (nastaveno na 0)
║ ║ ║ ║ ╚═══════► pravoúhlý průběh. 1=zapni. (nastaveno na 0)
║ ║ ║ ╚═════════► povoleno přer. na konci změn. 0 zakáže. (nastaveno na 0)
║ ║ ╚═══════════► povoleno alarmové přer. 0 zakáže (je na 0) Viz INT 1aH
║ ╚═════════════► povoleno periodické přer. 0 zakáže (nastaveno na 0)
╚═══════════════► Příznak možnosti změny UIP. 0 znamená připraveno
ke čtení
0cH stavový registr RTC C. Stavové bity přerušení pouze ke čtení
0dH stavový registr RTC D. Bit 7=1 má-li CMOS-RAM napájení
=0 výpadek baterií
0eH stavový BYTE POSTu
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │ │0 0║
╙╥┴╥┴╥┴╥┴╥┴╥┴─┴─╜
║ ║ ║ ║ ║ ╚═════► Čas platí (Po POSTu znamená 1 že není 30. února)
║ ║ ║ ║ ╚═══════► Špatný hard disk 1 znamená, že se nedá z disku bootnout
║ ║ ║ ╚═════════► Velikost RAM není v pořádku. 1=POST zjistil rozdíl RAM
║ ║ ╚═══════════► Konfigurační záznam není vpořádku. 1=jiné vybavení
║ ╚═════════════► Špatný kontrolní součet. 1=nesouhlasí k.s. v CMOS RAM
╚═══════════════► Ztráta napětí. 1=baterie pro reálný čas došly.
0fH stavový BYTE spadnutí
Tento byte se čte při inicializaci po resetu procesoru, aby se rozhodlo
zda byl reset použit jako způsob, jak se dostat z chráněného módu 80286
0 = měkký reset (Ctrl-Alt-Del) nebo neočekávané spadnutí
1 = spadnutí po určení velikosti paměti
2 = spadnutí po testu paměti
3 = spadnutí po chybě paměti (kontrola parity 1 nebo 2)
4 = spadnutí při požadavku zavaděče bootstrapu
5 = spadnutí při FAR JMP (fixuj řadič přerušení a skoč na 0:[0467H])
6,7,8 = spadnutí po testu chráněného režimu
9 = spadnutí po posunutí bloku. Viz BIOS INT 15 podfce 87H
0aH = spadnutí při FAR JMP (hned skoč na adresu 0:[0467H])
Podrobnosti : PROTECTED MÓD
10H typ mechaniky
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ ║
╙─┴─┴─┴─┴─┴─┴─┴─╜ 0000 = žádná
╚══╦══╝ ╚═════╩═► druhá mechanika ══╦═► 0001 = 360K 5.25"
╚════════════► první mechanika ═╝ 0010 = 1.2M
0011 = 720K 3.5"
0100 = 1.44M
11H rezervováno
12H typ hard disku (pro drive C: a D:, jsou-li mezi 1 a 14)
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ ║
╙─┴─┴─┴─┴─┴─┴─┴─╜
╚══╦══╝ ╚═════╩═► první hard disk (drive C:) ══╦═► 0000 = není
╚════════════► druhý hard disk (drive D:) ═╝ jinak = ID typu (níže)
1111 = ber adr 19H/1aH
Tyto typy jsou předdefinovány ROM-BIOSem. Vektory pro INT 41H and INT 46H
jsou původně nastaveny na ROMovou tabulku, obsahující informace o insta-
lovaných typech. Parametry HD 1. INT 41
Write Land Write Land
Typ Cyl Hla PreComp Zone Vel Typ Cyl Hla PreComp Zone Vel
▀▀▀▀ ▀▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀
1 306 4 128 305 10M 16 612 4 0 663 21M
2 615 4 300 615 21M 17 977 5 300 977 42M
3 615 4 300 615 32M 18 977 7 0ffffH 977 59M
4 940 8 512 940 65M 19 1024 7 512 1023 62M
5 940 6 512 940 49M 20 733 5 300 732 31M
6 615 4 0ffffH 733 21M 21 733 7 300 732 44M
7 462 8 256 511 32M 22 733 5 300 733 31M
8 733 5 0ffffH 733 31M 23 306 4 0 336 10M
9 900 15 0ffffH 901 117M 24-47 rezervováno
10 820 3 0ffffH 820 21M
11 855 5 0ffffH 855 37M Je-li půlbyte typu disku 0fH (15),
12 855 7 0ffffH 855 52M pak je typ disku uložen na CMOS adrese
13 306 8 128 319 21M 19H (drive C:) nebo 1AH (drive D:)
14 733 7 0ffffH 733 44M
15 rezervováno──nepoužívat
Poznámky: Typ 1 je originální hard disk XT
Typ 2 je standardní hard disk 20M AT (a první slušný...)
Typy 16-23 byly přidány do ROM-BIOSu 11/15/85
Jiné BIOSy mají jiná číslování typů, takže si zjistěte parametry
Vašeho harddisku a podle toho teprve vybírejte v Setupu
Pokud je uvedeno : User type, zapište si i počet stop, hlav,
sektorů atd. (Nestandardní typ).
13H rezervováno
14H Byte vybavení
╓7┬6┬5┬4┬3┬2┬1┬0╖
║drv│dsp│n/a│7│d║
╙─┴─┴─┴─┴─┴─┴╥┴─╜
╚╦╝ ╚╦╝ ║ ╚═► 1 = instalována mechanika(y)
║ ║ ╚═══► 1 = instalován mat. koprocesor 80287
║ ╚══════════► primární display 00 = žádný nebo ◄EGA
║ 01 = 40-sl. CGA
║ 10 = 80-sl. CGA
║ 11 = TTL Monochromatický
╚══════════════► mechaniky (00=1, 01=2, 10=3, 11=4)
15H základní paměť (nižší) ══╦═► 0100H=256K, 0200H=512K, 0280H=640K
16H základní paměť (vyšší) ═╝
17H rozšířená paměť nad 1M (nižší) ══╦═► (v K bytech. 0-3c00H)
18H rozšířená paměť (vyšší) ══════════╝ Viz BIOS INT 15 podfce 88H
19H disk 0 (drive C:) typ hard disku je-li (CMOS adr 12H & 0fH) rovna 0fH
1aH disk 1 (drive D:) typ hard disku je-li (CMOS adr 12H & f0H) rovna f0H
1bH-2dH rezervováno
2eH kontrolní součet adres CMOS 10H až 20H (vyšší byte)
2fH (nižší byte)
30H rozšířená paměť nad 1M (nižší) ══╦═► (v K bytech. 0-3c00H)
31H rozšířená paměť (vyšší) ══════════╝ Viz BIOS INT 15 podfce 88H
32H století v BCD (např. 19H)
33H různé informace. Bit 7=instalována paměť IBM 128K
Bit 6=je použit Setupem
34H-3fH rezervováno. Můžete se sem třeba podepsat (nebo se vám tam může podepsat
virus).
POST ROM-SCAN BOOT
Kontrola přídavných ROM
Během studeného startu po POST a instalaci obsluh přerušení BIOS provádí
kontrolu vnějších ROM (na deskách ve slotech). Tato činnost se nazývá ROM-scan.
Poznámka: Kontrola ROM nebyla ve dřívejších BIOSech implementována a ty nejstar-
ší PC (ty s maximálně 64K na systémové desce) tuto činnost neprovádí,
dokud nenainstalujete novější verzi ROM-BIOSu. (Takový počítač je dnes
vzácnost a historická rarita. Pátrají po nich památkáři.)
Vnější moduly ROM se mohou nacházet mezi adresami c800:0000 a e000:0000.
Testuje se označení každého 2K bloku z tohoto rozsahu, kde blok má tuto
strukturu:
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐
+0 1 │55H│ Označení modulu ROM přístupného BIOSem
├───┤ (první WORD segmentu je aa55H)
+1 1 │aaH│
├───┤
+2 1 │dél│ délka modulu ROM v 512-bytových přírůstcích
├───┼ ─ ┬───┐
+3 ? │ │ │ │ spustitelný kód
├───┼ ─ ┴───┘ (často NEAR skok na inicializaci)
| | (nevýznamný byte na korekci kontrolního součtu)
Jakmile BIOS najde označení ROM, spočítá kontrolní součet definovaného modulu.
Každý byte se sčítá modulo 100H a součet musí být přesně 0. Po testu na platnost
modulu BIOS provede FAR CALL na ofset 0003H jeho segmentu a ROM se musí (případ-
ně) vracet do BIOSu přes FAR RET.
Klasicky provádí modul ROM nějakou hardwarovou inicializaci a "pověsí" svoji
adresu na jeden nebo více vektorů přerušení.
Nejčastěji se téměř každý uživatel setká se dvěmi přídavnými ROMy:
- VGA-BIOS - má ho každý, kdo používá kartu VGA (EGA)
- XT harddisk BIOS (základní BIOS PC/XT neznal pevný disk, takže se jeho připo-
jení řeší takto. Bývá typicky na segmentu C800H, ale lze většinou přeadreso-
vat jumpery na desce kvůli kolizím. Někdy (zvláště u lepších řadičů) bývá i
u AT, kdy tento specializovaný BIOS lépe využije vlastnosti desky než obecný
ROM-BIOS. Navíc bývá v tomto BIOSu i podprogram pro formátování harddisku,
případně jiné pomocné funkce (test povrchu...). Typicky u řadičů Western
Digital se na tyto speciální funkce dostanete tak, že zjistíte segment tohoto
BIOSu (dejme tomu C800H, pak zavoláte program DEBUG a napíšete
G=C800:5
a objeví se menu.
Dále ROM-scanu využívají adaptéry sítí Ethernet, Decros security card a podobně.
BOOT CMOS POST
Tabulka parametrů diskety
Tato 10-bytová struktura je také známa jako "Tabulka báze disku". Dá se nalézt
na vektorové adrese INT 1eH (4-bytová adresa na 0:0078). Specifikuje řadu důle-
žitých proměnných pro disketové mechaniky. Tabulka je nastavena na implicitní
hodnoty ROM-BIOSem a je modifikována DOSem pro zlepšení výkonu disket.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌─┬─┐
+0 1 │ | │ bity 0-3: SRT (step rate time); bits 4-7: head unload time
├─┴┬┤ tj. rychlost krokování a doba uvolnění přítahu hlavy
+1 1 │ |│ bit 0: 1=používat DMA; bity 2-7: čas přítahu hlavy
├──┴┤
+2 1 │ │ čekání motoru (55-ms kroky před vypnutím motoru mechaniky)
├───┤
+3 1 │ │ velikost sektoru (0=128, 1=256, 2=512, 3=1024)
├───┤
+4 1 │ │ EOT (číslo posledního sektoru na stopě)
├───┤
+5 1 │ │ délka mezery ("gap") pro čtecí/zápisové operace
├───┤
+6 1 │ │ DTL (Data Transfer Length) max. délka přenosu
├───┤
+7 1 │ │ délka mezery "gap" pro formátování
├───┤
+8 1 │ │ vyplňovací znak pro formátování (normálně 0f6H '÷')
├───┤
+9 1 │ │ doba ustálení hlavy po vystavení (v milisekundách)
├───┤
+0aH 1 │ │ doba rozběhu motoru v osminách sekundy
└───┘
Disk INT 13 Přerušení BIOSu
Tabulka parametrů harddisku
Tato 16-bytová struktura se nalézá na vektorové adrese INT 41H (4-bytová adresa
na 0:0104). Parametry pro druhý hard disk (je-li přítomen) se nacházejí na
vektoru pro INT 46H. Tyto tabulky popisují řadu důležitých proměnných pro čin-
nost mechaniky hard disku.
XT Přepínače na desce řadiče určují jeden ze čtyř typů drive pro každý hard
disk. Během bootu nastaví BIOS INT 41H a INT 46H tak, jak je to těmito
přepínači určeno.
▌AT▐ Vektory INT 41H a INT 46H se nastaví v závislosti na hodnotě "Typ hard
disku", což je proměnná v paměti CMOS , uložená programem Setup.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 2 │ │ maximální počet cylindrů
├───┼───┘
+2 1 │ │ maximální počet hlav
├───┴───┐
+3 2 │ │ počáteční cylindr sníženého zápisového proudu
├───┴───┤
+5 2 │ │ cylindr, od kterého začíná zápisová prekompenzace
├───┼───┘
+7 1 │ │ maximální délka dat pro opravu chyb ECC
├───┤ ╔═ bit 7: zakaž opak.pokusů přístupu
+8 1 │ │ drive step options ◄═╣ bit 6: zakaž opak.pokusů ECC
├───┤ ╚═ bits 2-0: drive option
+9 1 │ │ standardní hodnota timeoutu
├───┤
+0aH 1 │ │ hodnota timeoutu pro formátování
├───┤
+0bH 1 │ │ hodnota timeoutu pro řízení
├───┴───┬───────┐
+0cH 4 │ │ │ (rezervováno)
└───┴───┴───┴───┘
Disk INT 13 Přerušení BIOSu
Tabulka parametrů harddisku
Tato 16-bytová struktura se nalézá na vektorové adrese INT 41H (4-bytová adresa
na 0:0104). Parametry pro druhý hard disk (je-li přítomen) se nacházejí na
vektoru pro INT 46H. Tyto tabulky popisují řadu důležitých proměnných pro čin-
nost mechaniky hard disku.
XT Přepínače na desce řadiče určují jeden ze čtyř typů drive pro každý hard
disk. Během bootu nastaví BIOS INT 41H a INT 46H tak, jak je to těmito
přepínači určeno.
▌AT▐ Vektory INT 41H a INT 46H se nastaví v závislosti na hodnotě "Typ hard
disku", což je proměnná v paměti CMOS , uložená programem Setup.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 2 │ │ maximální počet cylindrů
├───┼───┘
+2 1 │ │ maximální počet hlav
├───┴───┐
+3 2 │ │ počáteční cylindr sníženého zápisového proudu
├───┴───┤
+5 2 │ │ cylindr, od kterého začíná zápisová prekompenzace
├───┼───┘
+7 1 │ │ maximální délka dat pro opravu chyb ECC
├───┤ ╔═ bit 7: zakaž opak.pokusů přístupu
+8 1 │ │ drive step options ◄═╣ bit 6: zakaž opak.pokusů ECC
├───┤ ╚═ bits 2-0: drive option
+9 1 │ │ standardní hodnota timeoutu
├───┤
+0aH 1 │ │ hodnota timeoutu pro formátování
├───┤
+0bH 1 │ │ hodnota timeoutu pro řízení
├───┴───┬───────┐
+0cH 4 │ │ │ (rezervováno)
└───┴───┴───┴───┘
Disk INT 13 Přerušení BIOSu
Konfigurace systému - INT 11
Po zavolání této služby systém vrátí v AX konfiguraci systému. Je to totéž
jako hodnota na 0000:0410.
Význam bitů v AX :
15 14 13 12 11 9 8 7 6 5 4 3 2 1 0
┌─────┬───┬───┬─────┬───┬┬─────┬─────┬─────┬─────┬───┐
│ LPT │ T │ J │ COM │ D ││ DRV │ VID │ RAM │ FPU │ 1 │
└─────┴───┴───┴─────┴───┴┴─────┴─────┴─────┴─────┴───┘
LPT - Počet podporovaných LPT (0-3)
T - Připojena sériová tiskárna PC Junior (0)
J - Joystick připojen
COM - Počet připojených COM (0-7)
D - DMA připojena (1)
DRV - Počet připojených diskových jednotek (AT 0,1,2)
VID - Primární video : 01 - barevný 40 sloupců
10 - barevný 80 sloupců
11 - Monochromatický
RAM - BASE RAM : 01 - 16 KB
10 - 32 KB
11 - 64 KB a víc (takže vždy)
FPU - Koprocesor (nespolehlivé, radši MSW)
Pozn. : není příliš spolehlivé, ani příliš užitečné.
Na 486 vyvoláno CPU při chybě zarovnání. Viz INT 11 .
Přerušení CPU Nové registry 286 CMOS
Velikost paměti BASE INT 12
Hodnota vrácená v AX udává velikost instalované BASE RAM. Je to totéž, jako
hodnota na 0000:0413. Téměř vždy 0280h = 640 KB. Je-li tam méně, znamená to
(většinou), že je 'nahoře' rezidentní virus. Sídlí tam i některé ochrany
instalované z MBR. Např. PS-Guard.
Velikost rozšířené paměti ( EMS a XMS ) nelze zjistit INT 12.
Pozn.: Služba není příliš užitečná. Je to Rezervované přerušení pro CPU.
Viz DOS Fn 48 XMS EMS VCPI DPMI
Přerušení CPU
Uživatelský časovač INT 1C
Toto přerušení je vyjoláno každých 55ms (standardně) jako pokračování
INT 08 - Viz Časovač INT 08 . Uvědomte si, že v době, kdy INT 1C dostane
řízení, není ještě resetován řadič přerušení, je tedy třeba provést :
Mov al,20h
Out 20h,al
Pak teprve přijdou na řadu další přerušení (klávesnice, myš ..).
Pro běžné aplikace je využití INT 1C poněkud čistší, než INT 08.
Tabulka znaků INT 1F
Int 1F ukazuje na tabulku znaků užívanou BIOSem pro výpis znaků v grafickém
režimu. Po restartu ukazuje 'nikam', je-li potřeba provést inicializaci,
použijte příkaz GRAFTABL. Spodních 128 znaků nejde změnit, na horních ukazuje
tento vektor.
Tabulka je lineární, každý znak je dlouuhý 8 byte. Jednotlivé BYTE představují
řádky, bity jsou řazeny zleva doprava. (Nejvyšší bit je nejvíc vlevo.)
Poznámka : Je vždy výhodnější připravit si vlastní rutinu pro výstup a na
BIOS se vyfláknout. Je to rychlejší a člověk má jistotu o tom,
co to dělá.
Přerušení BIOSu Video INT 10
Tabulka videoparametrů INT 1D
Na tuto tabulku ukazuje vektor přerušení INT 1dH (0:0074).
Používána je INT 10H podfcí 00H při změně videorežimu. Hodnoty této tabulky
popisují hodnoty registrů, které musí být vloženy do řadiče CRT 6845 spolu s
ostatními daty (jako je počet sloupců atd.) proměnných obrazovky uložených v
poli dat BIOSu počínaje adresou 0000:0449.
Můžete nastavit vektor INT 1DH na vaši vlastní tabulku TSR. Další změna režimu
přes INT 10H potom bude používat hodnoty z vaší tabulky.
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌── ─ ─ ─ ─ ─ ─ ─ ──┐
+0 10H │ │ hodnoty reg. 6845 (viz dále) pro režimy 40x25
├── ┴ ─ ┴ ─ ┴ ─ ┴ ──┤
+10H 10H │ │ hodnoty reg. 6845 pro režimy 80x25
├─ ─┴ ─ ┴ ─ ┴ ─ ┴ ──┤
+20H 10H │ │ hodnoty reg. 6845 pro grafické režimy
├── ┴ ─ ┴ ─ ┴ ─ ┴ ──┤
+30H 10H │ │ hodnoty reg. 6845 pro monochr. kartu 80x25
├───┴───┼ ─ ┴ ─ ┴ ──┘
+40H 2 │ │ velikost RAM jedné stránky (režimy 40x25)
├───┴───┤
+42H 2 │ │ velikost RAM jedné stránky (režimy 80x25)
├───┴───┤
+44H 2 │ │ velikost regenerace grafických režimů s nízkým
├───┴───┤ stupněm rozlišení
+46H 2 │ │ velikost regenerace grafických režimů s vysokým
├───┼───┼───┬───┬───┬───┬───┬───┐ stupněm rozlišení
+48H 8 │ │ │ │ │ │ │ │ │ počet sloupců každého z 8mi režimů
├───┼───┼───┼───┼───┼───┼───┼───┤
+50H 8 │ hodnoty pro registr nastavení módu (port 3d8H) pro každý mód.
└───┴───┴───┴───┴───┴───┴───┴───┘ Běžná hodnota je uložena na 0:0465
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Prvních 40H bytů tabulky se skládá ze čtyř 16-bytových tabulek, které obsahují
množinu 1-bytových hodnot každého registru řadiče CRT 6845 v jejich sekvenčním
pořadí (R0...R15):
R0: celkem horizontálně znaků (včetně syncu)
R1: horizontálně zobrazených znaků
R2: pozice horizontálního syncu-lze posouvat displej doleva/doprava
R3: šířka horiz.a vert.synců (po 4 bitech) ve znacích
R4: celkem vertikálně znakových řádků
R5: vertikální jemná korekce (skanové řádky)
R6: vertikálně zobrazeno znakových řádků
R7: pozice vertikálního syncu-lze posouvat nahoru/dolů
R8: mód prokládání (bity 4 a 5) a posunutí (bity 6 a 7)
R9: max. adresa skanovacího řádku──počet skanovacích řádků na znakový řádek
R10: začátek kurzoru──počáteční skanovací řádek kurzoru
R11: konec kurzoru──poslední skanovací řádek kurzoru
R12: počáteční relativní adresa video paměti (vyšší byte)
R13: (lze využít k rychlému scrollování) (nižší byte)
R14: adresa kurzoru (vyšší byte) ... tyto dva porty lze i číst
R15: (nižší byte)
Registry 16-17 nejsou v tabulce zahrnuty, ale pro úplnost:
R16: adresa světelného pera (vyšší byte)
R17: (nižší byte)
Video INT 10 Přerušení BIOSu
Budík INT 4A
Jedná se o ukazatel na obslužnou rutinu, která může zpracovávat alarm.
Je volaná z IRQ č.8 ( INT 70 ), pokud je povolen službou č.6
Časovač INT 1A . Standardní obsluha ukazuje na IRET. Taktéž obslužná
rutina by měla končit IRETem.
IRQ 8 - Hodiny reálného času
Dostupné jen na AT a na PS/2. Je voláno 1024 krát za sekundu. Snižuje DWORD
počítadlo každých 976µ sec (1/1024). Dosáhne-li 0 a je-li nastaven příznak
volání Alarmu, provede Budík INT 4A . Není dostupné na PS/2 model 30.
Časovač INT 1A provádí obsluhu a nastavování parametrů.
INT 1A - Nastavení Času a Alarmu
Funkce je určena hodnotou v AH.
Funkce 0 - Čti sysémový čas.
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 00
Výstup : AL - Režim 12/24 hodin (1=24)
CX - horní word čítače
DX - spodní word čítače
Zvětšuje se 18.206 za sekundu. V půlnoci je CX:DX nula. CX je přibližně
počet hodin.
Funkce 1 - Nastav sysémový čas.
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 01
CX - horní word čítače
DX - spodní word čítače
Výstup : nic
CX:DX by měl být nastaven na počet sekund od půlnoci násobeno asi 18.206.
Funkce 2 - Čti reálný čas.
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 02
Výstup : CF = 0 OK 1 = chyba
CH = hodiny v BCD
CL = minuty v BCD
DH = sekundy v BCD
DL = 1 pro letní čas
AT s BIOSem před 10.6.85 nevrací DL
Funkce 3 - Nastav reálný čas.
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 03
CH = hodiny v BCD
CL = minuty v BCD
DH = sekundy v BCD
DL = 1 pro letní čas
0 pro zimní čas
Výstup : nic
Hodnoty v BCD.
Funkce 4 - Čti reálné datum.
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 04
Výstup : CH = Století v BCD (19, 20)
CL = rok v BCD (94)
DH = měsíc v BCD (0-Leden atd.)
DL = den v BCD (1-Neděle atd.)
CF = 0 OK 1 chyba
Funkce 5 - Nastav reálné datum.
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 05
CH = Století v BCD (19, 20)
CL = rok v BCD (94)
DH = měsíc v BCD (0-Leden atd.)
DL = den v BCD (1-Neděle atd.)
Výstup : nic
Funkce 6 - Nastav budík.
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 06
CH = hodiny v BCD
CL = minuty v BCD
DH = sekundy v BCD
Výstup : CF = 1 alarm už nastaven někým jiným, nebo nefunkční
CF = 0 OK
Je-li OK, pak se v zadaný čas provede Budík INT 4A .
Po provedení by měla být volána služba 07.
Funkce 7 - Zruš budík.
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 07
Výstup : nic
Zruší budík nastavený fcí 06.
Funkce 8 - Nastav čas v CMOS
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 08
CH = hodiny v BCD
CL = minuty v BCD
DH = sekundy v BCD
Výstup : nic
Funkce 9 - Čti čas v CMOS
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 09
Výstup : CH = hodiny v BCD
CL = minuty v BCD
DH = sekundy v BCD
DL = alarm mód:
= 00 alarm nedovolen CMOS
= 01 alarm dovolen CMOS , ale nenastaven
= 02 alarm povolen a nastaven
Funkce 0A - Čti počet dní
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 0A
Výstup : CX = počet dní od 1.1.1980
Funkce 0B - Nastav počet dní
────────────────────────────────────────────────────────────────────────────
Vstup : AH = 0A
CX = počet dní od 1.1.1980
Funkce 80 - Sound multiplex
────────────────────────────────────────────────────────────────────────────
Vynechávám. Jen PC Junior. Nebude Vám chybět.
Přerušení BIOSu
Ctrl+Break INT 1B
Tento vektor provede BIOS, pokud zjistí stisk Ctrl+Break. Po startu je nastaven
na IRET. DOS jej přesměruje do své obslužné rutiny, aby snáze zjistil přerušení
uživatelem. Pokud INT 1B přesměrujete na sebe, DOS nebude mít ani páru o stavu
Ctrl+Break. Je však snazší použít INT 23 , neboť DOS sám zajišťuje nastavení
zpět na původní hodnotu po ukončení programu ( PSP ).
Přerušení BIOSu
BOOT INT 19
Int 19 provede teplý start systému. Vynechá test paměti (někdy) a přistoupí
rovnou k natažení BOOT sektoru. Je-li systém zhroucen po stránce DOSu, je to
rychlejší než JMP FAR F000:FFF0. Viz BOOT .
Pozn.: Segment uvedený v adrese INT 19 se používal pro tzv. Bottom-up
alokaci Extended paměti. Byl-li na offsetu 12h segmentu INT 19h nápis
VDISK V, pak na offsetu 2Ch téhož segmentu byla Lineární adresa
1. volného byte v Extended RAM. Tento systém alokace se ale dnes
nevyužívá. Viz též XMS , EMS , VCPI a DPMI .
Např.: Xor ax,ax
Mov es,ax
Les di,es:[19h*4]
Mov di,12h
; test es:di na 'VDISK V'
;je-li ok (chacha)
Mov eax, dword ptr es:[2ch] ; eax lin adr 1. volného byte
Zapomeňte, že něco takového taky existuje.
Přerušení BIOSu
ROM Basic INT 18
Po provedení INT 18 se na originálním IBM PC (kdoví ze kdy) spustil
interpret BASICu. Postupem času se od toho upustilo, a tak se začal s DOSem
dodávat GWBasic a QBasic. Nebylo to k ničemu, ale mohlo to suplovat alespoň
něco, pokud se nespustil OS. (Pak se automaticky spouštěl INT 18.)
Přerušení BIOSu
INT 13H: Diskové I/O
Tato služba se používá k přímému přístupu na řadič disket nebo hard disku.
Tam, kde je to možné, je vhodné použít funkci DOSu INT 25 a INT 26 a nechat
DOSovské drivery zařízení udělat veškerou práci nejnižší úrovně. Samozřejmě na
formátování disku nebo instalaci/podporu zákazu kopírování je asi INT 13H
jedinou možností. Viz též: I/O porty .
(podfunkce nad 8 jsou pouze pro hard disk)
podfunkce: 00H resetuj řadič 08H vrať par. drive 10H test připr. drive
01H vrať stav 09H inic. tab. param. 11H rekalibruj drive
02H čti sektory 0aH čti dlouhý formát 14H diagnostika řadiče
03H piš sektory 0bH piš dlouhý formát 15H vrať typ disku
04H kontroluj sektory 0cH vystav cylinder 16H změň stav disku
05H formátuj stopu 0dH reset alt. disku 17H nastav stav disku
AH Služba
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H resetuj drive. Rekalibruje řadič disku.
Je-li DL 80H nebo 81H, resetuje se řadič hard disku, jinak pružného disku
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
01H vrať chybový stav poslední operace.
Vstup : DL = drive. DL < 80H = disketa; DL > 7FH = hard disk
Výstup: AL obsahuje kód diskové chyby. Je to totéž, jako hodnota na 0000:0441
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
02H čti sektor(y)
Vstup : DL = číslo drive (0=drive A...; 80H=hard disk 0; 81H=hard disk 1)
DH = číslo hlavy
CH = číslo stopy (cylindru) (0-n) ◄═╗
CL = číslo sektoru (1-n) ◄═══════════╩══ Viz pozn. níže.
AL = počet sektorů (hodnota pro jeden cylinder)
ES:BX => adresa bufferu volajícího programu
Parametry diskety INT 1E => Tabulka parametrů pružného disku
(pro disketové operace)
Parametry HD 1. INT 41 => Tabulka parametrů hard disku
(pro operace hard disku)
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH.
Jinak buffer na ES:BX obsahuje data přečtená z disku.
Pozn.: Hodnoty sektoru a cylindru jsou 6ti bitové a 10-bitové:
1 1 1 1 1 1
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
CX: ║c c c c c c c c C c S s s s s s║
╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜
╚═╩═══► použito jako nejvyšší bity čísla cyl
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
03H piš sektor(y)
Vstup : DL = číslo drive (0=drive A...; 80H=hard disk 0; 81H=hard disk 1)
DH = číslo hlavy
CH = číslo stopy (cylindru) (0-n) ◄═╗
CL = číslo sektoru (1-n) ◄═══════════╩══ Viz pozn. níže.
AL = počet sektorů (hodnota pro jeden cylinder)
ES:BX => adresa bufferu volajícího programu
Parametry diskety INT 1E => Tabulka parametrů pružného disku
(pro disketové operace)
Parametry HD 1. INT 41 => Tabulka parametrů hard disku
(pro operace hard disku)
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH.
Jinak buffer na ES:BX byl zapsán na disk.
Pozn.: Hodnoty sektoru a cylindru jsou 6ti bitové a 10-bitové:
1 1 1 1 1 1
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
CX: ║c c c c c c c c C c S s s s s s║
╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜
╚═╩═══► použito jako nejvyšší bity čísla cyl.
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
04H kontroluj sektory. Hlídá CRC vybraných sektorů.
Vstup : (jako u podfunkce 02H. ES:BX není nutný, ale nejlepší je jej použít)
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
05H formátuj stopu. Formátování na nejnižší úrovni. Ničí případná data.
Vstup : DL,DH,CH = drive,hlava,stopa (viz podfunkci 02H)
AL = počet sektorů na stopu. (pro 0 přeteče DMA) (AT HDD, FDD)
ES:BX => deskriptory sektorů (požaduje 512-bytový zásobník)
diskety: 4 byty 'CHSV' (Cylinder, Hlava, Sektor, Velikost)
pro každý sektor stopy (např. 36 bytů pro 9ti sektorovou
disketu). Čísla sektorů jdou v sekvenčním pořadí.
'V' je kód velikosti sektoru: 0=128; 1=256; 2=512; 3=1024
AT Hard disk: dva byte 'VS' (Příznak, Sektor) pro každý sektor stopy.
Sekvence polí 'N' určuje tzv. prokládací faktor (inter-
leave), tedy počet otáček média, za který se přečte celá
stopa.
XT Hard disk: ES:BX není použit. Namísto toho je v AL uložena hodnota
prokládání 1 až 16 (10H).
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH
(hard disk: pole 'V' se pro indikaci vadného sektoru nastaví na 80H
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
08H Vrať parametry drive. Vrací užitečné informace o drive.
Vstup : DL = drive
Výstup: DL = počet hard disků prvního řadiče
DH = maximální počet hlav
CH = maximální hodnota cylindru (spodních 8 bitů)
CL = maximální hodnota sektoru (a horní bity pro cylinder)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
09H Inicializuj tabulku parametrů drive. Dává BIOSu informaci o změnách
tabulek parametrů drive.
Vstup : (AT) Vektory pro Parametry HD 1. INT 41 a Parametry HD 2. INT 46
ukazující na Tabulku parametrů hard disku pro drive 0 a 1.
Pozn.: (XT) pracuje se dvěma drive, ale oba musí použít parametry na INT 40H
(AT) používá INT 40h pří zpracovávání INT 13.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0aH Dlouhé čtení. Čte 512 bytů + 4-bytové ECC (kód opravy chyby).
Vstup : (jako podfce 02H)
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH
ES:BX => buf. obsahuje (data sektoru + 4 byty) * počet sektorů (v AL)
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0bH Dlouhý zápis. Zapíše 512 bytů + 4-byty ECC.
Vstup : (jako podfce 02H)
ES:BX => buf. obsahující data sektoru + 4 byty na sektor
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0cH Vystav cylinder. Vystaví hlavu přímo na stopu.
Vstup : DL,DH,CH = drive,hlava,stopa (viz podfunkce 02H)
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0dH Resetuj alternativní disk
Vstup: DL = drive
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0eH Čti buffer sektoru
Vstup : (jako podfce 02H)
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0fH Zapiš buffer sektoru
Vstup : (jako podfce 02H)
Výstup: Při výskytu diskové chyby se postaví CF=1, její kód bude v AH
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
10H Test na připravenost drive
Vstup : DL = drive
Výstup: kód Diskové chyby (stav) v AH.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
11H Rekalibruje drive
Vstup : DL = drive
Výstup: kód Diskové chyby (stav) v AH.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
12H Diagnostika paměti RAM řadiče.
Výstup: kód Diskové chyby (stav) v AH.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
13H Diagnostika drive
Výstup: kód Diskové chyby (stav) v AH.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
14H Vnitřní diagnostika řadiče
Výstup: kód Diskové chyby (stav) v AH.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
15H Čti typ disku (nepracuje s u PC/XT s BIOSem do roku 1986)
Vstup : DL = drive
Výstup: AH = kód drive:
0 = drive DL neexistuje
1 = disketa; nemá indikaci výměny disku
2 = disketa; má indikaci výměny média (většina případů)
3 = hard disk
CX:DX jestliže AH <> 0, počet sektorů média ( DWORD )
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
16H Čti příznak výměny disku
Výstup: AH = kód stavu:
0 = nebyla výměna
6 = aktivní příznak výměny (někdo otevřel dvířka mechaniky)
DL = číslo drive, o který se jedná
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
17H Nastav typ diskety (použijte před formátováním)
Vstup : DL = číslo drive diskety (0 nebo 1)
AL = typ diskového média
00 = nepoužito
01 = 360K disketa v 360K drive
02 = 360K disketa v 1.2M drive
03 = 1.2M disketa v 1.2M drive
04 = 720K disketa v 720K drive
05: 720KB disk v 1.44MB mechanice
06: 1.44MB disk v 1.44MB mechanice
Výstup: AH = kód chyby disku, je-li CF=1
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
18H Nastav typ média pro formátování (jen hard disk)
Požaduje: AH = 18H
DL = disk
CH = dolních 8 bitů počtu stop
CL = bity 6-7: horní dva bity počtu stop
bity 0-5: počet sektorů
Výstup: AH = kód chyby disku, je-li CF nastaven na 1
AH = 00H: kombinace je podporována
01H: funkce není implementována
0CH: nepodporováno nebo neznámý typ disku
80H: žádný disk v mechanice
ES:DI => 11-bytová tabulka parametrů
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
19H Zaparkuj hlavy (jen hard disk)
Požaduje: AH = 19H
DL = disk
Výstup: AH = kód chyby disku, je-li CF nastaven na 1
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1AH ESDI disk - formátuj jednotku
Požaduje: AH = 1AH
DL = disk
AL = počet tabulek chyb
CL = modifikace formátu:
bit 0: ignoruj primární tabulku chyb
bit 1: ignoruj sekundární tabulku chyb
bit 2: modifikuj sekundární tabulku chyb
bit 3: dělej analýzu povrchů
bit 4: generuj periodické přerušení INT 15H
AH = 0FH po každém zformátovaném cylindru
ES:BX => tabulky chyb
Výstup: AH = kód chyby disku, je-li CF nastaven na 1
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1BH ESDI disk - dej hlavičku z výroby
Požaduje: AH = 1BH
DL = disk
ES:BX => tabulky chyb (hlavička z výroby)
Výstup: AH = kód chyby disku, je-li CF nastaven na 1
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1C0AH ESDI disk - dej konfiguraci zařízení
Požaduje: AH = 1CH
AL = 0AH
DL = disk
ES:BX => buffer
Výstup: AH = kód chyby disku, je-li CF nastaven na 1
ES:BX => ???
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1C0BH ESDI disk - dej konfiguraci řadiče
Požaduje: AH = 1CH
AL = 0BH
ES:BX => buffer
Výstup: AH = kód chyby disku, je-li CF nastaven na 1
ES:BX => ???
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1C0CH ESDI disk - dej informaci o POS
Požaduje: AH = 1CH
AL = 0CH
Výstup: AH = kód chyby disku, je-li CF nastaven na 1
ES:BX => POS informace
Diskové chyby
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1C0EH ESDI disk - transformuj RBA na ABA
Požaduje: AH = 1CH
AL = 0EH
DH = číslo povrchu (hlavy)
DL = disk
CH = dolních 8 bitů počtu stop
CL = bity 6-7: horní dva bity počtu stop
bity 0-5: počet sektorů
ES:BX => adresa absolutního bloku (ABA)
Výstup: AH = kód chyby disku, je-li CF nastaven na 1
Diskové chyby
Přerušení BIOSu INT 26 INT 25 Přerušení DOSu
Tento kód vrací INT 13H, je-li CF nastaven (CF=1), tj. funkce
skončila chybou a kód této chyby je v AH.
Číslo Popis chyby
▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
00H bez chyby
01H špatný příkaz: nesprávný požadavek na řadič
02H chybná adresová značka
03H pokus o zápis na write-protected disk
04H sektor nenalezen
05H chyba resetu (hard disk)
06H disketa byla vyměněna (Nemusí to být chyba v pravém slova smyslu)
07H chybný parametr (hard disk)
08H chyba DMA (overrun) (disketa)
09H přetečení DMA přes 64 KB
0AH detekován chybný sektor (hard disk)
0BH detekována špatná stopa (hard disk)
0CH nepodporovaná stopa
0DH chybný počet sektorů při formátování (hard disk)
0EH detekována adresová značka kontolních dat (hard disk)
0FH chyba rozhodování DMA (hard disk)
10H špatný CRC/ECC
11H data opravena pomocí ECC (hard disk)
20H chyba řadiče
40H chybný seek
80H timeout
AAH disk není připraven (hard disk)
BBH nedefinovaná chyba (hard disk)
CCH chyba zápisu (hard disk)
E0H chyba stavového registru (hard disk)
FFH chybný význam operace (hard disk)
Viz též: Přerušení BIOSu Disk INT 13
Funkce DOSu
INT 14H: Sériová komunikace
Tyto funkce pracují se dvěma porty RS-232 a jsou podporovány BIOSem.
Bázové adresy všech čtyř sérivých portů jsou uloženy od 0:0400, ale BIOS při
POST testuje a inicializuje pouze první dva sériové porty. S dalšími sér.
porty jsou problémy (kam je fláknout do I/O prostoru), a tak se na PC setkáme
(99%) jen se dvěma COMy. (Když noha bolí, tak ji rovnou uřízneme.)
Tyto funkce si je většina programátorů nucena napsat vlastní, protože
nepoužívají přerušení a tudíž lehce dochází ke ztrátám přijímaných znaků.
Docela dobře ale jdou použít pro komunikaci s Plotterem. (Málo znaků)
Viz též I/O porty .
AH Služba
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H inicializuj komunikační port
Vstup: DX = číslo portu (0-1)
AL = bitová pole parametrů inicializace
┌─7─┬─6─┬─5─┬─4─┬─3─┬─2─┬─1─┬─0─┐
│ přen rych │parita │stp│ délka │
└───┴───┴───┴───┴───┴─╥─┴───┴───┘
╚════╦════╝ ╚═╦═╝ ║ ╚═══╩══► délka slova
║ ║ ║ 10=7 bitů; 11=8 bitů
║ ║ ╚══════════► stop bity 0=1; 1=2;
║ ╚════════════════► kód parity
║ x0=žádná; 01=lichá; 11=sudá
╚══════════════════════════► rychlost přenosu 000=110; 100=1200
001=150; 101=2400
(baudů) 010=300; 110=4800
011=600; 111=9600
Výstup: AH = stav (viz dále)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
01H pošle znak na vybraný port RS-232
Vstup : DX = číslo portu (0-1)
AL = vysílaný znak
Výstup: AL je rezervován
Je-li nastaven bit 7 AH, vyskytla se chyba a pak v AH (bity 6-0) je
stav komunikační linky (viz AH dále)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
02H přijmi znak z vybraného portu RS-232
Vstup : DX = číslo portu (0-1)
Výstup: AL obsahuje přijatý znak
AH je nenulový, došlo-li k chybě
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
03H vrať stav komunikačního portu
Vstup : DX = číslo portu (0-1)
Výstup: AX = stav komunikačního portu
AH = stav řídící linky
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
bit 7: timeout
bit 6: vysílací registr prázdný
bit 5: přípravný vysílací registr prázdný
bit 4: zjištěn break (trvalá 0)
bit 3: chyba rámce (špatný stopbit)
bit 2: chyba parity
bit 1: overrun error
bit 0: připravenost dat
AL = stav modemu
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
bit 7:
bit 6: indikátor vyzvánění (ring indicator)
bit 5: Data Set Ready (DSR)
bit 4: Clear To Send
bit 3: Změna Data Carrier Detect (DCD)
bit 2: Vzestupná hrana signálu vyzvánění
bit 1: Změna signálu Data Set Ready (DSR)
bit 0: Změna signálu Clear To Send (CTS)
04H PS/2, Conv - rozšířená inicializace
Požaduje: AH = 04H
AL = break status: 0: break, 1: potlačen
BH = parita: 0: žádná
1: lichá
2: sudá
3: stick lichá
4: stick sudá
BL = počet stop bitů: 0: jeden, 1: dva
CH = délka slova: 0: 5 bitů
1: 6 bitů
2: 7 bitů
3: 8 bitů
CL = rychlost (baudy): 0: 110
1: 150
2: 300
3: 600
4: 1200
5: 2400
6: 4800
7: 9600
8: 19200
DX = číslo portu (0.. )
Výstup: AX = status portu (viz výše)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
04H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Inicializace řídícího programu
Požaduje: AH = 04H
DX = číslo portu (0.. )
Výstup: AX = status portu (1954H = O.K.) (viz výše)
BL = číslo nejvyšší podporované funkce (vyjma 7EH a výše)
BH = verze FOSSIL
Je podporováno DTR.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
05H PS/2, Conv - rozšířená obsluha portů
Požaduje: AH = 05H
AL = 0: dej registry modemu
Výstup:AH = status
BL = registry modemu (viz níže)
1: zapiš registry modemu
BL = registry modemu:
bit 0: DTR
bit 1: RTS
bit 2: OUT1
bit 3: OUT2
bit 4: LOOPBACK
bit 5-7: rezervováno
DX = číslo portu (0.. )
Výstup: AX = status portu (viz výše)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
05H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Deinicializace řídícího programu
Požaduje: AH = 05H
DX = číslo portu (0.. )
Výstup: žádný
Není podporováno DTR.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
06H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Zvedni/Shoď DTR
Požaduje: AH = 06H
DX = číslo portu (0.. )
AL = status (0 = shoď, 1 = nastav)
Výstup: AX = status portu (1954H = O.K.) (viz výše)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
07H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Dej parametry časovače
Požaduje: AH = 07H
Výstup: AL = číslo přerušení timeru
AH = počet tiků za vteřinu
DX = počet milisekund na 1 tik
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
08H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Vyprázdni výstupní buffer dokuď není výstup prázdný
Požaduje: AH = 08H
DX = číslo portu (0.. )
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
09H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Vyčisti výstupní buffery pro všechny aktuální výstupy
Požaduje: AH = 09H
DX = číslo portu (0.. )
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0AH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Vyčisti vstupní buffery pro všechny aktuální vstupy
Požaduje: AH = 0AH
DX = číslo portu (0.. )
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0BH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Výstup bez čekání
Požaduje: AH = 0BH
AL = znak
DX = číslo portu (0.. )
Výstup: AX = 0000H: znak akceptován
0001H: znak neakceptován
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0CH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Nedestruktivní čtení
Požaduje: AH = 0CH
AL = znak
DX = číslo portu (0.. )
Výstup: AX = 0FFFFH: znak není na vstupu
00xxH: znak xx je na vstupu
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0DH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Čtení klávesnice bez čekání
Požaduje: AH = 0DH
Výstup: AX = 0FFFFH: znak není na vstupu
xxxxH: standardní scan kódy IBM
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0EH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Čtení klávesnice s čekáním
Požaduje: AH = 0EH
Výstup: AX = xxxxH: standardní scan kódy IBM
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0FH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Povol/Zakaž průběžnou kontrolu
Požaduje: AH = 0FH
AL = bitová maska:
bit 0: Xon/Xoff na vysílání
bit 1: CTS/RTS
bit 2: rezervován
bit 3: Xon/Xoff na příjmu
bity 4-7: = 1
DX = číslo portu (0.. )
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
10H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Rozšířený test Ctrl-C/Ctrl-K a vysílání
Požaduje: AH = 10H
AL = bitová maska:
bit 0: zakaž/povol test Ctrl-C/Ctrl-K
bit 1: zakaž/povol vysílání
DX = číslo portu (0.. )
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
11H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Nastav pozici kurzoru
Požaduje: AH = 11H
DH = řádka
DL = sloupec
Poznámka: Funkce je totožná s INT 10H / AH = 02H
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
12H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Dej pozici kurzoru
Požaduje: AH = 12H
Výstup: DH = řádka
DL = sloupec
Poznámka: Funkce je totožná s INT 10H / AH = 03H
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
13H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Zapiš na obrazovku jeden ANSI znak
Požaduje: AH = 13H
AL = znak
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
14H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Zakaž/Povol proces hlídání
Požaduje: AH = 14H
AL = 0: povol, 1: zakaž
DX = číslo portu (0.. )
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
15H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Zapiš na obrazovku jeden znak pomocí funkce ROM-BIOS
Požaduje: AH = 15H
AL = znak
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
16H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Vlož/Přidej funkci do fronty na časovači
Požaduje: AH = 16H
AL = 0: smaž, 1: přidej
ES:DX => volaná rutina
Výstup: AX = 0000H: uspěšné provedení
0001H: neuspěšné provedení
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
17H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Boot systému
Požaduje: AH = 16H
AL = metoda: 0: studený start, 1: teplý start
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
18H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Čti blok
Požaduje: AH = 18H
DX = číslo portu (0.. )
CX = maximální počet znaků
ES:DI => buffer
Výstup: AX = počet načtených znaků
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
19H FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Zapiš blok
Požaduje: AH = 19H
DX = číslo portu (0.. )
CX = maximální počet znaků
ES:DI => buffer
Výstup: AX = počet vyslaných znaků
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1AH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Začátek nebo konec vysílání "break"
Požaduje: AH = 1AH
AL = 0: konec, 1: začni vysílat
DX = číslo portu (0.. )
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1BH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Dej informace o řídícím programu
Požaduje: AH = 1BH
DX = číslo portu (0.. )
CX = velikost bufferu
ES:DI => buffer
Výstup: AX = počet přenesených znaků v bufferu
Poznámka: Formát informací v bufferu:
velikost význam
▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
word velikost struktury v bytech
byte číslo standardu (verze) FOSSIL aktivního řídícího
programu
byte úroveň revize (minoritní číslo verze)
dword pointer na identifikační ASCII řetězec
word velikost vstupního bufferu
word počet bytů v bufferu
word velikost výstupního bufferu
word počet bytů v bufferu
byte šířka obrazovky
byte délka obrazovky
byte aktuální přenosová rychlost (počítač «-» modem)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
7EH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Instaluj externí funkci
Požaduje: AH = 7EH
AL = kód přiřazený externí aplikaci
ES:DX => vstupní bod funkce
Výstup: AX = 1954H: O.K.
BL = kód přiřazený aplikaci (jako AL na vstupu)
DH = 0: chyba instalace, 1: O.K.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
7FH FOSSIL (Fido/Opus/Seadog Standard Interface Level)
Odinstaluj externí funkci
Požaduje: AH = 7EH
AL = kód přiřazený externí aplikaci
ES:DX => vstupní bod funkce
Výstup: AX = 1954H: O.K.
BL = kód přiřazený aplikaci (jako AL na vstupu)
DH = 0: chyba odinstalace, 1: O.K.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Přerušení BIOSu Řídící kódy modemu Funkce DOSu
I/O porty HPGL Sériové porty Kabely
INT 16H: Služby klávesnice
Tato služba pomáhá obsluhovat klávesnici na aplikační úrovni. Klávesy jsou
ošetřovány nazávisle na aplikaci. Při stisku klávesy se provede její zpracování
pomocí Klávesnice INT 09 a zařadí se do kruhové fronty.
Viz Klávesnice AT pro informace o zrychlení její obsluhy a dalších hardwaro-
vých informací.
AH Služba
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H čti (čekej na) další klávesu
Výstup: AL = znak ASCII (je-li AL=0, AH je rozšířená klávesa ASCII)
AH = Scan-kód pro rozšířené kódy kláves Viz Scan-kódy klávesnice
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
01H Zjisti stisknutou klávesu (a zobraz ji)
Výstup: ZF = ZR = 1 není-li stisknuta žádná klávesa
ZF = NZ = 0 je-li nějaká stisknuta
AX se nastaví jako u podfunkce 00H (ale klávesa se
nevyřazuje z fronty).
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
02H Čti stav shiftových kláves. Určuje aktivní shiftové klávesy, jako např
Shift, NumLock atd.
Výstup: AL = klávesa shiftu a stav zámků (locků) - viz Příznaky klávesnice
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
03H Nastav rychlost opakování kláves
Vstup: AL=0 navrať implicitní stav klávesnice
1 zvětši počáteční prodlevu
2 zpomal rychlost opakování na 1/2
3 proveď podslužby 1 a 2
4 vypnutí automatického opakování
5 nastav rychlost a zpoždění automatického opakování
BL rychlost
BH zpoždění
BL znaků za sekundu BH zpoždění (ms)
00H 30.0 0 250
08H 15.0 1 500
10H 7.5 2 750
18H 3.7 3 1000
1Fh 2.0
Ostatní hodnoty BL se dají zjistit interpolací.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
04H Zapni/vypni pípání klávesnice (jen PCjr a Convertible)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
05H Zápis do bufferu klávesnice (jen AT po roce 1985). Vloží znak a scan-kód
do bufferu klávesnice tak, že jako by byla stisknuta klávesa.
Vstup : CH scan-kód
CL ASCII kód
Výstup: AL 00H operace proběhla úspěšně
AL 01H buffer je již plný Viz Scan-kódy klávesnice
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
10H Čtení rozšířené klávesnice. Vrátí další znak z bufferu klávesnice. Pokud
v bufferu není žádný znak, čeká na stisknutí další klávesy. Účelem této
služby je podpora rozšířené 101/102 tlačítkové klávesnice.
Výstup: AL ASCII kód
AH scan-kód
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
11H Status rozšířené klávesnice. Kontroluje, zda je další znak přítomen
v bufferu klávesnice.
Výstup: Zero - 0 znak je připraven
1 znak není připraven
AX - je-li znak k dispozici, jeho hodnota jako u služby 10H
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
12H Dej status přepínacích kláves (101-klávesová klávesnice)
Požaduje: AH = 12H
Vrací: AX = status klávesnice
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
F0H Compaq 386 - Nastav rychlost CPU
Požaduje: AH = F0H
AL = rychlost:
00H: 6 MHz (COMMON)
01H: 8 MHz (FAST)
02H: 16 MHz (FULL)
03H: automatické přepínání mezi 8 MHz a rychlostí
systémové desky (AUTO a HIGH)
08H: plných 16 MHz, ale 8 MHz pro disketové operace
09H: specifická rychlost:
CX = 1 až 50 (3 ≈ 8086)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
F1H Compaq 386 - Dej aktuální rychlost CPU
Požaduje: AH = F1H
Vrací: AL = rychlost (viz SubFn F0H)
pro AL = 9: CX = kód rychlosti
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
F2H Compaq 386 - Urči typ klávesnice
Požaduje: AH = F2H
Vrací: AL = 0: 11-bitová AT klávesnice, 1: 9-bitová PC
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
ASCII Přerušení BIOSu Funkce DOSu
Porty PPI I/O Porty
Scan-kódy klávesnice
Když si klávesnice vynutí přerušení hardware, předá manipulačnímu programu
přerušení scan kód. Manipulační program jej převede na hodnotu ASCII nebo
rozšířené ASCII. Pro kompatibilitu na rozličných klávesnicích je rozumné
se použití scan kódů vyhnout a držet se transformace stisknutí klávesy,
kterou poskytuje BIOS.
Původní klávesnice XT/AT Je-li klávesa uvolněna, pošle klávesnice
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ hodnotu, která je rovna hodnotě při stisknutí
OR 80H (např. [Ctrl] posílá 1DH, je-li stisknuta, a 9DH, je-li uvolněna).
╓────────────╥─────────────╥───────────────╥────────────────╥──────────────────╖
║Hex Dec Kl. ║Hex Dec Kl. ║Hex Dec Kláv. ║Hex Dec Kláv. ║Hex Dec Kláv. ║
╟────────────╫─────────────╫───────────────╫────────────────╫──────────────────╢
║01 1 Esc ║12 18 E ║23 35 H ║34 52 . > ║45 69 NumLock ║
║02 2 1 ! ║13 19 R ║24 36 J ║35 53 / ? ║46 70 ScrollLock║
║03 3 2 @ ║14 20 T ║25 37 K ║36 54 Shft(pr)║47 71 Home [7] ║
║04 4 3 # ║15 21 Y ║26 38 L ║37 55 * PrtSc ║48 72 ↑ [8] ║
║05 5 4 $ ║16 22 U ║27 39 ; : ║38 56 Alt ║49 73 PgUp [9] ║
║06 6 5 % ║17 23 I ║28 40 " ' ║39 57 Mezerník║4A 74 K - ║
║07 7 6 ^ ║18 24 O ║29 41 `,tilda║3A 58 CapsLock║4B 75 <- [4] ║
║08 8 7 & ║19 25 P ║2A 42 Shft(L)║3B 59 F1 ║4C 76 [5] ║
║09 9 8 * ║1A 26 [ { ║2B 43 \ | ║3C 60 F2 ║4D 77 -> [6] ║
║0A 10 9 ( ║1B 27 ] } ║2C 44 Z ║3D 61 F3 ║4E 78 K + ║
║0B 11 0 ) ║1C 28 Enter║2D 45 X ║3E 62 F4 ║4F 79 End [1] ║
║0C 12 - _ ║1D 29 Ctrl ║2E 46 C ║3F 63 F5 ║50 80 ↓ [2] ║
║0D 13 + = ║1E 30 A ║2F 47 V ║40 64 F6 ║51 81 PgDn [3] ║
║0E 14 Bksp║1F 31 S ║30 48 B ║41 65 F7 ║52 82 Ins [0] ║
║0F 15 Tab ║20 32 D ║31 49 N ║42 66 F8 ║53 83 Del [.] ║
║10 16 Q ║21 33 F ║32 50 M ║43 67 F9 ║ ║
║11 17 W ║22 34 G ║33 51 , < ║44 68 F10 ║ ║
╙────────────╨─────────────╨───────────────╨────────────────╨──────────────────╜
K označuje klávesu na numerické klávesnici.
84-klávesová klávesnice AT 84-klávesová klávesnice posílá stejné scan
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ kódy jako 83-klávesová (původní PC) klávesnice
s tím, že klávesa [SysReq] posílá scan kód 54H (84 dekadicky).
Na druhé straně BIOS nikdy tento scan kód aplikaci nepředá. Namísto toho
vyvolá BIOS INT 15 SubFn 85H pro obsluhu této klávesy SysReq.
Jinak se zachází s 'přerušením' (uvolněním klávesy). Při přerušení posílá
klávesnice dvoubytovou posloupnost: 00F0H, následovanou scan kódem aktivní
klávesy. Pro informace o programování této klávesnice viz AT klávesnice.
101-klávesová klávesnice Tato klávesnice má tři různá oddělená mapování
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ scan kódů, vybíraná komunikací přes port 64H.
Klávesnice přichází na svět se scan kódem nastaveným na 2 (což je hrubě
odlišné od 84-klávesového mapování). Scan kódy jsou však přeloženy
hardwarovým rozhraním klávesnice, dřív než jsou zpřístupněny programům,
které klávesnici čtou.
Výsledek je ten, že všechny scan kódy určené předchozí tabulkou jsou
platné, je-li přirozeně zavedena 101-klávesová klávesnice. Následující
tabulka přináší další scan kódy, které 101-klávesová klávesnice posílá.
Povšimněte si, že všechny klávesy zde zmíněné se vztahují ke klávesám,
které jsou pro tuto klávesnici jedinečné; například [Insert] je skutečná
klávesa Insert (nikoli klávesa Ins numerické klávesnice).
────────────────────────────────────────────╥───────────────────────────
Klávesa Posloupnost Hex ║ Klávesa Posloup. Hex
────────────────────────────────────────────╫───────────────────────────
F11 ..................... 57 ║ Home ........ E0 47
F12 ..................... 58 ║ Shft-Home ... E0 AA E0 47
Right-Alt ............... E0 38 ║ End ......... E0 4F
Right-Ctrl .............. E0 1D ║ Shft-End .... E0 AA E0 4F
PrintScreen ............. E0 2A E0 37 ║ ↑ ........... E0 48
Shft-PrintScreen (SysReq) E0 37 ║ Shft-↑ ...... E0 AA E0 48
Ctrl-PrintScreen (SysReq) E0 37 ║ ↓ ........... E0 50
Alt-PrintScreen ......... 54 ║ Shft-↓ ...... E0 AA E0 50
Pause ................... E1 1D 45 E1 9D C5 ║ PageUp ...... E0 49
Ctrl-Pause (Break) ...... E0 46 E0 C6 ║ Shft-PageUp . E0 AA E0 49
Insert .................. E0 53 ║ PageDown .... E0 51
Shft-Insert ............. E0 AA E0 52 ║ Shft-PageDown E0 AA E0 51
Delete .................. E0 53 ║ ->........... E0 4D
Shft-Delete ............. E0 AA E0 53 ║ Shft+->...... E0 AA E0 4D
<-....................... E0 4B ║ K Enter ..... E0 1C
Shft+<-.................. E0 AA E0 4B ║ K / ......... E0 35
║ Shft+ K / ... E0 AA E0 35
────────────────────────────────────────────╨───────────────────────────
K označuje klávesu na numerické klávesnici
Všimněte si, že v případech, kdy je klávesa podobná jiné (z pre-101
klávesové klávesnice), je druhý byte kódu prohledávání totožný s původní
klávesou. Proto některé programy, které pracují na úrovni scan kódu, mohou
prostým ignorováním prefixu 0E0H pracovat i nadále bez nutnosti úprav.
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Viz též: Klávesnice INT 09 Příznaky klávesnice
ASCII AT klávesnice
Příznaky klávesnice
Dva byty na adresách 0000:0417H a 0000:0418H určují status kláves Shift
a klopných obvodů klávesnice. První byte vrací INT 16H v AL.
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖ Volejte Klávesnice INT 16 Fn 02H
║I │C │N │S │a │c │sL│sR║ nebo přečtěte byte na adrese 0000:0417H
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
║ ║ ║ ║ ║ ║ ║ ╚═ 0: Pravý Shift stisknut
║ ║ ║ ║ ║ ║ ╚════ 1: Levý Shift stisknut
║ ║ ║ ║ ║ ╚═══════ 2: Ctrl (libovolný) stisknut
║ ║ ║ ║ ╚══════════ 3: Alt (libovolný) stisknut
║ ║ ║ ╚═════════════ 4: Stav ScrollLock
║ ║ ╚════════════════ 5: Stav NumLock
║ ╚═══════════════════ 6: Stav CapsLock
╚══════════════════════ 7: Stav Insert
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖
║i │c │n │s │ │sy│aL│cL║ Přečtěte byte na adrese 0000:0418H
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
║ ║ ║ ║ ║ ║ ║ ╚═ 0: Levý Ctrl stisknut
║ ║ ║ ║ ║ ║ ╚════ 1: Levý Alt stisknut
║ ║ ║ ║ ║ ╚═══════ 2: SysReq stisknut
║ ║ ║ ║ ╚══════════ 3: Status Pause
║ ║ ║ ╚═════════════ 4: ScrollLock stisknut
║ ║ ╚════════════════ 5: NumLock stisknut
║ ╚═══════════════════ 6: CapsLock stisknut
╚══════════════════════ 7: Insert stisknut
Poznámky: Bity 0-2 z 0000:0418H jsou definovány pouze pro rozšířenou
101-klávesovou klávesnici.
BIOS podporující 101-klávesovou klávesnici po volání Klávesnice INT 16 Fn 12
vrací v AL stejné hodnoty jako po volání Fn 02H, ale registr AH obsahuje
následující informace:
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖ Volejte Klávesnice INT 16 Fn 12H
║sy│c │n │s │aR│cR│aL│cL║ (jen 101-kl. BIOS)
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
║ ║ ║ ║ ║ ║ ║ ╚═ 0: Levý Ctr stisknut
║ ║ ║ ║ ║ ║ ╚════ 1: Levý Alt stisknut
║ ║ ║ ║ ║ ╚═══════ 2: Pravý Ctrl stisknut
║ ║ ║ ║ ╚══════════ 3: Pravý Alt stisknut
║ ║ ║ ╚═════════════ 4: ScrollLock stisknut
║ ║ ╚════════════════ 5: NumLock stisknut
║ ╚═══════════════════ 6: CapsLock stisknut
╚══════════════════════ 7: SysReq stisknu
Některé starší programy mění hodnoty bitů stavu NumLock a CapsLock (na
0000:0417H) k vynucení přepnutí stavu. To není moudré, protože moderní
klávesnice mají indikační LED, které budou asynchronní se stavem
klávesnice. Pro další informace o LED viz AT klávesnice .
Viz též: Klávesnice INT 16 Přerušení DOSu
Klávesnice INT 09 AT klávesnice
AT KLÁVESNICE
Klávesnice na AT je díky řízení mikropočítačem Intel 8042 programovatelná
a lze ji řídit programově narozdíl od klávesnice na XT (ta je řízena
pomocí PPI - viz Porty PPI ).
Lze nastavit rychlost opakování a řídit stavy diod přepínání klávesnice.
Obvod 8042 patří mezi monolitické mikropočítače odvozené z řady 8048
a jeho detailní popis se vymyká tomuto manuálu.
Port 60H je určen pro zápis dat v kompatibilním módu se staršími modely.
Jestliže vám tedy nebude periferie reagovat na port 64H, zkuste port 60H.
Port 64H je určen pro zápis příkazů i dat a pro čtení stavu periferie.
Normálně před vysláním příkazu čte ROM-BIOS stav klávesnice a provádí
testy interních bufferů, stisknutí klávesy atd. Jestliže toto neprovedete,
riskujete zablokování klávesnice. Pro vyslání instrukce musíte provést:
mov al,kód_příkazu
out 64H,al
mov cx,2000H ; čas na rozmyšlenou ≈ 10 ms
delay: loop delay
mov al,data
out 64H,al
Kód Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0FFH Reset klávesnice a start interní diagnostiky
0FEH Znovu vyšli poslední přenášený blok (chyba na příjmu)
0FDH-0F7H (NOP)
0F6H Nastav klávesnici do implicitního stavu a pokračuj ve snímání
0F5H Nastav klávesnici do implicitního stavu a zakaž snímání kláves
0F4H Odblokuj klávesnici. Klávesnice by měla vyslat potvrzení ("ACK"),
vyčistit buffery a začít snímat klávesy
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0F3H Nastav zpoždění a hodnotu opakování
Vyšli 0F3H a pak datový byte:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0│zp.│opakování║
╙─┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜
╚╦╝ ╚═╩═╩═╩═╩═ bity 0-4: počet opakování za vteřinu: lze jej
║ nastavit spojitě, zde jsou jen
║ některé hodnoty: 0 = 30.0 0AH = 10.0
║ 1 = 26.7 0DH = 9.2
║ 2 = 24.0 10H = 7.5
║ 4 = 20.0 14H = 5.0
║ 8 = 15.0 1FH = 2.0
║
╚════════════ bity 5-6: hodnota zpoždění před prvním opakováním:
00=250ms; 01=500ms; 10=750ms; 11=1000ms
iniciální nastavení klávesnice je 2AH (10 opakování za vteřinu,
prodleva 0.5 vteřiny).
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0EEH Diagnostika: vyšli echo. Klávesnice by měla vyslat zpět byte 0EEH.
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0EDH Zapnutí LED 'lock key'.
Vyšli 0EDH a pak datový byte:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0│0│0│0│0│c│n│s║
╙─┴─┴─┴─┴─┴╥┴╥┴╥╜
║ ║ ╚═ 1 = rozsviť diodu ScrollLock
║ ╚═══ 1 = rozsviť diodu NumLock
╚═════ 1 = rozsviť diodu CapsLock
Bity na pozici 0-2 odpovídají bitům 4-6 v příznaku klávesnice
v datové oblasti ROM-BIOS. Měli byste si dát pozor na to, aby
nedošlo k nesouhlasu mezi rozsvícením diod a skutečným přepnutím
módu. Přepnutí módu můžete provést nastavením bitů 4-6 na adrese
0000:0417H.
Viz též: Příznaky klávesnice I/O porty
INT 17H: Obsluha tiskárny
Tyto funkce umožňují přístup k paralelním portům tiskárny (LPT1, atd.)
Adresy portů tiskárny jsou uloženy od 0:0408.
Hodnotu timeoutu tiskárny začínají na 0:0478. Rutina Print Screenu je INT 05
AH Služba
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H Tiskni znak
Vstup : AL = znak ASCII. Viz též: ASCII
DX = číslo tiskárny (0,1, nebo 2)
Výstup: AH = 01H, když se znak nedá vytisknout (vyskytl se timeout)
ostatní bity jsou nastaveny jako v podfci 02H (stavové příznaky)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
01H inicializuj port tiskárny
Vstup : DX = číslo tiskárny (0,1, nebo 2)
Výstup: AH = nastaven jako v podfunkci 02H (stavové příznaky)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
02H vrať stav tiskárny
Vstup : DX = číslo tiskárny (0,1, nebo 2)
Výstup: AH = stavové příznaky tiskárny
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │ │ ║
╙╥┴╥┴╥┴╥┴╥┴─┴─┴╥╜
║ ║ ║ ║ ║ ╚╦╝ ╚═► timeout (AH & 01H)
║ ║ ║ ║ ║ ╚════► (nepoužito)
║ ║ ║ ║ ╚═══════► chyba I/O (AH & 08H)
║ ║ ║ ╚═════════► vybráno (AH & 10H) (00H znamená off-line)
║ ║ ╚═══════════► došel papír (AH & 20H)
║ ╚═════════════► potvrzení (AH & 40H) (40H = tiskárna připojena)
╚═══════════════► volná (AH & 80H) pozn.:0 znamená - pracuje
Přerušení BIOSu Funkce DOSu
Paralelní porty Kabely
BIOS INT 15
Toto přerušení poskytuje různé služby pro zařízení v AT (služby OS,
XMS, kazetopásková jednotka). Toto přerušení také využívá podstatná
část funkcí DESQView. Poku ale zrovna nevyvíjíte (ne)preemptivní
multitásking, klidně INT 15 ignorujte.
AH Služba
▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
00H KAZETA - Zapni motor kazetopáskové jednotky
Požaduje: AH = 00H
Vrací: CF je nastaven na 1, nastala-li chyba
AH = 86H, není-li kazetopásková jednotka instalována
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
01H KAZETA - Vypni motor kazetopáskové jednotky
Požaduje: AH = 01H
Vrací: CF je nastaven na 1, nastala-li chyba
AH = 86H, není-li kazetopásková jednotka instalována
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
02H KAZETA - Čti blok dat
Požaduje: AH = 02H
CX = počet bytů
ES:BX => buffer
Vrací: CF je nastaven na 1, nastala-li chyba
AH = status
01H: chyba CRC
02H: špatný signál na pásce
04H: nejsou žádná data
80H: chybný příkaz
86H: kazetopásková jednotka není instalována
DX = počet přečtených bytů
ES:BX => ukazuje za poslední přečtený byte
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
03H KAZETA - Zapiš blok dat
Požaduje: AH = 03H
CX = počet bytů
ES:BX => buffer
Vrací: CF je nastaven na 1, nastala-li chyba
AH = status
01H: chyba CRC
02H: špatný signál na pásce
04H: nejsou žádná data
80H: chybný příkaz
86H: kazetopásková jednotka není instalována
ES:BX => ukazuje za poslední přečtený byte
CX = 0
Poznámka : Na dnešních PC kazety nejsou instalovány ( alespoň už 8 let ).
Jen pro úplnost
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
4FH OS - Podchycení přerušení klávesnice
Požaduje: AH = 4FH
AL = scan kód
CF nastaven
Vrací: CF je nastaven: AL = nový scan kód
CF není nastaven: scan kód by neměl být použit
Poznámka: Tato funkce je volána INT 09H pro konverzi scan kódu (někdy)
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
80H OS - Otevři zařízení
Požaduje: AH = 80H
BX = identifikátor zařízení
CX = typ procesu
Vrací: CF je nastaven na 1, nastala-li chyba
AH = status
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
81H OS - Zavři zařízení
Požaduje: AH = 81H
BX = identifikátor zařízení
CX = typ procesu
Vrací: CF je nastaven na 1, nastala-li chyba
AH = status
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
82H OS - Ukonči program zařízení
Požaduje: AH = 82H
BX = identifikátor zařízení
Vrací: CF je nastaven na 1, nastala-li chyba
AH = status
Poznámka: Zavře všechna zařízení otevřená funkcí 80H
Pozn.: 80-82 bylo zamýšleno pro multitasking. ROM nedělá nic. Měl by obsadit
OS, aby zjišťoval, co který proces dělá. Ale multitásking stejně běží
v PROTECTED MÓDu a tem se nechá kontrolovat vše pomocí nastavení
přístupových práv v TSS .
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
83H OS - Čekej na výsledek
Požaduje: AH = 82H
AL = 0: nastav interval (a spusť časovač)
ES:BX => 1 byte; 7. bit bude nastaven po vypršení
časového intervalu
CX*65535 + DX = počet mikrosekund (přesnost na
977 mikrosekund)
1: zruš čekání
Vrací: CF je nastaven na 1, je-li funkce již obsazena
Viz také Budík INT 4A
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
84H OS - Čti joystick
Požaduje: AH = 84H
DX = 0: dej stávající nastavení přepínačů
Vrací: AL = nastavení přepínačů
1: čti vstup joysticku
Vrací: AX = A (x)
BX = A (y)
CX = B (x)
DX = B (y)
Jediná užitečná funkce na INT 15.
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
85H OS - Obsluha klávesnice
Požaduje: AH = 85H
AL = 0: akce pro stisknutí klávesy
1: akce pro uvolnění klávesy
Vrací: CF je nastaven na 1, nastala-li chyba
AH = status
Popis: Tato funkce je volána INT 09H při stisknutí a uvolnění
klávesy. Zde je možné navěsit testovací rutinu TSR
programu.
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
86H OS - Čekej
Požaduje: AH = 86H
CX*65535 + DX = počet mikrosekund (přesnost na
977 mikrosekund)
Vrací: CF je nastaven na 1, nastala-li chyba
CF = 0 : po vypršení čekací doby
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
87H Extended paměť - Přenes blok paměti
Požaduje: AH = 87H
CX = počet wordů k přenesení (max. 8000H, 286 styl)
ES:SI => Global Descriptor Table (GDT)
Vrací: CF je nastaven na 1, nastala-li chyba
AH = 0: bez chyby
1: chybná parita RAM
2: chyba přerušení
3: chyba adresové linky A20
Popis: Funkce přenáší blok paměti z nebo do rozšířené paměti
nad 1MB. Doporučené vyplnění GDT:
GDT: 00H-0FH: nuly
10H-11H: délka zdrojového segmentu v bytech
12H-14H: 24-bitová adresa zdroje
15H byte přístupových práv (93H)
16H-17H: nuly
18H-19H: délka cílového segmentu v bytech
1AH-1CH: 24-bitová adresa cíle
1DH byte přístupových práv (93H)
1EH-2FH: nuly
Viz Deskriptor .
Není moc rychlé a mohou nastat konflikty v obsazování
vyšší paměti. Lépe nepoužívat. Viz XMS , EMS , VCPI a
DPMI . JE použitelné i ve V86 MÓDu , správce obsluhuje
přenos sám (BIOS odpojí).
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
88H Extended - Dej velikost rozšířené paměti
Požaduje: AH = 88H
Vrací: AX = velikost paměti v KB
Je-li instalována XMS (HIMEM.SYS, QEMM, 386MAX), vrací 0.
VyužívaLO se k tzv. Top-down alokaci. Volné paměti (použitelné) bylo
AX KB; Lineární adresa začátku byla 10000h. Pokud si někdo (TSR) alokoval
Extended, musel pověsit rezidenta na 15h. Viz také BOOT INT 19
pro Bottom-up alokaci.
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
89H OS - Přepni do chráněného režimu
Požaduje: AH = 88H
DS:SI => GDT pro přepnutí
offset 00H: nuly
08H: Deskriptor GDT
10H: Deskriptor IDT
18H: DS
20H: ES
28H: SS
30H: CS
38H: nuly
BL = číslo přerušení pro IRQ0 (IRQ1-7 použijí dalších 7)
BH = číslo přerušení pro IRQ8 (IRQ1-7 použijí dalších 7)
CX = offset protected-módového CS pro JUMP
Vrací: CF je nastaven na 1, nastala-li chyba:
AL = FFH: chyba adresové linky A20
Po přepnutí je třeba ihned nastavit stack.
Není příliš užitečné, funguje jen v REAL MÓDu . Lépe je buď
provést přepnutí sám, nebo využít VCPI nebo DPMI .
Viz též PROTECTED MÓD
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
90H OS - Čekací smyčka při obsazeném zařízení
Požaduje: AH = 90H
AL = typ zařízení:
00H: hard disk
01H: disketa
02H: klávesnice
03H: zařízení PS/2
80H: síť
ES:BX => blok síťových informací
FCH: reset disku
FDH: start motoru diskety
FEH: tiskárna
Vrací: CF je nastaven na 1, když čekací doba uplynula
CF = 0 musí-li řídící program ještě čekat
Poznámka: Kódy zařízení jsou rozděleny takto:
00H-7FH: nereentrantní zařízení: OS musí rozhodnout o
přístupu
80H-BFH: reentrantní zařízení: ES:BX ukazuje na řídící blok
C0H-FFH: volání jen pro čekání
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
91H: OS - Nastav příznak a ukonči přerušení
Požaduje: AH = 91H
AL = typ zařízení:
00H: hard disk
01H: disketa
02H: klávesnice
03H: zařízení PS/2
80H: síť
ES:BX => blok síťových informací
FCH: reset disku
FDH: start motoru diskety
FEH: tiskárna
Vrací: AH = 0 (???)
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
C0H OS - Dej konfiguraci (také některé XT)
Požaduje: AH = C0H
Vrací: CF = CY jestliže BIOS tuto službu nepodporuje
ES:BX => tabulka v ROM:
velikost význam
▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
word počet bytů tabulky
byte FFH = PC
FEH = XT a PORTable
FDH = PC/Jr
FCH = AT, XT286, PS/2 50,60
FBH = XT s 640 KB RAM
FAH = PS/2 30
F9H = PC Conv
F8H = PS/2 80
byte submodel
byte verze BIOS
byte 80H = kanál 3 DMA použit BIOS pro hard disk
40H = instalován druhý řadič 8259
20H = instalován reálný čas
10H = INT 15H/AH=4FH je volán během INT 09H
08H = podporováno čekání na externí událost
04H = extended BIOS alokován nad 640KB
02H = bus je Micro Channel místo PC Bus
word 0
word 0
─────────────────────────────────────────────────────────
Poznámka: XT BIOS starší než 1.10.86 vrací nekorektní
hodnoty
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Viz též: Přerušení BIOSu Funkce DOSu
INT 2F Přerušení DOSu
DATOVÁ OBLAST ROM-BIOSu
Zde je popsána standardní oblast proměnných BIOS. Celá mapa je
dokumentovaná a vypadá nadějně i do budoucna. Jsou-li některé byty
nepopsány, považujte je za rezervované.
Adresa Vel. Popis
▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Datová oblast ROM-BIOS
0:0400H 2 Bázová adresa sériového portu 1. RS-232 adaptéru (COM1)
0:0402H 2 Port COM2
0:0404H 2 Port COM3
0:0406H 2 Port COM4
0:0408H 2 Bázová adresa paralelního portu 1. adaptéru (LPT1)
0:040AH 2 Port LPT2
0:040CH 2 Port LPT3
0:040EH 2 Port LPT4
PS/2: Segment adresy Extended BIOS Data Segmentu
0:0410H 2 Popis instalovaného hardwaru. Viz Konfigurace INT 11 .
0:0412H 1 Byte chyby na PC/Jr infračervené lince klávesnice
AT: příznaky inicializačního testu
Conv: status POST
0:0413H 2 Celková kapacita základní paměti v KB. Paměť INT 12
0:0415H 2 Stav baterií (PC Conv)
Na AT využíváno pro testy výrobce
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0417H 2 Příznaky klávesnice a rozšířené příznaky klávesnice
0:0419H 1 Akumulovaná hodnota pro Alt+numerická klávesnice.
Normálně 0. Když je [Alt] puštěn, hodnota je uložena do
klávesnicového bufferu.
0:041AH 2 Adresa příštího bytu v bufferu klávesnice (ne počátku !)
0:041CH 2 Adresa posledního platného bytu v bufferu klávesnice
0:041EH 32 Buffer klávesnice. Funguje jako cyklický buffer, pointery
na začátek a konec jsou na adresách 0:041AH až 0:043CH.
(Ale viz 0:0480H,81H)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:043EH 1 Disketa vyžadující rekalibraci (bit 0=A, bit 1=B,...)
Bity 4-5 indikují, která mechanika je vybraná, bit 7 indikuje
příznak přerušení.
0:043FH 1 Motor diskety je v chodu (bit 0=A:...bit 3=D:)
Bity 4-5 indikují, která mechanika je vybraná, bit 7 indikuje
příznak probíhající čtecí nebo zápisové operace (1=zápis nebo
formátování, 0=čtení nebo verifikace)
0:0440H 1 Dekrementální hodnota pro vypnutí motoru. Časování vypne
motor při zjištění, že je zde 0.
0:0441H 1 Kód chyby diskety. Stejné jako status vrácený Disk INT 13 .
Diskové chyby
0:0442H 7 Informační oblast řadiče diskety (hlášení chyb)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0449H 1 Stávající aktivní video mód. Viz Video INT 10 .
0:044AH 2 Šířka obrazovky v textových sloupcích
0:044CH 2 Délka videooblasti v bytech (regen size)
0:044EH 2 Offset aktivní videostránky od počátku videosegmentu
0:0450H 16 Pozice kurzoru pro 8 stránek (8 párů: sloupec,řádka...)
0:0460H 2 Velikost kurzoru (shape). Dolní byte = koncová linka (scan
line), horní byte = počáteční linka
0:0462H 1 Číslo aktivní videostránky
0:0463H 2 Adresa portu 6845 video adaptéru. Viz CGA I/O Porty.
0:0465H 1 Aktuální hodnota 6845 CRT_MODE (registry na portu 3x8H)
0:0466H 1 Aktuální hodnota 6845 CRT_PALETTE (registry na portu 3x9H)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0467H 5 Oblast pro řadič kazety
nebo
0:0467H 4 vstupní bod v reálném módu pro POST
0:046BH 1 poslední neočekávané přerušení POST
0:046CH 4 Čítač taktů hodin (počet 55ms tiků od resetu CPU).
0:0470H 1 Příznak přetečení 24 hodin. Viz Časovač INT 1A .
0:0471H 1 Příznak Ctrl-Break. Bit 7=1, když byl stisknut. Příznak není
nikdy resetován automaticky, musí to udělat program.
0:0472H 2 1234H = probíhá Ctrl-Alt-Del reboot. BIOS testuje tento
příznak, aby se vyhnul zbytečným testům jako pro
studený reset.
4321H = resetuj, ale zachovej paměť
5678H = zachovej systém (PC Conv)
9ABCH = proveď test výrobce (PC Conv)
ABCDH = POST loop mód (PC Conv)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0474H 4 PC/Jr disketa nebo AT hard disk - řídící oblast
(0474H) 1 status poslední operace hard disku:
00H bez chyby
01H špatný funkční požadavek
02H adresová značka nenalezena
03H pokus o zápis na write-protect médium
04H sektor nenalezen
05H chybný reset
07H chybný parametr aktivity disku
08H přetečení DMA
09H chyba dat na DMA
0AH detekován příznak vadného sektoru
0BH detekován příznak vadné stopy
0DH nekorektní počet sektorů pro formátování
0EH detekována kontrolní značka řídících dat
0FH úroveň řízení DMA mimo rozsah
10H neopravitelná chyba ECC nebo CRC
11H opravitelná chyba dat ECC
20H obecná chyba řadiče
40H chyba seeku
80H time out
AAH disk není připraven
BBH nedefinovatelná chyba
CCH chyba zápisu na vybraný disk
E0H chyba statusu nebo registr chyby je nulový
FFH chyba citlivosti
0:0475H 1 počet AT hard disků
0:0476H 1 řídící byte pro XT hard disk
0:0477H 1 port XT hard disku
0:0478H 4 timeout pro paralelní porty (478H=LPT1, 478H=LPT2...)
0:047CH 4 timeout pro sériové porty RS-232 (47CH=COM1, 47DH=COM2...)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0480H 2 offset adresy počátku bufferu klávesnice pro AT a PS/2
(obvykle 01EH) od adresy 0:0400H
0:0482H 2 koncová adresa (obvykle 003EH)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ [konec pro XT BIOS] ─ ─ ─ ─
0:0484H 1 Maximální číslo znakového řádku EGA obrazovky
0:0485H 2 Počet bytů na znak EGA (scan-lines/char)
0:0487H 1 Doplňkové informace EGA (EGA aktivní, monochrom monitor...)
0:0488H 1 Doplňkové informace EGA (nastavení přepínačů)
Viz Video parametry INT 1D .
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0489 2 Řízení koprocesoru 8087
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:048BH 1 Disketa: bity 5-4: krokování
bity 7-6: přenosová rychlost:
00: 500K/s, 01: 300K/S, 10: 250K/s
0:048CH 1 Status řadiče hard disku
0:048DH 1 Status chyby hard disku
0:048EH 1 Řízení přerušení hard disku
0:048FH 1 Informace řadiče diskety (nikoli XT)
bit 7: rezervováno
bit 6: =1 disk 1 je určen
bit 5: =1 disk 1 je multi-rate, korektní je-li disk určen
bit 4: =1 disk 1 podporuje 80 stop
bit 3: rezervováno
bit 2: =1 disk 0 je určen
bit 1: =1 disk 0 je multi-rate, korektní je-li disk určen
bit 0: =1 disk 0 podporuje 80 stop
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0490H 1 Status média pro disketu 0 (A:)
0:0491H 1 1 (B:)
0:0492H 1 Příznak diskových operací pro disketu 0 (A:)
0:0493H 1 1 (B:)
0:0494H 1 Aktuální stopa na disketě 0 (A:)
0:0495H 1 1 (B:)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0496H 1 Příznaky klávesnice
0:0497H 1 Příznak LED na klávesnici:
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0498H 4 Pointer ma 8-bitový příznak čekání. Viz BIOS INT 15
0:049CH 4 Počet mikrosekund do konce čekání
0:04A0H 1 Uživatelský příznak aktivity timeru:
bit 0: čekání aktivní
bit 1: obsazen uživatelský Budík INT 4A
bit 2: obsazena rutina budíku
bit 7: čekání je ukončeno
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:04A1H 7 Rezervováno pro síťové adaptéry
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:04A8H 4 Adresa tabulky SAVE_PTR. Viz Video parametry INT 1D
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:04B0H 4 Adresa vstupního bodu BIOS nebo řídícího programu optického
disku 3363:
Je-li aktivní 3363 BIOS, pak na udané adrese + 3 byty je
ASCIIZ retezec "OPTIC",00H.
Je-li aktivní 3363 BIOS i 3363 File System Driver, pak na
udané adrese + 3 byty je ASCIIZ retezec
"FILE SYSTEM DRIVER",00H.
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:04F0H 16 Komunikační oblast pro předávání dat mezi aplikacemi.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
F000:FFF0H 5 FAR JMP na začátek POST
(po tvrdém resetu sem skáče procesor 8086, ale procesory
286, 386 a 486 mají nastaveny adresovací linky A20 a
vyšší a tudíž skáčou na horní konec 4 GB(3,486) 16MB (286)
F000:FFF5H 8 Datum výroby ROM-BIOS jako ASCII řetězec (tj. "04/24/81" je
originální IBM PC)
F000:FFFCH 2 nepoužito
F000:FFFEH 1 Typový kód počítače. Viz též BIOS INT 15 .
0FFH = originální PC
0FEH = XT nebo Portable PC
0FDH = PC/Jr
0FCH = AT (nebo XT-286 nebo PS/2 Model 50/60)
0FBH = XT se 640K na motherboardu
0FAH = PS/2 Model 30
0F9H = PC Conv
0F8H = PS/2 Model 80
Přerušení BIOSu Datová oblast DOSu
Datová oblast DOSu
0:0500H 1 Status rutiny print-screen:
00H = OK
01H = zrovna tiskne
FFH = chyba při tisku
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
0:0504H 1 Status stínové diskety
00H = disk A je používán jako A
01H = disk A je používán jako B
FFH = disk A je používán jako A
0:0510H 17 Vyhrazeno pro BASIC interpreter
0:0530H 3 Vyhrazeno příkazu MODE
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Datová oblast BIOS Přerušení DOSu Funkce DOSu
Detailní popis služeb ROM-BIOSu INT 10H.
V tomto oddíle nejsou popsány služby EGA BIOSu. Viz Video služby EGA/VGA
AH Služba
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H nastav mód obrazovky. Čistí obrazovku, nastaví proměnné BIOSu a zapne mód.
Vstup: AL=mód
AL Typ Formát Barvy Adaptér Adr Monitor
═══ ═══════ ═══════ ═════════════ ═══════ ════ ═════════════════
0 text 40x25 16/8 odstíny CGA,EGA b800 Kompozitní
1 text 40x25 16/8 CGA,EGA b800 Komp,RGB,Zvýraz.
2 text 80x25 16/8 odstíny CGA,EGA b800 Kompozitní
3 text 80x25 16/8 CGA,EGA b800 Komp,RGB,Zvýraz.
4 graf 320x200 4 CGA,EGA b800 Komp,RGB,Zvýraz.
5 graf 320x200 4 odstíny) CGA,EGA b800 Kompozitní
6 graf 640x200 2 CGA,EGA b800 Komp,RGB,Zvýraz.
7 text 80x25 3 (č/b/zvýraz) MDA,EGA b000 TTL Monochromat.
0dH graf 320x200 16 EGA A000 RGB,Zvýraz.
0eH graf 640x200 16 EGA A000 RGB,Zvýraz.
0fH graf 640x350 3 (č/b/zvýraz) EGA A000 Zvýraz.,TTL Mono
10H graf 640x350 4 nebo 16 EGA A000 EGA,analog VGA
11H graf 640x480 2 VGA A000 analog VGA
12H graf 640x480 16 VGA A000 analog VGA
13H graf 320x200 256 VGA A000 analog VGA
8,9,0aH módy PC junioru
0bH,0cH (reservováno ─ vnitřní potřeba EGA BIOSu)
V případě adaptéru EGA se rozumí počet barev jako počet současně zobra-
zitelných barev, které lze však vybrat z širšího množství (tzv.paleta).
Tato paleta u EGA představuje celkem 64 odstínů, u VGA 262144 odstínů.
Pozn.: Adaptér EGA a VGA připouští přičtení 80H k AL a inicializace
se provede bez smazání obrazovky.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
01H nastav velikost/tvar kurzoru (textové módy). Je─li kurzor viditelný, bliká.
Vstup: CH = počáteční řádek (0─1fH; 20H=žádný)
CL = poslední řádek (0─1fH) Počítáno shora v textovém řádku
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
02H nastav pozici kurzoru. Nastavení na řádek 25 učiní kurzor neviditelným.
Vstup: BH = stránka obrazovky
DH,DL = řádek,sloupec (počítá se od nuly)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
03H čti velikost kurzoru a jeho pozici
Vstup : BH = stránka obrazovky
Výstup: DH,DL = daný řádek a sloupec
CH,CL = první a poslední čárka kurzoru (viz funkce 01H)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
04H čti světelné pero
Vstup : žádný
Výstup: AH = snímání (0=ne; 1=vrací se platné hodnoty)
DH,DL = řádek, sloupec (textové módy)
BX = sloupec bodu (grafické módy)
CH = řádek bodu (pro grafické módy EGA se vrací v CX)
Ovladač myši může emulovat světelné pero
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
05H vyber aktivní stránku obrazovky
Vstup: AL = číslo vybrané stránky (většina software to nechává na nule)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
06H roluj okno nahoru (nebo smaž okno). Roluje obdélník o 1 či více řádcích.
Vstup: CH,CL = řádek, sloupec levého horního rohu okna (počítá se od nuly)
DH,DL = řádek, sloupec pravého spodního rohu okna
AL = počet prázdných řádků, které se narolují (0=vymaž celé okno)
BH = atribut, který se má pro prázdné řádky použít
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
07H roluj okno dolů (vloží prázdné řádky shora)
Vstup: (totéž, jako u funkce 06H)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
08H čti znak/atribut na dané pozici kurzoru
Vstup : BH = číslo stránky obrazovky
Výstup: AL = načtený znak
AH = načtený atribut (pouze pro textový mód)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
09H napiš znak/atribut na danou pozici kurzoru
Vstup: BH = číslo stránky obrazovky
AL = zapisovaný znak
CX = počet opakování (kolikrát zapsat znak z AL)
BL = atribut obrazovky (textové módy) nebo barva (grafické módy)
(grafické módy: +80H znamená XOR bitů znaku)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0aH napiš znak na danou pozici kurzoru.
Vstup: BH = číslo stránky obrazovky
AL = zapisovaný znak
CX = počet opakování (kolikrát zapsat znak z AL)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0bH vyber paletu barev/barvu pozadí (módy kompatibilní s CGA)
Vstup: BH = 0: (textové módy) vyber barvu pozadí
BL = barva pozadí (0─1fH; 10H až 1fH vysvícení)
BH = 1: (grafické módy) vyber kombinaci palety
BL = 0: vyber zelenou/červenou/hnědou
BL = 1: vyber světle modrou/fialovou/bílou
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0cH nakresli grafický bod (pozn.: podfunkce 0cH a 0dH jsou pomalé
Vstup: BH = číslo stránky obrazovky pro většinu grafických operací)
DX,CX = řádek, sloupec
AL = hodnota barvy (+80H znamenás XORuj bod s vybranou barvou)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0dH čti grafický bod
Input : BH = číslo stánky obrazovky
DX,CX = řádek, sloupec
Výstup: AL = načtená hodnota barvy
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0eH napiš znak na aktivní stránku obrazovky (emuluj dálnopis)
Vstup: AL = zapisovaný znak (používá současný atribut)
BL = barva papíru (pro grafické módy)
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0fH čti daný mód obrazovky
Vstup : žádný
Výstup: AL = daný mód (viz funkci 00H)
AH = počet sloupců na obrazovce
BH = číslo současné aktivní stránky obrazovky
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Video služby EGA/VGA
Video služby EGA/VGA
Služby video - viz též Video INT 10
Adaptér EGA přinesl možnost zobrazení až 64 barev. Protože však jeden obrazový
bod má pouze 16 různých hodnot, je třeba vybrat těchto 16 z celkových 64 barev.
Toto přiřazení se nazývá paleta. Adaptér VGA tyto možnosti dále rozšířil, pro-
tože umožňuje zobrazit celkem 262144 barev, avšak najednou na obrazovce pouze
256 barev. Pro ovládání palety je nejvýhodnější použít služby BIOSu, pod-
služby 10. Následuje podrobný popis pod-pod-služeb INT 10H podslužba 10H.
INT 10H, AH=10H (práce s paletou). Poznámka VGA pod číslem podslužby znamená,
že tato služba je dostupná pouze u adaptéru VGA, nikoliv EGA.
PEL registry I/O porty
AL Služba
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H nastav jeden registr palety
BL = číslo barvy (urči 4─bitovou barvu; 0─15)
BH = hodnota, na níž jej nastavíme (6─bitová barva rgbRGB)
r,g,b = váha 1/3, R,G,B = váha 2/3
01H nastav registr okraje. Pozn.: Některé karty okraj nemají
BH = hodnota, na kterou se nastaví
02H nastav všechny registry a registr okraje
ES:BX => 17 bytů (registry palet a registr okraje)
03H povol intenzitu nebo blikání
BL = 0: povol intenzitu pozadí (16 možných pozadí, bez blikání)
BL = 1: povol blikání (8 barev pozadí + blikání popředí)
Hodnota registrů palet pro podfce 0,1,a 2:
┌─7─┬─6─┬─5─┬─4─┬─3─┬─2─┬─1─┬─0─┐
│Nepouž.│ r g b/I R G B │ (6 bitů = 64 možných barev)
└───┴───┴───┴───┴─╥─┴───┴───┴───┘
╚═► bit 3 funguje jako Intensita v módech CGA─komp.
07H [VGA] čti určený registr palety
Vstup : BL = číslo barvy
Výstup: BH = hodnota palety
08H [VGA] čti obsah registru okraje
Výstup: BH = hodnota registru okraje
09H [VGA] čti všech 16 registrů palety a registr okraje
Vstup : ES:DX adresa místa o velikosti 17 bytů
Výstup: tabulka obsahuje 16 bytů barev + hodnotu okraje
10H [VGA] nastav určený registr barvy DAC
Výstup: BX - číslo registru barvy
CH - hodnota zelené (všechny hodnoty jsou 6-bitové)
CL - hodnota modré
DH - hodnota červené
Pozn.: Zde není vše tak přímočaré, jak by se zdálo. Chceme-li přiřadit
barvám 0-15 např. škálu odstínů jedné barvy, nelze volat tuto službu
s BX postupně od 0 do 15. Místo toho je třeba použít hodnoty palety pro
tyto barvy, které lze získat např. funkcí 09H, a teprve tyto hodnoty
použít v této funkci. Jedná se tedy o dvojí překódování:
číslo barvy (0-15) - hodnota palety (0-63) - hodnota registru barev
(0-63 pro R,G i B).
To je kvůli zachování kompatibility s kartou EGA.
11H rezervováno
12H [VGA] nastav blok registrů barvy DAC
Vstup : BX - první registr, který má být zapsán
CX - počet registrů, který má být zapsán
ES:DX - adresa tabulky hodnot červené-zelené-modré
13H [VGA]
Vstup :BL = 0 pro nastavení bitu 7 registru "Mode Control"
BH = hodnota pro bit 7
BL = 1 pro nastavení registru "Color Select"
BH = hodnota pro registr "Color Select"
14H rezervováno
15H [VGA] čti určený registr barvy video DAC
Vstup : BX - číslo registru barvy
Výstup: CH - zelená
CL - modrá
DH - červená
16H rezervováno
17H [VGA] čti blok registrů barvy video DAC
Vstup :BX - první registr, který má být čten
CX - počet registrů, které mají být čteny
ES:DX - adresa pro tabulku hodnot červené-zelené-modré
Výstup:Na určené adrese je (3 * CX) bytů r,g,b
18H [VGA] nastav registr "Mask" video DAC
Vstup :BL - nová hodnota masky (IBM doporučuje nechat 255)
19H [VGA] čti registr "Mask" video DAC
Výstup:BL - hodnota z registru masky
1AH [VGA] čti registr "Color Select" řadiče atributů
Výstup:BL - bit 7 registru "Mode Control"
BH - bity 2-3 registru "Color Select" (když BL=0)
0-3 BL=1
1BH [VGA] převeď blok registrů barvy video DAC na odstíny šedi
Vstup :BX - první registr barvy v bloku
CX - počet registrů barvy
Viz též : Video parametry INT 1D
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
11H Funkce znakového generátoru EGA. Zruší proměnné obrazovky beze změn hodnot
obnovovacího bufferu (čili obrazovka se nemaže).
Vstup: AL = 0: zaveď uživatelský font pod textovým módem
ES:BP => tabulka uživatelského fontu
CX = počet ukládaných znakových obrazců
DX = ofset znaků (zavádění znaků začne na této ASCII hodnotě)
BL = zaváděný blok fontů (0 až 3; 4 pro 256K paměť EGA)
BH = počet bytů na jeden obraz znaku (např. 8 nebo 14)
AL = 1: zaveď ROMový znakový font 8x14
BL = zaváděný blok fontů (0─4)
AL = 2: zaveď ROMový dvojitý znakový font 8x8
BL = zaváděný blok fontů (0─4)
AL = 3: nastav spec. bloku (povolí dvě ze čtyř 256─znakových množin)
Druhá množina 256ti znaků se určuje atributovým bitem č.3
(jinými slovy ─ vyberete─li barvu popředí nad 7, EGA zobrazí
druhý font).
BL = výběr bloku fontů (4 bity 0─0fH)
┌─7─┬─6─┬─5─┬─4─┬─3─┬─2─┬─1─┬─0─┐
│ nepoužito │č.bloku│č.bloku│
└───┴───┴───┴───┴───┴───┴───┴───┘
╚═╦═╝ ╚═══╩══► vybráno je─li atr. bit 3=0
╚════════════► použito při atr. bit 3=1
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Podfunkce 10H,11H,a 12H očekávají aktivní stránku 0 a měly by být
použity ihned po nastavení módu. Přepočítají řádky a sloupce a
přeprogramují několik registrů CRTC, včetně registrů kurzoru.
Tyto služby by měly být volány ihned po nastavení módu zobrazení.
AL=10H: zavede uživatelský font (viz podfunkci 00H)
AL=11H: zavede ROMový znakový font 8x14 (viz podfunkci 01H)
AL=12H: zavede ROMový dvojitý znakový font 8x8 (viz podfunkci 02H)
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
AL=20H: nastaví uživatelský znakový font pro grafické módy
ES:BP => 2048─bytová tabulka množiny znaků 8x8 pro INT 1fH
AL=21H: nastaví uživatelský znakový font pro grafické módy
ES:BP => tabulka množiny znaků 8x8 pro INT 44H
CX = bodů (bytů na znak)
BL = kód řádků obrazovky
0 = specifikováno uživatelem
DL = znakových řádků na obrazovku
1 = 0eH (14 znakových řádků na obrazovku)
2 = 19H (25 znakových řádků na obrazovku)
3 = 2bH (43 znakových řádků na obrazovku)
Tato podslužba nahraje 256 znakových definic.
Režimy zobrazení 4,5 a 6 používají pouze prvních 128 znaků.
Všechny ostatní režimy používají všech 256 znaků.
AL=22H: nastav ROMový znakový font 8x14 pro grafické módy
BL = kód řádků obrazovky (viz výše)
AL=23H: nastav ROMový znakový dvojitý font 8x8 pro grafické módy
BL = kód řádků obrazovky (viz výše)
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
AL=30H: Vrať informace o fontu
BH = typ pointeru, který má být vrácen
0 = vrať ES:BP => adresa grafického fontu pro INT 1fH
1 = vrať ES:BP => adresa grafického fontu pro INT 44H
2 = vrať ES:BP => adresa ROMového fontu 8x14
3 = vrať ES:BP => adresa ROMového dvojitého fontu 8x8
4 = vrať ES:BP => adresa ROMového dvoj. fontu 8x8 (vrch)
5 = vrať ES:BP => adresa ROMové altern. tabulky 9x14
Výstup: ES:BP pointer na tabulku určenou BH
CX = řádků jednoho znaku fontu (bytů definice fontu na znak)
DL = řádky obrazovky
Poznámka: Pro výběr textového módu 80 x 43 na 350-řádkovém displeji vyvo-
lejte funkci 11H INT 10H, aby byla zavedena sada 8x8 z paměti
ROM a řadič CRT přeprogramován pro zobrazení 43 znakových řád-
ků.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
12H Speciální funkce EGA, VGA karty (Alternativní výběr)
Informace o EGA kartě:
Vstup : BL=10H (číslo podfunkce)
Výstup: BH = mód (0=barevný; 1=monochromatický)
BL = kód velikosti paměti (0=64K; 1=128K; 2=192K; 3=256K)
CH = doplňovací bity (hodnoty nepoužitých konektorů RCA)
CL = nastavení přepínače (adaptér/display primární/sekundární
Nastav náhradní podprogram pro PRINT-SCREEN:
Vstup : BL=20H: zajistěte její použití kdykoli změníte počet řádků
obrazovky).
Zvol počet rozkladových řádků pro textové módy [VGA]:
Vstup : BL=30H (číslo podfunkce)
AL=0 200 řádků
1 350 řádků
2 400 řádků
Povol zavedení implicitní palety [VGA]:
Vstup : BL=31H
AL=0 povol zavedení implicitní palety při změně videomódu
1 zakaž zavedení implicitní palety Viz funke 10h
Výstup: Proběhlo-li vše v pořádku, vrací AL=12H
Přístup CPU do videopaměti [VGA]:
Vstup : BL=32H
AL=0 povol přístup CPU k videopaměti a k I/O portům
AL=1 zakaž přístup CPU k videopaměti a k I/O portům
Výstup: Je-li vše OK, AL=12H
Povolení výpočtu odstínů šedé [VGA]:
Vstup : BL=33H
AL=0 bit 1 bytu Flags [0040:0089] nastaven - povolen výpočet šedé
(hodnoty R,G,B jsou převedeny na odstíny šedé v případě, že
funkce 0 a 10H INT 10H aktualizují registry barvy DAC).
AL=1 bit 1 Flags nulován - zakázán výpočet šedé
Výstup: Je-li vše OK, AL=12H Viz též : Video parametry INT 1D
Povolení emulace kurzoru [VGA]:
Vstup : BL=34H
AL=0 povolí emulaci kurzoru (bit 0 proměnné INFO [0040:0087]=0)
AL=1 zakáže emulaci kurzoru Viz též: Video parametry INT 1D
Výstup: Je-li vše OK, AL=12H
Pozn.: Na adaptérech EGA a VGA se registry začátku a konce kurzoru chovají
trochu odlišně, než na MDA a CGA (a navíc odlišně EGA od VGA). Proto je-li
zapnuta emulace kurzoru, adresování začátku a konce kurzoru při nastavení
funkcí 01H INT 10H je přepočítáno tak, jako bychom zobrazovali znaky
v matici 8x8 bodů. Implicitně je emulace zapnuta. U adaptéru EGA musíme
bit 0 proměnné INFO nastavit přímo, VGA-BIOS nám umožňuje použít tuto
funkci. Viz též: I/O porty
Služby pro přepínání mezi dvěma videosystémy na PS/2
Vstup : BL=35H AL=kód pod-pod-...-služby
(není v našich končinách příliš podstatné)
Zákaz obnovování obrazovky [VGA]:
Vstup : BL=36H
AL=0-povolí 1-zakáže obnovování obrazovky. Dočasný zákaz u progra-
mu, který provádí hodně manipulací s obrazovkou, může zrychlit
jeho běh.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
13H napiš řetězec (AT) ◄EGA► Zobrazí řetězec na určené pozici.
Znaky 0dH (CarRet), 0aH (LineFeed), 08H (bksp), a 07H (Beep) jsou brány
jako řídící příkazy a nejsou zobrazovány.
Vstup: ES:BP => zobrazovaný řetězec (spec. formát pro AL=2 a AL=3)
CX = délka řetězce (počítají se jen znaky)
DH,DL = řádek a sloupec počátku zobrazování
BH = číslo stránky
AL = kód podfunkce:
0 = použij atribut v BL; neměň kurzor
1 = použij atribut v BL; nastav kurzor na konec řetězce
2 = formát řetězce: znak,atr, znak,atr...; neposunuj kurzor
3 = formát řetězce: znak,atr, znak,atr...; posuň kurzor
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
14H pouze PC Convertible
15H pouze PC Convertible
16H rezervováno
17H rezervováno
18H rezervováno
19H rezervováno
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1AH Vrať/nastav kombinaci videosystémů
Vstup: AH=1AH
AL=0 vrať kombinaci videosystémů
AL=1 nastav kombinaci videosystémů
Výstup (AL=0):
AL=1AH příznak, že funkce je podporována
BL=aktivní videosystém
BH=neaktivní videosystém
Aktualizuje byte DCC na adrese 0040:008A (viz Video parametry INT 1D
a Datová oblast BIOSu ). Tento byte obsahuje index do tabulky Display
Combination Code, která obsahuje přípustné kombinace jednoho nebo dvou
videosystémů. Videosystémy mají následující hodnoty:
FFH nerozpoznaný videosystém
0 žádný displej
1 MDA s monochromatickým displejem
2 CGA s barevným displejem
3 rezervováno
4 EGA s barevným displejem
5 EGA s monochromatickým displejem
6 "Professional Graphics Controller"
7 VGA s analogovým monochromatickým displejem
8 VGA s analogovým barevným displejem
9 rezervováno
0AH MCGA s digitálním barevným displejem
0BH MCGA s analogovým monochromatickým displejem
0CH MCGA s analogovým barevným displejem
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1BH vrať informace o stavu a možnostech video-BIOSu
Vstup : AH=1BH
BX=typ implementace (musí být 0)
ES:DI=adresa 64-bytového bufferu
Výstup: ES:DI - do bufferu jsou zapsány informace
AL=1BH
Vrací informace o okamžitém stavu i o možnostech video-BIOSu.
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1CH uschovej/obnov stav videosystému
Vstup : AH=1CH
AL=0 vrať velikost vyrovnávací paměti
CX=požadované stavy
bit 0 - stav technického vybavení
1 - datové oblasti BIOSu
2 - stav DAC
bity 3-0Fh rezervovány
Výstup: AL=1CH
BX=velikost potřebné paměti v 64-bytových blocích
AL=1 uschovej požadované stavy
CX=požadované stavy (viz výše)
ES:BX=adresa bufferu
AL=2 obnov požadované stavy
CX=požadované stavy (viz výše)
Přerušení BIOSu Nestandardní video módy VESA standard interface
I/O Porty Video INT 10 EGA/VGA I/O Porty
Nestandardní VIDEO módy
Mód text. vel. graf. počet poč. adr. systém
rozl. font rozl. barev str. obr.
▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
14H 80x25 8x8 640x200 Lava Chrome II EGA
640x400 16 Tecmar VGA/AD
132x25 Nx16 16 XGA, IBM Enhanced VGA
15H 80x25 8x14 640x350 Lava Chrome II EGA
16H 80x25 8x14 640x350 Lava Chrome II EGA
800x600 16 Tecmar VGA/AD
17H 80x34 8x14 640x480 Lava Chrome II EGA
132x25 Tecmar VGA/AD
18H 132x44 8x8 mono Tseng Labs EVA
80x34 8x14 640x480 Lava Chrome II EGA
1024x768 16 Tecmar VGA/AD
132x44 8x8 16/256 2 B000H Tseng ET4000 chipset
80x30 9x16 720x480 16 1 A000H RealTek chipset
19H 132x25 8x14 mono Tseng Labs EVA
132x25 8x14 16/256 4 B000H Tseng ET4000 chipset
80x43 9x11 720x473 16 1 A000H RealTek chipset
1AH 132x28 8x13 mono Tseng Labs EVA
640x350 256 Tecmar VGA/AD
132x28 8x13 16/256 4 B000H Tseng ET4000 chipset
80x60 9x8 720x480 16 1 A000H RealTek chipset
1BH 640x400 256 Tecmar VGA/AD
132x25 9x16 1188x350 16 1 A000H RealTek chipset
1CH 640x480 256 Tecmar VGA/AD
132x30 9x16 1188x480 16 1 A000H RealTek chipset
1DH 800x600 256 Tecmar VGA/AD
132x43 9x11 1188x473 16 1 A000H RealTek chipset
1EH 132x60 9x8 1188x480 16 1 A000H RealTek chipset
1FH 100x75 8x8 800x600 16 1 A000H RealTek chipset
20H 120x45 8x16 960x720 16 1 A000H RealTek chipset
21H 132x43 9x9 1188x387 16 PVGA (Western Digital)
132x60 16 2 B800H Tseng ET4000 chipset
128x48 8x16 1024x768 16 1 A000H RealTek chipset
22H 132x44 8x8 Tseng Labs EVA
132x44 8x8 Ahead Systems EGA2001
132x43 Allstar Peacock (VGA)
132x44 8x8 16/256 2 B800H Tseng ET4000 chipset
132x44 8x8 16 2 B800H Ahead B
132x44 16 Orchid Prodesigner VGA
80x43 8x8 720x348 mono B800H DESQview 2.x+Hercules
96x64 8x16 768x1024 16 1 A000H RealTek chipset
23H 132x25 6x14 Tseng Labs EVA
132x25 8x14 Ahead Systems EGA2001
132x25 8x8 16 B800H ATI EGA Wonder,ATI VIP
132x28 Allstar Peacock (VGA)
132x25 8x14 16/256 4 B800H Tseng ET4000 chipset
132x25 8x14 16 4 B800H Ahead B
132x28 16 Orchid Prodesigner VGA
128x48 8x16 1024x768 4 1 A000H RealTek chipset
24H 132x28 6x13 Tseng Labs EVA
132x25 Allstar Peacock (VGA)
132x28 8x13 16/256 4 B800H Tseng ET4000 chipset
132x28 8x12 16 1 B800H Ahead B
132x25 16 Orchid Prodesigner VGA
64x32 8x16 512x512 256 1 A000H RealTek chipset
25H 80x60 8x8 640x480 Tseng Labs EVA
640x480 16 VEGA VGA
80x60 8x8 640x480 16/256 1 A000H Tseng ET4000 chipset
80x60 8x8 640x480 16 A000H Orchid Prodesigner VGA
80x60 8x8 640x480 16 1 A000H Ahead B (same as 26h)
640x480 16 NEC GB-1
80x25 8x14 640x400 256 1 A000H RealTek chipset
26H 80x60 8x8 Tseng Labs EVA
80x60 8x8 640x480 Ahead Systems EGA2001
80x60 Allstar Peacock (VGA)
80x60 8x8 16/256 2 B800H Tseng ET4000 chipset
80x60 16 Orchid ProDesigner VGA
80x60 8x8 640x480 16 1 A000H Ahead B (same as 25h)
80x30 8x16 640x480 256 1 A000H RealTek chipset
27H 720x512 16 VEGA VGA
132x25 8x8 mono B000H ATI EGA Wonder,ATI VIP
720x512 16 Genoa
100x75 8x8 800x600 256 1 A000H RealTek chipset
28H ???x??? VEGA VGA
29H 800x600 16 VEGA VGA
800x600 16 Allstar Peacock (VGA)
100x37 8x16 800x600 16 A000H Orchid,STB,Genoa,Sigma
100x37 8x16 800x600 16/256 1 A000H Tseng ET3000/4000 chipset
800x600 ??? EIZO MDB10
2AH 100x40 Allstar Peacock (VGA)
100x40 8x16 16 Orchid Prodesigner VGA
100x40 8x15 16/256 4 B800H Tseng ET4000 chipset
2DH 640x350 256 VEGA VGA
640x350 256/256k A000H Orchid, Genoa, STB
80x25 8x14 640x350 256/256k 1 A000H Tseng ET3000/4000 chipset
2EH 640x480 256 VEGA VGA
80x30 8x16 640x480 256/256k A000H Orchid,STB,Genoa,Sigma
80x30 8x16 640x480 256/256k 1 A000H Tseng ET3000/4000 chipset
2FH 720x512 256 VEGA VGA
160x50 8x8 1280x400 16 4 B800H Ahead B (Wizard/3270)
720x512 256 Genoa
80x25 8x16 640x400 256/256k 1 A000H Tseng ET4000 chipset
30H 800x600 256 VEGA VGA
100x37 8x16 800x600 256/256k A000H Orchid,STB,Genoa,Sigma
720x350 2 3270 PC
800x600 256 Cardinal
100x37 8x16 800x600 256/256k 1 A000H Tseng ET3000/4000 chipset
???x??? B800H AT&T 6300
32H 80x34 8x10 16 4 B800H Ahead B (Wizard/3270)
33H 132x44 8x8 16 B800H ATI EGA Wonder,ATI VIP
80x34 8x8 16 4 B800H Ahead B (Wizard/3270)
34H 80x66 8x8 16 4 B800H Ahead B (Wizard/3270)
36H 960x720 16 VEGA VGA
960x720 16 STB
960x720 16 jen Tseng ET3000
37H 1024x768 16 VEGA VGA
128x48 8x16 1024x768 16 A000H Orchid,STB,Genoa,Sigma
1024x768 16 Definicon
128x48 8x16 1024x768 16 1 A000H Tseng ET3000/4000
132x44 8x8 mono B000H ATI EGA Wonder,ATI VIP
38H 1024x768 256 STB VGA/EM-16 Plus (1MB)
128x48 8x16 1024x768 256/256k 1 A000H Tseng ET4000 chipset
1024x768 256 Orchid ProDesigner II
3DH 1280x1024 16 Definicon
128x64 8x16 1280x1024 16 1 A000H Tseng ET4000 BIOS v3.00[6]
3EH 1280x961 16 Definicon
40H 80x25 8x16 640x400 2 1 B800H AT&T 6300, AT&T VDC600
80x25 8x16 640x400 2 1 B800H Compaq Portable 386
80x25 8x16 640x400 2 1 B800H Compaq Portable 386
80x43 VEGA VGA, Tecmar VGA/AD
80x43 Video-7 V-RAM VGA
80x43 Tatung VGA
100x30 16 MORSE VGA
41H 640x200 16 1 AT&T 6300
132x25 VEGA VGA
132x25 Tatung VGA
132x25 Video-7 V-RAM VGA
100x50 16 MORSE VGA
42H 80x25 8x16 640x400 16 AT&T 6300, AT&T VDC600
132x43 VEGA VGA
132x43 Tatung VGA
132x43 Video-7 V-RAM VGA
80x34 9x10 4 4 B800H Ahead B (Wizard/3270)
100x60 16 MORSE VGA
43H 640x200 640x400 viewport AT&T 6300
(neověřeno !!!)
80x60 VEGA VGA
80x60 Tatung VGA
80x60 Video-7 V-RAM VGA
80x45 9x8 4 4 B800H Ahead B (Wizard/3270)
100x75 16 MORSE VGA
44H AT&T 6300
(blokuj VDC a DEB výstup)
100x60 VEGA VGA
100x60 Tatung VGA
100x60 Video-7 V-RAM VGA
45H 132x28 Tatung VGA
132x28 Video-7 V-RAM VGA
46H 100x40 8x15 800x600 2 AT&T VDC600
47H 100x37 8x16 800x600 16 AT&T VDC600
48H 80x50 8x8 640x400 2 B800H AT&T 6300, AT&T VDC600
49H 80x30 8x16 640x480 Lava Chrome II EGA
4DH 120x25 VEGA VGA
4EH 120x43 VEGA VGA
4FH 132x25 VEGA VGA
VESA standard interface
50H 132x25 9x14 mono Ahead Systems EGA2001
80x30 8x16 640x480 16 Paradise EGA-480
80x43 mono VEGA VGA
640x480 mono??? Taxan 565 EGA
80x34 Lava Chrome II EGA
80x30 8x16 640x480 16/256k B800H Trident VGA
132x25 9x14 4 4 B800H Ahead B
132x25 8x14 16 8 B800H OAK Technologies VGA-16
132x30 16 MORSE VGA
51H 80x30 8x16 Paradise EGA-480
80x30 Lava Chrome II EGA
80x34 8x14 640x480 16 ATI EGA Wonder
132x25 mono VEGA VGA
80x43 8x11 640x473 16/256k B800H Trident VGA
132x43 8x8 16 5 B800H OAK Technologies VGA-16
132x28 9x12 4 4 B800H Ahead B
132x50 16 MORSE VGA
52H 132x44 9x8 mono Ahead Systems EGA2001
132x43 mono VEGA VGA
94x29 8x14 752x410 16 ATI EGA Wonder
80x60 Lava Chrome II EGA
80x60 8x8 640x480 16/256k B800H Trident VGA
100x75 8x8 800x600 16 1 A000H OAK Technologies VGA-16
132x44 9x8 4 2 B800H Ahead B
132x60 16 MORSE VGA
53H 100x40 8x14 800x560 16 ATI EGA Wonder,ATI VIP
132x43 Lava Chrome II EGA
132x25 8x14 1056x350 16/256k B800H Trident VGA
640x480 256 Oak VGA
80x60 16 MORSE VGA
54H 132x43 8x8 Paradise EGA-480
132x43 7x9 16/256k B800H Paradise VGA
132x43 8x9 16/256k B800H Paradise VGA on multisync
132x43 Taxan 565 EGA
132x43 AST VGA Plus
132x43 Hewlett-Packard D1180A
132x43 7x9 16 AT&T VDC600
132x25 Lava Chrome II EGA
100x42 8x14 800x600 16 A000H ATI EGA Wonder, VGA Wonder
132x43 8x11 1056x473 16/256k B800H Trident VGA
132x43 9x9 1188x387 16 PVGA (Western Digital)
800x600 256 Oak VGA
55H 132x25 8x14 Paradise EGA-480
132x25 7x16 16/256k B800H Paradise VGA
132x25 8x16 16/256k B800H Paradise VGA on multisync
132x25 Taxan 565 EGA
132x25 AST VGA Plus
132x25 Hewlett-Packard D1180A
132x25 7x16 16 AT&T VDC600
80x66 8x8 16/256k A000H ATI VIP
94x29 8x14 752x410 Lava Chrome II EGA
132x25 9x16 1188x400 16 PVGA (Western Digital)
132x43 8x11 16/256k B800H Trident TVGA 8800/8900
128x48 8x16 1024x768 16/256k A000H ATI VGA Wonder v4+
1024x768 16/256h ATI VGA Wonder Plus
56H 132x43 8x8 3??? 2 B000H NSI Smart EGA+
132x43 7x9 4 B000H Paradise VGA
132x43 8x9 4 B000H Paradise VGA on multisync
132x43 mono Taxan 565 EGA
132x43 7x9 2 AT&T VDC600
132x60 8x8 1056x480 16/256k B800H Trident VGA
132x43 9x9 1188x387 mono PVGA (Western Digital)
1024x768 16 Oak VGA
57H 132x25 8x14 3??? 4 B000H NSI Smart EGA+
132x25 7x16 4 B000H Paradise VGA
132x25 8x16 4 B000H Paradise VGA on multisync
132x25 mono Taxan 565 EGA
132x25 7x16 2 AT&T VDC600
132x25 9x14 1188x350 16/256k B800H Trident VGA
132x25 9x16 1188x400 mono PVGA (Western Digital)
58H 100x75 8x8 800x600 16/256k A000H Paradise VGA
100x75 8x8 800x600 16 AT&T VDC600
80x33 8x14 16 B800H ATI EGA Wonder,ATI VIP
800x600 16 AST VGA Plus,Compaq VGA
800x600 16 Hewlett-Packard D1180A
132x30 9x16 1188x480 16/256k B800H Trident VGA
100x75 8x8 800x600 16 PVGA (Western Digital)
800x600 16 Dell VGA
800x600 ELT VGA PLUS 16
59H 100x75 8x8 800x600 2 A000H Paradise VGA, COMPAQ VGA
100x75 8x8 800x600 2 AT&T VDC600
80x66 8x8 16/256k A000H ATI VIP
800x600 2 AST VGA Plus
800x600 2 Hewlett-Packard D1180A
132x43 9x11 1188x473 16/256k B800H Trident VGA
800x600 2 Dell VGA
5AH 132x60 9x8 1188x480 16/256k B800H Trident VGA
128x48 8x16 1024x768 2 PVGA (Western Digital)
5BH 100x75 8x8 800x600 16/256k A000H Trident VGA
800x600 16 Maxxon, SEFCO TVGA, Imtec
640x350 256 Genoa 6400
80x30 8x16 B800H ATI VGA Wonder (undoc)
800x600 Vobis MVGA
5CH 80x25 8x16 640x400 256/256k A000H Trident VGA
640x400 256 Logix, ATI Prism Elite
640x400 256 Maxxon, SEFCO TVGA, Imtec
80x25 8x16 640x400 256/256k A000H Zymos Poach, Hi Res 512
640x480 256 Genoa 6400
5DH 80x30 8x16 640x480 256/256k A000H Trident VGA
128x48 8x16 1024x768 16 PVGA (Western Digital)
640x480 256 Logix, ATI Prism Elite
640x480 256 Maxxon, SEFCO TVGA, Imtec
80x30 8x16 640x480 256/256k A000H Zymos Poach, Hi Res 512
5EH 640x400 256 Paradise VGA,VEGA VGA
640x400 256 AST VGA Plus,Compaq VGA
80x25 8x16 640x400 256 AT&T VDC600
100x75 8x8 800x600 256/256k A000H Trident VGA
80x25 8x16 640x400 256 PVGA (Western Digital)
640x400 256 Compaq VGA, Dell VGA
800x600 16 Logix, ATI Prism Elite
800x600 256 Genoa 6400
100x75 8x8 800x600 256/256k A000H Zymos Poach, Trident 8900
100x75 8x8 800x600 256/256k A000H Hi Res 512
5FH 640x480 256 Paradise VGA
640x480 256 AST VGA Plus,Compaq VGA
640x480 256 Hewlett-Packard D1180A
80x30 8x16 640x480 256 AT&T VDC600 (512K)
128x48 8x16 1024x768 16/256k A000H Trident VGA
80x30 8x16 640x480 256 PVGA (Western Digital)
640x480 256 Compaq VGA, Dell VGA
80x30 8x16 640x480 256 AT&T VDC600 (512K)
1024x768 16 Logix, ATI Prism Elite
1024x768 16 Maxxon, Genoa 6400, Imtec
128x48 8x16 1024x768 16/256k A000H Zymos Poach, Hi Res 512
60H 80x??? ???x400 Corona/Cordata BIOS 4.10+
752x410 VEGA VGA
752x410 16 Tatung VGA
752x410 16 Video-7 V-RAM VGA
80x25 8x16 640x400 256 1 A000H Ahead A, Ahead B
132x25 8x14 16/64 8 B800H Quadram Ultra VGA
128x48 8x16 1024x768 4/256k A000H Trident VGA
61H ???x400 Corona/Cordata BIOS 4.10+
720x540 VEGA VGA
720x540 16 Tatung VGA
720x540 16 Video-7 V-RAM VGA
96x64 8x16 768x1024 16/256k A000H Trident VGA
80x25 8x16 640x400 256 A000H ATI VGA Wonder,VGA Wonder+
80x30 8x16 640x480 256 1 A000H Ahead A, Ahead B (512K)
132x29 8x12 16/64 8 B800H Quadram Ultra VGA
62H 800x600 VEGA VGA
800x600 16 Tatung VGA
800x600 16 Video-7 V-RAM VGA
128x48 8x16 1024x768 256/256k A000H Trident VGA
80x30 8x16 640x480 256 A000H ATI VGA Wonder,VGA Wonder+
100x75 8x8 800x600 256 1 A000H Ahead A, Ahead B (512K)
132x32 8x11 16/64 6 B800H Quadram Ultra VGA
63H 1024x768 2 Video-7 V-RAM VGA
100x42 8x14 800x600 256 A000H ATI VGA Wonder,VGA Wonder+
128x48 7x16 1024x768 256 1 A000H Ahead B (1MB)
132x44 8x8 16/64 5 B800H Quadram Ultra VGA
720x540 16 MORSE VGA
64H 1024x768 4 Video-7 V-RAM VGA
128x48 8x16 1024x768 256 A000H ATI VGA Wonder Plus
800x600 16 MORSE VGA
800x600 SAMPO-Mira VGA
65H 1024x768 16 Video-7 V-RAM VGA
128x48 8x16 1024x768 16 A000H ATI VGA Wonder
66H 640x400 256 Tatung VGA
640x400 256 Video-7 V-RAM VGA
67H 640x480 256 Video-7 V-RAM VGA
128x48 8x16 1024x768 4 A000H ATI VGA Wonder
69H 720x540 256 Video-7 V-RAM VGA
6AH 100x75 8x8 800x600 16 PVGA (Western Digital)
800x600 16 A000H VESA standard interface
800x600 16 Genoa 6400
800x600 16 A000H Ahead A
100x75 8x8 800x600 16 1 A000H Ahead B (VESA) (see 71h)
800x600 16 Zymos Poach, Hi Res 512
800x600 16 Epson LT-386SX in CRT Mode
800x600 16 Compuadd 316SL in CRT Mode
100x42 8x14 800x600 A000H ATI VGA Wonder (undoc)
6FH nastavení rozšířených módů Video-7 V-RAM VGA
70H 800x600 16 C&T chipset, Cardinal
90x28 8x14 720x392 16 1 A000H Ahead B
40x25 8x8 16 8 B800H Quadram (CGA double scan)
800x600 16 Chips & Tech Chipset
nastavení rozšířených módů Everex Micro Enhancer EGA
71H 100x35 8x16 800x600 16 z 64 A000H NSI Smart EGA+
960x720 16 C&T chipset, Cardinal
100x75 8x8 800x600 16 1 A000H Ahead B (same as 6Ah)
80x25 8x8 16 8 B800H Quadram (CGA double scan)
72H 1024x768 16 C&T chipset, Cardinal
80x60 8x8 16 B800H Quadram Ultra VGA
640x480 32768 A000H ATI
1024x768 16 Chips & Tech Chipset
73H 80x60 8x8 640x480 16 A000H Quadram Ultra VGA
640x480 16 Genoa Super EGA
74H 640x400 2 B800H Toshiba 3100 AT&T mode
128x48 8x16 1024x768 16 1 A000H Ahead A, Ahead B (512K)
80x66 8x8 16 B800H Quadram Ultra VGA
75H 128x48 8x16 1024x768 4 1 A000H Ahead B
80x66 640x528 16 A000H Quadram Ultra VGA
640x528 16 Geno Super EGA Hirez+
76H 128x48 8x16 1024x768 2 1 A000H Ahead B
94x29 8x14 16 B800H Quadram Ultra VGA
77H 94x29 752x410 16 A000H Quadram Ultra VGA
752x410 16 Genoa Super EGA Hirez+
78H 640x400 256 STB VGA/EM-16 Plus
640x400 256 Cardinal, C&T chipset
640x400 256 Chips & Tech Chipset
100x75 8x8 16 B800H Quadram Ultra VGA
79H 640x480 256 Cardinal, C&T chipset
100x75 800x600 16 A000H Quadram Ultra VGA
800x600 16 Genoa Super EGA
640x480 256 Chips & Tech Chipset
7AH 720x540 256 C&T chipset, Cardinal
114x60 8x8 16 B800H Quadram Ultra VGA
7BH 800x600 256 C&T chipset, Cardinal
114x60 912x480 16 A000H Quadram Ultra VGA
912x480 16 Genoa Super EGA Hirez+
800x600 256 Chips & Tech Chipset
7CH 512x512 16 Genoa
7DH 512x512 256 Genoa
7EH nastavení zvláštních módů Paradise VGA, AT&T VDC600
7FH nastavení zvláštních funkcí Paradise VGA, AT&T VDC600
82H 80x25 mono AT&T VDC overlay mód *
83H 80x25 AT&T VDC overlay mód *
86H 640x200 mono AT&T VDC overlay mód *
88H 90x43 8x8 720x352 mono B000H Hercules + MSHERC.COM
C0H 640x400 2/prog paleta AT&T VDC overlay mód *
C4H blokování výstupu AT&T VDC overlay mód *
D0H 640x400 2 B800H DEC VAXmate AT&T mód
* pro AT&T VDC overlay módy, BL obsahuje DEB mód, který může být 06H,
40H, nebo 44H
Seznam nad je k ničemu. Používejte VESA standard, pokud je k dispozici.
Video INT 10 VESA standard interface
VESA standard interface
Pokud jste si ještě nepřečetl kapitolu Nestandardní video módy ,
nepochopíte, jak užitečný je standard VESA. Tato zkratka reprezentuje
Video Electronic Standard Asociation. Vznikla iniciativou výrobců SVGA
karet jako odezva na vznikající nepřehlednou situaci (stručně bordel)
při inicializaci a obsluze grafických a textových módů s vyšším rozlišením.
První verze VESA, která je zde popsaná, vznikla v roce 1990 a bývá již součástí
SVGA-BIOSu. Pokud je karta starší, nechá se nainstalovat VESA ovladač od
příslušného výrobce. Některé ovladače mám, je to většinou FREEWARE.
Vesa obsazuje přerušení Video INT 10 a je vyvolána službami s AH=4Fh.
Kód funkce je uložen v AL a parametry většinou v BX. Je-li funkce podporována,
je po návratu AL=4Fh (není-li al=4F, pak není podporována). Úspěšné provedení
požadované funkce signalizuje AH=00, chyba je signalizována nenulovým AH.
AX
════ ═══════════════════════════════════════════════════════════════════════
4F00 Zjisti informace o (S)VGA
Vstup : ES:DI ukazatel na buffer dat
Výstup : je-li OK (viz výše), buffer naplněn.
Buffer : 00 DD 'VESA'
04 DW verze VESA (BCD)
06 DD ukazatel na ASCIIZ jméno výrobce
0A 4*DB vlastnosti SVGA
0E DD ukazatel na podporované videomódy (ukončen FFFF)
AX
════ ═══════════════════════════════════════════════════════════════════════
4F01 Zjisti informace o režimu
Vstup : ES:DI ukazatel na buffer dat
CX - režim SVGA
Výstup : je-li OK (viz výše), buffer naplněn.
Buffer : 00 DW MODEFLAG
15 5 4 3 2 1 0
┌────────────────────┬─┬─┬─┬─┬─┐
│ Nepoužito │G│C│B│V│T│
└────────────────────┴─┴─┴─┴─┴─┘
T - režim podporován tecnickým vybavením
V - Volitelné informace poskytnuty (viz dále)
B - BIOS podporuje režim (Putpixel ..)
C - Barevný režim
G - Grafický režim
02 DB Příznaky pro 1. přístupové okno
03 DB -//- 2. -//-
15 2 1 0
┌────────────────────────┬─┬─┬─┐
│ Nepoužito │W│R│E│
└────────────────────────┴─┴─┴─┘
E - Okno existuje
R - Lze z něj číst
W - Lze do něj zapisovat
04 DW Granularita oken v KB (zarovnávání)
06 DW Velikost okna v KB
08 DW Segment začátku 1. okna
0A DW Segment začátku 2. okna
0C DD ukazatel na proceduru pro nastavení oken (FAR)
;------------ konec povinné části ----------
;------------ dodatek jen je-li nastaven bit 2 v MODEFLAG
10 DW Rozlišení ve směru X
12 DW Rozlišení ve směru Y
14 DB Šířka matice znaku ve směru X (body)
15 DB Výška matice znaku ve směru Y (body)
16 DB Počet bitových rovin
17 DB Počet bitů na barvu
18 DB Počet paměťových bank
19 DB Použitý paměťový model
1A DB Velikost paměťového bloku v KB
Paměťový model :
00 - textový formát (char/attr/char/attr ..)
01 - CGA formát
02 - Hercules formát (po bitech, mono)
03 - Standard EGA/VGA 16 barev (tedy barva bodu kolmo podle rovin)
04 - Zhuštěný formát 1 BYTE jsou 2 body (po 4 bitech)
05 - VGA formát pro 256 barev (1 bod=1 BYTE)
06-FF nevyužito
AX
════ ═══════════════════════════════════════════════════════════════════════
4F02 Nastav režim SVGA
Vstup : BX - režim
bit 15 : 0 - smazat
1 - nechat původní obsah
BX Rozlišení Barev Paměť(KB) Text/Graf
──────────────────────────────────────────────────────────
6Ah 800x600 16 256 G
100h 640x400 16 256 G
101h 640x480 256 512 G
102h 800x600 16 256 G
103h 800x600 256 512 G
104h 1024x768 16 512 G
105h 1024x768 256 1024 G
106h 1280x1024 16 1024 G
107h 1280x1024 256 >1280 G
AX
════ ═══════════════════════════════════════════════════════════════════════
4F03 Čti aktivní režim
Výstup : BX - režim (podle tabulky nad)
AX
════ ═══════════════════════════════════════════════════════════════════════
4F04 Uložení - Nastavení stavu SVGA
Vstup : DL=0 - zjisti kolik paměti
CX - co uložit :
15 3 2 1 0
┌──────────────────────┬─┬─┬─┬─┐
│ Nepoužito │S│D│B│H│
└──────────────────────┴─┴─┴─┴─┘
S - stav SVGA (mód)
D - Stav DAC registrů
B - Stav BIOSu
H - Stav hardware (tedy i bitových rovin !)
Výstup : BX - počet 64 Byte bloků
Vstup : DL=1 - ulož stav
CX - co uložit (viz výše)
ES:BX - Buffer pro data, velikost podle fce 0
Vstup : DL=2 - obnov stav
CX - co obnovit (viz výše)
ES:BX - Buffer pro data, velikost podle fce 0
AX
════ ═══════════════════════════════════════════════════════════════════════
4F05 Připrav okno (nad 512 KB řeší přístup do dalších rovin)
Vstup : BL - okno 1 nebo 2
BH - 00 výběr okna
01 návrat okna
DX - poloha okna.
DX*granularita vrácená fcí 01 udává adresu ve video RAM, odkud se bude
promítat do příslušného okna. Někdy jsou přístupná i 2 okna. 1. mívá
segment A000, 2. segment B000.
Nestandardní video módy Video INT 10
Dos Protected Mode Interface
Snahou DPMI (podobně jako VCPI ) je umožnit programům pracovat
v PROTECTED MÓDu , přestože jsou volány / spuštěny z V86 MÓDu .
Ve V86 nelze přímo přepnout do protected - Systém ochrany , a proto
se musí použít služeb některého správce, který to milostivě povolí.
Takovým správcem byl poprvé VCPI . Vcpi předal programu řízení
počítače ÚPLNĚ - dal mu CPL =0. To od něj sice bylo moc pěkné, ale
existují i určité nevýhody :
■ Program NEMOHL nijak se správcem spolupracovat, NIC ( až na rutinu na
přepnutí zpět do V86 s ním nesdílel. ANI IDT !!! ).
■ Program s CPL =0 nešlo dost dobře táskovat - udělal si, co chtěl.
To by až zas tak nevadilo, ale Bill u Windows to prostě nepřenesl
přes srdce.
■ Nešlo třeba jen změnit položku IDT a pak se přebnout zpět do V86
a odtud volat paměťově náročné operace napsané pro PROTECTED MÓD
přímo a jednoduše instrukcí INT.
Hlavně kvůli bodu II. se vytvořil nový standard DPMI.
Zásadní odlišností proti VCPI byl v omezení práv programu spuštěném pod DPMI.
• CPL přidělené správcem není NIKDY 0. Program může být rádm když dostane
CPL =3.
• DPMI si může s programem hrát na kočku a na myš. Třeba mu nakukat, že je víc
RAM (virtualizovat), slibovat určité akce, ale ty plnit tak, aby si program
nemohl moc pískat a pod.
• Vzít program pod ním spuštěný řádně u huby.
Vlastní koncepce DPMI vychází (bohužel) z 286 procesoru, a tak už v počátku
neslibuje nic moc. Hlavní nedostatky DPMI ( pro 386 a vyšší ) jsou :
• Jen JEDNA LDT. Přitom by nebyl problém udržovat LDT víc.
• Dědictví 16 bitových procesorů 286. 16 bitové segmenty, 16 bitová adresace,
délka bloku 64KB. Dnes již sice běžně existují 32 - bitové
DPMI, ale zdaleka ne všechna. Program po zjištění, že je DPMI přítomno, ale
je to 16 uživateli sladce oznámí, že chce 32. Průměrný uživatel NEVÍ, co je
DPMI, pomyslí si něco o rozmazlenosti a program nejspíš vymaže.
Windows se nespustí, je-li instalované DPMI a není instalované VCPI . Některé
kvalitní správce paměti ( QEMM, 386MAX ) dokážou obé, ale např. spuštění DPMI
od Microsoftu, nebo od Borlandu (RTM) odpojí VCPI . Windows pak neběží.
Uživatel chce Windows, a tak odpojí DPMI. Windows běží, ale ne program psaný
pro DPMI. No dobře, budeme se chovat jako Windows a budeme podporovat VCPI.
Ale poté, co jsou Windows spuštěny je k dispozici JEN DPMI a ne VCPI .
Uživatele nikdy nenapadne nic zvrhlejšího než spouštět program střídavě pod
Windows ( DPMI bez VCPI ) a pod DOSem ( VCPI a ne DPMI ). Důsledkem je nutnost
podporovat oboje. Pak ještě na scénu přicházejí patogenní případy, kdy
v systému není přítomno ani VCPI ani DPMI - běžíme v REAL MÓDu .
I v RM jsou 2 (až 4) možnosti :
■ Je instalováno něco na způsob HIMEM. JE tedy přítomna XMS . Program
to omezuje jen v alokaci paměti. (alokace fn 09 a zamknutí fn 0c )
Přepínat módy musí program sám ( 286 tam a zpátky , 386 tam a zpátky )
■ Systém je úplně bez správy vyšší paměti. Situace je podstatně bližší
HIMEMu. Alokujeme si, co hrdlo a program ráčí. Ale musíme si sami
ohlídat A20 . To podporoval XMS ovladač.
■ V systému je užita aktivní Top-Down alokace ( 0.001%, viz BIOS INT 15 )
musíme pak jen jinak alokovat bloky v Extended paměti.
V systému je užita aktivní Bottom-Up alokace ( 0.000001%, viz BOOT INT 19 )
musíme pak jen jinak alokovat bloky v Extended paměti.
Nebo jsou tam obě. Good bye, boy.
■ Inteligentní uživatel si nainstaloval něco ve stylu SHAREWARE EMS SUPPORT.
Běží to v realu a page frame to má pod hranicí 640KB.Zabere celou Extended
a bloky přenáší BIOS INT 15 Fn 87. Extended paměť pak OPRAVDU nelze
bezpečně (bez rizika přepsání) alokovat. Naštěstí je výskyt opravdu jen
mizivý.
Kdo dobře počítal v minulém odstavci, zjistil existenci nejméně 5 různých
standardů alokace extended paměti a jejího využívání. Opravdu seriózní program
by VŠECHNY měl podporovat. To však lze jen v pohádkách. Proto se situace řeší
rázně těmito způsoby :
■ Program nepotřebuje moc alokace paměti. Napíše se tedy v REAL MÓDu .
■ Program potřebuje dost paměti na data, ale ne na kód. Napíše se tedy
v REAL MÓDu a používá XMS a EMS .
■ Program potřebuje dost paměti na data i na kód. Napíše se tedy
v REAL MÓDu , používá XMS a EMS a používá overlaye. V kritické
situaci uživatele soustavně obtěžuje hláškou "Insufficient memory by .."
■ Program potřebuje tolik paměti a tolik dat, že je nezbytné jej napsat
v protected módu. Pak ale většinou běží pod Windows jako Windows aplikace.
To jsou ale výhledy. Sám mám rád Windows jako sršně za košilí a považuji je
za poněkud rozvláčný a pomalý loader k Mine Sweeperu.
Obecné zásady pro DPMI
Kategorie služeb DPMI :
DPMI Přepínání módů
DPMI Alokace v LDT
DPMI Alokace v IDT
DPMI Alokace paměti
DPMI Správa Hardware Breakpoints
DPMI Ostatní
I Windows podporují pro své aplikace něco jako DPMI. Jedinou věc, kterou na
DPMI nechápu je název. Proč DOS ? Vždyť DOS ( do verze 6.02 ) ani pořádně
nevěděl o existenci 286 instrukcí, protected módu a dokonce ani o typu
procesoru, na kterém právě běží...........
VCPI XMS EMS DOS Fn 48
Přerušení CPU Seznam přerušení
Obecné zásady pro DPMI
• DPMI obsazuje dva vektory přerušení :
■ INT 2F - Je dostupný z V86 MÓDu a slouží ke získání informací o DPMI
Je použitelný i PROTECTED MÓDu , ale jen pod DPMI ke získání
informací o právě platném módu.
INT 2FH Fn 1687H
INT 2FH Fn 1686H
■ INT 31 - Je dostupný JEN z PROTECTED MÓDu pod DPMI. Zde jsou zpracovávány
všechny sluřby DPMI.
• DPMI sám obsluhuje přemapování IRQ
• DPMI po přepnutí nastaví všechny vektory tak, aby jejich vyvolání PM
programem pracovalo stejně jako v RM. Problémy však nastávají při
předávání parametrů v paměti.
• DPMI samo spravuje nastavování Stacku podle platného módu.
• Je-li zadáno 16 bitové používání DPMI, veškeré odkazy na data v paměti
se chápou jako XS:XX, tedy pomocí 16 bitového offsetu. I na 386.
Je-li zadáno 32 bitové používání DPMI, veškeré odkazy na data v paměti
se chápou jako XS:EXX, tedy pomocí 32 bitového offsetu.
• Kódový segment programu musí odpovídat zadanému způsobu využívání DPMI.
16 bitové využívání MUSÍ mít 16 bitový kódový segment a analogicky 32.
Jediná výjimka je po startu 32 bitového programu, kdy DPMI po přepnutí
nastaví kódový segment na 16 bitů. Program by pak měl co nejdříve nastavit
své CS na 32 bitový segment.
• 16 bitové nebo 16 bitově využívané DPMI NEMUSÍ správně nastavovat části
Deskriptorů charakteristické pro 32 bitové prostředí.
• DPMI vrací chybu operace standardně nastavením CF na 1.
• DPMI neničí registry ( kromě předávání dat ) a jeho služby jsou reentrantní
DPMI
DPMI Alokace v LDT
■ Alokace LDT Deskriptorů
───────────────────────────────────────────────────────────────────────────
Vstup: AX=0000
CX počet Deskriptorů k alokaci
Výstup: CF - signalizace chyby
AX - první Selektor
( další jsou dostupné přičtením hodnoty vrácené fcí 0003 k AX )
Pozn.: Alokované deskriptory je nutno dealokovat před ukončením programu.
■ Uvolnění selektoru
───────────────────────────────────────────────────────────────────────────
Vstup: AX=0001
BX Selektor
Výstup: CF - signalizace chyby
Pozn.: Uvolňujte jen ty selekory, které jste alokoval
■ Segment -> Deskriptor
───────────────────────────────────────────────────────────────────────────
Vstup: AX=0002
BX REAL módový segment
Výstup: CF - signalizace chyby
AX Selektor pro odpovídající RM segment
Pozn.: NEUVOLŇOVAT !
Limit 64 KB, R/W, datový
Používejte uvážlivě, alokuje LDT jednou provždy.
Dvojí vyvolání alokace téhož segmentu vrátí týž selektor
■ Selektor - Selektor vzdálenost
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0003
Výstup: CF - signalizace chyby
AX vzdálenost sousedních alokovaných selektorů po fci 0000.
( je třeba přičíst k selektoru k získání dalšího )
Pozn.: Většinou 8
■ Čti bázi deskriptoru
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0006
BX Selektor
Výstup: CF - signalizace chyby
CX:DX Lineární adresa začátku segmentu.
Pozn.: Pro 286 CH=0.
■ Nastav bázi deskriptoru
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0007
BX Selektor
CX:DX Lineární adresa začátku segmentu
Výstup: CF - signalizace chyby
Pozn.: Používejte jen pro vlastní deskriptory alokovaené fcí 0000.
■ Nastav Limit
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0008
BX Selektor
CX:DX Limit 32 bitový (16 bitové DPMI CX=0)
Výstup: CF - signalizace chyby
Pozn.: Velikost větší než 1MB musí být zarovnána na 4096 byte.
Používejte jen pro vlastní Deskriptory alokovaené fcí 0000.
Na čtení použijte instrukci LSL.
■ Nastav práva přídtupu
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0009
BX Selektor
CL - Přístupová práva
CH - 386 přístupová práva (jen 32 DPMI)
Struktura - Viz Deskriptor CL - BYTE 5
CH - BYET 6
Výstup: CF - signalizace chyby
Pozn.: Používejte jen pro vlastní deskriptory alokovaené fcí 0000.
Ke čtení použijte instrukci LAR. Pole DPL nastavte tak, aby platilo
DPL >= CPL
■ Vytvoř ALIAS segment
────────────────────────────────────────────────────────────────────────────
Vstup: AX=000A
BX Selektor kódového Deskriptoru
Výstup: CF - signalizace chyby
AX - Selektor Alias segmentu
Pozn.: Nutno odstranit před skončením.
Změny v původním deskriptoru CS se do ALIAS seg. nepromítají automaticky
Deskriptor je R/W, Limit a báze podle CS. Alias segment lze ( narozdíl
od CS ) modifikovat.
■ Čti deskriptor
────────────────────────────────────────────────────────────────────────────
Vstup: AX=000B
BX Selektor
ES:(E)DI - 8 byte buffer
Přečte celý Deskriptor do bufferu. Struktura viz Deskriptor
Výstup: CF - signalizace chyby
Pozn.: Pro 16 DPMI nejsou definovány poslední 2 BYTE. Budou asi 0.
■ Naplň deskriptor
────────────────────────────────────────────────────────────────────────────
Vstup: AX=000C
BX Selektor
ES:(E)DI buffer 8 BYTE ( obsah Deskriptoru )
Výstup: CF - signalizace chyby
Pozn.: 16 DPMI nemusí správně zpracovat poslední 2 byte.
Odpovídající deskriptor musí existovat (Fn 0000)
Používejte jen pro vlastní deskriptory.
■ Alokuj specifický Deskriptor
────────────────────────────────────────────────────────────────────────────
Vstup: AX=000D
BX Selektor Č.
Výstup: CF - signalizace chyby
Pozn.: Alokuje specifický selektor číslo BX. Nemusí se vždy povést a nemělo
by se moc používat. Lepší je psát programy, kterým je jedno, jaká
jsou čísla jejich selektorů.
Deskriptor je třeba odstranit ( Fn 0001 ) před ukončením.
Selektor Deskriptor
DPMI Obecné zásady pro DPMI
DPMI Přepínání módů
Detekce DPMI ( viz též INT 2FH Fn 1687H )
Mov ax,1687h
Int 2Fh
Or ax,ax
Jz NeDPMI
.. dpmi je přítomno ..
AX=0
BX=Příznaky DPMI. Bit 0 - 0 Jen 16 DPMI (podporuje JEN 16)
1 16 i 32 DPMI (podporuje 16 I 32)
CL=Typ procesoru 02 - 286
03 - 386
04 - 486
DH BCD vyšší číslo verze
DL BCD nižsí číslo verze
SI - Počet paragrafů v BASE paměti nutných pro DPMI
ES:DI - vstupní bod DPMI
Přepnutí do PROTECTED MÓDu :
( Nejprve je vhodné uvolnit A20 )
AX - Příznaky. 16 bitové aplikace nastaví bit 0 na 0 (DPMI 16)
32 bitové aplikace nastaví bit 0 na 1 (DPMI 32)
VELMI DŮLEŽITÉ ! Podle toho se chová celé DPMI !.
Viz Obecné zásady pro DPMI Prostředí 16/32
ES - Alokovaný segment pro DPMI velikosti SI paragrafů ( viz výše )
CALL vstupní bod ( vrácen jako es:di minulou funkcí )
Po návratu :
CF=1 Chyba. Běží stále V86 (REAL)
CF=0 OK. Běží PROTECTED MÓD
CS - Selekto 16 bitového deskriptoru kódu. I pro 32 !! ( kvůli Use16/Use32)
SS - Nastaven na místo původního Stacku v real módu, limit 64KB.
DS - -//- DS -//-
ES - Nastaven na PSP , 100h BYTE Limit.
FS, GS=0
32 bitové aplikace budou mít bity 31..16 ESP nuly.
Nyní jsou dostupné všechny služby INT 31.
Návrat do V86 (REALu) :
Mov ax,4C00h
Int 21h
Tak je to jednoduchý. Ale má to své mouchy :
■ Po provedení se ukončí celá aplikace, tedy v REAL módu už nedostanete
řízení.
■ Nelze tedu provádět mnoho užitečných věcí (např. alokovat XMS,použít jí pod
DPMI a pak ji dealokovat (není kdy).
■ Nelze napsat rezident pod DPMI.
NEDOKUMENTOVANÉ : pokud si u QEMMu nebo 386MAXe pověsíte rezidenta ( před
skokem dop PM ) na INT 21 a sledujete fci 4C00h, máte ještě šanci urvat
řízení. Lze tak ukončit TP program včetně ExitProc a uklidit po sobě ( zavřít
soubory, dealokovat XMS a EMS ... )
DPMI naštěstí ještě má i jiné prostředky na přepínání V86 <-> PM.
Definovaný tvar pro předávání registrů :
31 16 15 0
┌────────────────────────────────────┐
00 │ EDI │
├────────────────────────────────────┤
04 │ ESI │
├────────────────────────────────────┤
08 │ EBP │
├────────────────────────────────────┤
0C │ Reserved │
├────────────────────────────────────┤
10 │ EBX │
├────────────────────────────────────┤
14 │ EDX │
├────────────────────────────────────┤
18 │ ECX │
├────────────────────────────────────┤
1C │ EAX │
└──────────────────┬─────────────────┤
20 │ Flags │
├─────────────────┤
22 │ ES │
├─────────────────┤
24 │ DS │
├─────────────────┤
26 │ FS │
├─────────────────┤
28 │ GS │
├─────────────────┤
2A │ IP │
├─────────────────┤
2C │ CS │
├─────────────────┤
2E │ SP │
├─────────────────┤
30 │ SS │
└─────────────────┘
U 16 DPMI není zaručeno předání 386 specifických registrů (E.., FS, GS ).
Budou pravděpodobně obsahovat 0.
Na stacku LZE předávat parametry běžným způsobem v konvenci PASCAL i C.
■ Simuluj RM přerušení
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0300h
BL - INT č.
BH - příznaky - Bit 1 - zakaž A20 před INT
0 - nezáleží na A20
CX - Počet parametrů ke zkopírování ( ve WORDech )
ES:(E)DI - Vyplněná struktura ( viz nad, na CS a IP nezáleží )
Výstup: CF - signalizace chyby
OK - Struktura na ES:(E)DI vyplněna vyplněna podle reg po návratu
z přerušení. LZE tak zaručit správný chod i těch INTů, kde
se pracuje přímo s BASE pamětí. ( Čtení do bufferu .. )
Pozn.: Je-li SS:SP 0, DPMI nastaví vlastnéí stack. Je však mělký (80 BYTE)
O případné parametry DPMI nestará. ( Odstraňuje aplikace )
■ Zavolej RM proceduru končící RETF (n)
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0301h
BH - Příznaky jako 0300h
CX - počet WORDů ke zkopírování mezi zásobníky
ES:(E)DI - Vyplněná struktura ( viz výše )
Výstup: CF - signalizace chyby
OK - Struktura na ES:(E)DI vyplněna podle reg po návratu
Pozn.: Je-li SS:SP 0, DPMI nastaví vlastnéí stack. Je však mělký (80 BYTE)
O případné parametry DPMI nestará. ( Odstraňuje aplikace ).
Pole CS:IP musí být vyplněno na vstupní bod procedury.
■ Zavolej RM proceduru končící IRET
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0302h
BH - Příznaky jako 0300h
CX - počet WORDů ke zkopírování mezi zásobníky
ES:(E)DI - Vyplněná struktura ( viz výše )
Výstup: CF - signalizace chyby
OK - Struktura na ES:(E)DI vyplněna podle reg po návratu
Pozn.: Je-li SS:SP 0, DPMI nastaví vlastnéí stack. Je však mělký (80 BYTE)
O případné parametry DPMI nestará. ( Odstraňuje aplikace )
Pole CS:IP musí být vyplněno na vstupní bod procedury.
■ Alokuj zpětné volání (Call-Back)
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0303h
DS:(E)SI - Selektor : Offset procedury v PM, která se zavolá
z RM
ES:(E)DI - Struktura, ve které budou registry CPU (při provádění
procediry na DS:(E)SI
Výstup: CF - signalizace chyby
OK CX:DX - Segment :Offset k zavolání
Pozn.: Je-li výsledek OK, pak zavolání z RM na CX:DX (Segment : Offset )
způsobí vyvolání procedury v PM ( na DS:(E)SI ). Registry CPU po
vyvolání PM procedury budou umístěné ve struktuře na ES:(E)DI.
Po skončení této procedury se odsud registry přečtou (včetně
CS, IP, SS a SP !!) a bude se pokračovat podle nich ( v RM ).
PM procedura získá v registrech tyto údaje :
DS:(E)SI - Selektor:Offset RM Stacku
ES:(E)DI - Selektor :Offset struktury registrů
SS:(E)SP - PM stack.
PM procedura se ukončí IRET s ES:(E)DI (Selektor:Offset) nastavenými
na strukturu registrů.
CS a IP v struktuře MUSÍ být změněny - ukazují na CALL, který PM
proceduru vyvolal !
Call - Backů je omezené množství - minimálně však 16 .
■ Uvolni Call-Back
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0304h
CX:DX - RM Call-Back adresa k uvolnění
Výstup: CF - signalizace chyby
Pozn.: Šetřete Call-backy. Kdo šetří, má za tři.
■ Zjisti pozici procedury Uschovej/Obnov registry
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0305h
Výstup: CF - signalizace chyby
OK AX - Velikost Bufferu
BX:CX - Adresa ( Segment:Offset ) procedury volatelné z RM
pro uložení PM registrů.
SI:(E)DI - Adresa ( Selektor:Offset ) procedury volatelné z PM
pro uložení RM registrů.
Pozn.: Procedury by měly být volané před a po použití Raw přepnutí módů.
Některé verze DPMI je sice přímo nevyžadují, ale všechny je podporují.
V RM : ES:DI - Buffer o velikosti AX ( vrácené touto fcí )
Al 0 - ulož PM registry
Al 1 - Obnov PM registry
V PM : ES:(E)DI - Buffer o velikosti AX ( vrácené touto fcí )
Al 0 - ulož PM registry
Al 1 - Obnov PM registry
Klasicky se využívá v RM obsluze časovače.
RM obsluha časovače :
...
; chci obsloužit něco v PM,
; Uložit stav
Les di, buffer
Xor ax,ax
Call dword ptr cs:[PM_Reg]
; reg PM uloženy
; může přijít RAW mode switch RM -> PM
...........PM obsluha.....
; RAW mode switch PM -> RM
Les di, buffer
Mov al,01
Call dword ptr cs:[PM_Reg]
; obnoveny PM registry
...... pokračuje obsluha časovače ....
■ Zjisti pozici procedur RAW mode switch
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0306h
Výstup: CF - signalizace chyby
OK BX:CX - Adresa ( Segment:Offset ) procedury volatelné z RM
pro přepnutí do PM
SI:(E)DI - Adresa ( Selektor:Offset ) procedury volatelné z PM
pro přepnutí do RM
Pozn.: Na uvedené adresy JMP FAR.
Parametry procedur :
AX - Nové DS
CX - Nové ES
DX - Nové SS
(E)BX - Nové (E)SP
SI - Nové CS
(E)DI - Nové (E)IP
Ostatní registry zničí.
Před JMP Far uložte registry příslušného módu.
DPMI Obecné zásady pro DPMI
Selektor Deskriptor
PROTECTED MÓD REAL MÓD V86 MÓD
DPMI Alokace paměti
■ Alokuj blok DOS paměti
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0100h
BX Počet paragrafů ( 16-tic bytů )
Výstup: CF - signalizace chyby
OK : AX - REAl módový segment alokovaného bloku
DX - Selektor alokovaného bloku
Chyba :AX - kód chyby (08 - nedostatek paměti)
BX - maximum paragrafů.
Pozn.: Je-li alokováno >64KB, další selektor se získá stejně jako u
funkce 00 - DPMI Alokace v LDT
Alokované deskriptory budou ve stylu 286.
Deskriptory nedealokujte funkcí 0001. Provede se to automaticky
při uvolňování paměti.
■ Uvolni blok DOS paměti
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0101h
BX Selektor bloku k uvolnění
Výstup: CF - signalizace chyby
Pozn.: Automaticky odstraní všechny deskriptory alikované při alokaci
paměti (0100h)
■ Změna velikosti bloku
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0102h
BX Požadovaná velikost
DX Selektor bloku
Výstup: CF - signalizace chyby
Pozn.: Vlastnosti totožné s funkcí 0100h
■ Zjisti velikost paměti
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0500h
ES:(E)DI Selektor:Offset pro buffer 30h byte
Výstup: CF - signalizace chyby
OK - Buffer vyplněn
00h Velikost největšího volného bloku (byte)
04h Maximální alokace nezamknutých stránek (virualizovaných)
08h Maximální alokace zamknutých stránek (nevirualizovaných)
0Ch Velikost lineárního adresního prosturu ve stránkách
10h Celkem nezamknutých stránek
14h Celkem volných stránek
18h Celkem fyzických stránek
1Ch Velikost volného lineárního adresního prosturu ve stránkách
20h Velikost souboru pro virtualizaci ve stránkách
24h-2Fh Reserved
Pozn.: Není-li podpora virtualizace, vyplní se jen 1. položka.
Ostatní budou -1.
■ Alokuj blok paměti
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0501h
BX:CX - velikost v BYTEch
Výstup: CF - signalizace chyby
OK - BX:CX Lineární adresa bloku
SI:DI - HANDLE pro uvolnění
Pozn.: Selektory pro přidělenou paměť si musí program alokovat sám.
Často se používá zarovnávání. Alokujte proto velikosti dělitelné 4096.
■ Uvolni blok paměti
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0502h
SI:DI HANDLE bloku (vrácené fcí 0501h)
Výstup: CF - signalizace chyby
Pozn.: Selektory pro daný blok paměti je třeba odstranit ( Fce 0001 )
■ Změna velikosti bloku
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0503h
BX:CX - nová velikost bloku
SI:DI Handle vrácené fcí 0501h
Výstup: CF - signalizace chyby
OK SI:DI nové handle
BX:CX nová velikost
Pozn.: Nemusí si odpovídat Lineární adresa bloku před a po volání této funkce
Chybu signalizuje BX:CX = 0
■ Uzamkni blok paměti
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0600h
BX:CX Lineární adresa bloku
SI:DI - velikost v bytech
Výstup: CF - signalizace chyby
Pozn.: Zamknuté bloky nemohou být virtualizovány.
Zámykat lze násobně, ale i odemykat se pak musí násobně.
Blok by měl být úplně odemknut před uvolněním.
Zamyká se vždy celá stránka (4096 byte)
■ Odemkni blok paměti
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0601h
BX:CX Lineární adresa bloku
SI:DI délka k odemknutí
Výstup: CF - signalizace chyby
Pozn.: viz 0600h
■ Označ blok DOS paměti jako stránkovatelný
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0602h
BX:CX - Lineární adresa bloku
SI:DI - velikost
Výstup: CF - signalizace chyby
Pozn.: Hodí se ke zvětšení bloku lineární paměti. Před ukončením aplikace
je třeba opět zrušit. Jako stránkovatelou je možno označit tu paměť.
v 1. MB, kterou vlastníte a která není použita během INT.
■ Odznač blok DOS paměti jako stránkovatelný
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0603h
BX:CX - Lineární adresa bloku
SI:DI - velikost
Výstup: CF - signalizace chyby
Pozn.: viz 0602h
■ Zjisti velikost stránky
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0604h
Výstup: CF - signalizace chyby
BX:CX - velikost stránky v BYTEch
Pozn.: Vrátí se (asi) 4096.
■ Označ blok paměti jako zřídka užívaný
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0702h
BX:CX - Lineární adresa bloku
SI:DI - velikost
Výstup: CF - signalizace chyby
Pozn.: Označí blok paměti jako zřídka užívaný a informuje OS,
že jej může bezproblémově swapovat na disk.
Šetří pamětí a umožní optimalizovat výkon systému. Ne všechna DPMI
podporují.
■ Odznač blok paměti jako zřídka užívaný
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0703h
BX:CX - Lineární adresa bloku
SI:DI - velikost
Výstup: CF - signalizace chyby
Pozn.: Odznačí blok paměti jako zřídka užívaný a informuje OS,
že by jej radši viděl v RAM.
DPMI Obecné zásady pro DPMI
Lineární adresa Fyzická adresa VCPI XMS EMS
DPMI Alokace v IDT
■ Čti REAL módový vektor
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0200h
BL číslo
Výstup: CF - signalizace chyby
CX:DX - ! SEGMENT ! :Offset
■ Nastav REAL módový vektor
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0201h
BL - číslo INTu
CX:DX - ! SEGMENT ! :Offset
Výstup: CF - signalizace chyby
■ Zjisti ovladač výjimky (Exception handler)
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0202h
BL číslo výjimky (0 - 1Fh ) Přerušení CPU
Výstup: CF - signalizace chyby
CX:(E)DX - Selektor : Offset obslužné rutiny
Pozn.: DX pro 16 DPMI, EDX pro 32 DPMI
■ Nastav ovladač výjimky (Exception handler)
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0203h
BL - číslo výjimky (0-1F) Přerušení CPU
CX:(E)DX - Selektor : Offset obslužné rutiny
Výstup: CF - signalizace chyby
Pozn.: DX pro 16 DPMI, EDX pro 32 DPMI
Řízení se k rutině dostane až když si obsluha DPMI neví rady.
Vrací se RETF, musí se uchovat všechny registry.
Mělo by se řetězit podle následddujícího schématu :
Odstranil jsem chybu -> RETF
Neodstranil jsem -> JMP FAR na původní obsluhu získanou fn 0202h
Na stacku nalezne chybový kód a umístění chyby. To lze samozřejmě
změnit. Zde pracující rutina dostrane CPL =0 !!!
Tvar zásobníku :
16 DPMI 32 DPMI
15 0 31 0
├────────────┤ ├──────────────┬─────────────┤
│ SS │ │ 000000000000 │ SS │
├────────────┤ ├──────────────┴─────────────┤
│ SP │ │ ESP │
├────────────┤ ├────────────────────────────┤
│ Flags │ │ EFLAGS │
├────────────┤ ├──────────────┬─────────────┤
│ CS │ │ 000000000000 │ CS │
├────────────┤ ├──────────────┴─────────────┤
│ IP │ │ EIP │
├────────────┤ ├──────────────┬─────────────┤
│ Ch.Kód │ │ 000000000000 │ Ch.Kód │
├────────────┤ ├──────────────┼─────────────┤
│ RET CS │ │ 000000000000 │ RET CS │
├────────────┤ ├──────────────┴─────────────┤
│ RET IP │ │ RET EIP │
SS:SP -> SS:ESP ->
Chybový kód nalesznou na stacku obsluhy všech výjimek, platný je však
jen pro INT 08 INT 0A INT 0B INT 0C INT 0D a INT 0E . Ostaní
(asi) naleznou 0.
■ Čti položku IDT
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0204h
BL - číslo INT
Výstup: CF - signalizace chyby
CX:(E)DX - Selektor : Offset obslužné rutiny
Pozn.: DX pro 16 DPMI, EDX pro 32 DPMI
■ Nastav položku IDT
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0205h
BL - číslo INT
CX:(E)DX - Selektor : Offset obslužné rutiny
Výstup: CF - signalizace chyby
Pozn.: DX pro 16 DPMI, EDX pro 32 DPMI
DPMI Obecné zásady pro DPMI
Selektor DOS Fn 25 DOS Fn 35 Deskriptor
DPMI Ostatní
■ Čti verzi
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0400h
Výstup: CF - vždy 0. Nemůže selhat (prý).
AH - BCD vyšší číslo verze
AL - BCD nižší číslo verze
BX - Bit 0 0: 16 DPMI
1: 32 DPMI
Bit 1 0: Procesor se vrací do RM
1: Procesor se vrací do V86 RM
Bit 2 - Podpora virtualizace paměti
Ostatní rezervovány.
CL - Procesor 02 = 80286
03 = 80386
04 = 80486
DH - Mapování prvních 8 IRQ ( základní vektor )
DL - Mapování druhých 8 IRQ ( základní vektor )
■ Zjisti lineární adresu
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0800h
BX:CX - Fyzická adresa
SI:DI - velikost
Výstup: CF - signalizace chyby
OK BX:CX - Lineární adresa
Pozn.: Provede přepočet Fyzická adresa -> Lineární adresa. Pro potřeby nalezení
specifické RAM nebo ROM.
■ Zakaž interrupty
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0900h
Výstup: CF - signalizace chyby
OK Al - minulý stav IF
Pozn.: Instrukce STI a CLI jsou pro CPL > IOPL zakázané. Tato funkce je
supluje.
■ Povol interrupty
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0901h
Výstup: CF - signalizace chyby
OK Al - minulý stav IF
Pozn.: Instrukce STI a CLI jsou pro CPL > IOPL zakázané. Tato funkce je
supluje.
■ Zjisti interrupty
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0902h
Výstup: CF - signalizace chyby
OK Al - stav IF
Pozn.: Instrukce STI a CLI jsou pro CPL > IOPL zakázané. Tato funkce je
supluje.
■ Zjisti rozšíření DPMI
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0A00h
Výstup: CF - signalizace chyby
OK ES:(E)DI vstupní bod rozšířeného DPMI
Pozn.: ????
DPMI Obecné zásady pro DPMI
Systém ochrany
DPMI Správa Hardware Breakpoints
Tyto funkce umožňují práci s Hardware Breakpoints , které jsou jinak pro
CPL >0 tabu. Jen pro 386 a vyšší.
■ Nastav HB
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0B00h
BX:CX - lineární adresa
DL - Velikost breakpointu 1 BYTE, 2 WORD, 4 DWORD
DH - Typ 0 - Výběr instrukce
1 - Zápis
2 - Čtení/Zápis
Výstup: CF - signalizace chyby
OK DX - HANDLE HB ( jeho číslo 0..3 )
Pozn.: Viz Hardware Breakpoints
■ Uvolni HB
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0B01h
BX - HB handle
Výstup: CF - signalizace chyby
Pozn.: Viz Hardware Breakpoints
■ Čti HB
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0B02h
BX - HB handle
Výstup: CF - signalizace chyby
OK AX - Bit 0 = 1 HB byl vyvolán
■ Resetuj HB
────────────────────────────────────────────────────────────────────────────
Vstup: AX=0B03h
BX - HB handle
Výstup: CF - signalizace chyby
Pozn.: vynuluje AL pro 0B02h
DPMI Obecné zásady pro DPMI
Systém ochrany Hardware Breakpoints
I/O PORTY
Obecně:
■ Porty 000H-0FFH jsou vyhrazeny pro řadiče na motherboardu
■ Porty 100H-3FFH jsou směrovány na I/O sběrnici, do adaptérů
■ Porty 400H a vyšší nejsou na systémové sběrnici přístupny. Přesněji
řečeno, na motherboardu je použito jen prvních 10 linek kontrolní
sběrnicem takže adresy portů vyšší než 400h se cyklicky promítají zpět
( and 3FFh ).
V následující tabulce je přehled portů použitých v PC/XT a AT.
Podrobnější informace k jednotlivým portům viz odkazy nebo specializovaná
literatura (česky např. Pavel Valášek: Monolitické mikroprocesory a
mikropočítače, SNTL 1989). Adresy portů jsou v hexa.
AT PC/XT Popis Další informace
▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
000-01F 000-00F 1. DMA řadič 8237A-5 Porty DMA
020-03F 020-021 1. řadič přerušení 8259A Porty PIC
040-05F 040-043 časovač 8253-5 (AT: 8254.2). Porty PIT
060-063 PPI (Programmable Peripheral Interface)
klávesnice, přepínače, časovač Porty PPI
060-06F řadič klávesnice 8042 a PPI AT klávesnice
070-07F reálný čas, hodiny, CMOS, NMI CMOS
080 diagnostika
080-09F 080-083 registry stránkování DMA 74LS612 Porty DMA
0A0 maska NMI (Non-maskable Interrupt)
0A0-0BF 2. řadič přerušení 8259A Porty PIC
0C0-0DF 2. řadič DMA 8237A-5 Porty DMA
0F0-0FF Matematický koprocessor
170-177 2. hard disk AT Porty AT HD
1F0-1F7 1. hard disk AT Porty AT HD
200-207 200-20F Game I/O (joystick A/D port) Porty joysticku
210-217 Adaptér "Expansion Box"
278-27F 278-27F 2. paralelní port (3. s MDA) Paralelní porty
2C0-2DF 2C0-2DF 2. EGA EGA/VGA I/O porty
2F8-2FF 2F8-2FF 2. asynchronní adaptér Sériové porty
300-31F Adaptér "Prototype card"
320-32F Hard disk XT Porty XT HD
370-377 2. řadič diskety Porty FDC
378-37F 378-37F 1. paralelní port (2. s MDA) Paralelní porty
380-38F 380-38F řadič datové synchronní linky (SDLC)
3A0-3AF 3A0-3A9 1. bisynchronní porty
3B0-3DF 3B0-3DF VGA EGA/VGA I/O Porty
3B0-3BF 3B0-3BF MDA/1. paralelní port Paralelní porty
210-217 Adaptér "Expansion Box"
3C0-3CF 3C0-3CF 1. EGA EGA/VGA I/O Porty
3D0-3DF 3D0-3DF CGA a EGA/VGA CGA I/O Porty
3F0-3F7 3F0-3F7 1. řadič diskety Porty FDC
3F8-3FF 3F8-3FF 1. asynchronní adaptér Sériové porty
──────────────────────────────────────────────────────────────────────────
Viz též: Datová oblast BIOSu Kabely Přerušení BIOSu
PORTY DMA
DMA (Direct Memory Access) je vysokorychlostní přenos dat mezi I/O
zařízením a pamětí bez zásahu CPU. Typicky je použit při přenosu dat
z diskety nebo hard disku do paměti a obráceně, ale lze jej použít i pro
streamer (pásku) nebo velké paměťové přesuny apod.
Originální PC podporovalo čtyři osmibitové DMA kanály s 20-bitovým
adresovým prostorem řízeným řadičem Intel 8237A. AT podporuje 8 DMA
kanálů (0-7) se dvěmi řadiči 8237A-5 zapojenými v kaskádě (většinou na
kanále 4).
Rozdíly mezi DMA na PC a AT se projevují na konci tabulky.
Kanál Použití v PC a XT
▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 obnova paměti (refresh) nejvyšší priorita
1 volný
2 řadič diskety
3 řadič hard disku nejnižší priorita
──────────────────────────────────────────────────
Kanál Použití na AT a PS/2
▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 volný ─┐
1 SDLC (Synchronous Data Link Control) ╞═ 8-bitové DMA kanály
2 řadič diskety │
3 řadič hard disku ─┘
4 kaskáda (2. řadič) ─┐
5 volný ╞═ 16-bitové DMA kanály
6 volný │
7 volný ─┘
────────────────────────────────────────────────────────────────────────
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
000H-007H bázová adresa DMA offsetových registrů
Všechny registry jsou 16-bitové: zapište nebo přečtěte dolní byte a
potom horní byte ze stejného I/O portu. Bázové adresy jsou offsety
DMA stránek (viz níže).
000H Zápis: bázová adresa DMA kanálu 0 (také nastavení běžné adresy)
Čtení: běžná adresa DMA kanálu 0
001H Zápis: bázová adresa a počet slov DMA kanálu 0
Čtení: běžný počet slov DMA kanálu 0
002H Zápis: bázová adresa DMA kanálu 1
Čtení: běžná adresa DMA kanálu 1
003H Zápis: bázová adresa a počet slov DMA kanálu 1
Čtení: běžný počet slov DMA kanálu 1
004H Zápis: bázová adresa DMA kanálu 2 (řadič diskety)
Čtení: běžná adresa DMA kanálu 2 "
005H Zápis: bázová adresa a počet slov DMA kanálu 2 "
Čtení: běžný počet slov DMA kanálu 2 "
006H Zápis: bázová adresa DMA kanálu 3 (řadič hard disku)
Čtení: běžná adresa DMA kanálu 3 "
007H Zápis: bázová adresa a počet slov DMA kanálu 3 "
Čtení: běžný počet slov DMA kanálu 3 "
008H-00FH řídící a stavové registry DMA
008H Zápis: příkazový registr DMA
╓7┬6┬5┬4┬3┬2┬1┬0╖ Poznámka: Nedoporučuji měnit nastavení
║ │ │ │ │ │ │ │ ║ bitů 3-5 !
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit
║ ║ ║ ║ ║ ║ ║ ╚═ 0: 1 = povol operaci paměť-paměť přez DMA
║ ║ ║ ║ ║ ║ ║ (ch0 ◄═ ch1) - nepoužívejte na PC !
║ ║ ║ ║ ║ ║ ╚═══ 1: 1 = povol držení adresy Ch0 -
║ ║ ║ ║ ║ ║ - nepoužívejte na PC !
║ ║ ║ ║ ║ ╚═════ 2: 1 = blokuj řadič
║ ║ ║ ║ ╚═══════ 3: 1 = nastav zkomprimovaný časovací mód
║ ║ ║ ╚═════════ 4: 1 = povol rotaci priority
║ ║ ╚═══════════ 5: 1 = nastav rozšířený zápisový mód
║ ║ 0 = pozdější zápis
║ ╚═════════════ 6: 1 = nastav citlivost na vysokou úroveň DREQ
║ 0 = nastav citlivost na nízkou úroveň DREQ
╚═══════════════ 7: 1 = nastav citlivost na vysokou úroveň DACK
0 = nastav citlivost na nízkou úroveň DACK
Čtení: stavový registr DMA
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │ │ │ ║
╙─┴─┴─┴─┴─┴─┴─┴─╜ bit
╚══╦══╝ ╚═════╩═ 0-3: kanál 0-3 požadavek ukončen
╚════════════ 4-7: kanál 0-3 vykonává požadavek
009H Zápis: registr požadavků
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ unused │ │ ║
╙─┴─┴─┴─┴─┴╥┴─┴─╜ bit
║ ╚═╩═ 0-1: výběr kanálu (00=0; 01=1; 10=2; 11=3)
╚═════ 2: 1 = nastav bit požadavku pro kanál
0 = resetuj bit požadavku pro kanál
00AH Zápis: registr maskovacích bitů
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ unused │ │ ║
╙─┴─┴─┴─┴─┴╥┴─┴─╜ bit
║ ╚═╩═ 0-1: výběr kanálu (00=0; 01=1; 10=2; 11=3)
╚═════ 2: 1 = nastav masku pro kanál
0 = smaž masku (povol)
00BH Zápis: registr módu
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │ │ │ ║
╙─┴─┴╥┴╥┴─┴─┴─┴─╜ bit
╚╦╝ ║ ║ ╚╦╝ ╚═╩═ 0-1: vyběr kanálu (00=0; 01=1; 10=2; 11=3)
║ ║ ║ ╚══════ 2-3: typ přenosu:
║ ║ ║ 00 = verifikace
║ ║ ║ 01 = zápis
║ ║ ║ 10 = čtení
║ ║ ╚═════════ 4: 1 = povol autoinicializaci
║ ╚═══════════ 5: 1 = inkrementace adresy
║ 0 = dekrementace adresy
╚══════════════ 6-7: 00 = požadavkový mód
01 = jednotlivý mód
10 = blokový mód
11 = kaskádový mód
00CH Zápis: smaže přepínač bytů
Jakýkoliv OUT způsobí výmaz FLIP-FLOP přepínače, takže
další zápis do 16-bitových registrů je dekódován jako dolní
byte. Následuje horní byte, pak dolní byte,...
00DH Zápis: hlavní výmaz
Jakýkoliv OUT vymaže nastavení, vše musí být znovu
inicializováno.
00EH Zápis: výmaz maskovacího registru
Jakýkoliv OUT způsobí povolení všech čtyř kanálů.
00FH Zápis: hlavní maskovací registr
Nastavení nebo maskování všech nebo jednoho z kanálů.
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ ║
╙─┴─┴─┴─┴╥┴╥┴╥┴╥╜ bit
║ ║ ║ ╚═ 0: 1 = nastav maskovací bit pro 0. kanál
║ ║ ║ 0 = smaž maskovací bit pro 0. kanál
║ ║ ╚═══ 1: 1 = nastav maskovací bit pro 1. kanál
║ ╚═════ 2: 1 = nastav maskovací bit pro 2. kanál
╚═══════ 3: 1 = nastav maskovací bit pro 3. kanál
Čtení: dočasný registr - lze přečíst poslední byte při přenosu
paměť-paměť (na PC nepoužito)
081H-08FH registry stránek DMA
Pro nastavení počáteční adresy pro DMA operace proveďte OUT do
registru stránky pro vybraný kanál a pak nastavte bázovou adresu
pro daný kanál. Jinak řečeno, DMA registry jsou pouze 16-tibitové
a adresace probíhá na 20-ti bitech (když sečtete segment a offset,
dostanete 20 bitů !). Takže v reálném módu je dolních 16 bitů adresy
zapsáno na kanál 00H-07H a horní 4 bity na kanál 81H-8FH. Na AT
a PS/2 je využito všech 8 bitů kanálů 81H-8FH, adresováno je totiž
128KB (64KB slov) na 24 bitech.
081H stránkový registr pro kanál 2
082H stránkový registr pro kanál 3
083H stránkový registr pro kanál 1
087H stránkový registr pro kanál 0
089H stránkový registr pro kanál 6
08AH stránkový registr pro kanál 7
08BH stránkový registr pro kanál 5
08FH stránkový registr pro kanál 4 (refresh)
──────────────────────────────────────────────────────────────────────────
0C0H-0DFH registry pro 16-tibitové přenosy DMA na AT.
Kanály 0-3 pracují s 8 bity jako na PC, kanály 4-7 podporují
16-tibitové I/O operace. Přenos začíná vždy na adrese slova a
veškeré adresování a počítání se týká 16-tibitových slov (tj.
bázová adresa 123H ukazuje na offset 246H stránky pro kanál).
0C0H bázová adresa a počet slov DMA kanálu 4 (bity 1-16, bit 0 je vždy 0)
0C2H běžný počet slov DMA kanálu 4
0C4H bázová adresa a počet slov DMA kanálu 5 (bity 1-16, bit 0 je vždy 0)
0C6H běžný počet slov DMA kanálu 5
0C8H bázová adresa a počet slov DMA kanálu 6 (bity 1-16, bit 0 je vždy 0)
0CAH běžný počet slov DMA kanálu 6
0CCH bázová adresa a počet slov DMA kanálu 7 (bity 1-16, bit 0 je vždy 0)
0CEH běžný počet slov DMA kanálu 7
0D0H-0DFH řídící a stavové registry AT DMA
0D0H Zápis: registr příkazů
Čtení: stavový registr
0D2H Zápis: registr požadavku
0D4H Zápis: registr maskovacích bitů
0D6H Zápis: registr módu
0D8H Výmaz FLIP-FLOP bytového přepínače
0DAH Zápis: hlavní výmaz
Čtení: dočasný registr
0DCH Výmaz maskovacího registr
0DEH Zápis: registr všech maskovacích bitů
──────────────────────────────────────────────────────────────────────────
Pozn.: Správce paměti jako QEMM, 386 MAX a podobné, které podporují UMB
a přestránkovávají paměť musejí ovkádat porty a požadavky na DMA, aby
se shodl procesor i DMA na přrpočtu Lineární adresa -> Fyzická adresa
Viz též: I/O porty Seznam přerušení
PORTY PROGRAMOVATELNÉHO ŘADIČE PŘERUŠENÍ 8259A
Řadič 8259A (Programmable Interrupt Controller) řídí až 8 úrovní přerušení
a předává je procesoru v pořadí jejich priority. Vždy je vykonáváno
přerušení s nejnižším číslem (nejvyšší priorita). Hardwarová přerušení
(IRQ 0 - 7) 8259A jsou spojena s přerušeními 08H - 0FH. Přerušení IRQ 0
má nejvyšší prioritu, IRQ 7 nejnižší. Jednotlivá přerušení mohou být
individuálně povolena nebo zakázána nastavením bitové masky 8259A.
Rutina obsluhující dané přerušení je zodpovědná za sdělení 8259A, kdy
může být vyvoláno další přerušení. To se provede vysláním bytu 20H
na port 20H:
MOV AL,20H
OUT 20H,AL
V IBM PC/AT jsou dva řadiče 8259A v kaskádě, takže mohou obsluhovat 16
různých přerušení (IRQ 0 - 15, druhá osma je svázána s přerušeními 70H
až 77H).
IRQ Použití
▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 Časovač INT 08
1 Klávesnice INT 09
2 EGA - INT 0A
3 COM - INT 0B
4 COM - INT 0C
5 LPT - INT 0D
6 Floppy - INT 0E
7 LPT - INT 0F
8 INT 70 Hodiny reálného času (AT/XT286/PS)
9 INT 71 1. adaptér LAN (AT/XT286/PS, BIOS jej
přesměrovává na INT 0AH)
10 INT 72 Rezervováno (AT/XT286/PS)
11 INT 73 Rezervováno (AT/XT286/PS)
12 INT 74 myš (AT/XT286/PS)
13 INT 75 chyba X87 (AT/XT286/PS, BIOS jej
přesměrovává na INT 02 )
14 INT 76 Hard disk (AT/XT286/PS)
15 INT 77 Rezervováno (AT/XT286/PS)
─────────────────────────────────────────────────────────────────
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
020H 8259A příkazový port
Vyšlete na tento port 20H jako signál ukončení přerušení
(end-of-interrupt, EOI).
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖
║ R│ L│ E│ 0│ 0│ úroveň ║
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
║ ║ ║ ║ ║ ╚══╩══╩═ 0-2: Úroveň přerušení (je-li bit 6 = 1)
║ ║ ║ ║ ╚══════════ 3: vždy 0
║ ║ ║ ╚═════════════ 4: vždy 0
║ ║ ╚════════════════ 5: mód EOI
║ ╚═══════════════════ 6: nastav úroveň přerušení
╚══════════════════════ 7: mód rotace
Bity 7-5: Tyto bity definují mód rotace, konec přerušení nebo
kombinaci obojího:
765 Význam
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
000 Rezervováno
001 Nespecifický příkaz End-of-Interrupt
010 Nic (NOP)
011 Specifický příkaz End-of-Interrupt
(bity 2-0 určují přerušení, které má být
ukončeno)
100 Rezervováno
101 Rotace nespecifického příkazu End-of-Interrupt
110 Příkaz Nastav prioritu
(bity 2-0 určují přerušení, které má být
preferováno)
111 Rotace specifického příkazu End-of-Interrupt
────────────────────────────────────────────────────
021H 8259A Registr masky přerušení
0 = přerušení povoleno, 1 = přerušení zakázáno:
021H 8259A Registr masky přerušení
0 = přerušení povoleno, 1 = přerušení zakázáno:
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖
║ 7│ 6│ 5│ 4│ 3│ 2│ 1│ 0║
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
║ ║ ║ ║ ║ ║ ║ ╚═ 0: IRQ 0 - systémový časovač
║ ║ ║ ║ ║ ║ ╚════ 1: IRQ 1 - klávesnice
║ ║ ║ ║ ║ ╚═══════ 2: IRQ 2 - globální povolení I/O kanálu
║ ║ ║ ║ ╚══════════ 3: IRQ 3 - sériový port COM2: přes I/O kanál
║ ║ ║ ╚═════════════ 4: IRQ 4 - sériový port COM1: přes I/O kanál
║ ║ ╚════════════════ 5: IRQ 5 - hard disk přes I/O kanál
║ ╚═══════════════════ 6: IRQ 6 - řadič disku přes I/O kanál
╚══════════════════════ 7: IRQ 7 - paralelní port přes I/O kanál
──────────────────────────────────────────────────────────────────────────
Viz též: I/O porty
PORTY PROGRAMOVATELNÉHO ČASOVAČE 8253-5
Řadič 8253-5 (Programmable Interval Timer) obsahuje tři nezávislé
programovatelné časovače. Lze je použít v několika režimech práce.
Podrobnější informace naleznete v Intel Microprosessors and Peripherals
Handbook.
Tyto tři časovače jsou použity takto:
Kanál Použití
▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 Systémový časovač (INT 08H)
1 Obnova (refresh) paměti
2 Kazetopásková jednotka a reproduktor
─────────────────────────────────────────────
Frekvence časovače 8253-5 1.193180 MHz je odvozena z frekvence systémových
hodin 4.772727 MHz, která je výsledkem dělení frekvence krystalu 14.3178
MHz. Tato frekvence je výsledkem přerušovací frekvence, která se pohybuje
mezi 838 ns (odpovídá jednomu cyklu sběrnice nebo čtyřem strojovým cyklům
procesoru 8088) a 54.925493 ms určenými dělitelem v rozsahu 1 až 65535.
Chcete-li použít dělitel 65536, použijte dělitel 65535 a následně 0.
Chcete-li nastavit poměr přerušení, zapište dělitel na port pro daný kanál
(40H - 42H). Dělitel vypočtete tak, že vydělíte 1193180 požadovanou
frekvencí. Např. MS-BASIC používá dělitel 16384 pro nastavení
1193180 / 16384 = 72.826 přerušovacích cyklů za vteřinu (tzn. přerušení
bude vyvoláno každých 13.73 ms) ve svých "hudebních" funkcích.
Pro přečtení LSB/MSB dělitele nastavte odpovídající bity na portu 43H.
Aby byly operace nastaveny korektně, musí být přečteny a zapsány oba
byty (LSB i MSB) dělitele !
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
040H 8253-5 Kanál 0
Použit pro systémový Časovač INT 08 pomocí přerušení IRQ 0
řadiče 8259A. Použijte dělitel 0 (65536) k nastavení 18.20648193
přerušení za vteřinu (každých 54.925493 ms). Na přerušení INT 08H
je založeno také časování motoru disku. Operuje v módu 3 (viz port
043H).
Z tohoto kanálu lze získat pseudonáhodná čísla, aniž by byl narušen
režim čítání:
MOV AL,0
OUT AL,43H
IN 40H,AL
MOV AH,AL
IN 40H,AL ; 16-bitové náhodné číslo je v AX
041H 8253-5 Kanál 1
Použit pro časování obnovovacích cyklů paměti (refresh). Operuje
v módu 2 (viz port 043H) s dělitelem 18, vyvolává přerušení
řadiče 8259A každých 15.08 ms. Nedoporučuji jakýkoliv zásah
(může dojít ke zhroucení počítače a chybě parity).
042H 8253-5 Kanál 2
Použit pro ovládání kazetopáskové jednotky a reproduktoru. Napojení
na reproduktor je prostřednictvím portu 061H řadiče 8255A-5.
043H 8253-5 Řízení módu
Použit jen pro řízení módů 2 a 3.
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖
║ kan.│ div.│ módy │č.║
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
╚══╣ ╚══╣ ╚══╩══╣ ╚═ 0: 0 = binární mód (v PC vždy binární)
║ ║ ║ 1 = BCD mód
║ ║ ╚════ 1-3: 000 = mód 0: čítání dolů s volitelnou
║ ║ citlivostí (úrovňový výstup)
║ ║ 001 = mód 1: čítání dolů s volitelným
║ ║ restartem (úrovňový výstup)
║ ║ 010 = mód 2: generování pulsu po N cyklech
║ ║ (použito pro obnovování DMA
║ ║ paměti kanálem 1)
║ ║ 011 = mód 3: generování kvadratické vlny
║ ║ (použito kanály 0 and 2)
║ ║ (použito pro obnovování DMA
║ ║ paměti kanálem 1)
║ ║ paměti kanálem 1)
║ ║ 011 = mód 3: generování kvadratické vlny
║ ║ (použito kanály 0 and 2)
║ ║ (použito pro obnovování DMA
║ ║ paměti kanálem 1)
║ ║ 100 = mód 0: čítání dolů s volitelnou
║ ║ citlivostí (pulsní výstup)
║ ║ 101 = mód 1: čítání dolů s volitelným
║ ║ restartem (pulsní výstup)
║ ╚═════════════ 4-5: 00 = blokováno
║ 01 = čti/zapiš jen MSB
║ 10 = čti/zapiš jen LSB
║ 11 = čti/zapiš LSB a pak MSB
╚═══════════════════ 6-7: 00 = kanál 0
01 = kanál 1
10 = kanál 2
──────────────────────────────────────────────────────────────────────────
Viz též: I/O porty Časovač INT 08
PORTY PROGRAMOVATELNÉHO ŘADIČE VNĚJŠÍCH ROZHRANÍ
Řadič 8255A-5 (Programmable Peripharal Interface) podporuje tři nezávisle
přístupné I/O porty, které komunikují s externími zařízeními přes rozhraní
sběrnice. Tato externí zařízení jsou klávesnice, reproduktor, konfigurační
přepínače a kazetopásková jednotka (je-li přítomna). Řadič 8255A-5
podporuje několik módů komunikace s periferiemi navíc k módům, které jsou
použity v PC.
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
060H 8255A-5 Vstup portu A
Zde jsou snímány scan kódy klávesnice. Také je použit pro čtení
stavu přepínačů na starých PC.
061H 8255A-5 Port B
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖
║ K│ T│ P│ R│ C│ R│ S│ S║
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
║ ║ ║ ║ ║ ║ ║ ╚═ 0: vstupní brána reproduktoru:
║ ║ ║ ║ ║ ║ ║ 1 = 2. kanál 8253-5
║ ║ ║ ║ ║ ║ ║ 0 = přímé řízení reproduktoru pomocí 1. bitu
║ ║ ║ ║ ║ ║ ╚════ 1: 1 = reproduktor povolen
║ ║ ║ ║ ║ ╚═══════ 2: nedefinováno/přepínač rychlosti:
║ ║ ║ ║ ║ Na některých klonech XT je tento bit
║ ║ ║ ║ ║ použit pro přepínání mezi 4.77 a 8 MHz
║ ║ ║ ║ ║ (např. Commodore PC 20-III)
║ ║ ║ ║ ║ 0 = 4.77 MHz, 1 = 8 MHz.
║ ║ ║ ║ ║ PS/2: 0 = povol test parity (nastavuje se
║ ║ ║ ║ ║ během POST)
║ ║ ║ ║ ╚══════════ 3: motor kazety on/off (na starých PC)
║ ║ ║ ║ PS/2: 0: povol test kanálu (nastavuje se
║ ║ ║ ║ během POST)
║ ║ ║ ╚═════════════ 4: povolen chybový stav parity RAM
║ ║ ║ PS/2: Čtení: bit indikuje požadavek
║ ║ ║ na obnovení
║ ║ ╚════════════════ 5: 0: povolen signál chyby parity z
║ ║ rozšiřujících portů
║ ║ PS/2: Čtení: výstup 2. časovače. Bit
║ ║ Bit indikuje stav signálů
║ ║ 2. čítače/časovače
║ ╚═══════════════════ 6: PS/2: Čtení: 1 = test kanálu byl vykonán
╚══════════════════════ 7: 0: povolení klávesnice
1: potvrzení klávesnice
PS/2: Zápis: reset blokování časovače 0
(IRQ 0)
Čtení: test parity (1 = povolen)
062H 8255A-5 Vstup portu C
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖
║ R│ E│ 2│ C│ 0│ 0│ 0│ 0║
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
║ ║ ║ ║ ╚══╩══╩══╩═ 0-3: nedefinováno
║ ║ ║ ╚═════════════ 4: vstup kazety (jen na starých PC)
║ ║ ╚════════════════ 5: signál 2. kanálu 8253-5
║ ╚═══════════════════ 6: 1 = chyba ve slotu
╚══════════════════════ 7: 1 = chyba parity RAM
063H 8255A-5 Řídící registr módu
Normálně je nastaven na 99H, určuje port B jako výstupní a porty
A a C jako vstupní.
╓─7┬─6┬─5┬─4┬─3┬─2┬─1┬─0╖
║ A│ a│ a│ a│ c│ b│ b│ c║
╙─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥┴─╥╜ bit
║ ╚══╣ ║ ║ ║ ║ ╚═ 0: bity 0-3 portu C: 1 = vstup, 0 = výstup
║ ║ ║ ║ ║ ╚════ 1: port B: 1 = vstup, 0 = výstup
║ ║ ║ ║ ╚═══════ 2: mód portu B: 0 = mód 0 (v PC vždy 0)
║ ║ ║ ║ 1 = mód 1
║ ║ ║ ╚══════════ 3: bity 4-7 portu C: 1 = vstup, 0 = výstup
║ ║ ╚═════════════ 4: port A: 1 = vstup, 0 = výstup
║ ╚════════════════ 5-6: mód portu A: 00 = mód 0 (v PC vždy 0)
║ 01 = mód 1
║ 10 = mód 2
╚══════════════════════ 7: aktivita
──────────────────────────────────────────────────────────────────────────
Viz též: Klávesnice INT 09 Klávesnice INT 16
I/O porty AT klávesnice
Porty AT HD
Řadič hard disku na AT je vkomponován do stejné desky jako řadič
diskety. Příkazy pro řadič v AT jsou jiné než pro řadič v XT.
Viz Porty XT HD . Podrobněji viz např. Martin Althaus: Das PC Profibuch,
Sybex 1988).
1. řadič obsazuje porty 1F0H až 1F7H
2. řadič obsazuje porty 170H až 177H
Řadič generuje hardwarové přerušení IRQ14 po vykonání každé operace
(čtení, zápis, seek, rekalibrace atd.). IRQ je obsluhován BIOS INT 76
po nastavení příznaků na adrese 0000:048EH.
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1F0H Datový registr
Čtení a zápis z a do bufferu sektoru řadiče.
1F1H Zápis: registr zápisu prekompenzace. Zapne zápis prekompenzace.
Čtení: Registr chyb. Obsahuje bitový popis poslední chyby.
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │0│ │0│ │ │ ║
╙╥┴╥┴─┴╥┴─┴╥┴╥┴╥╜ bit
║ ║ ║ ║ ║ ╚═ 0: adresová značka (Data Address Mark) nenalezena
║ ║ ║ ║ ╚═══ 1: chyba stopy 0
║ ║ ║ ╚═════ 2: příkaz byl zrušen/přerušen
║ ║ ╚═════════ 4: nenalezena značka identifikace sektoru
║ ╚═════════════ 6: chyba ECC: neopravitelná chyba dat
╚═══════════════ 7: špatný blok
1F2H Čtení/Zápis: Počet sektorů pro čtení/zápis.
1F3H Čtení/Zápis: Logické číslo počátečního sektoru
1F4H Čtení/Zápis: Číslo cylindru (bity 1-2 jsou bity 8-9 desetibitového
čísla)
1F5H Čtení/Zápis: Dolních 8 bitů desetibitového čísla cylindru
1F6H Čtení/Zápis: Disk a hlava (povrch)
1F7H Zápis: příkazový registr
Čtení: stavový registr
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │ │ │ ║
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit
║ ║ ║ ║ ║ ║ ║ ╚═ 0: 1 = předcházející příkaz skončil chybou
║ ║ ║ ║ ║ ║ ╚═══ 1: index: nastaven na 1, byla-li detekována mezera
║ ║ ║ ║ ║ ║ v indexování
║ ║ ║ ║ ║ ╚═════ 2: data opravena pomocí ECC
║ ║ ║ ║ ╚═══════ 3: data jsou požadována
║ ║ ║ ╚═════════ 4: seek ukončen
║ ║ ╚═══════════ 5: chyba zápisu
║ ╚═════════════ 6: disk je připraven pro čtení/zápis/seek
║ (viz bit 4)
╚═══════════════ 7: řadič je obsazen prováděním příkazu
──────────────────────────────────────────────────────────────────────────
Viz též: Disk INT 13 Porty XT HD
Přerušení BIOSu I/O Porty
Porty joysticku
Port 201H je určen pro adaptér her pro připojení joysticku. Není
podporován XT BIOS, ale v počítači AT je obsluhován BIOS INT 15
subfunkcí 84H, která usnadňuje práci s adaptérem.
Na "game portu" je čtyřnásobný AD převodník, který může být také použit
jako vstupní zařízení pro přístroje s odporovou smyčkou (např. teploměr).
Je zde též čtyřnásobný digitální vstup. Tyto vstupy je možné využívat
najednou, např. pro připojení joysticku. Lze tedy připojit dva joysticky
naráz: každý má dva analogové (X a Y souřadnice) a dva digitální signály
(2 tlačítka).
Hodnoty jsou bitově kódované do výstupu z portu 201H:
╓─7┬─6┬─5┬─4╥─3┬─2┬─1┬─0╖
║B2│B1│A2│A1║By│Bx│Ay│Ax║
╙╥─┴──┴──┴─╥╨╥─┴──┴──┴─╥╜
╚════╦════╝ ╚═════════╩═ analogové vstupy, časově závislé (souřadnice)
╚══════════════════ digitální vstupy
Pro čtení digitálních vstupů můžete použít např. tuto sekvenci instrukcí:
MOV DX,201H
OUT DX,AL ; inicializace transakce - AL = cokoliv
IN AL,DX ; nyní přečtěte a otestujte bity 4-7:
0 = tlačítko je stisknuto
1 = puštěno
Pro přečtení hodnoty analogových vstupů, ať už je připojen joystick,
odporový měřák, míchací přístroj apod., je nutné po zinicializování portu
počítat počet čtení portu tak dlouho, až bude patřičný bit nulový. Potom
počet čtení udává odpor (souřadnici). Samozřejmě každý přístroj (i
joystick) je nutné nakalibrovat. Zde je ona magická sekvence:
MOV DX,201H
OUT DX,AL ; inicializace transakce - AL = cokoliv
MOV CX,0FFFFH ; nastavení čítače
cekej:
IN AL,DX ; načtení hodnoty z portu
INC CX ; uprav čítač
TEST AL,1 ; je již X-souřadnice joysticku A načtena ?
JNZ cekej ; opakuj smyčku, dokud nebude hodnota načtena
(tzn. 0. bit = 0)
Počet průchodů smyčkou v CX nyní udává X-ovou souřadnici joysticku A.
Výsledná hodnota se liší pro každý procesor. Korektnější rutina by využila
hardwarový timer.
──────────────────────────────────────────────────────────────────────────
Viz též: BIOS INT 15 Přerušení BIOSu
I/O porty
Paralelní porty
ROM-BIOS podporuje ve svých rutinách až 3 paralelní tiskárenské porty
(označované LPT1 až LPT3), v datové oblasti ROM-BIOS je místo pro
4 bázové adresy portů (I/O bran) paralelních portů (komunikačních obvodů)
od adresy 0000:0408H. První 3 jsou během POST inicializovány standardně
takto:
1) 3BCH pro paralelní port na adaptéru MDA (Hercules)
2) 378H pro 1. adapter tiskárenského portu
3) 278H pro 2. adapter tiskárenského portu
LPT1 standardně obsazuje hardwarové přerušení IRQ 7 (INT 0FH).
LPT2 standardně obsazuje hardwarové přerušení IRQ 5 (INT 0DH).
Služba na LPT INT 17 ROM-BIOS podporuje až 4 paralelní tiskárny, fyzicky
lze při šikovné konfiguraci do počítače vměstnat až 8 portů.
Chcete-li oklamat systém a prohodit dvě tiskárny, pak to lze udělat např.
takto:
XOR AX,AX
MOV DS,AX
MOV SI,0408H ; DS:SI => začátek tabulky na 0000:0408H
MOV AX,[SI] ; načte bázovou adresu LPT1
XCHG AX,[SI+2] ; vymění ji s bázovou adresou LPT2
MOV [SI],AX ; a uloží adresu bývalé LPT2 na LPT1
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
378H Zápis: vyšle zapsaný byte na tiskárnu
Čtení: vrátí hodnotu naposledy vyslaného znaku
37AH Čtení/Zápis: řízení tiskárny
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0 0 0│ │ │ │ │ ║
╙─┴─┴─┴╥┴╥┴╥┴╥┴╥╜ bit
║ ║ ║ ║ ╚═ 0: +Strobe (pin 1) = 1: při vysílání bytu
║ ║ ║ ╚═══ 1: +AUTO LF (pin 14) = 1: vyrobí LF po CR
║ ║ ╚═════ 2: -INIT (pin 16) = 0: reset tiskárny
║ ╚═══════ 3: +SLCT IN (pin 17) = 1: připojení tiskárny
╚═════════ 4: +IRQ = 1: povolí hardwarové
přerušení při
nekorektním
příchodu -ACK
379H Čtení: status tiskárny
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │0 0 0║
╙╥┴╥┴╥┴╥┴╥┴─┴─┴─╜ bit
║ ║ ║ ║ ╚═══════ 3: -ERROR (pin 15) 0 = tiskárna hlásí chybu
║ ║ ║ ╚═════════ 4: +SLCT (pin 13) 1 = tiskárna je připojena
║ ║ ╚═══════════ 5: +PE (pin 12) 1 = došel papír
║ ╚═════════════ 6: -ACK (pin 10) 0 = může přijmout další znak
╚═══════════════ 7: -BUSY (pin 11) 0 = obsazena nebo off-line
nebo chyba
──────────────────────────────────────────────────────────────────────────
Viz též: LPT INT 17 Přerušení BIOS
I/O porty Kabely
EGA/VGA I/O PORTY
EGA (Enhanced Graphics Adapter) je zezdola kompatibilní s CGA z hlediska
přístupu přes BIOS. Na úrovni hardware je EGA více komplexní, má však
i na této úrovni podporu emulace registrů i operací CGA (viz též
CGA I/O porty ). Zde jsou popsány změny a rozšíření vůči CGA. Přesto
tento popis nemůže být vyčerpávající.
VGA (Video Graphics Array) je zezdola kompatibilní s CGA, MDA a EGA
a při společných operacích emuluje jejich porty.
Programování na úrovni hardware je již značně riskantní a výrobci
doporučují pro jednodušší operace použít služeb BIOSu. Na tomto místě jim
však jen můžeme poděkovat za radu, protože funkce BIOSu jsou N - krát
pomalejší než to, co si dokážu naprogramovat sám ( N > 10 !! ).
1. řadič EGA/VGA obsazuje porty 3C0H až 3DFH
2. řadič EGA/VGA obsazuje porty 2C0H až 2DFH
Řadič může generovat hardwarové přerušení úrovně IRQ2 během snímání
(overscan). Toto přerušení je umístěno na INT 0AH. Jestliže chcete
použít toto přerušení, pak je nutné si uvědomit, že v AT je toto
přerušení použito pro kaskádové řazení druhého řadiče přerušení pro
obsluhu IRQ 8-15.
Poznámka: BIOS ukládá stav portů CRTC i jiných informací o EGA/VGA do
datové oblasti ROM-BIOS. Měníte-li některou hodnotu, můžete
číst patřičnou proměnnou, nastavit bity, provést OUT a uložit
novou hodnotu do proměnné.
Vlastní popis portů viz Programování EGA/VGA
Viz též: Video INT 10 CGA I/O Porty
I/O porty
Sériové porty
V datové oblasti ROM-BIOS je seznam bázových adres prvních čtyř COM
portů. Během POST BIOS testuje a inicializuje POUZE COM1 a COM2.
Iniciální hodnoty adres portů a hardwarových přerušení jsou:
COM1: 3F8H..3FFH, IRQ4
COM2: 2F8H..2FFH, IRQ3
COM3: 3E8H..3EFH, IRQ4 nebo IRQ5 nebo IRQ7 (většinou lze na
COM4: 2E8H..2EFH, IRQ3 nebo IRQ7 nebo IRQ5 adaptéru přepnout)
Přestože BIOS inicializuje pouze první dva, COM INT 14 pracuje se čtyřmi
porty, jejichž adresy jsou uloženy v paměti od 0000:0400H. Pozor na to,
aby nebyly dvě adresy stejné !
Dále jsou popsány porty pro COM1, pro ostatní COM jsou totožné (pouze
si přetransformujte adresu).
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
3F8H Zápis: 8 bitů vysílaného znaku. Bude okamžitě vyslán na drát.
Čtení: 8 bitů přijatého znaku. Čtení vynuluje 0. bit registru 3FDH.
Zápis: Je-li nastaven bit DLAB (3FBH), je byte považován za hodnotu
dolního bytu dělitele pro určení rychlosti. Tzn. proveďte
OUT 3FBH,80H, MOV AX,dělitel a OUT DX,AX.
Baudy Dělitel Baudy Dělitel Baudy Dělitel
▀▀▀▀▀ ▀▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀▀▀
110 1040 1200 96 18200 6
150 768 2400 48 38400 3
300 384 4800 24 57600 2
600 192 9600 12 115200 1
────────────── ────────────── ──────────────
Chcete-li nastavit jinou rychlost, záleží zcela na Vás, jaký
dělitel zadáte. Výsledná rychlost je 115200/dělitel.
3F9H Zápis: Je-li nastaven bit DLAB (3FBH), je byte považován za hodnotu
horního bytu dělitele pro určení rychlosti. Viz výše.
Zápis: Registr povolení přerušení.
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0 0 0 0│ │ │ │ ║
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit
╚═╩╦╩═╝ ║ ║ ║ ╚═ 0: 1 = vyvolej přerušení při příchodu dat
║ ║ ║ ╚═══ 1: 1 = vyvolej přerušení při prázdném přenosovém
║ ║ ║ bufferu
║ ║ ╚═════ 2: 1 = vyvolej přerušení při změně statusu linky
║ ║ (tj. chyba nebo break)
║ ╚═══════ 3: 1 = vyvolej přerušení při změně statusu modemu
║ (tj. CTS, DSR, RI, RLSD)
╚════════════ 4-7: 1111xxxx vynuluje všechno
3FAH Čtení: registr identifikace přerušení. Při vykonávání přerušení
můžete testovat tento registr a zjistit příčinu vyvolání:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0 0 0 0 0│ │ ║
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit
╚═╩╦╩═╩═╝ ╚╦╝ ╚═ 0: 1 = žádné přerušení není zpracováváno
║ ╚════ 1: 00= přerušení vyvoláno statusem linky na
nejnižší priorita příjmu. Možná příčina: přetečení, parita,
║ chyba rámce nebo break. Resetuje se čtením
║ registru 3FDH.
nižší priorita 01= přijatá data jsou k dispozici.
║ Resetuje se čtením registru 3F8H.
vyšší priorita 10= přenosový buffer je prázdný.
║ Resetuje se zápisem do přenosového bufferu
║ (port 3F8H).
nejvyšší priorita 11= přerušení vyvoláno statusem linky modemu.
║ Možná příčina: CTS, DSR, RI nebo je
║ detekován signál na příjmové lince.
║ Resetuje se čtením portu 3FEH.
╚════════════ 3-7: 11111xxx vynuluje všechno
3FBH Čtení/Zápis: registr ovládání linky
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │par│s│dél║
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit
║ ║ ╚╦╝ ║ ╚═╩═╩═ 0-2: délka slova a stop bity:
║ ║ ║ ║ 000: 5 bitů/znak, 1 stop bit
║ ║ ║ ║ 001: 6 bitů/znak, 1 stop bit
║ ║ ║ ║ 010: 7 bitů/znak, 1 stop bit
║ ║ ║ ║ 011: 8 bitů/znak, 1 stop bit
║ ║ ║ ║ 100: 5 bitů/znak, 1.5 stop bitu
║ ║ ║ ║ 101: 6 bitů/znak, 2 stop bity
║ ║ ║ ║ 110: 7 bitů/znak, 2 stop bity
║ ║ ║ ║ 111: 8 bitů/znak, 2 stop bity
║ ║ ║ ╚═══════ 3: 1 = nastavena parita; 0 = žádná parita
║ ║ ╚══════════ 4-5: (Pozn.: BIOS nepoužívá 5. bit)
║ ║ 00: lichá parita
║ ║ 01: sudá parita
║ ║ 10: paritní bit je vždy 0
║ ║ 11: paritní bit je vždy 1
║ ╚═════════════ 6: break: 1 = začni vysílat nuly; 0: zakázán break
╚═══════════════ 7: DLAB (Divisor Latch Access Bit)
Určuje mód portů 3F8H a 3F9H:
0 = normální stav
1 = nastav rychlost
3FCH Zápis: registr ovládání modemu
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0 0 0│ │ │ │ │ ║
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit
╚═╩╦╝ ║ ║ ║ ║ ╚═ 0: 1 = aktivuj -DTR (-Data Terminal Ready)
║ ║ ║ ║ ╚═══ 1: 1 = aktivuj -RTS (-Request to Send)
║ ║ ║ ╚═════ 2: 1 = aktivuj -OUT1 (volné pro uživatelsky
║ ║ ╚═══════ 3: 1 = aktivuj -OUT2 definovaný výstup)
║ ╚═════════ 4: 1 = aktivuj diagnostiku loopback
╚════════════ 5-7: 111xxxxx vynuluje všechno
3FDH Čtení: registr stavové linky
╓7┬6┬5┬4┬3┬2┬1┬0╖
║0│ │ │ │ │ │ │ ║ Poznámka: bity 1-4 indikují chybový stav při
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit přerušení (viz 3F9H)
║ ║ ║ ║ ║ ║ ║ ╚═ 0: 1 = DR (Data Ready) Nastaven, když je přijat
║ ║ ║ ║ ║ ║ ║ znak. Resetuje se čtením 3F8H.
║ ║ ║ ║ ║ ║ ╚═══ 1: 1 = OE (Overrun Error) Nastaven, když je přijat
║ ║ ║ ║ ║ ║ znak a buffer není prázdný. Resetuje se
║ ║ ║ ║ ║ ║ čtením 3F8H.
║ ║ ║ ║ ║ ╚═════ 2: 1 = PE (Parity Error) Chyba parity.
║ ║ ║ ║ ║ Resetuje se po přečtení tohoto registru.
║ ║ ║ ║ ╚═══════ 3: 1 = FE (Framing Error) Chyba rámce, tj. chybný
║ ║ ║ ║ stop bit. Resetuje se po přečtení registru.
║ ║ ║ ╚═════════ 4: 1 = BI (Break Indicated) Přijímány samé nuly.
║ ║ ║ Resetuje se po přečtení tohoto registru.
║ ║ ╚═══════════ 5: 1 = THRE (Transmitter Holding Register Empty)
║ ║ Může být vyslán znak. Resetuje se posláním
║ ║ znaku do 3F8H.
║ ╚═════════════ 6: 1 = TEMT (Transmitter Empty) Znak byl úspěšně
║ odeslán a nic se už neděje.
╚═══════════════ 7: 1xxxxxxx vynuluje všechno
3FEH Čtení: registr stavu modemu
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │ │ │ ║ Poznámka: bity 0-3 indikují stav při průběhu
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit přerušení (viz 3F9H)
║ ║ ║ ║ ║ ║ ║ ╚═ 0: 1= změna stavu DCTS (Delta Clear To Send)
║ odeslán a nic se už neděje.
╚═══════════════ 7: 1xxxxxxx vynuluje všechno
3FEH Čtení: registr stavu modemu
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ │ │ │ ║ Poznámka: bity 0-3 indikují stav při průběhu
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit přerušení (viz 3F9H)
║ ║ ║ ║ ║ ║ ║ ╚═ 0: 1= změna stavu DCTS (Delta Clear To Send)
║ ║ ║ ║ ║ ║ ╚═══ 1: 1= změna stavu DDSR (Delta Data Set Ready)
║ ║ ║ ║ ║ ╚═════ 2: 1= aktivní TERI (Trailing Edge Ring Indicator)
║ ║ ║ ║ ╚═══════ 3: 1= změna stavu DDCD (Delta Data Carrier Detect)
║ ║ ║ ╚═════════ 4: 1= aktivní CTS (Clear To Send)
║ ║ ╚═══════════ 5: 1= aktivní DSR (Data Set Ready)
║ ╚═════════════ 6: 1= aktivní RI (Ring Indicator)
╚═══════════════ 7: 1= aktivní DCD (Data Carrier Detect)
──────────────────────────────────────────────────────────────────────────
Viz též: COM INT 14 Přerušení BIOSu
I/O Porty Kabely
Porty XT HD
Zde je popsán řadič hard disku XT. Má mnoho klonů, které jsou používány
v PC a které jsou kompatibilní, avšak není záruka, že se tak budou chovat
za všech okolností. Podrobněji viz např. Martin Althaus: Das PC Profibuch,
Sybex 1988).
Řadič obsazuje porty 320H až 327H.
Řadič generuje hardwarové přerušení úrovně IRQ5. Toto přerušení je
umístěno na vektoru INT 0DH (který může být použit také pro LPT2).
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
320H Datový registr
Zápis: Sekvenčně zapsaná série bytů. První je vždy kód příkazu,
za ním následují datové byty (až 5) popisující hlavu,
cylindr, sektor a případně kontrolní byte.
Čtení: Je-li na portu 321H (bit 1) hlášena chyba, pak lze vyslat
požadavek na specifikaci a z tohoto portu číst čtyři byty
upřesňující situaci.
321H Zápis: zápis bytu 00H způsobí reset řadiče.
Čtení: stavový registr
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │d│ │e│ ║
╙─┴─┴╥┴─┴─┴─┴╥┴─╜ bit
║ ╚═══ 1: 1 = je detekována chyba
╚═══════════ 5: číslo logické jednotky (0 nebo 1)
322H Zápis: jakýkoliv zápis do tohoto registru odstartuje činnost řadiče
před příkazem.
323H Zápis: registr DMA a přerušení
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │i│d║
╙─┴─┴─┴─┴─┴─┴╥┴╥╜ bit
║ ╚═ 0: 1 = použij DMA, 0 = nepoužij DMA
╚═══ 1: 1 = generuj přerušení (IRQ5) po řídícím příkazu
──────────────────────────────────────────────────────────────────────────
Viz též: Disk INT 13 Porty AT HD
Přerušení BIOSu I/O Porty
Porty FDC
Zde jsou popsány I/O porty řadiče diskety (FDC), založeném na
mikroprocesoru NEC µPD765. V počítači AT je vkomponován do stejné desky
jako řadič hard disku, ale je plně kompatibilní s řadičem v XT.
Na výjimky je upozorněno. Hlavní rozdíl je v rychlosti - na úkor toho,
že je schopen obsluhovat jen dvě mechaniky namísto čtyř.
Podrobněji viz např. Martin Althaus: Das PC Profibuch, Sybex 1988).
1. řadič obsazuje porty 3F0H až 3F7H
2. řadič obsazuje porty 370H až 377H (jen AT)
FDC generuje hardwarové přerušení IRQ6 po vykonání každé operace (čtení,
zápis, seek, rekalibrace atd.). IRQ je obsluhován BIOS Floppy - INT 0E .
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
3F2H Zápis: registr digitálního výstupu
╓7┬6┬5┬4┬3┬2┬1┬0╖
║D C B A│ │ │ ║
╙╥┴─┴─┴╥┴╥┴╥┴╥┴╥╜ bit
╚══╦══╝ ║ ║ ╚═╩═ 0-1: Vybraný disk (0-3, AT: 0-1)
║ ║ ╚═════ 2: 0 = reset řadiče
║ ╚═══════ 3: 1 = povol DMA a přerušení
╚════════════ 4-7: roztoč motor (AT: bity 6-7 nejsou využity)
3F4H Čtení: hlavní status registr
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │D C B A║
╙╥┴╥┴╥┴╥┴╥┴─┴─┴╥╜ bit
║ ║ ║ ║ ╚═════╩═ 0: mechanika je obsazena (AT: bity 2-3 nevyužity)
║ ║ ║ ╚═════════ 4: 1 = řadič je obsazen (probíhá čtení nebo zápis)
║ ║ ╚═══════════ 5: 1 = non-DMA mód; 0 = DMA mód je aktivní
║ ╚═════════════ 6: směr toku dat:
║ 1 = FDC ══► CPU
║ 0 = CPU ══► FDC
╚═══════════════ 7: dotaz na připravenost:
1 = OK pro přenos dat nebo příkazů
3F5H Čtení/Zápis: registr příkazů a dat
Tento port je použit pro přenos příkazů a dat. Jako první vyšlete
kód příkazu následovaný daty. Po vykonání operace jsou vyslána zpět
požadovaná data (jsou-li).
3F7H Zápis: řídící registr (jen AT)
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ ║
╙─┴─┴─┴─┴─┴─┴╥┴╥╜ bit
╚═╩═ 0-1: přenosová rychlost
00 = 500 KB/s
01 = 300 KB/s
10 = 250 KB/s
11 = rezervováno
Čtení: registr vstupu
Určeno (mimo bit 7) pro diagnostiku.
╓7┬6┬5┬4┬3┬2┬1┬0╖
║c│ │ hlava │ │ ║
╙╥┴╥┴╥┴─┴─┴╥┴╥┴╥╜ bit
║ ║ ╚══╦══╝ ║ ╚═ 0: 1 = vyber disk 0
║ ║ ║ ╚═══ 1: 1 = vyber disk 1
║ ║ ╚════════ 2-5: vyber hlavu 0-3 (bit 2 = hlava 0,
║ ║ bit 3 = hlava 1 atd.)
║ ╚═════════════ 6: Write Gate
╚═══════════════ 7: linka výměny (1 = linka výměny diskety je ON)
──────────────────────────────────────────────────────────────────────────
Viz též: Disk INT 13 Přerušení BIOSu
I/O porty
CGA I/O PORTY
Zde jsou popsány I/O porty CGA (Color/Graphics Adapter), který je
založen na CRT procesoru Motorola 6845.
Řadič CGA obsazuje porty 3D0H až 3DFH (skutečně používané jsou však jen
porty 3D2H až 3DCH). Pro dosažení vzestupné kompatibility jsou tyto porty
a tento řadič simulovány i na EGA a VGA, takže lze tyto informace
aplikovat i na EGA/VGA řadiče.
Řadič CGA nevyužívá žádné hardwarové přerušení.
Poznámka: BIOS ukládá stav portů CRTC i jiných informací o CGA do
datové oblasti ROM-BIOS. Měníte-li některou hodnotu, můžete
číst patřičnou proměnnou, nastavit bity, provést OUT a uložit
novou hodnotu do proměnné.
Port Popis
▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
3D4H Zápis: výběr registru CRTC
Proveďte: OUT 3D4H,číslo_registru
OUT 3D5H,data (nebo IN data,3D5H)
3D5H Registry CRTC
Po nastavení registru portem 3D4H lze z tohoto portu číst nebo
zapisovat do registru CRTC.
Zápis: CRTC registry a standardní nastavení ROM-BIOS pro jednotlivé
video módy.
Čtení: Registry R12 až R17 mohou být čteny pro získání informací
o videostránce, kurzoru apod.
3D8H Zápis: registr výběru módu (poznámka: BIOS ukládá aktuální hodnotu
na adresu 0000:0465H)
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │b│r│v│c│g│w║
╙─┴─┴╥┴╥┴╥┴╥┴╥┴╥╜ bit
║ ║ ║ ║ ║ ╚═ 0: šířka obrazovky pro textový mód:
║ ║ ║ ║ ║ 0 = 40 sloupců, 1 = 80 sloupců
║ ║ ║ ║ ╚═══ 1: 1 = grafický mód; 0 = textový mód
║ ║ ║ ╚═════ 2: 1 = zakaž barvy pro kompozitní monitor
║ ║ ╚═══════ 3: 1 = povol zobrazení; 1 = zakaž (vše černé)
║ ╚═════════ 4: rozlišovací schopnost:
║ 0 = 320 dvoubitových bodů
║ 1 = 640 jednobitových bodů
╚═══════════ 5: povol blikání:
1 = 7. bit atributu znamená blikání (8 barev)
0 = povoleno 16 barev pozadí
3D8H Zápis: registr výběru barev
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │b│i│I│R│G│B║
╙─┴─┴╥┴╥┴─┴─┴─┴─╜ bit
║ ║ ╚═════╩═ 0-3: barva (textový mód: IRGB rámečku - border,
║ ║ grafický mód: IRGB pozadí)
║ ╚═════════ 4: intenzita (text: intenzita pozadí,
║ střední grafika: intenzita pixelu)
╚═══════════ 5: modrá (výběr palety 0 nebo 1 - 1 je s modrou)
3DAH Čtení: stavový registr
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │ │ ║
╙─┴─┴─┴─┴╥┴╥┴╥┴╥╜ bit
║ ║ ║ ╚═ 0: 1 = zobrazení mezi vertikálním nebo
║ ║ ║ horizontálním snímkováním
║ ║ ╚═══ 1: 1 = tlačítko světelného pera je stisknuto
║ ╚═════ 2: 1 = přepínač světelného pera je otevřen
╚═══════ 3: 1 = přítomnost vertikálního synchronizačního
pulsu - teď je možný přístup do paměti
bez "sněžení"
3DBH Čtení/Zápis: reset zámku světelného pera. Jakýkoliv OUT smaže zámek
světelného pera.
3DCH Čtení/Zápis: nastavení zámku světelného pera. Jakýkoliv OUT nastaví
zámek světelného pera.
──────────────────────────────────────────────────────────────────────────
Viz též: Video INT 10 EGA/VGA I/O Porty I/O Porty
Direktivy TASM (MASM mód)
Specifikace typu procesoru
.186 Povoluje 80186 instrukce
.286 Povoluje 80286 instrukce, ale ne Privilegované instrukce
.286C Jako .286
.286P Povoluje 80286 instrukce i Privilegované instrukce
.287 Povoluje instrukce koprocesoru 80287
.386 Povoluje 80386 instrukce, ale ne Privilegované instrukce
Použití před .MODEL specigikuje všechny segmenty jako Use32
Zarovnání segmentů je implicitně DWORD (Align 4)
.386P Povoluje 80386 instrukce i Privilegované instrukce
.387 Povoluje instrukce koprocesoru 80387
.8086 Implicitně, jen 8088/8086 instrukce
.8087 Implicitně, povoluje 8087 instrukce
Procesory Koprocesory Instrukce procesoru Instrukce koprocesoru
Musí se použít před definicí segmentu. xxxx Segment xxxx
Je povoleno uvnitř .code segmentu
Specifikace modelu
.CODE [jméno] začátek kódového segmnentu, až PO .MODEL definici
.CONST začátek data segmentu konstant, jméno CONST;
PO .MODEL definicii; součást DGROUP
.DATA začátek datat segmentu, jméno _DATA součást DGROUP
PO .MODEL definicii
.DATA? začátek datat segmentu, jméno _BSS součást DGROUP
PO .MODEL definicii
.FARDATA [jméno] není součást žádné skupiny (group)
.FARDATA? [name] není součást žádné skupiny (group)
.MODEL model definuje model:
SMALL, COMPACT, MEDIUM, LARGE nebo HUGE;
musí být použito před definicí segmentu.
Specifikace modelu
.STACK [vel] Indikuje začátek STACK segmentu, jméno 'STACK'
vel určuje velikost, není-li uvedeno, je 1KB
součást DGROUP
Definice segmentů
.ALPHA Linkuje segmenty abecedně podle jmen
.SEQ Linkuje segmenty podle pořadí v ASM souboru, implicitní
ASSUME sreg:jm [,sreg:jm...] definuje implicitní segmentový reg,
který ASM použije pro adresaci v daném segmentu, NEMĚNÍ
ani negeneruje kód pro změnu seg. registru !
Jm je buď jméno SEGMENTu, GROUPy nebo NOTHING
COMM def [,def...] Definuje proměnné jako PUBLIC a zároveň EXTRN.
Užívá se pro sdílení proměnné více .obj soubory.
Nelze je inicializovat a není garantováno jejich
kontinuální umístění ( Linker určuje jejicj pořadí )
DOSSEG Řadí segmenty jako Microsoftí jazyky, všechny jsou PARA
END [jm] Označuje konec souboru a určuje vstupní bod (jm).
jm ENDP Označuje konec procedury jm
jm ENDS Označuje konec segmentu jm
EXTRN jm:typ [,jm:typ...] definuje 1 nebo více externě definovaných
proměnných zadaného typu.
jm GROUP seg[,seg] do GROUPy jm přiřadí uvedené segmenty
jm LABEL [NEAR|FAR|PROC] Definuje bod v segmentu. Je-li jeho typ PROC,
záleží na definici .MODEL
NAME pgmJm Ignorováno do MASM 5.0; použito k definici jména modulu
jm PROC [NEAR|FAR] Definuje proceduru NEAR/FAR. Není-li uvedeno, bere se
default podle .MODEL
ARG [Prom1:Typ:Vel[,Prom2:typ:Vel ...]][=expr] Používá se pro definici
procedury používané vyšším programovacím jazykem. Musí
se nejprve definovat .MODEL. Prom udává jméno proměnné,
Typ její typ, Vel její velikost ( zadanou explicitně,
např :Byte:2 pro pascal ). =expr je součet velikostí
proměnných a použije se pro RET n. Arg rovnou generuje
ENTER (nebo Push bp Mov Bp,sp) a tak je nutno před
Ret n zadat LEAVE nebo Pop bp.
LOCAL [Prom1:Typ:Vel[,Prom2:typ:Vel ...]] definuje lokální proměnné
procedury. Spolupracuje s ARG a spoluvytváří parametry
ENTER. Platí pro něj stejné zásady jako pro ARG.
PUBLIC jm[,jm...] Učiní symbol 'jm' dostupný ostatním modulům
jm SEGMENT [align][combine][use]['class']
align = BYTE zarovnán na 1 byte ( bez zarovnání )
= WORD zarovnán na sudou adresu
= DWORD zarovnán na adresu děl. 4
= PARA zarovnán na paragraf ( děl. 16 )
= PAGE zarovnán na 256 BYTE
combine = PUBLIC Podobně nazvané segmenty jsou default pro CS
= STACK Podobně nazvané segmenty jsou default pro SS
= COMMON Podobně nazvané segmenty jsou překryté
= MEMORY Podobně nazvané segmenty jsou spojené
= AT addr Segnent je umístěn relativně k zadané adrese
= nic Segnent ja privátní pro daný modul
use = USE16 Segment bude 16 -bitový
= USE32 Segment bude 32 -bitový Prostředí 16/32
Umístění Dat
ALIGN n Zarovná následující instrukci / proměnnou na adresu
tak, aby byla dělitelná n. Na 286 + může zvýšit rychlost
kódu. Kód je případně vyplněn NOPy.
[jme] DB init[,init...] definuje byte
[jme] DD init[,init...] definuje byte DWORD, 4 byte
[jme] DP init[,init...] definuje byte PWORD, 386, 6 byte
[jme] DQ init[,init...] definuje byte QWORD, 8 byte
[jme] DT init[,init...] definuje byte BYTE, 10 bytů
[jme] DW init[,init...] definuje byte WORD, 2 byte
cnt DUP (init[,init...]) Duplikuje 'Init' cnt krát. dup může být i vnořený.
jm ENDS konec STRUC
EVEN Jako ALIGN 2
ORG addr Nastaví pozici následujících dat na addr. Pro COM
použijte ORG 100h. ORG $ nedělá nic.
jm RECORD fld[,fld...] Definuje BYTE nebo WORD proměnnou složenou z
bitových položek. Položky mají tentoformát :
Jméno_položky : velikost [= výraz]
[jm] STRUC <[init[,init]]> definuje strukturu. Hodnotu mezi <> jsou pro
inicializaci. Není-li inicializace, je přesto nutné
uvést <>.
Logické direktivy
expr1 AND expr2 Vrátí logický součin expr1 a expt2
expr1 EQ expr2 Vrátí (-1) je-li expr1=expr2,jinak (0)
expr1 GE expr2 Vrátí (-1) je-li expr1>=expr2,jinak (0)
expr1 LE expr2 Vrátí (-1) je-li expr1<=expr2,jinak (0)
expr1 LT expr2 Vrátí (-1) je-li expr1 Blok označený IRP a ENDM se zopakuje podle
počtu arg v <>. Všechny 'parm' v bloku budou postupně
nahrazeny arg, arg1 ....
LOCAL name[,name...] definuje lokální identifikátory pro makro
jm MACRO [parm[,parm...]] Definuje makro a jeho parametry
PURGE name[,name] Odstraní makro z paměti (při překladu)
REPT expr Opakuje blok mezi REPT a ENDM expr - krát
Zprávy pro uživatele (během překladu)
.ERR Generuje chybu
.ERR1 Generuje chybu pro průchod 1
.ERR2 Generuje chybu pro průchod 2
.ERRB Generuje chybu, je-li arg prázdný
.ERRDEF name Generuje chybu, je-li name už definováno
.ERRE expr Generuje chybu, není-li expr pravdivé
%OUT text Zobrazí 'text'
Předdefinované operátory
@curseg Právě platný segment
@filename Platné jméno bez příponky
@code Právě platný CS
@codesize 0 pro small & compact, 1 pro large, medium & huge
@datasize 0 pro small & medium, 1 pro compact & large, 2=huge
@const Jméno segmentu .CONST
@data Segment .DATA
@data? Segment .DATA?
@fardata Segment .FARDATA
@fardata? Segment .FARDATA?
@stack Segment .STACK
Definice číselné soustavy
.RADIX expr Nastaví default číselnou soustavu [2..16]
Implicitně 10
B Binární čísla
Q Data v 8-čkové soustavě
O Data v 8-čkové soustavě
D Data v 10-kové soustavě
H Data v 16-kové soustavě
Příkazy TASM na řádce Instrukce koprocesoru Instrukce procesoru
Specifikace modelu
Paměťové modely
Model
TINY Data i kód jsou v jednom max 64KB segmentu.Stačí jen NEAR
pointry. Pro COM.
SMALL Max 64 KB data segment a 64 KB kódový segment.Stačí jen NEAR
pointry
COMPACT Max 1MB data segment a max. 64K kódový segment. Kód NEAR,
data FAR. Velikost pole max 64KB.
MEDIUM Max 64K data segment a max 1MB kódový segment. Kód FAR, data
NEAR.
LARGE Max 1Mb data segment a max 1Mb Kódový segment. Všechno FAR.
Velikost pole (procedury, proměnné ..) max 64KB. Pro PASCAL.
HUGE Max 1Mb data segment a max 1Mb Kódový segment. Všechno FAR.
Velikost pole (procedury, proměnné ..) MŮŽE být více než 64KB.
Pro C.
Small
Directiva Segment Zarovnání Popis Jméno
.CODE _TEXT WORD PUBLIC 'CODE'
.DATA _DATA WORD PUBLIC 'DATA'
.CONST CONST WORD PUBLIC 'CONST'
.DATA? _BSS WORD PUBLIC 'BSS'
.STACK STACK PARA STACK 'STACK'
Compact
Directiva Segment Zarovnání Popis Jméno
.CODE _TEXT WORD PUBLIC 'CODE'
.FARDATA FAR_DATA PARA private 'FAR_DATA'
.FARDATA? FAR_BSS PARA private 'FAR_BSS'
.DATA _DATA WORD PUBLIC 'DATA'
.CONST CONST WORD PUBLIC 'CONST'
.DATA? _BSS WORD PUBLIC 'BSS'
.STACK STACK PARA STACK 'STACK'
Medium
Directiva Segment Zarovnání Popis Jméno
.CODE name_TEXT WORD PUBLIC 'CODE'
.DATA _DATA WORD PUBLIC 'DATA'
.CONST CONST WORD PUBLIC 'CONST'
.DATA? _BSS WORD PUBLIC 'BSS'
.STACK STACK PARA STACK 'STACK'
Large a Huge
Directiva Segment Zarovnání Popis Jméno
.CODE name_TEXT WORD PUBLIC 'CODE'
.FARDATA FAR_DATA PARA private 'FAR_DATA'
.FARDATA? FAR_BSS PARA private 'FAR_BSS'
.DATA _DATA WORD PUBLIC 'DATA'
.CONST CONST WORD PUBLIC 'CONST'
.DATA? _BSS WORD PUBLIC 'BSS'
.STACK STACK PARA STACK 'STACK'
- Všechny segmenty vyjma ???_TEXT , FAR_DATA a FAR_BSS spadají do
DGROUP.
Příkazy TASM na řádce Instrukce koprocesoru Instrukce procesoru
Direktivy TASM
Příkazy TASM na řádce
TASM
Syntaxe: TASM [volba] zdroj [,object] [,listing] [,xref]
/a,/s Abecední řazení segmentů
/c Vytvářet cross-reference v listingu
/dSYM[=VAL] Definovat symbol SYM = 0, nebo = VAL
/e,/r Emulace instrukcí koprocesoru
/h,/? Zobrazí nápovědu
/iPATH PATH pro include soubory
/jCMD Přidat ASM direktivu (např. /jIDEAL)
/kh# Hash table capacity # symbols
/l,/la Generovat listing: l=normální listing, la=rozšířený listing
/ml,/mx,/mu Rozlišovat malá/velká : ml=vždy, mx=globalní , mu=nikdy
/mv# Maximální délka symbolů
/m# Povolit více průchodů
/n Potlačit tabulku symbolů v listingu
/o,/op Generovat overlay object, Phar Lap - style 32-bit
/p Kontrola kódových segmentů v PM ( UseXX )
/q Potlačit části .OBJ nepotřebné k linklování
/t Potlačit výstup mimo chyb
/w0,/w1,/w2 Warning - nastavení: w0=žádné, w1=w2=všechny
/w-xxx,/w+xxx Zakaž (-) nebo Povol (+) warning xxx
/x Přidat podmíněné bloky do listingu ( i ty neplatné )
/z Zobrazovat řádku s chybou
/zi,/zd Debug informaze : zi=vše, zd=jen čísla řádek
TLINK
Syntaxe: TLINK objfiles, exefile, mapfile, libfiles
Volby : /m = MAPy s PUBLIC
/x = Žádné MAPy
/i = Inicializacxe všech segmentů
/l = Přidat čísla zdrojových řádek ( pro TD )
/s = Celková mapa segmentů
/n = Žádné knihovny (library)
/d = Warning pro stejné symboly v knihovnách
/3 = Povol linkování segmentů Use32
/v = Celé Debug info ( pro TD )
/e = Ignorovat rozšířený slovník
/t = Vytvořit COM soubor ( s Org 100h atd .. )
/o = Podporovat overlaye
/ye = Swapovat do EMS
/yx = Swapovat do XMS
Specifikace modelu Instrukce koprocesoru Instrukce procesoru
Direktivy TASM
Programování EGA/VGA
Zde je popis portů EGA/VGA pro práci se standardními režimy ( 256 KB karty).
Na 512KB a 1 MB toto sice platí dále, ale jen pro standardní videomódy. Pro
práci s rozšířenými videomódy ( od 800x600x16 ) je lépe využít funkcí BIOSu,
protože tam neexistuje standard. Vhodné jsou služby VESA Standard Interface ,
pokud je dostupný.
Většina programátorů portů EGA/VGA nechá BIOS nastavit videomód a pak
provádá všechny operace ( body, čáry, obdélníky... ) vlastními silami.
Vyjde to až 10x rychleji.
Někteří tvrdí, že po práci s porty video je nutno opravit příslušné položky -
viz Datová oblast BIOSu . Není to pravda. Jen to zdržuje. Oprava je nutná až
tehdy, je-li třeba použít BIOS. Opravy nemá cenu provádět před voláním služeb
BIOSu ke změně videomódu ( ten stejně všechno přepíše ).
Při programování video je nutno si uvědomit, že nejpomalejší jsou tyto operace:
• Výpočty v pohyblivé řádové čárce. To ale platí obecně. Je nutno volit
algoritmy tak, aby se těmto operacím předešlo.
• Přístup k Video - RAM. Až 5x pomalejší než ostatní RAM.
• Čtení Video - RAM je PODSTATNĚ pomalejší než zápis.
Pokud lze nastavením určitých položek portů zajistit méně přístupů k video RAM,
je lépe provést víc Out, než Mov. Out je rychlejší.
Řada portů VGA a EGA se nachází ve dvojicích. Na prvním portu se zápisem určí
číslo registru zpřístupněného druhým portem. Vhodné je používat přístup po
WORDech : Mov al, Reg_č.
Mov ah, hodnota
Mov dx, Č. portu
Out dx, ax ;zápis
Čtení se musí provádět ve dvou fázích ( ale není téměř třeba ) :
Mov al,Reg_č
Mov dx, Č. portu
Out dx,al
Inc dx
Jmp @wait
@wait: In al,dx ; čtení
Číst lze JEN porty VGA ne EGA !!
Jednotlivé registry získaly své názvy (viz tabulka). Číslo portu odpovídá
standardnímu umístění pro barevnou VGA. Ostsní je třeba dopočítat - viz
kapitolu EGA/VGA I/O porty . Zde je uveden jen základni popis EGA/VGA,
pro detaily doporučuji knihu programování grafických adaptérů PC, vydala
GRADA.
Jméno Adresa
─────────────────────────────────────────────────────────
Miscellaneous 03C2 W
03CC R
Input status 0 03C2 R
Input status 1 03DA R Obecné registry
Feature Control 03DA W
03CA R
Video Sub Systm 03C3 R/W
CRT kontroler 03D4 CRT registry
CRT data 03D5
Sekvencer kontroler 03C4 Registry sekvenceru
Sekvencer data 03C5
GDC kontroler 03CE GDC registry
GDC data 03CF
Atributový kontroler 03C0 Atributové registry
Atributová data 03C1
PEL adresa 03C8 VGA PEL registry
PEL adresa 03C7 VGA (někdy nazývané DAC)
PEL data 03C9 VGA
PEL maska 03C6 VGA
──────────────────────────────────────────────────────────────────────────────
Video INT 10 I/O Porty
Obecné registry :
03CC W, 03C2 R
7 6 5 4 3 2 1 0
┌───────┬───┬───┬───────┬───┬───┐
│ ř │ D │ 0 │ Fre │ R │ i │
└───────┴───┴───┴───────┴───┴───┘
i - Volba I/O adresy. Tento port (3CC,3C2) je konstantní, ostatní se mění podle
typu VGA. ( a tohoto bitu )
0 - monochromatický
1 - barevný viz EGA/VGA I/O porty
R - Povolení RAM - 0 procesor má smůlu
1 přístup povolen
D - Pro diagnostické účely
ř - volba řádkování : Fre - volba frekvence
0 0 Reserved 0 0 25.175 MHz (640 bodů)
0 1 400 mikrořádek 0 1 28.322 MHz (720 bodů)
1 0 350 mikrořádek 1 0 externí
1 1 480 mikriřádek 1 1 Reserved
3C2 Čtení
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ Z │ 0 │ 0 │ T │ 0 │ 0 │ 0 │ 0 │
└───┴───┴───┴───┴───┴───┴───┴───┘
Z - Indikace snímkového zpětného běhu ( 1 probíhá )
Je-li do video ram zasahováno při zpětném běhu, je obraz klidnější.
T - Test na monitor. Viz Kabely
3DA Čtení
7 6 5 4 3 2 1 0
┌───┬───┬───────┬───┬───┬───┬───┐
│ 0 │ 0 │ D │ C │ 0 │ 0 │ Z │
└───┴───┴───────┴───┴───┴───┴───┘
Z - Probíhá zpětný běh ( řádkový nebo snímkový )
C - Informace o CRT 0 - Zobrazuje se obsah Video-RAM
1 - Zpětný běh
D - Pro diagnostické účely
3CA Čtení 3DA Zápis
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ Reserved │
└───┴───┴───┴───┴───┴───┴───┴───┘
3C3 Čtení + zápis
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ O │
└───┴───┴───┴───┴───┴───┴───┴───┘
O - Monitor zobrazuje (1)
Monitor nezobrazuje (0)
Je-li 0, je celá obrazovka černá. Přístup do Video-RAM je rychlejší.
Video INT 10 Programování EGA/VGA I/O porty
CRT Registry
(Port 3D4,3D5)
Reg 00
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ Horizontal Total │
└───┴───┴───┴───┴───┴───┴───┴───┘
Počet znaků v jedné řádce + zatemnění - 5. Pro účely generování Hsync
Reg 01
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ Horizontal Enable End │
└───┴───┴───┴───┴───┴───┴───┴───┘
Počet skutečně zobrazovaných znaků - 1.
Reg 02
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ Start Horizontal Blanking │
└───┴───┴───┴───┴───┴───┴───┴───┘
Okamžik začátku aktivity řádkového zatemňovacího signálu v počtu znaků.
Reg 03
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 1 │ SKEW │ End Horiz Blanking│
└───┴───┴───┴───┴───┴───┴───┴───┘
Pětice méně významných bitů pro okamžik ukončení řádkového zatemnění.
Zbývající je v reg 07
SKEW - Nastavení hodnoty oddálení čtení znaků z obrazové paměti
0 0 0 znaků 1 0 2 znaky
0 1 1 znak 1 1 3 znaky
Reg 04
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ Start Horizontal Retrace │
└───┴───┴───┴───┴───┴───┴───┴───┘
Hodnota znakové pozice, od které začíná zpětný běh.
Reg 05
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ E │ │End Hor. Retrace │
└───┴───┴───┴───┴───┴───┴───┴───┘
D7 + D4..0 Okamžik konce řádkového zpětného běhu.
5..6 oddálení SKEW řádkového zpětného běhu.
Reg 06
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ Vertical Total │
└───┴───┴───┴───┴───┴───┴───┴───┘
Méně významné bity hodnoty celkového počtu mikrořádků - 2.
Zbývající bity jsou v reg 07.
Reg 07
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ │ │ │ │ │ │ │ Přetečení - skladiště
└───┴───┴───┴───┴───┴───┴───┴───┘
Okamžik začátku aktivity řádkového zatemňovacího signálu v počtu znaků.
D0 - bit 8 pro Vertical Total
D1 - bit 8 pro Vertical Display Enable End
D2 - bit 8 pro Vertical Retrace Start
D3 - bit 8 pro Start Vertical Blanking
D4 - bit 8 pro Line Compare
D5 - bit 9 pro Vertical Total
D6 - bit 9 pro Vertical Display Enable End
D7 - bit 9 pro Vertical Retrace Start
Reg 08
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ │ │ Preset Row Scan
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-4 Jemný vertikální posuv obrazu o počet mikrořádek
D5-6 Rozšíření PEL Panning
Reg 09
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ │ │ │ Max Scan Line
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-4 Počet mikrořádek na jeden znak
D5 Bit 9 Start Vertical Blanking
D6 Bit 9 Line COmpare
D7 dvojité mikrořádkování ( 0 jednoduché 200; 1 dvojité 400 )
Reg 0A
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ │ │ Cursor Start
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-4 mikrořádek začátku kurzoru
D5 0 - Zapnut kurzor
1 - Vypnut kurzor
Reg 0B
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ │ │ Cursor End
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-4 mikrořádek konce kurzoru
D5-6 Oddálení signálu pro kurzor 00 - nic .. 11 3 znaky
Reg 0C
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Start Adress
└───┴───┴───┴───┴───┴───┴───┴───┘
Vyšší byte offsetu začátku obrazové paměti ve video RAM.
Reg 0D
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Start Adress
└───┴───┴───┴───┴───┴───┴───┴───┘
Nižší byte offsetu začátku obrazové paměti ve video RAM.
Reg 0E
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Cursor Location
└───┴───┴───┴───┴───┴───┴───┴───┘
Vyšší byte pozice kurzoru ve video RAM.
Reg 0F
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Cursor Location
└───┴───┴───┴───┴───┴───┴───┴───┘
Nižší byte pozice kurzoru ve video RAM.
Reg 10
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Vertical Retrace Start
└───┴───┴───┴───┴───┴───┴───┴───┘
Nižsí byte čísla mikrořádku, kde začíná snímkový zpětný běh.
Reg 11
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ │ │ │ │ Vertical Retrace End
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-3 Číslo mirořádku, kde končí aktivní signál snímkového zpětného běhu.
D4 Signál snímkového zpětného chodu nastaví poprovedení na 0
D5 0 povoluje IRQ 2 ( EGA - INT 0A ) pro snímkový zpětný běh.
D6 Počet obnovování na mikrořádek 0 - 3 obnovení
1 - 5 obnovení
D7 Ochrana proti nežádoucímu přepisu CRT 0 - vypnuta
1 - zapnuta
Reg 12
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Vertical Display Enable End
└───┴───┴───┴───┴───┴───┴───┴───┘
Nižší BYTE posledního mikrořádku zobrazovací plochy.
Reg 13
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Offset
└───┴───┴───┴───┴───┴───┴───┴───┘
Logická délka mikrořádku aktivního režimu
Reg 14
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ │ │ │ Underline Location
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-4 Číslo mirořádku zobrazení podtržení
D5 Pro spolupráci se 4 byte adresami. (D6 = 1) Je-li 1, nastaví
se adresový čítač paměti na 1/4
D6 Volba adresy 2 BYTE (0) nebo 4 BYTE (1)
Reg 15
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │Start Vertical Blanking
└───┴───┴───┴───┴───┴───┴───┴───┘
Méně významný BYTE mikrořádku začátku zatemňovacího pulzu.
Reg 16
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ End Vertical Blanking
└───┴───┴───┴───┴───┴───┴───┴───┘
Adresa mikrořádku konce zatemňovacího pulzu.
Reg 17
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ │ │ 0 │ │ │ │ │ CRT mode
└───┴───┴───┴───┴───┴───┴───┴───┘
D0 - Kompatibilita s 6845 (1 zapnuta)
D1 - Čítač mikrořádků - 0 bit 14 adresy
1 bit 1 čítače
D2 - Mikrořádky 0 - normální (1024)
1 - poloviční (2048)
D3 - Obnovovací cyklus 0 - časování odpovídá čítači mikrořádek
1 - časování poloviční
D5 - Nastavení kopatibility s CGA
D6 - Režim BYTE / WORD
D7 - HW reset VGA
Reg 18
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Line Compare
└───┴───┴───┴───┴───┴───┴───┴───┘
Méně významný byte výmazu čítače mikrořádek.
Pozn.: Hodnoty v CRT není ( až na kurzor ) potřeba měnit.
Video INT 10 Programování EGA/VGA I/O porty
Registry sekvenceru
Porty 3C4 a 3C5
Reg 00
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ │ │ Reset
└───┴───┴───┴───┴───┴───┴───┴───┘
D0 - asynchronní nulování 0-pracuje asynchronně
D1 - synchronní nulování 0-pracuje synchronně - při zápisu se odpojuje
Reg 01
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ │ │ │ │ 0 │ │ Clocking Mode
└───┴───┴───┴───┴───┴───┴───┴───┘
D0 - 0 - 9 bitů rastr
1 - 8 bitů rastr
D2 - 0 - serializace přenosu
1 - 16 bitové operace
D3 - 0 - normální bodová frekvence
1 - poloviční bodová frekvence
D4 - 0 - Přenos dat s bodovou frekvencí
1 - jen za každé 4 body
D5 - 0 - zobrazení povoleno
1 - zakázáno
Reg 02
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │ Map Mask
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-3 bitové roviny s 0 jsou zakázané pro zápis. Lépe je využít GDC maskování
Reg 03
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ │ │ │ │ Character Map Select
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-1 - výběr pozice pro znakovou sadu
D2-3 - výběr pozice pro znakovou sadu
D4 - Mapa A
D5 - Mapa B
Bit 4 (5) bit 1(3) bit 0(2)
────────────────────────────────────────────
0 0 0 1. 8 KB roviny 2
0 0 1 3. 8 KB roviny 2
0 1 0 5. 8 KB roviny 2
0 1 1 7. 8 KB roviny 2
1 0 0 2. 8 KB roviny 2
1 0 1 4. 8 KB roviny 2
1 1 0 6. 8 KB roviny 2
1 1 1 8. 8 KB roviny 2
Reg 04
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │ │ │ 0 │ Memory Mode
└───┴───┴───┴───┴───┴───┴───┴───┘
D1 - Vga používá 256 KB
D2 - Sudý - lichý režim 0 - povolen
1 - pomocí map mask
D3 - 0 - Sekvenční přístup
1 - Podle posledních 2 bitů adresy ( pro 320x200x256 )
Video INT 10 Programování EGA/VGA I/O porty
Atributové registry
Porty 03C0 a 03C1. JINÝ přístup - Na 03C0 zapsat číslo reg a na ten samý port
poté poslat jeho hodnotu. 03C1 slouží ke čtení.
Reg 00-0F - výběr pro jednotlivé barvy z EGA palety (0-3F)
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ r │ g │ b │ R │ G │ B │ R,G,B 2/3 intenzity
└───┴───┴───┴───┴───┴───┴───┴───┘ r,g,b 1/3 intenzity
Reg 10
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ │ │ 0 │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0 - režim 0 - text
1 - grafika
D1 - Barevný režim 0 - ano
1 - monochromatický
D2 - zobrazení 9. bitu (text)
0 - na barvu pozadí
1 - opakování pro znaky C0 - DFh
D3 - Význam bitu 7 atributů 0 - intenzita
1 - blikání
D5 - Povolení PEL Paning 0 - registr se nebere
1 - CRTC provádí Line Compare
D6 - Povolení fce 0013h Video INT 10
D7 - původ signálu P4 a P5 D/A převodníku.
Reg 11
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ Overscan Color
└───┴───┴───┴───┴───┴───┴───┴───┘
Nastavení barvy rámečku
Reg 12
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ │ │ Color Pane Enable
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-4 Povolení práce s bitovou rovinou. 1 Povoleno. Lépe je však využívat
registry GDC.
D4-5 Volba 2 z osmi barev pro Input Status (??)
Reg 13
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │ Horizontal Pel Panning
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-3 umožňuje vodorovný posuv obrazu. V kombinaci s CRT reg 0C a Reg 0D
lze posunovat obraz libovolně po stínítku BEZ nutnosti přesunout jediný
BYTE ve Video RAM. Posyny (max):
monochr : 8 bodů
256 barev : 3 body
ostatní : 7 bodů
Reg 14
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │ │ Color Select
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-1 v podfci 13 bity nahrazující signály P4 a P5 palety
D2-3 Dva nejvýznamější bity palety ( ne pro 256 barev )
Video INT 10 Programování EGA/VGA I/O porty
PEL (DAC) registry
JEN VGA !
03C8 - PEL adresa pro zápis
Zápis na tento port způsobí, že všechna data zapisovaná
na port 03C9 budou obsahovat R,G a B složky palety pro uvedený registr
barvy VGA.
Registrů barev VGA je 256 ( EGA jen 64 ). Pro 256 barevný mód přímo udávají
paletu příslušné barvy. V méně barevném režimu se používá přepočet :
Barva - Registr VGA - Složky RGB
(hodnota v 03C0 reg č. barva )
To znamená : chci-li změnit paletu pro modrou (1), přečtu registr č. 01
z 03C0 ( Atributové registry ), tuto hodnotu pošlu na 03C8 a pak na 03C9 pošlu
3 hodnoty představující R, G a B složky.
03C7 Zápis - PEL adresa pro čtení
Pracuje jako 03C8, ale pro čtení z 03C9. Nekombinujte čtení a zápis dohromady.
Vznikne chaos a nebude to gungovat. Lépe je nejdříve provést celé čtení a pak
celý zápis.
03C7 Čtení - pozice v PEL
Po přečtení udává položku VGA registrů, které se bude týkat další R/W na 03C9.
03C9 - Data registr.
Poskytuje hodnoty pro jednotlivé složky R, G a B palety. Před začátkem je
třebainicializovat port 03C8 číslem registru VGA pro zápis a pak
lze na 03C9 uložit R,G a B složky barvy. Další zápis ( čtvrtý
BYTE ) se vztahuje k R složce dalšího registru VGA. Stačí tedy poslat 0 na
port 03C8 a pak najednou zapsat všech 768 byte palety.
Pozn. Horní 2 bity jsou nulové.
03C6 PEL mask
Vnitřně maskuje všechny hodnoty R, G a B pro všechny VGA registry barev.
Zápis 0 na tento port zhasne celou obrazovku.
Video INT 10 Programování EGA/VGA I/O porty
GDC registry
Při programování EGA/VGA je práce s GDC to nejdůležitější. Je vhodné pracovat
jen s GDC ( stačí to ) a ostaních možností, jak odpojit bitové roviny si raději
nevšímat ( všechno se ANDuje ). Pro podrobnosti o přístupu k VGA viz kapitolu
R/W módy VGA
Reg 00 - Set/Reset
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-4 určují hodnotu, jěž se zapíše do jednotlivých bitových rovin při použití
zápisového módu 0 a kolmého přístupu.
Reg 01 - Enable Set/Reset
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
Pro write mód 0 určuje způsob zápisu do rovin - 0 použij byte procesoru
1 použij bit reg 00
Reg 02 - Color Compare
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-3 určují barvu ke srovnání v Read módu 1.
Reg 03 - Data rotate
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-2 - kolik rotací s BYTE od procesoru (pomalé, lépe je rotovat sám), 0
D3-4 - Způsob zápisu 0 0 Replace
0 1 AND
1 0 OR
1 1 XOR
Reg 04 - Read Map Select
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-1 volí bitovou rovinu pro Read mód 0.
Reg 05 - Graphic mode
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ │ │ │ │ 0 │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-1 Volba Write módu
D3 Volba Read módu
D4 Sudý/lichý režim (1 zapnut) 0
D5 pro BIOS
D6 pro režimy 256 barev
Reg 06 - Miscellaneous
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0 - 0 Povolen přístup ke znakovému generátoru (0)
1 zakázán
D1 - Specifikace režimu sudý/lichý
D2-3 Počátek video RAM :
0 0 A000h 128KB
0 1 A000h 64KB (default pro grafiku)
1 0 B000h 32KB (Hercules)
1 1 B800h 32KB (text)
Reg 07 - Color don't care
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-4 pro Read mode 1
Reg 08 - Bit mask
7 6 5 4 3 2 1 0
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ │ │ │ │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
D0-7 definují hodnotou 1 možnost zápisu do určeného bitu. Pro Write módy.
Video INT 10 Programování EGA/VGA I/O porty
R/W módy VGA
Zde jsou popsány možnosti přístupu k EGA a VGA kartě. Pro EGA NENÍ dostupný
Write mode 3. Veškeré přístupy do VGA probíhají přes tzv. Latch registry VGA.
Tyto hardware podle požadavků naplňuje a zpět zapisuje do VGA paměti. VGA paměť
de facto neexistuje jako taková, offset uvnitř Video ROM pouze informuje
hardware, že se chce pracovat s tím a tím BYTEM a tak ho pomocí LATCH
zpřístupní. Latch registry je až na výjimky nutno inicializovat před zápisem.
proto se zřídka používá Mov es:[di],al ale něco ve stylu Or es:[di],al.
Cesta obrazu k uživateli
┌─────────────┐ ┌────────────────┐ ┌───────────────────┐
│ Video RAM ├──◄►──┤ Latch Registry ├─◄►──┤ CPU R/W Video RAM │
└──────┬──────┘ └───────┬────────┘ └───────────────────┘
▼ ▲
┌──────┴──────┐ ┌───────┴────────┐ ┌───────────────────┐
│ CRT, │ │ GDC, Sekvencer ├─◄►┬─┤CPU I/O Video porty│
│ Kontroler ├─┐ │ Řízení Latch │ │ └───────────────────┘
│ atributů │ │ └────────────────┘ │ (Pro EGA jen O porty)
└──────┬──────┘ └───────────────────────◄►┤
▼ │
┌──────┴──────┐ │
(Ega) (Vga) │
│ ┌────┴─────┐ │
│ │ PEL ├───────────────────◄►┘ ┌───────────┐
│ │ registry │ ┌──┤ Monitor │
│ └────┬─────┘ │ └───────────┘
└─────►───────┴─────────►─────────────────┘
Schéma organizace Video RAM pro 16-ti barevné módy (i 800x600x16)
Vyznačený BYTE se adresuje ve VŠECH rovinách s offsetem 0.
To, kam připadne a jakým způsobem se do bitových tovin zobrazí určují GDC
registry. Výsledná barva bodu na stínítku je dána kombinací odpovídajících si
bitů v různých barevných rovinách. Délka řádku X je počet bodů vodorovně shr 3.
Začátek Video RAM.────────┐ ┌ Vodorovný přístup. Dojde k výměně celého BYTE
│ │ ve zvolené rovině (zvolených rovinách)
│ │
Kolmý přístup : ▼ │
BYTE : YYYYABCD (bin) 0 ▼ 1 X
YYYY se ││││ ┌─B───────────────┬────//──┬───────────────┐ Rov. 0
zahodí. │││└─────────► │ ∙ ∙ ∙ ∙ ∙ ∙ ∙ ∙ │ │ ∙ ∙ ∙ ∙ ∙ ∙ ∙ │ Modrá
┌──────────┘││ 0 ├─────────────────┼────//──┼───────────────┤
│ ┌─────┘│ ┌─G─────┴─────────┬────────────//──────────┐Rov. 1 │
│ │ └─► │ ∙ ∙ ∙ ∙ ∙ ∙ ∙ ∙ │ │Zelená │
│ │ 0 ├─────────────────┼───────────//───────────┤ │
│ │ ┌─R─────┴─────────┬──────────────────//────┐Rov. 2 │ │
│ └► │ ∙ ∙ ∙ ∙ ∙ ∙ ∙ ∙ │ │Červená│ │
│0 ├─────────────────┼─────────────────//─────┤ │ │
│ ┌─I─────┴─────────┬────────────────//──────┐Rov. 3 │ │ │
└►│ ∙ ∙ ∙ ∙ ∙ ∙ ∙ ∙ │ │Jas │ │ │
├─────────────────┼──────────────//────────┤ │ │ │
│ │ │ │ │
....................................................................
Při kolmém zápisu se poloha zapisovaného bitu v daném BYTE roviny řídí hodnotou
uvedenou v Bit Mask registru (Reg 08). GDC Registry .
256 barevné módy využívají vodorovný zápis ve formě : Co bod, to byte.
Read mode 0. - Čtení po bitových rovinách.
───────────────────────────────────────────────────────────────────────────
Musí se nastavit :
1. bit 3 reg 05 GDC na 0
2. bity 0 a 1 reg 04 GDC na číslo požadované bitové roviny.
Potom instrukce Mov al,es:[di] přečte byte na adrese di (es je video segment)
z roviny specifikované v reg 04.
Př.: Mov dx,03ceh
Mov ax,0005h
Out dx,ax
Mov ax,0004h
Out dx,ax
Mov ax,0a000h
Mov es,ax
Xor di,di
Mov al, byte ptr es:[di] ; přečte první byte z bitové roviny 0
Read mode 1. - Kolmé čtení.
───────────────────────────────────────────────────────────────────────────
Musí se nastavit :
1. bit 3 reg 05 GDC na 1
2. bity 0 až 3 reg 02 GDC na číslo barvy
3. bity 0 až 3 reg 07 GDC na masku
Potom instrukce Mov al,es:[di] zjistí, které z osmice bodů, jež daný BYTE
specifikuje odpovídají barvě uvedené v registru 02. Tyto body se nastaví v al
na 1, ostatní na 0. Je-li v reg 07 uvedena jiná hodnoa než 0Fh, pak se ještě
před nastavením al provede maskování. Shoda bit je pak požadována jen tam, kde
je bit masky nastaven na 1. Pro masku 00 se al vrátí vždy 0FFh.
GDC Registry
Write mode 0. - Kolmý a vodorovný zápis.
───────────────────────────────────────────────────────────────────────────
Musí se nastavit :
1. bity 01 v reg 05 GDC na 00
2. Reg 03 GDC na požadovaný způsob zápisu
3. Reg 08 GDC na maskování jednotlivých bitů
4. Reg 00 GDC na požadovanou barvu ( pak reg 01 GDC je 0Fh )
5. Reg 01 GDC na 0fh ( pro reg 00 obsahující barvu, kolmý zápis ) nebo
nastavíme na 0 ty bitové roviny, kde má být proveden vodorovný zápis,
reg 00 obsahuje 0.
Kolmý zápis - ( viz výše ) - do pozic povolených 1 v masce (reg 08)
se zapíšou podle zvolené logické funkce ( reg 03 ) body barvou specifikovanou
v reg 00. Je ovšem třeba naplnit Latch.
Např. Add es:[di],al ( čtení + zápis ), význam má jen adresa !
Ve specifikovaném byte se nastaví všechny 4 roviny podle udané barvy (reg 00)
Př.: Mov dx,03ceh
Mov ax,0f01h
Out dx,ax ; kolmý zápis
Mov al,00
Mov ah,barva
Out dx,ax ; barva k zápisu
Mov ax,0003
Out dx,ax ; bez rotací, záměna
Mov ax,0005
Out dx,ax ; Write mode 0
Mov ax,0408h
Out dx,ax ; bit mask nastaven na 04, tzn zápis se týká jen 3.bitu
; zprava
Xor di,di
Mov ax,0a000h
Mov es,ax ; první bit
Add es:[di],al ; naplnění Latch registrů, + zápis provokující hardware
; na al VŮBEC nezáleží.
Vodorovný zápis
Byte předaný CPU se maskuje podle reg 08 GDC a uloží do rovin, kde je 0 v reg
01 GDC podle specifikovaného typu zápisu (reg 03). Do bitových rovin, kde je
reg 01 nastaven na 1, provede hardware kolmý zápis podle reg 00, kde budou
nejspíš nuly. Maskování podle GDC je tedy vhodné jen pro zápis do jednotlivých
rovin. Doporučuji vyzkoušet, co EGA (VGA) provede. I zde je vhodné naplnit
předem Latch registry ( ne Mov, ale Or ). Maskování rovin přes GDC není ten
nejlepší nápad, pro čistě vodorovný zápis je výhodnější použít
Registry sekvenceru . Ale čistě vodorovný zápis není právě obvyklý, až na
některé specifické operace ( stahování a obnovování podkladů, zobrazování BMP
a PCX ... )
Pozn.: Lze i kombinovat hodnoty v reg 00 a 01 a získat tak polokolmý a
polovodorovný zápis, ale k čemu to je ?
GDC Registry
Write mode 1. - Přenosy uvnitř VGA (EGA)
───────────────────────────────────────────────────────────────────────────
Musí se nastavit :
1. bity 01 v reg 05 GDC na 01
Jednoduše zapíše obsah Latch registrů na cílovou pozici ve Video RAM.
Např. instrukce Movsb přenese VŠECHNY 4 byte ( v každé bitové rovině 1)
z ds:[si] na es:[di]. Je to více než 5 x rychlejší než do normální RAM.
Write mode 2. - Zápis bodu
───────────────────────────────────────────────────────────────────────────
Musí se nastavit :
1. bity 01 v reg 05 GDC na 10
2. reg 08 v GDC na masku
3. bity 34 v reg 03 GDC podle log fce
Pak sekvence Mov al, ds:[si]
Mov ds:[si], ah
nastaví body povolené reg 08 na barvu polde ah pomocí požadované funkce
(reg 03). Jedná se tedy o kolmý zápis.
Pozn.: Totéž dokáže i Write mode 0.
Př.: Mov dx,03ceh
Mov ax,0a000h
Mov es,ax
Xor di,di
Mov ax,0205h ; Write mode 2
Out dx,ax
Mov ax,0408h ; maskování
Out dx,ax
Mov ax,0003 ; způsob zápisu
Out dx,ax
Mov al, es:[di] ; naplnění Latch
Mov al,barva
Mov es:[di],al ; zápis do video
Příklad dělá totéž jako příklad u Write mode 0.
GDC Registry
Write mode 3. - Kolmý zápis (jen VGA)
───────────────────────────────────────────────────────────────────────────
1. bity 01 v reg 05 GDC na 11
2. reg 08 v GDC na masku
3. reg 00 GDC na barvu
4. bity 34 v reg 03 GDC podle log fce
Pracuje jako Write mode 0 v kolmém zápisu, ale maskuje se 2x, jednou pomocí
reg 08 GDC a podruhé podle byte procesoru. Ušetří 1 OUT, ale musí se provádět
zbytečně 2 instrukce R/W ze VGy.
Lépe je použít Write mode 0.
Př.: Mov dx,03ceh
Mov ax,0a000h
Mov es,ax
Xor di,di
Mov ax,0305h ; Write mode 3
Out dx,ax
Mov ax,0ff08h ; maskování - všechno povoleno
Out dx,ax
Mov ax,0003 ; způsob zápisu
Out dx,ax
Mov ah,barva
Xor al,al
Out dx,ax ; vybraná barva
Mov al, es:[di] ; naplnění Latch
Mov al,04
Mov es:[di],al ; zápis do video
Příklad dělá totéž jako příklad u Write mode 0.
Pozn.: Pro do VGA a EGA je lépe využívat přístup jen po BYTEch. Přístup po
WORDech není tak spolehlivý ; pro kolmý zápis má cenu myslet jen na
BYTE, ve vodorovných zápisech mějte na paměti, že bit mask funguje
jen pro prvních osm bitů a ostatní nejsou jeho hodnotou ovlivněny.
Video INT 10 Programování EGA/VGA I/O porty
GDC Registry
Ovladače zařízení
Možnost instalovat vlastní ovladače zařízení bývá někdy označována za největší
vynález od vzniku CP/M.
Instalovatelný ovladač zařízení vám umožní vytvořit standardní interface mezi
DOSem a nestandardní částí hardware. Budeme se zajímat o následující:
Drivery zařízení obecně .......... obecný úvod k driverům
Hlavička zařízení ............... struktura první části popisu driveru
Atributy zařízení ............... bitové příznaky definující zařízení
Požadavky zařízení .............. příkazy, které musí driver vykonat
Hlavička požadavku zařízení ..... struktura prvních 13-bytů bloku požadavku
Chyby ovladačů zařízení ......... kódy chyb, které vrací driver DOSu
Stavové slovo zařízení ........... stavové bity vracené DOSu
Lahůdky DOSu 6.0 ................ Billova prasárna #n+1
Funkce DOSu Dos Fn 44 Přerušení DOSu
Drivery zařízení obecně
Instalovatelný driver zařízení je speciálně formátovaný program, který se
natáhne do paměti při bootu DOSu.
Driver je soubor ve tvaru binární masky. Přeložený zdrojový kód přeměňte pomocí
EXE2BIN na binární soubor. Na rozdíl od souborů ve formátu COM nepoužívejte
na počátku programu ORG 100H.
První část souboru musí být 18-bytová struktura nazývaná Hlavička zařízení.
První čtyři byty jsou změněny DOSem měhem instalace. Jestliže soubor CONFIG.SYS
obsahuje direktivu DEVICE= pro tento soubor driveru, bude soubor nainstalován
do řetězce driverů zařízení. V podstatě jde o to, že instalovaný driver má pak
přednost před driverem DOSu pro zařízení stejného jména.
╔═════════ Hlavička ═════════╗
╓───┬───┬───┬───┬───┬───────────────╥─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐
╔═◄═║DalšíZř│ │ │ │C O N ║ program a data ANSI.SYSu │
║ ╙─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─╨─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘
║ ╓───┬───┬───┬───┬───┬───────────────╥─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐
║ ║DalšíZř│ │ │ │C O N ║ program a data zařízení CON │
║ ╙─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─╨─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘
║ ╓───┬───┬───┬───┬───┬───────────────╥─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐
╚══►║DalšíZř│ │ │ │L P T 1 ║ program a data zařízení LPT1 │
╔═◄═╙─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─╨─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘
║ ╓───┬───┬───┬───┬───┬───────────────╖
╚══►║DalšíZř│ │ │ │C O M 1 ║
╔═◄═╙─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─╜
║ ╓───┬───┬───┬───┬───┬───────────────╥─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐
╚══►║DalšíZř│ │ │ │C O M 2 ║ program a data zařízení COMn │
╔═◄═╙─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─╨─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘
atd.
┌────────────────────────┐
│ Strategie a přerušení │ Dvě z polí v hlavičce driveru jsou 16-bitové
└────────────────────────┘ ukazatele do programového segmentu driveru.
Při jakémkoli požadavku zařízení DOS nejprve volá adresu Strategie a předá jí
adresu Hlavičky požadavku v ES:BX. Rutina strategie tento ES:BX zaznamená pro
pozdější použití v prostředí multi-taskingu tak může vytvořit pro požadavky
frontu FIFO. ( chacha )
Potom je bez parametrů DOSem volána rutina Přerušení. Jejím úkolem je vyvolat
adresu nejposlednější hlavičky požadavku a provést příkazy, které jsou zde
uloženy. Nejrůznější příkazy zařízení používají rozličné struktury pro tvar
bloku dat, který je předáván DOSem. Prohlédněte si strukturu požadavků zařízení,
seznam příkazů a jejich popis. Standardně bude driver obsahovat nějaký druh
n-násobného větvení k obsluze požadavků.
Po vyhovění požadavku by měl driver nastavit stavové slovo zařízení na indikaci
tohoto stavu, vyčíslit chyby a vrátit řízení DOSu přes FAR ret.
Funkce DOSu Ovladače zařízení Přerušení DOSu
Struktura hlavičky zařízení
Binární soubor ovladače zařízení začíná následující strukturou. Během instalace
se upraví položka Next_Device tak, aby odpovídala řetězu zařízení.
Ofset Vel Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┬───────┐ Next_Device: FAR adresa dalšího zařízení v řetězu
+0 4 │ofset segment│ (ofset=0ffffH pro poslední ovladač)
├───┴───┼───┴───┘
+4 2 │DevAttr│ bitové pole tvořící atribut zařízení
├───┴───┤
+6 2 │Stratgy│ ofsetová adresa rutiny STRATEGY
├───┴───┤
+8 2 │Intrupt│ ofsetová adresa rutiny INTERRUPT
├───┴───┴───────────────────────┐
+0aH 8 │'L' 'P' 'T' '1' 20H 20H 20H 20H│ Název zařízení doplněný mezerami
└───┴───┴───┴───┴───┴───┴───┴───┘ (číslo podjednotky)
Atributy zařízení Ovladače zařízení Požadavky zařízení
Atributy zařízení
Pole DevAttr hlavičky zařízení charakterizuje vlastnosti zařízení.
1 1 1 1 1 1
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
║ │ │ │0│ │0 0 0 0│ │0 0│ │ │ │ ║
╙╥┴╥┴╥┴─┴╥┴─┴─┴─╨─┴╥┴─┴─┴╥┴╥┴╥┴╥╜ č. bitu hodnota masky
║ ║ ║ ║ ║ ║ ║ ║ ╚═► 0: 1=standardní zařízení vstupu (a & 0001H)
║ ║ ║ ║ ║ ║ ║ ╚═══► 1: 1=standardní zařízení výstupu (a & 0002H)
║ ║ ║ ║ ║ ║ ╚═════► 2: 1=standardní nulové zařízení (a & 0004H)
║ ║ ║ ║ ║ ╚═══════► 3: 1=časové zařízení (a & 0008H)
║ ║ ║ ║ ╚═════════════► 6: 1=podporuje logické zařízení (a & 0040H)
║ ║ ║ ╚═══════════════════════► 11: 1=otevři/zavři/RM (a & 0800H)
║ ║ ╚═══════════════════════════► 13: 1=blokové zař. jiné, než IBM (a & 2000H)
║ ╚═════════════════════════════► 14: 1=podporuje IOCTL (a & 4000H)
╚═══════════════════════════════► 15: 1=znakové zařízení; 0=blokové (a & 8000H)
Poznámky:
• nahrazujete-li ovladač CON, nastavte standardní I/O bity (0 a 1)
• nulové zařízení se nedá přesměrovat(nezkoušejte nahradit nulové zařízení DOSu)
• bit logického zařízení (DOS 3.2+) indikuje zabezpečení požadavků 17H a 18H
(vrať-nastav Logické zařízení) používané ve smyslu "pseudofloppy" filozofie
ovladače DRIVER.SYS.
• bit otevři/zavři/RM (DOS 3.0+) indikuje zabezpečení požadavků spojených s
vyměnitelnými médii (0dH až 0fH), takže se dají ovladače blokových zařízení
optimalizovat pomocí lokálních bufferů a znaková zařízení mohou vysílat
inicializační sekvence.
• bit indikace non-IBM zařízení se používá při (02H) Vytvoř BPB
• bit IOCTL pomáhá utilitám zařízení, které používají DOS Fn 44
• bit znakového zařízení ovlivňuje požadavky Vstupu a Výstupu a rozhoduje o
významu 'názvu zařízení' v Hlavičce zařízení. Je-li tento bit 0, zařízení
je blokové (obvykle diskový drive).
• bit časového zařízení indikuje náhradu zařízení CLOCK$. CLOCK$ je znakové
zařízení, které obsluhuje požadavky zařízení na vstup a výstup přesně 6ti
bytů. Požadavek na vstup (kód příkazu 4) by měl vrátit 6 bytů označujících
současný čas/datum a požadavek na výstupu (kód příkazu 8) by měl akceptovat
6 bytů k nastavení hodin/kalendáře. Formát pro CLOCK$ I/O je:
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────┐
+0 2 │ datum │ dnů od 1. ledna 1980
├───┼───┘
+2 1 │min│ minuta (0-59)
├───┤
+3 1 │hod│ hodina (0-24)
├───┤
+4 1 │sek│ sekunda (0-59)
├───┤
+5 1 │set│ setina sekundy (0-99)
└───┘
Ovladače zařízení Hlavička zařízení Požadavky zařízení
Požadavky zařízení
Příkaz Jméno Použit Příkaz Jméno Použit DOS
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
0 Inicializuj zařízení Z,B █ 0aH Stav výstupu Z
1 Kontroluj médium B █ 0bH Smazání výstupu Z
2 Vytvoř BPB B █ 0cH Výstup IOCTL Z,B,I
3 Vstup IOCTL Z,B,I █ 0dH Otevření zařízení Z,B,R 3.0+
4 Vstup (čti zařízení) Z,B █ 0eH Zavření zařízení Z,B,R 3.0+
5 Nedestruktivní Vstup Z █ 0fH Vyměnitelná média B,R 3.0+
6 Stav vstupu Z █ 13H Generický požadavek IOCTL I 3.2
7 Smazání vstupu Z █ 17H Vrať logické zařízení Z,B 3.2
8 Výstup (Piš na zařízení) Z,B █ 18H Nastav logické zařízení Z,B 3.2
9 Výstup s kontrolou Z,B █
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Klíč: Z = ovladače znakových zařízení ────────────┐
B = bloková zařízení (většinou diskové drivery) ╞►Viz Atributy zařízení
I = musí zabezpečit IOCTL │
R = musí zabezpečit O/Z/RM ────────────┘
Pole struktury požadavků je proměnné délky a definice závisí na "Kódu příkazu"
(byte v hlavičce požadavků na ofsetu 2). Některé příkazy sdílí stejné struktu-
ry požadavků. Jiné mají specifickou strukturu a některé používají pro komuni-
kaci s DOSem pouze hlavičku zařízení.
┌────────────────────┐
│Inicializuj zařízení│ Kód příkazu zařízení: 0
Ofset Vel. Obsah └────────────────────┘
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────────────────────────────────────────────────┐
+0 0dH │ 13-bytová hlavička požadavku │
├───┼───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┘
+0dH 1 │ │ Návrat: počet jednotek definovaných tímto ovladačem
├───┴───┬───────┐
+0eH 4 │ofset segment│ Návrat: poslední adresa rezidentní části
├───┴───┼───┴───┤
+12H 4 │ofset segment│ Vstup: adresa ASCII řetězce z CONFIG.SYSu
├───┼───┴───┴───┘ Návrat: adresa BPB pro zařízení (bloková z.)
+16H 1 │drv│ Číslo drive (0=A, 1=B, atd.) Pouze pro DOS 3.0+
└───┘
Tento ovladač inicializuje zařízení a vrátí adresu konce paměti, kterou bude
potřebovat rezidentní část podržet.
Počínaje DOSem 3.0, obsahuje ofset 12H DWORD adresu textu, který se objevuje
po načtení příkazu "DEVICE=" z CONFIG.SYSu. Tento text se dá číst kvůli zjištění
uživatelských parametrů. Také od této verze obsahuje ofset 16H číslo drive (což
umožní ovladači zobrazit zprávu o tom, které ID drive bylo instalováno)
Je dobré během inicializace používat jen DOS Fn 01H-0cH.
┌────────────────┐
│Kontroluj médium│ Kód příkazu: 1
Ofset Vel. Obsah └────────────────┘
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────────────────────────────────────────────────┐
+0 0dH │ 13-bytová Hlavička zařízení │
├───┼───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┘
+0dH 1 │ │ Vstup: Byte deskriptoru média (DOS si všímá jeho změny)
├───┤
+0eH 1 │ │ Návrat: 0ffH=změna média; 1=totéž médium; 0=nevím
├───┴───┬───────┐
+0fH 4 │ofset segment│ Návrat: adresa ASCII ID předchozího označení média
└───┴───┴───┴───┘ (je-li změněno médium a zabezpečení RM)
Ovladač zjišťuje, zda bylo změněno médium.
┌──────────┐
│Vytvoř BPB│ Kód příkazu: 2
Ofset Vel. Obsah └──────────┘
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────────────────────────────────────────────────┐
+0 0dH │ 13-bytová hlavička požadavku │
├───┼───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┘
+0dH 1 │ │ Vstup: byte deskriptoru média
├───┴───┬───────┐
+0eH 4 │ofset segment│ Vstup: adresa bufferu (FAT sektor 0)
├───┴───┼───┴───┤
+12H 4 │ofset segment│ Návrat: adresa BPB pro tento disk
└───┴───┴───┴───┘
Ovladač vrací ukazatel na BPB pro disketu, která je právě v mechanice. Má-li
zařízení atribut Jiné zařízení, než typu IBM, pak ofset 0eH ukazuje pánu bohu
do oken. Je-li ve formátu IBM, pak ukazuje na první sektor FAT (která se načítá
před příkazem "Vytvoř BPB").
┌─────────────────┐
│ Vstup či Výstup │ Kódy příkazů: 3,4,8,9,0cH
Ofset Vel. Obsah └─────────────────┘
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────────────────────────────────────────────────┐
+0 0dH │ 13-bytová hlavička požadavku │
├───┼───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┘
+0dH 1 │ │ Vstup: byte deskriptoru zařízení
├───┴───┬───────┐
+0eH 4 │ofset segment│ Vstup: adresa bufferu přenosu dat
├───┴───┼───┴───┘
+12H 2 │Počet │ Vstup: počet bytů (počet sektorů pro bloková z.)
├───┴───┤
+14H 2 │Sektor │ Vstup: číslo počátečního sektoru (jen bloková
├───┴───┼───────┐ zařízení)
+16H 4 │offset segment│ Výstup:adresa ASCIIZ řetězce jména Volume ID
└───┴───┴───┴───┘ (při vrácení chyby zařízení 0fH)
Při vstupních příkazech (3,4) by mělo zařízení přenést Počet bytů (sektorů pro
bloková zařízení) ze zařízení do paměti počínaje na adrese a ofsetu 0eH.
Při výstupních povelech (8,9,0cH) by mělo zařízení přenést Počet bytů/sektorů
z paměti počínaje na adrese a ofsetu 0eH do zařízení.
┌─────────────────────────────────┐
│ Nedestruktivní vstup bez čekání │ Kód příkazu: 5
Ofset Vel. Začátek └─────────────────────────────────┘
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────────────────────────────────────────────────┐
+0 0dH │ 13-bytové záhlaví požadavku │
├───┼───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┘
+0dH 1 │ │ Výstup: Hodnota bytu, který je další ve frontě
└───┘
Toto je použitelné pouze u znakových zařízení. Dovoluje DOSu prohlédnout si
dopředu znak, který bude vrácen vstupním požadavkem Další.
┌────────┐
│ Status │ Kódy příkazů zařízení = 6, 0aH
└────────┘ Tyto příkazy požadují, aby ovladač nastavil Stavové slovo zařízení
s důrazem na bit "aktivní" (busy).
Pro Status vstupu (povel 6) nulujte bit aktivity, když v bufferu je čekající
znak. Nastavte jej, jestliže zařízení čeká na byte (např. klávesu).
Pro Status výstupu (povel 7), nulujte bit aktivity, není-li právě žádný rozdě-
laný požadavek na výstup a další výstup by šel přímo na zařízení. Nastavte jej,
jestliže předchozí požadavek na výstup dosud není vyřízen.
┌───────────┐
│ Vyprázdni │ Kódy příkazů: 7, 0bH
└───────────┘ Tyto příkazy požadují po driveru vyprázdnit (zrušit) vstupní
nebo výstupní buffery. Používá se hlavně pro vymazání kláves z klávesnicového
bufferu.
┌───────────────────┐
│ Otevři nebo zavři │ Kódy příkazů: 0dH, 0eH
└───────────────────┘ Tyto příkazy se používají u zařízení s atributem indiku-
jícím podporu "Otevři/Zavři/Výměnné médium". (O/Z/RM)
Bloková zařízení mohou tyto příkazy používat rovněž pro lokální bufferování.
Požadavek "otevření" (0dH) je proveden při každém otevření souboru a požadavek
"zavření" (0eH) je proveden při každém uzavření souboru. To umožňuje driveru
sledovat období, kdy je možné vyměnit disk, a/nebo vyprádnit buffery pro
optimální výkonnost.
Znaková zařízení tyto příkazy mohou rovněž používat pro posílání inicializač-
ních řetězců na zařízení (např. tiskárnu) nebo resetovat zařízení na impli-
citní hodnoty.
┌────────────────┐
│ Výměnné médium │ Kód příkazu: 0fH
└────────────────┘ Tento kód je používán zařízeními s atributem indikujícím
podporu "Otevři/zavři/výměnné médium". Ovladač by měl sdělit DOSu, zda podpo-
ruje výměnná média. Vrací informaci v bitu "busy" stavového slova zařízení:
aktivní (bit 9) = 0 médium je výměnné
1 médium není výměnné
┌───────────────┐
│ Generic IOCTL │ Kód příkazu: 13H
Ofset Vel. Obsah └───────────────┘
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────────────────────────────────────────────────┐
+0 0dH │ 13-bytová hlavička požadavků │
├───┼───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┘
+0dH 1 │ │ Vstup: číslo funkce
├───┤
+0eH 1 │ │ Vstup: číslo podfunkce
├───┴───┐
+0fH 4 │ SI │ Vstup: hodnota SI z požadavku DOS Fn 44 IOCTL
├───┴───┤
+11H 4 │ DI │ Vstup: hodnota předaná v DI
├───┴───┼───────┐
+15H 4 │ofset segment│ Vstup: adresa datového paketu IOCTL
└───┴───┴───┴───┘
Drivery v DOS 3.2+. které indikují v atributu zařízení podporu IOCTL, musí být
schopné zpracovat tento požadavek. Používá se v mnoha operacích včetně formá-
tování disku. Je navržen pro standardizaci rozhraní pro mnoho různých typů
disků přes logický ovladač DRIVER.SYS.
Pro související funkce viz DOS Fn 44 IOCTL .
┌─────────────────────────────┐
│ Čti/nastav logické zařízení │ Kódy příkazů: 17H,18H
Ofset Vel. Obsah └─────────────────────────────┘
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───────────────────────────────────────────────────┐
+0 0dH │ 13-bytová Hlavička požadavku zařízení │
├───┼───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┘
+0dH 1 │ │ Vstup: kód jednotky; výstup:poslední referencované
├───┤ zařízení
+0eH 1 │ │ Vstup: kód příkazu
├───┴───┐
+0fH 4 │status │ (nemáme podrobnosti)
├───┴───┼───────┐
+11H 4 │ ofset segment│ (rezervováno)
└───┴───┴───┴───┘
Drivery DOSu 3.2+, které v atributu zařízení indikují podporu IOCTL, musí být
schopny zpracovat tuto funkci. Používá se k udržování přehledu o "logických"
mechanikách, instalovaných blokovým ovladačem DRIVER.SYS. Dává možnost buď dota-
zu, nebo nastavení, který logický disk je aktivní pro fyzickou mechaniku.
U funkce Čti logický drive (18H) by měl driver umístit identifikaci mechaniky
na ofset 0dH (1=A, 2=B, atd.). Jestliže driver obsluhuje jedinou mechaniku, měl
by v tomto poli vrátit 0. Viz DOS Fn 44H IOCTL podfunkce 0eH a 0fH.
────────────────────────────────────────────────────────────────────────────────
Ovladače zařízení Atributy zařízení Hlavička požadavku zařízení
Hlavička požadavku zařízení
Každý požadavek na ovladač zařízení je doprovázen ukazatelem na paket nebo
strukturu s požadavky. Každý paket požadavku začíná touto 13-bytovou hlavičkou.
Po vstupu do driveru ukazuje ES:BX na paket tohoto tvaru:
Ofset Vel. Obsah
▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐
+0 1 │len│ délka tohoto paketu požadavků (hlavička a data)
├───┤
+1 1 │unt│ použitá jednotka (pouze pro bloková zařízení)
├───┤
+2 1 │cmd│ kód příkazu (00-18H) určuje jakou akci provést
├───┴───┐
+3 2 │Status │ Stavové slovo zařízení je naplněno před návratem
├───┴───┴───────────────────────┐ z driveru
+5H 8 │ (rezervováno) │
├───┴ ─ ┴ ─ ┴───┴───┼───┴───┴───┘
+0dH ? │ data prom.délky │ data formátovaná v závislosti na kódu příkazu
└───┴ ─ ┴ ─ ┴───┴───┘ Viz Požadavky zařízení pro různé tvary.
Požadavky zařízení Ovladače zařízení
Chyby ovladačů zařízení
Zjistí-li ovladač neplatný požadavek nebo chybu během své činnosti, nastaví se
bit chyby stavového slova zařízení (bit 15) a kód této chyby se uloží do nižších
8mi bitů (byte hlavičky požadavku s ofsetem 3).
Kód Význam Kód Význam
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
0 zápis na chráněné médium █ 9 tiskárna nemá papír
1 neznámá jednotka █ 0aH chyba při zápisu
2 zařízení není připraveno █ 0bH chyba při čtení
3 neznámý příkaz █ 0cH celkový neúspěch
4 chyba v CRC █ 0dH (reservováno)
5 špatná délka strukt. požadavku █ 0eH (reservováno)
6 chyba vystavení █ 0fH chybná výměna disku (DOS 3.0+)
7 neznámé médium █
8 sektor nenalezen █
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
────────────────────────────────────────────────────────────────────────────────
Stavové slovo zařízení Hlavička požadavku zařízení
Požadavky zařízení Ovladače zařízení
Stavové slovo zařízení
1 1 1 1 1 1
╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
║e│rezerva │b│d║ kód chyby ║ 16-bitové slovo v hlavičce požadavku ofset 3
╙╥┴─┴─┴─┴─┴─┴╥┴╥╨─┴─┴─┴─┴─┴─┴─┴─╜ bit
║ ║ ║ ╚═════════════╩═► 0-7: kód chyby zařízení
║ ║ ╚═════════════════► 8: 1=hotovo (po návratu vždy nastaveno)
║ ╚═══════════════════► 9: 1=aktivní (busy) (pouze povely 6 a 0fH)
╚═══════════════════════════════► 15: 1=nastala chyba
Ovladač zařízení musí vždycky vrátit statové slovo DOSu. Stavové slovo je umís-
těno na ofsetu 3 v hlavičce požadavků zařízení. Po normálním ukončení požadavku
musí driver nastavit bit "hotovo" a vrátit se FAR RETem.
Bit "busy" je nastaven rutinou pro zpracování požadavku tehdy, když dospěje
k závěru, že požadavek nelze uspokojit, protože fyzické zařízení je v provozu
ještě po předchozím požadavku. Dá se také použít pro vrácení různých informací
typu "fronta klávesnice není prázdná" nebo "médium je vyměnitelné".
(Viz Požadavky zařízení )
Bit "chyba" je nastaven, když driver obdrží požadavek, který nedokáže zvládnout,
nebo nastane chyba při pokusu o uspokojení požadavku. Když je nastaven bit "chy-
ba", bity 0-7 (bytu na hlavičce požadavku ofset 3) by měly být naplněny kódem
chyby. Viz Chyby zařízení pro seznam definovaných chybových kódů.
────────────────────────────────────────────────────────────────────────────────
Hlavička zařízení Požadavky zařízení Hlavička požadavku zařízení
Ovladače zařízení
Lahůdky DOSu 6.0
MS-BOSS 6.0 přinesl s sebou novinku Double Space. Pro blbý je to bezva obchodní
trik : Nový DOS je tak dokonalý, že dokáže šetřit místem na disku dvakrát lépe
než ty ostatní. To dokáže jen MicroSoft.
Fígl je zkušenějšímu uživateli jasný : Bill koupil něco ve stylu Super Stor,
změnil jméno a přilepil to k novému DOSu. Stejně jako Central Point Antivirus
a další ...
Aby však byla vize zcela dokonalá, NEINSTALUJE se ovladač komprimovaného disku
až v CONFIG.SYSu, ale již hned po ukončení MSDOS.SYS a před CONFIG.SYS, kde se
instalují ostatní Ovladače zařízení . DOSy od 6.00 hledají soubor DBLSPACE.BIN
a pokud ho naleznou, nainstalují jej jako běžný ovladač.
Konkurence toho úspěšně využila a tak se konkurenční produkty přejmenovávají
na DBLSPACE.BIN aby je neopatrný zásah nevykopnul. Tak se např. chová i nový
Stacker 4.0 .
Nic nebrání vašemu ovladači maskovat se pod takovým jménem a být tak první,
kdo se nainstaluje. Ale vzhledem k možné kolizi s některým komprimačním
programem to nedoporučuji. Pokud se rozhodnete podvádět stejně jako Bill, pak
nezapoměňte, že to bude fungovat až od DOSu 6.0 .
Podraz #n+2
Od DOSu v 5.0 se objevila další legrácka : ovladače už nejsou jen BIN a SYS,
ale dokonce i EXE. ( První vlaštovkou byl EMM386.EXE . ) Výhoda je jasná :
ten samý soubor lze použít jak ovladač tak i pro pozdější řídící program,
který může změnit chování již instalovaného ovladače. Pokud něco takového
chcete, napište mi a já Vám pošlu mustr. Viz Moje Adresa .
Ovladače zařízení
Rejstřík
AThelp obsahuje celkem 478 kapitol. Jsou to tyto :
286 tam a zpátky
386 tam a zpátky
80286
80386DX
80386SX
80486DX
80486DX/2
80486DX/4
80486SX
8086
══════════════════════════════ A ═════════════════════════════════
A20
ASCII
ASCII tabulka
AT klávesnice
Adresace
Aritmetické instrukce 80286
Aritmetické instrukce 80386
Aritmetické instrukce 8086
Atributové registry
Atributy souboru
Atributy zařízení
══════════════════════════════ B ═════════════════════════════════
BIOS INT 15
BOOT
BOOT INT 19
BPB
Bitově orientované instrukce 80386
Blok popisu disku
Blok proměnných DOS
Break INT 1B
Budík INT 4A
══════════════════════════════ C ═════════════════════════════════
CGA I/O PORTY
CMOS
COM
COM - INT 0B
COM - INT 0C
COM INT 14
CPL
CRT Registry
Chybové kódy DOS
Chyby ovladačů zařízení
Časovač INT 08
Časovač INT 1A
══════════════════════════════ D ═════════════════════════════════
DOS Fn 00
DOS Fn 01
DOS Fn 02
DOS Fn 03
DOS Fn 04
DOS Fn 05
DOS Fn 06
DOS Fn 07
DOS Fn 08
DOS Fn 09
DOS Fn 0A
DOS Fn 0B
DOS Fn 0C
DOS Fn 0D
DOS Fn 0E
DOS Fn 0F
DOS Fn 10
DOS Fn 11
DOS Fn 12
DOS Fn 13
DOS Fn 14
DOS Fn 15
DOS Fn 16
DOS Fn 17
DOS Fn 19
DOS Fn 1A
DOS Fn 1B
DOS Fn 1C
DOS Fn 1F
DOS Fn 21
DOS Fn 22
DOS Fn 23
DOS Fn 24
DOS Fn 25
DOS Fn 26
DOS Fn 27
DOS Fn 28
DOS Fn 29
DOS Fn 2A
DOS Fn 2B
DOS Fn 2C
DOS Fn 2D
DOS Fn 2E
DOS Fn 2F
DOS Fn 30
DOS Fn 31
DOS Fn 32
DOS Fn 33
DOS Fn 34
DOS Fn 35
DOS Fn 36
DOS Fn 37
DOS Fn 38
DOS Fn 39
DOS Fn 3A
DOS Fn 3B
DOS Fn 3C
DOS Fn 3D
DOS Fn 3E
DOS Fn 3F
DOS Fn 40
DOS Fn 41
DOS Fn 42
DOS Fn 43
DOS Fn 44
DOS Fn 45
DOS Fn 46
DOS Fn 47
DOS Fn 48
DOS Fn 49
DOS Fn 4A
DOS Fn 4B
DOS Fn 4C
DOS Fn 4D
DOS Fn 4E
DOS Fn 4F
DOS Fn 50
DOS Fn 51
DOS Fn 52
DOS Fn 53
DOS Fn 54
DOS Fn 55
DOS Fn 56
DOS Fn 57
DOS Fn 58
DOS Fn 59
DOS Fn 5A
DOS Fn 5B
DOS Fn 5C
DOS Fn 5D
DOS Fn 5E
DOS Fn 5F
DOS Fn 60
DOS Fn 62
DOS Fn 63
DOS Fn 65
DOS Fn 66
DOS Fn 67
DOS Fn 68
DOS Fn 69
DOS Fn 6C
DPL
DPMI
DPMI Alokace paměti
DPMI Alokace v IDT
DPMI Alokace v LDT
DPMI Ostatní
DPMI Přepínání módů
DPMI Správa Hardware Breakpoints
Datová oblast BIOS
Datová oblast DOS
Deskriptor
Deskriptor média
Detekce EMS
Detekce koprocesoru
Detekce procesoru
Direktivy TASM
Disk INT 13
Diskové chyby
Drivery zařízení obecně
══════════════════════════════ E ═════════════════════════════════
EGA - INT 0A
EGA/VGA I/O PORTY
EMS
EPB
EPL
EXE
══════════════════════════════ F ═════════════════════════════════
FAT
FCB
Floppy - INT 0E
Formát dat koprocesoru
Formát času a data souboru
Funkce DOS
Fyzická adresa
══════════════════════════════ G ═════════════════════════════════
GDC registry
Generic IOCTL 40/60
Generic IOCTL 41/61
Generic IOCTL 42/62
══════════════════════════════ H ═════════════════════════════════
HMA
HPGL
Hardware Breakpoints
Hlavička EXE
Hlavička požadavku zařízení
Hlavička zařízení
══════════════════════════════ I ═════════════════════════════════
I/O PORTY
I/O přes FCB
I/O přes HANDLE
INT 00
INT 01
INT 02
INT 03
INT 04
INT 05
INT 06
INT 07
INT 08
INT 09
INT 0A
INT 0B
INT 0C
INT 0D
INT 0E
INT 0F
INT 10
INT 11
INT 20
INT 21
INT 22
INT 23
INT 24
INT 25
INT 26
INT 27
INT 28
INT 29
INT 2A
INT 2B
INT 2C
INT 2D
INT 2E
INT 2F
INT 2FH BMB
INT 2FH FN 0100H
INT 2FH FN 0101H
INT 2FH FN 0102H
INT 2FH FN 0103H
INT 2FH FN 0104H
INT 2FH FN 0105H
INT 2FH FN 0106H
INT 2FH FN 0500H
INT 2FH FN 05XXH
INT 2FH FN 0600H
INT 2FH FN 0601H
INT 2FH FN 0800H
INT 2FH FN 1000H
INT 2FH FN 1100H
INT 2FH FN 111EH
INT 2FH FN 1200H
INT 2FH FN 1202H
INT 2FH FN 1203H
INT 2FH FN 1204H
INT 2FH FN 1205H
INT 2FH FN 1206H
INT 2FH FN 1207H
INT 2FH FN 1208H
INT 2FH FN 120DH
INT 2FH FN 1210H
INT 2FH FN 1211H
INT 2FH FN 1212H
INT 2FH FN 1213H
INT 2FH FN 1214H
INT 2FH FN 1216H
INT 2FH FN 1217H
INT 2FH FN 1218H
INT 2FH FN 121AH
INT 2FH FN 121CH
INT 2FH FN 121EH
INT 2FH FN 121FH
INT 2FH FN 1220H
INT 2FH FN 1225H
INT 2FH FN 1229H
INT 2FH FN 122CH
INT 2FH FN 1400H
INT 2FH FN 1500H
INT 2FH FN 1501H
INT 2FH FN 1502H
INT 2FH FN 1503H
INT 2FH FN 1504H
INT 2FH FN 1505H
INT 2FH FN 1506H
INT 2FH FN 1507H
INT 2FH FN 1508H
INT 2FH FN 1509H
INT 2FH FN 150BH
INT 2FH FN 150CH
INT 2FH FN 150DH
INT 2FH FN 150EH
INT 2FH FN 150FH
INT 2FH FN 1680H
INT 2FH FN 1686H
INT 2FH FN 1687H
INT 2FH FN 1A00H
INT 2FH FN 4300H
INT 2FH FN 4310H
INT 2FH FN 4800H
INT 2FH FN 4810H
INT 2FH FN 5453H
INT 2FH FN 6400H
INT 2FH FN 7A00H
INT 2FH FN 8900H
INT 2FH FN 8901H
INT 2FH FN 8902H
INT 2FH FN AA00H
INT 2FH FN AD80H
INT 2FH FN AD81H
INT 2FH FN AD82H
INT 2FH FN AD83H
INT 2FH FN B000H
INT 2FH FN B700H
INT 2FH FN B800H
INT 2FH FN B803H
INT 2FH FN B804H
INT 2FH FN E300H
INT 2FH FN F700H
INT 2FH FN F701H
INT 33
INT 70
INT 71
INT 74
INT 75
INT 76
IOPL
IRQ
Informace zařízení IOCTL
Instrukce 80286
Instrukce 80386
Instrukce 80486
Instrukce 8086
Instrukce koprocesoru
Instrukce ochrany paměti 80286
Instrukce ochrany paměti 80386
Instrukce posunů a rotací 80286
Instrukce posunů a rotací 80386
Instrukce posunů a rotací 8086
Instrukce pro práci s řetězci dat 80286
Instrukce pro práci s řetězci dat 80386
Instrukce pro práci s řetězci dat 8086
Instrukce procesoru
Instrukce přesunu dat 80286
Instrukce přesunu dat 80386
Instrukce přesunu dat 8086
Instrukce skoků a volání 80286
Instrukce skoků a volání 80386
Instrukce skoků a volání 8086
Instrukce řídící 80286
Instrukce řídící 80386
Instrukce řídící 8086
══════════════════════════════ K ═════════════════════════════════
Kabely
Klávesnice INT 09
Klávesnice INT 16
Konfigurace INT 11
Koprocesory
Kód země
Kódová stránka
══════════════════════════════ L ═════════════════════════════════
LPT - INT 0D
LPT - INT 0F
LPT INT 17
Lahůdky DOSu 6.0
Lineární adresa
Literatura
Logické instrukce 80286
Logické instrukce 80386
Logické instrukce 8086
══════════════════════════════ M ═════════════════════════════════
MCB
Mapa paměti
Moje adresa
Mou Fn 00
Mou Fn 01
Mou Fn 02
Mou Fn 03
Mou Fn 04
Mou Fn 05
Mou Fn 06
Mou Fn 07
Mou Fn 08
Mou Fn 09
Mou Fn 0A
Mou Fn 0B
Mou Fn 0C
Mou Fn 0D
Mou Fn 0E
Mou Fn 0F
Mou Fn 10
Mou Fn 12
Mou Fn 13
Mou Fn 14
Mou Fn 15
Mou Fn 16
Mou Fn 17
Mou Fn 18
Mou Fn 19
Mou Fn 1A
Mou Fn 1B
Mou Fn 1C
Mou Fn 1D
Mou Fn 1E
Mou Fn 1F
Mou Fn 20
Mou Fn 21
Mou Fn 24
Mou Fn 42
Mou Fn 50
Mou Fn 52
Multiplex
══════════════════════════════ N ═════════════════════════════════
NEDOKUMENTOVÁNO
Nedokumentované instrukce
Nestandardní video módy
Nové instrukce 80486
Nové registry 286
Nové registry 386
Nové registry 486
══════════════════════════════ O ═════════════════════════════════
Obecné registry
Obecné zásady pro DPMI
Ochrana V86
Ovladače zařízení
══════════════════════════════ P ═════════════════════════════════
PEL registry
PORTY DMA
POST
PROTECTED MÓD
PSP
Paměť INT 12
Paralelní porty
Parametry HD 1. INT 41
Parametry HD 2. INT 46
Parametry diskety INT 1E
Pentium
Porty AT HD
Porty FDC
Porty PIC
Porty PIT
Porty PPI
Porty XT HD
Porty joysticku
Požadavky zařízení
Privilegované instrukce
Procesory
Programování EGA/VGA
Prostředí 16/32
Prostředí DOS
Přerušení BIOS
Přerušení CPU
Přerušení DOS
Příkazy TASM na řádce
Příznaky klávesnice
══════════════════════════════ R ═════════════════════════════════
R/W módy VGA
REAL MÓD
ROM Basic INT 18
ROM-SCAN
RPL
Registry koprocesoru
Registry procesoru
Rozšířené funkce EMM
Rozšířené kódy kláves
Rámečky
Řídící kódy ASCII
Řídící kódy modemu
Řídící kódy tiskáren
══════════════════════════════ S ═════════════════════════════════
Scan-kódy klávesnice
Registry sekvenceru
Selektor
Seznam kapitol
Seznam přerušení
Specifikace modelu
Standardní funkce EMM
Status EMM
Stavové slovo zařízení
Struktura Boot-sektoru
Struktura položky adresáře
Stránkování
Systém ochrany
Systémové funkce EMM
Sériové porty
══════════════════════════════ T ═════════════════════════════════
TSS
Tabulka rozdělení disku
Tabulka znaků
Tabulka znaků INT 1F
══════════════════════════════ U ═════════════════════════════════
UMB
Uživatelský časovač INT 1C
══════════════════════════════ V ═════════════════════════════════
V86 MÓD
VCPI
VESA standard interface
Video INT 10
Video parametry INT 1D
Video služby EGA/VGA
══════════════════════════════ X ═════════════════════════════════
XMS
══════════════════════════════ Z ═════════════════════════════════
Zpracování přerušení
Seznam kapitol