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 │ 8028680386SX ├── Celkem je to 16 různých typů. 80386DX │ Budiž nám IBM, INTEL a Microsoft milostiv. 80486SX │ ( Skoro jako svatá trojice, ne ? ) 80486DX80486DX/280486DX/4Pentium ─┘ 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