Π”ΠΈΠΏΠ»ΠΎΠΌΡ‹, курсовыС, Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚Ρ‹, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅...
Брочная ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅

Π ΠΎΠ±ΠΎΡ‚Π° Π² Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΎΠΌΡƒ Ρ€Π΅ΠΆΠΈΠΌΡ– мікропроцСсора

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π ΠΎΠ·Ρ€ΠΎΠ±ΠΈΡ‚ΠΈ дСскриптори усіх Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΈΡ… сСгмСнтів ΠΏΠ°ΠΌ’яті Ρ– сформувати Π· Π½ΠΈΡ… Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρƒ дСскрипторну Ρ‚Π°Π±Π»ΠΈΡ†ΡŽ GDT. Π—Π°ΠΌΡ–ΡΡ‚ΡŒ Π΄Π°Π»ΡŒΠ½Ρ–Ρ… адрСс Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρ– ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΠ²Π°Π½ΡŒ Π²ΠΈΠΊΠΎΡ€ΠΈΡΡ‚ΠΎΠ²ΡƒΡŽΡ‚ΡŒΡΡ дСскриптори ΡˆΠ»ΡŽΠ·Ρ–Π²; ΠœΡ–Π½Ρ–ΡΡ‚Π΅Ρ€ΡΡ‚Π²ΠΎ освіти Ρ– Π½Π°ΡƒΠΊΠΈ ΡƒΠΊΡ€Π°Ρ—Π½ΠΈ Π½Π°Ρ†Ρ–ΠΎΠ½Π°Π»ΡŒΠ½ΠΈΠΉ Ρ‚Π΅Ρ…Π½Ρ–Ρ‡Π½ΠΈΠΉ унівСрситСт. I. Π’ΠΈΠΊΠ»ΠΈΠΊΠ°Ρ‚ΠΈ Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½Π΅ Π·Π³Ρ–Π΄Π½ΠΎ Ρ–Π· Ρ–Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½ΠΈΠΌ завданням Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ. Π’ΠΈΠΊΠΎΠ½Π°Ρ‚ΠΈ Π² Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΎΠΌΡƒ Ρ€Π΅ΠΆΠΈΠΌΡ– Π΄Ρ–Ρ—, Π·Π°Π΄Π°Π½Ρ– Ρ–Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½ΠΈΠΌ завданням… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π ΠΎΠ±ΠΎΡ‚Π° Π² Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΎΠΌΡƒ Ρ€Π΅ΠΆΠΈΠΌΡ– мікропроцСсора (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ΠœΠ†ΠΠ†Π‘Π’Π•Π Π‘Π’Π’Πž ΠžΠ‘Π’Π†Π’Π˜ Π† НАУКИ Π£ΠšΠ ΠΠ‡ΠΠ˜ ΠΠΠ¦Π†ΠžΠΠΠ›Π¬ΠΠ˜Π™ Π’Π•Π₯ΠΠ†Π§ΠΠ˜Π™ Π£ΠΠ†Π’Π•Π Π‘Π˜Π’Π•Π’

«Π₯ΠΠ ΠšΠ†Π’Π‘Π¬ΠšΠ˜Π™ ΠŸΠžΠ›Π†Π’Π•Π₯ΠΠ†Π§ΠΠ˜Π™ Π†ΠΠ‘Π’Π˜Π’Π£Π’»

Π ΠΎΠ·Ρ€Π°Ρ…ΡƒΠ½ΠΊΠΎΠ²ΠΎ-Π³Ρ€Π°Ρ„Ρ–Ρ‡Π½Π΅ завдання № 1

Π· ΠΊΡƒΡ€ΡΡƒ

" ΠœΡ–ΠΊΡ€ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€Π½Ρ– систСми"

Π’ΠΈΠΊΠΎΠ½Π°Π²:

ст. Π³Ρ€. xxxxxxx

xxxxxxxxxxxxx

ΠŸΠ΅Ρ€Π΅Π²Ρ–Ρ€ΠΈΠ²:

xxxxxxxxx

Π₯Π°Ρ€ΠΊΡ–Π² 2006

Зміст

1. Π†Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½Π΅ завдання

2. ПояснСння Π΄ΠΎ Π·ΠΌΡ–сту Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ

3. Опис ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ

4. ВСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ

5. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΈ Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ

6. Висновки

1. Π†Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½Π΅ завдання

Π’Π°Ρ€Ρ–Π°Π½Ρ‚ 16

Π’ Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΎΠΌΡƒ Ρ€Π΅ΠΆΠΈΠΌΡ– Π²ΠΈΠΊΠΎΠ½Π°Ρ‚ΠΈ наступні Π΄Ρ–Ρ—:

I. Π’ΠΈΠΊΠ»ΠΈΠΊΠ°Ρ‚ΠΈ Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½Π΅ Π·Π³Ρ–Π΄Π½ΠΎ Ρ–Π· Ρ–Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½ΠΈΠΌ завданням Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ

II. ΠžΠ±Ρ€ΠΎΠ±ΠΈΡ‚ΠΈ Π·Π°Π΄Π°Π½Π΅ Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ Π΄Π²ΠΎΠΌΠ° засобами:

Π°) ΠΏΡ€ΠΈΠ±Ρ€Π°Π²ΡˆΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ;

Π±) ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ρ‰ΠΎ Π²ΠΈΠ·Π²Π°Π»Π° Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ.

III. ΠžΠ±Ρ€ΠΎΠ±ΠΈΡ‚ΠΈ Π·Π°Π΄Π°Π½Π΅ Π·ΠΎΠ²Π½Ρ–ΡˆΠ½Ρ” пСрСривання.

2. ПояснСння Π΄ΠΎ Π·ΠΌΡ–сту Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ

Для виконання завдання Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΎ Π²ΠΈΠΊΠΎΠ½Π°Ρ‚ΠΈ наступні Π΄Ρ–Ρ—:

Ρ€ΠΎΠ·Ρ€ΠΎΠ±ΠΈΡ‚ΠΈ дСскриптори усіх Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΈΡ… сСгмСнтів ΠΏΠ°ΠΌ’яті Ρ– сформувати Π· Π½ΠΈΡ… Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρƒ дСскрипторну Ρ‚Π°Π±Π»ΠΈΡ†ΡŽ GDT.

Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡŽ рСгістра GDTR Π·Π°Π΄Π°Ρ‚ΠΈ Π±Π°Π·ΠΎΠ²Ρƒ адрСсу Ρ– Ρ€ΠΎΠ·ΠΌΡ–Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ– GDT;

Ρ€ΠΎΠ·Ρ€ΠΎΠ±ΠΈΡ‚ΠΈ дСскриптори усіх ΡˆΠ»ΡŽΠ·Ρ–Π², сформувати Π· Π½ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†ΡŽ IDT.

Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡŽ рСгістра IDTR Π·Π°Π΄Π°Ρ‚ΠΈ Π±Π°Π·ΠΎΠ²Ρƒ адрСсу Ρ– Ρ€ΠΎΠ·ΠΌΡ–Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ– IDT;

сформувати Π΄Π°Π½Ρ– для повСрнСння Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ;

Π·Π°Π±ΠΎΡ€ΠΎΠ½ΠΈΡ‚ΠΈ масковані Ρ– нСмасковані пСрСривання;

пСрСвСсти мікропроцСсор Ρƒ Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ;

Π²ΠΈΠΊΠΎΠ½Π°Ρ‚ΠΈ Π² Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΎΠΌΡƒ Ρ€Π΅ΠΆΠΈΠΌΡ– Π΄Ρ–Ρ—, Π·Π°Π΄Π°Π½Ρ– Ρ–Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½ΠΈΠΌ завданням;

повСрнутися Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ;

Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΠΈ масковані Ρ– нСмасковані пСрСривання.

Для розуміння ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ–Π² програмування Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ Π² Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΎΠΌΡƒ Ρ€Π΅ΠΆΠΈΠΌΡ– Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΎ Ρ€ΠΎΠ·ΡƒΠΌΡ–Ρ‚ΠΈ ΠΉΠΎΠ³ΠΎ особливості. Π—Π°Ρ…ΠΈΡ‰Π΅Π½ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΌΠ°Ρ” Ρ‚Π°ΠΊΡ– особливості Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ Π· ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΠ²Π°Π½Π½ΡΠΌΠΈ (ΠΏΠΎΡ€Ρ–Π²Π½ΡŽΡŽΡ‡ΠΈ Π· Ρ€Π΅Π°Π»ΡŒΠ½ΠΈΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ):

1) Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½ΠΎΠ²ΠΈΠΉ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΠ²Π°Π½ΡŒ — Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ;

2) Π·Π°ΠΌΡ–ΡΡ‚ΡŒ Π΄Π°Π»ΡŒΠ½Ρ–Ρ… адрСс Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρ– ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΠ²Π°Π½ΡŒ Π²ΠΈΠΊΠΎΡ€ΠΈΡΡ‚ΠΎΠ²ΡƒΡŽΡ‚ΡŒΡΡ дСскриптори ΡˆΠ»ΡŽΠ·Ρ–Π²;

3) таблиця ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΠ²Π°Π½ΡŒ ΠΌΠΎΠΆΠ΅ знаходитися Π² Π±ΡƒΠ΄ΡŒ-якому місці ΠΏΠ°ΠΌ’яті.

Π’ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ ΠΏΠΎΠ΄Ρ–Π»ΡΡŽΡ‚ΡŒΡΡ Π½Π° Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠΈ:

— ΠŸΠΎΠΌΠΈΠ»ΠΊΠ° (trap);

— ΠŸΠ°ΡΡ‚ΠΊΠ° (fault);

— ΠΠ²Π°Ρ€Ρ–я (abort).

Помилка — Ρ†Π΅ Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ, Ρ‰ΠΎ Π²ΠΈΠ½ΠΈΠΊΠ°Ρ” Π² ΡΠΈΡ‚ΡƒΠ°Ρ†Ρ–Ρ— ΠΏΠΎΠΌΠΈΠ»ΠΊΠΎΠ²ΠΈΡ… Π΄Ρ–ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΉ ΠΏΡ€ΠΈΠΏΡƒΡΠΊΠ°Ρ”Ρ‚ΡŒΡΡ, Ρ‰ΠΎ Ρ‚Π°ΠΊΡƒ ΠΏΠΎΠΌΠΈΠ»ΠΊΡƒ ΠΌΠΎΠΆΠ½Π° Π²ΠΈΠΏΡ€Π°Π²ΠΈΡ‚ΠΈ. Виконання ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ²ΠΆΡƒΡ”Ρ‚ΡŒΡΡ ΠΏΠΎΡ‡ΠΈΠ½Π°ΡŽΡ‡ΠΈ Ρ–Π· ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΏΡ€ΠΈ якій Π²ΠΈΠ½ΠΈΠΊΠ»ΠΎ Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ.

ΠŸΠ°ΡΡ‚ΠΊΠ° — Ρ†Π΅ Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ, Ρ‰ΠΎ Π²ΠΈΠ½ΠΈΠΊΠ°Ρ” Π²Ρ–Π΄Ρ€Π°Π·Ρƒ після виконання ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ. Виконання ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ²ΠΆΡƒΡ”Ρ‚ΡŒΡΡ Ρ–Π· наступної ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Ρ‰ΠΎ ΠΉΠ΄Π΅ Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΡŽ Π½Π° ΡΠΊΡ–ΠΉ Π²ΠΈΠ½ΠΈΠΊΠ»ΠΎ Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ. На ΠΏΠ°ΡΡ‚ΠΊΠ°Ρ… ΡΡ‚Ρ€ΠΎΡ—Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ…Π°Π½Ρ–Π·ΠΌ Π²Ρ–Π΄Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌ.

Аварія — Ρ†Π΅ Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ, Ρ‰ΠΎ Π½Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΡ” ΠΏΡ€ΠΎΠ΄ΠΎΠ²ΠΆΠΈΡ‚ΠΈ виконання ΠΏΠ΅Ρ€Π΅Ρ€Π²Π°Π½ΠΎΡ— ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Ρ– сигналізує ΠΏΡ€ΠΎ сСрйозні ΠΏΠΎΡ€ΡƒΡˆΠ΅Π½Π½Ρ цілісності систСми.

3. Опис ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ

Для написання ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ для виконання Ρ€Π°Π·Ρ€Π°Ρ…ΡƒΠ½ΠΊΠΎΠ²ΠΎΠ³ΠΎ завдання, ΡΠΊΠΎΡ€ΠΈΡΡ‚Π°Π»ΠΈΡΡŒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ PROT Ρ– ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΎΡŽ P_INT, Ρ‰ΠΎ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡŒΡΡ Ρ€Π°Π·ΠΎΠΌ Ρ–Π· Ρ–Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½ΠΈΠΌ завданням. Π’ ΠΌΠΎΠ΄ΡƒΠ»Ρ– PROT ΠΌΡ–ΡΡ‚ΡΡ‚ΡŒΡΡ основні Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½Ρ– константи Ρ– Ρ„ΡƒΠ½ΠΊΡ†Ρ–Ρ— для створСння власних Ρ‚Π°Π±Π»ΠΈΡ†ΡŒ GDT Ρ‚Π° IDT, для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρƒ Π² Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ, ΠΌΡ–ΡΡ‚ΡΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΠΆ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ для всіх Π°ΠΏΠ°Ρ€Π°Ρ‚Π½ΠΈΡ… Ρ– ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΠ²Π°Π½ΡŒ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° P_INT ΠΌΡ–ΡΡ‚ΠΈΡ‚ΡŒ пСрСвизначСння Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΈΡ… для Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ, Π°Π±ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ… Π·Π° Ρ–Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½ΠΈΠΌ завданням ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΠ²Π°Π½ΡŒ, Π² Π½Ρ–ΠΉ Π·Π°Π΄Π°Ρ”Ρ‚ΡŒΡΡ вміст Ρ‚Π°Π±Π»ΠΈΡ†ΡŒ GDT Ρ‚Π° IDT (Π² Π½Ρ–ΠΉ Π²ΠΈΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡŒΡΡ сСлСктори Π·Π°Π³Π»ΡƒΡˆΠΎΠΊ, Π°Π±ΠΎ Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΠ²Π°Π½ΡŒ, Π½Π° Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΈΡ… місцях), ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Ρ€Π΅Π°Π»Ρ–Π·ΡƒΡ” ΠΏΠ΅Ρ€Π΅Ρ…Ρ–Π΄ Π² Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Ρ–ΠΌΡ–Ρ‚ΡƒΡ” виникнСння ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½ΠΎΠ³ΠΎ пСрСривання, Π° Ρ‚Π°ΠΊΠΎΠΆ Ρ€Π΅Π°Π»Ρ–Π·ΡƒΡ” Π²Ρ–Ρ‡Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ», Π΄ΠΎ Π²ΠΈΠ½ΠΈΠΊΠ½Π΅Π½Π½Ρ Π°ΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ пСрСривання. ΠŸΡ–ΡΠ»Ρ Ρ†ΡŒΠΎΠ³ΠΎ Ρ€Π΅Π°Π»Ρ–Π·ΡƒΡ”Ρ‚ΡŒΡΡ Π²ΠΈΡ…Ρ–Π΄ Π΄ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΡƒ, ΡˆΠ»ΡΡ…ΠΎΠΌ скидання мікропроцСсору (Π½Π΅ ΠΏΡ€Π°Ρ†ΡŽΡ” Π½Π° Π½ΠΎΠ²ΠΈΡ… модСлях мікропроцСсорів) Π°Π±ΠΎ ΡˆΠ»ΡΡ…ΠΎΠΌ відновлСння старої GDT Ρ‚Π° IDT, Ρ– повСрнСння Π΄ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΡƒ. Нами Π±ΡƒΠ»ΠΎ Π΄ΠΎΠ΄Π°Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½Ρ– ΠΏΠΎ Ρ–Π½Π΄ΠΈΠ²Ρ–Π΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ завданню Π°ΠΏΠ°Ρ€Π°Ρ‚Π½Π΅ Ρ– ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½Π΅ пСрСривання, Ρ– Ρ€Π΅Π°Π»Ρ–Π·ΠΎΠ²Π°Π½ΠΎ Π²ΠΈΠΊΠ»ΡŽΡ‡Π½Ρƒ ΡΠΈΡ‚ΡƒΠ°Ρ†Ρ–ΡŽ для Ρ—Ρ… виникнСння.

4. ВСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ

{——ΠœΠΎΠ΄ΡƒΠ»ΡŒ содСрТит константы, Ρ‚ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅,——}

{———ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅———-}

unit prot;

interface

uses crt;

const

hex_tabl:array[0.15] of char='12 345 6789ABCDEF';

s2:string='Run time error: ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ';

{———————Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ дСскрипторов сСгмСнтов———————-}

code_sel =$ 08; { ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, }

code_sel2 =$ 10; { ΠΊΠΎΠ΄Π° модуля PROT, }

data_sel :word =$ 18; { Π΄Π°Π½Π½Ρ‹Ρ…, }

stack_sel :word =$ 20; { стСка, }

video_sel :word =$ 28; { видСопамяти, }

mem_sel :word =$ 30; { Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ памяти, }

{————————-Π‘ΠΈΡ‚Ρ‹ Π±Π°ΠΉΡ‚ΠΎΠ² доступа сСгмСнтов———————-}

present =$ 80; { P=1: сСгмСнт Π΅ΡΡ‚ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ }

nosys =$ 10; { S=1: сСгмСнт нСсистСмный }

exe =$ 08; { E=1: сСгмСнт выполняСмый }

down =$ 04; { ED=1: сСгмСнт Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π²Π½ΠΈΠ· }

wr_ena =$ 02; { W=1: Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° запись Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ }

rd_ena =$ 02; { R=1: Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Π° }

{————-ЗначСния поля TYPE систСмных дСскрипторов—————-}

type_int =$ 06; { шлюза прСрывания для 80 286 }

type_trap =$ 07; { шлюза ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для 80 286 }

type_TSS =$ 01; { сСгмСнта TSS }

type_call =$ 04; { шлюза Π²Ρ‹Π·ΠΎΠ²Π° }

type_task =$ 05; { шлюза Π·Π°Π΄Π°Ρ‡ΠΈ }

{————————-Π‘Π°ΠΉΡ‚ доступа сСгмСнта ΠΊΠΎΠ΄Π°—————————}

acc_code=present OR nosys OR exe OR rd_ena;

acc_code1=present OR nosys OR exe ;

{————————Π‘Π°ΠΉΡ‚ доступа сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ…————————-}

acc_data=present OR nosys OR wr_ena;

{————————Π‘Π°ΠΉΡ‚ доступа сСгмСнта стСка ————————-}

acc_stack=present OR nosys OR wr_ena OR down;

{————————-Π‘Π°ΠΉΡ‚ доступа шлюза Π·Π°Π΄Π°Ρ‡ΠΈ—————————-}

acc_task =present OR type_task;

type

{——————-Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° дСскриптора Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ GDT———————-}

t_gdt=record

lim_l, { Π³Ρ€Π°Π½ΠΈΡ†Π° сСгмСнта (Π±ΠΈΡ‚Ρ‹ 15−0) }

base_l :word; { Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ адрСс сСгм. (Π±ΠΈΡ‚Ρ‹ 15−0) }

base_h, { Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ адрСс сСгм. (Π±ΠΈΡ‚Ρ‹ 23−16) }

acc, { Π±Π°ΠΉΡ‚ доступа }

lim_h, { G, D,0,X, Π³Ρ€Π°Π½ΠΈΡ†Π° сСгм. (Π±ΠΈΡ‚Ρ‹ 19−16) }

base_hh:byte { Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ адрСс сСгм. (Π±ΠΈΡ‚Ρ‹ 31−24) }

end;

{——————-Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° дСскриптора Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ IDT———————-}

t_idt=record

off_l, { смСщСниС (Π±ΠΈΡ‚Ρ‹ 15−0) }

sel :word; { сСлСктор }

par, { число ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² }

acc :byte; { Π±Π°ΠΉΡ‚ доступа }

off_h :word { смСщСниС (Π±ΠΈΡ‚Ρ‹ 31−16) }

end;

{———————-Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° рСгистров GDTR ΠΈ IDTR———————-}

t_dtr=record

lim :word; { Π³Ρ€Π°Π½ΠΈΡ†Π° ΠΈ }

base :longint; { Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ адрСс Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ }

end;

{————————-Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° TSS для ΠœΠŸ 80 286—————————}

t_tss286=record

link, { сСлСктор Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° }

sp0,ss0, { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка ΠΊΠΎΠ»ΡŒΡ†Π° 0 }

sp1,ss1, { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка ΠΊΠΎΠ»ΡŒΡ†Π° 1 }

sp2,ss2, { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка ΠΊΠΎΠ»ΡŒΡ†Π° 2 }

ip, flags, ax, cx, dx, bx, sp, bp, { рСгистры }

si, di, es, cs, ss, ds, ldtr { микропроцСссора }

:word;

end;

{———————Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° TSS для ΠœΠŸ 80 386 ΠΈ Π²Ρ‹ΡˆΠ΅———————}

t_tss386=record

link, { сСлСктор Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° }

esp0,ss0, { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка ΠΊΠΎΠ»ΡŒΡ†Π° 0 }

esp1,ss1, { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка ΠΊΠΎΠ»ΡŒΡ†Π° 1 }

esp2,ss2, { ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка ΠΊΠΎΠ»ΡŒΡ†Π° 2 }

cr3,eip, eflags, eax, ecx, edx, ebx, { рСгистры }

esp, ebp, esi, edi, es, cs, ss, ds, fs, gs, ldtr{ МП }

:longint;

bit_t, { Π±ΠΈΡ‚ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ }

adr_BKVV:word; { смСщСниС Π‘ΠšΠ’Π’ }

Sys_inf, { ΠΏΠΎΠ»Π΅ для систСмной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ }

BKVV:longint; { Π‘ΠšΠ’Π’ }

byte_end:byte; { Π±Π°ΠΉΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ TSS }

end;

var

gdt:array[0.15] of t_gdt; { Π’Π°Π±Π»ΠΈΡ†Π° GDT }

idt:array[0.$ 32] of t_idt; { Π’Π°Π±Π»ΠΈΡ†Π° IDT }

gdtr, { Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ GDTR }

idtr, { Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ IDTR для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ }

idtr_r { Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ IDTR для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ }

:t_dtr;

ofs_ret, { Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ }

sel_ret, { сСлСктор Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ }

ofs_ret_mov, { Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ ret_mov: }

cs_prot, { Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ рСгистра CS Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ }

cs1, { Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСгмСнта ΠΊΠΎΠ΄Π° модуля PROT }

{ ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для хранСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ рСгистров: }

real_ss, { SS, }

real_es, { ES ΠΈ }

real_sp:word; { SP }

scan, { Π‘ΠΊΠ°Π½-ΠΊΠΎΠ΄ наТатия клавиши }

cpu_type, { НомСр Ρ‚ΠΈΠΏΠ° микропроцСссора }

res, { ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ сброса ΠœΠŸ }

rm1, { Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ рСгистров маски 1-Π³ΠΎ }

rm2, { ΠΈ 2-Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² прСрывания }

excep, { НомСр ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ }

acc_int, { Π‘Π°ΠΉΡ‚ доступа прСрывания }

acc_trap, { Π‘Π°ΠΉΡ‚ доступа Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ }

t:byte; { ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ разрядности ΠœΠŸ: T=0 — 16; T=8 — 32 }

function lin_adr (seg, off: word):longint;

function hex (p:longint):string;

function hw (p:word):string;

procedure init_gdt (i:byte;limit, base: longint;acces,

procedure init_idt (i:byte;p_off, p_sel:word;acces:byte);

procedure pic (mode:byte);

procedure init_gdtr;

procedure init_idtr_p;

procedure init_idtr_r;

procedure save_ret_real (seg, ofs: word;byte_shut:byte);

procedure not_int;

procedure en_int;

procedure set_unr (base, limit: longint;kseg, byte_6h:byte);

procedure save_sreg;

procedure reset;

procedure test_wr;

procedure init_tss286 (var tss: t_tss286; cs, ds, es,

ofs_task, ofs_task_stack, flags: word);

procedure init_tss386 (var tss: t_tss386; cs, ds, es,

ofs_task, ofs_task_stack, eflags: word);

procedure get_cpu_type (inf:byte;var cpu: byte);

procedure exc00;

procedure exc01;

procedure exc02;

procedure exc03;

procedure exc04;

procedure exc05;

procedure exc06;

procedure exc07;

procedure exc08;

procedure exc10;

procedure exc11;

procedure exc12;

procedure exc13;

procedure exc14;

procedure exc16;

procedure exc17;

procedure exc18;

procedure PIC1;

procedure PIC2;

procedure keyb;

procedure int_30h;

procedure int_30hr;

procedure int_32h;

implementation

{———ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ логичСского адрСса Π² Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ адрСс——-}

function lin_adr;

begin

lin_adr:=longint (seg) shl 4+off

end;{lin_adr}

{——————-ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² 16-Ρ€ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ————-}

function hex (p:longint):string;

var s: string;

begin

s:='h';

repeat

s:=hex_tabl[p and $f]+s;

p:=p shr 4

until p=0;

hex:=s

end;{hex}

function hw (p:word):string;

var

i:byte;

s:string;

begin

s:='';

for i:=0 to 3 do begin

s:=hex_tabl[p and $f]+s;

p:=p shr 4

end;

hw:=s

end;{hw}

{——————Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ дСскриптора Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ GDT——————-}

procedure init_gdt (i:byte;limit, base: longint;acces,

byte_6h:byte);

begin

with gdt[i] do begin

lim_l :=limit;

base_l :=base;

base_h :=base shr 16;

acc :=acces;

lim_h :=limit shr 16 or byte_6h;

base_hh:=base shr 24;

end

end; {init_gdt}

{———Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… рСгистра GDTR ΠΈ Π΅Π³ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°———-}

procedure init_gdtr;

begin

gdtr.lim:=sizeof (gdt)-1;

gdtr.base:=lin_adr (seg (gdt), ofs (gdt));

asm

db 0fh, 01h, 16h { LGDT gdtr: }

dw gdtr { Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² GDT Π² GDTR ΠΈΠ· gdtr }

end

end; {init_gdtr}

{——————Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ дСскриптора Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ IDT——————-}

procedure init_idt (i:byte;p_off, p_sel:word;acces:byte);

begin

with idt[i] do begin

off_l:=p_off;

sel:=p_sel;

par:=0;

acc:=acces;

off_h:=0

end

end; {init_idt}

{————Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠ΅ ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… рСгистра IDTR————-}

{————ΠΈ Π΅Π³ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅————}

procedure init_idtr_p;

begin

asm

db 0fh, 1,0eh { SIDT idtr: }

dw idtr_r { Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² IDT Π² idtr_r }

end;

idtr.lim:=sizeof (idt)-1;

idtr.base:=lin_adr (seg (idt), ofs (idt));

asm

db 0fh, 01h, 1eh { LIDT idtr: }

dw idtr { Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² IDT Π² IDTR ΠΈΠ· idtr }

end;

end;{init_idtr_p}

{———Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… рСгистра IDTR ΠΈ Π΅Π³ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°———-}

{————————для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅————————-}

procedure init_idtr_r;

begin

idtr_r.lim:=$ 3ff; { Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², }

idtr_r.base:=0; { Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ адрСс Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² }

end;{init_idtr_r}

{——————-Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°————————}

{——————-Π² Ρ€Π΅Π°Π»ΡŒΠ»Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ послС сброса МП———————-}

procedure save_ret_real;

begin

{——————-Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ рСгистров маски——————-}

{——————-1-Π³ΠΎ ΠΈ 2-Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ——————-}

rm1:=port[$ 21];

rm2:=port[$a1];

{————-ЗанСсСниС Π² ΡΡ‡Π΅ΠΉΠΊΠΈ 40h:67h ΠΈ 40h:69h адрСса————-}

{———(смСщСниС ΠΈ ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚) Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ—-}

{—————————-послС сброса МП—————————————-}

memw[$ 40:$ 67]: =ofs;

memw[$ 40:$ 69]:=seg;

{————ЗанСсСниС Π² ΡΡ‡Π΅ΠΉΠΊΡƒ КМОП памяти с Π°Π΄Ρ€Π΅ΡΠΎΠΌ 0Fh————-}

{—————-Π±Π°ΠΉΡ‚Π° состояния ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (byte_shut).—————-}

{———-Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ah ΡΡ‚ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° обСспСчиваСт ΠΏΡ€ΠΈ сбросС МП——}

{————-ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ Π² ΡΡ‡Π΅ΠΉΠΊΠ°Ρ… 40h:67h ΠΈ 40h:69h;———}

{——ΠΊΠΎΠ΄ 5 ΠΏΠΎΠΌΠΈΠΌΠΎ этого осущСствляСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ———}

{————————ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ———————————}

port[$ 70]: =$ 0f;

port[$ 71]:=byte_shut;

end;{save_ret_real}

{————————Π—Π°ΠΏΡ€Π΅Ρ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ————————-}

procedure not_int;

begin

asm cli end; { маскируСмых }

port[$ 70]: =$ 80; { ΠΈ Π½Π΅ΠΌΠ°ΡΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… }

end; {not_int}

{———————-Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ———————}

procedure en_int;

begin

asm sti end; { маскируСмых }

port[$ 70]: =$d; { ΠΈ Π½Π΅ΠΌΠ°ΡΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… }

mem[$ 40:$ 17]: =0 { Бброс состояния клавиш-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ }

end; {en_int}

{—————————Установка Ρ€Π΅ΠΆΠΈΠΌΠ° «Unreal» —————————}

procedure set_unr (base, limit: longint;kseg, byte_6h:byte);

begin

{ Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ GDT: }

init_gdt (0,0,0,0,0); { Π½ΡƒΠ»ΡŒ-дСскриптор }

init_gdt (1,limit, base,$ 92,$ 80); { дСскриптор сСгмСнта }

init_gdtr; { Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° рСгистра GDTR }

not_int;{ Π—Π°ΠΏΡ€Π΅Ρ‚ маскируСмых ΠΈ Π½Π΅ΠΌΠ°ΡΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ }

asm { ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ: }

db $ 0f,$ 20,0c0h { MOV EAX, CR0 }

db 66h, 0dh { OR EAX, 1 }

dd 1h

db $ 0f, 22h, 0c0h { MOV CR0, EAX }

{ Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сСлСктора Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ сСгмСнта (kseg): }

mov ax, 8

cmp kseg, 0

jnz @3

db 8eh, 0c0h { MOV ES, AX }

jmp @k

@3: cmp kseg, 3

db 8eh, 0d8h { MOV DS, AX }

jmp @k

@4: cmp kseg, 4

jnz @5

db 8eh, 0e0h { MOV FS, AX }

jmp @k

@5:db 8eh, 0e8h { MOV GS, AX }

{ Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ: }

@k:db 0fh, 20h, 0c0h { MOV EAX, CR0 }

db 66h, 25h { AND EAX, FFFFFFFEh }

dd 0fffffffeh

db 0fh, 22h, 0c0h { MOV CR0, EAX }

end;

en_int

end;

{——————ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π΅Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΈ Π²Π΅Π΄ΠΎΠΌΠΎΠ³ΠΎ——————-}

{——————-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹——————-}

{———Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ (mode=0) ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ (mode=1) Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ…———}

procedure pic (mode:byte);

var k1, k2:byte;

begin

if mode=0 then begin

k1:=8; k2:=$ 70

end else begin

k1:=$ 20; k2:=$ 28

end;

port[$ 20]: =$ 11; { 1-ΠΉ ПКП: ICW1 }

port[$ 21]: =k1; { 1-ΠΉ ПКП: ICW2 }

port[$ 21]: =4; { 1-ΠΉ ПКП: ICW3 }

port[$ 21]: =1; { 1-ΠΉ ПКП: ICW4 }

port[$a0]: =$ 11; { 2-ΠΉ ПКП: ICW1 }

port[$a1]: =k2; { 2-й ПКП: ICW2 }

port[$a1]: =2; { 2-й ПКП: ICW3 }

port[$a1]: =1; { 2-й ПКП: ICW4 }

end;{pic}

{—————Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ сСгмСнтных рСгистров—————-}

procedure save_sreg;

begin

memw[0:4*$ 60]: =Dseg; { DS, }

real_ss:=Sseg; { SS ΠΈ }

asm mov real_es, es end { ES }

end;{save_sreg}

{——————-Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅——————-}

{————ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ сброс МП————-}

procedure reset;assembler;

asm

mov res, 1 { Установка ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° сброса ΠœΠŸ }

mov al, 0feh { Команда сброса }

out 64h, al { микропроцСссора }

@wait_res: { ОТиданиС Π²ΠΎ Π²Ρ€Π΅ΠΌΡ сброса ΠœΠŸ }

hlt

jmp @wait_res

db 0cbh { ΠœΠ΅ΠΆΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Π½Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ }

end; {reset}

{—-ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сохранСния Π·Π°ΠΏΡ€Π΅Ρ‚Π° записи Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° послС—-}

{———Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠœΠŸ ΠΈΠ· Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ MOV:———}

{——-Ссли Π·Π°ΠΏΡ€Π΅Ρ‚ сохранСн — вырабатываСтся ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ 13,——}

{——-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° reset) сбрасываСт МП——-}

procedure test_wr;

begin

Meml[0:13*4]: =Longint (@reset); { ЗанСсСниС адрСса }

{ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° прСрывания 13 — ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ reset }

{ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² }

asm

(* db 2eh { CS: }*)

mov ax, cs:[0]

(* db 2eh *)

mov cs:[0], ax { Π—Π°ΠΏΠΈΡΡŒ Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° }

end;

pic (0); { ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ПКП для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° }

end; {test_wr}

{————————-Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ TSS для 80 286—————————}

procedure init_tss286 (var tss: t_tss286; cs, ds, es,

ofs_task, ofs_task_stack, flags: word);

begin

tss.cs:=cs;

tss.ds:=ds;

tss.es:=es;

tss.ss:=ds;

tss.ip:=ofs_task;

tss.bp:=ofs_task_stack;

tss.sp:=ofs_task_stack;

tss.ldtr:=0;

tss.flags:=flags;

end;{init_tss286}

{———————Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ TSS для 80 386 ΠΈ Π²Ρ‹ΡˆΠ΅———————}

procedure init_tss386(var tss: t_tss386; cs, ds, es,

ofs_task, ofs_task_stack, eflags: word);

begin

tss.cs:=cs;

tss.ds:=ds;

tss.es:=es;

tss.ss:=ds;

tss.eip:=ofs_task;

tss.ebp:=ofs_task_stack;

tss.esp:=ofs_task_stack;

tss.ldtr:=0;

tss.eflags:=eflags;

tss.bit_t:=0;

tss.adr_bkvv:=108;

tss.BKVV:=0;

tss.byte_end:=$ff

end;{init_tss386}

{————-ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° микропроцСссора (cpu_type)————-}

procedure get_cpu_type (inf:byte;var cpu: byte);

var

data_cach:array[1.4,1.4] of byte; { Π”Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΊΡΡˆΠ΅ ΠœΠŸ }

max_inp, { Max Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ…. ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID }

EBX_, { Брэнд ID ΠΈ Π΄Ρ€. }

feature, { Π”Π°Π½Π½Ρ‹Π΅ ΠΎΠ± ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ях ΠœΠŸ (Ρ€Π΅Π³iстр EDX) }

ECX_:longint; { Π”Π°Π½Π½Ρ‹Π΅ ΠΎΠ± ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ях ΠœΠŸ (Ρ€Π΅Π³iстр ECX) }

desc_L2:word; { ДСскриптор кэша L2 }

{ Π‘Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ микропроцСссора: }

sn1, { младшиС 32 разряда, }

sn2, { срСдниС 32 разряда, }

sn3:longint; { ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ 32 разряда }

vend:array[1.12] of char;{ НазваниС Ρ„ΠΈΡ€ΠΌΡ‹-изготовитСля }

brand_str:array[1.48] of char; { Брэнд-строка }

typ, { Π’ΠΈΠΏ МП (0−2) }

model, { МодСль МП (4−6) }

i, j,

id_flag, { Π€Π»Π°Π³ исполнСния ΠœΠŸ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID }

cpu_type, { Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠ° ΠœΠŸ (0, 2−6) }

brand, { Брэнд ID }

CLFSH, { Π”Π»ΠΈΠ½Π° строки кэша }

NMP, { Число логичСских процСссоров Π² ΠΊΡ€ΠΈΡΡ‚Π°Π»Π»Π΅ }

par:byte; { Число ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID }

unknown:boolean; { ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ нСраспознавания Ρ‚ΠΈΠΏΠ° ΠœΠŸ }

s:string;

begin

unknown:=false;

id_flag:=0;

asm

pushf { Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ FLAGS }

@8086: { ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° МП i8086: }

{ Π±ΠΈΡ‚Ρ‹ 12−15 рСгистра FLAGS всСгда установлСны }

pushf

pop ax

mov cx, ax

and ax, 0fffh

push ax

popf

pushf

pop ax

and ax, 0f000h

cmp ax, 0f000h

mov cpu_type, 0 { ΠœΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€: 8086 }

jne @80 286

@80 286: { ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° МП i80286: }

{ Π±ΠΈΡ‚Ρ‹ 12−15 рСгистра FLAGS Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ всСгда ΡΠ±Ρ€ΠΎΡˆΠ΅Π½Ρ‹ }

or cx, 0f000h

push cx

popf

pushf

pop ax

and ax, 0f000h

mov cpu_type, 2 { ΠœΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€: 80 286 }

jnz @80 386

jmp @end_cpuid

@80 386: { ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° МП i80386: }

{ Ρ„Π»Π°Π³ AC (Π±ΠΈΡ‚ 18) рСгистра EFLAGS Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн }

db 66h { прСфикс разрядности: 32 разряда }

pushf

db 66h

pop ax { ЗанСсти Π² EAX исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EFLAGS }

db 66h

mov cx, ax { Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EFLAGS Π² ECX }

db 66h, 35h { Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ XOR Π±ΠΈΡ‚ AC Π² EFLAGS }

dd 4 0000h

db 66h

push ax { Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EFLAGS Π² ΡΡ‚Π΅ΠΊΠ΅ }

db 66h

popf { Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EFLAGS }

db 66h

pushf

db 66h

pop ax { Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EFLAGS Π² EAX }

db 66h

xor ax, cx

mov cpu_type, 3

jz @end_cpuid { Если Π±ΠΈΡ‚ AC Π½Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ‚ся: }

db 66h { микропроцСссор: 80 386 }

push cx

db 66h

popf { Π’ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ AC Π±ΠΈΡ‚ Π² EFLAGS }

@80 486: { ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° МП i486 ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ: }

{ установка/сброс ID Ρ„Π»Π°Π³Π° (Π±ΠΈΡ‚ 21) Π² EFLAGS }

{ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΠœΠŸ }

mov cpu_type, 4 { ΠœΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€: i486 }

db 66h

mov ax, cx { ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EFLAGS }

db 66h, 35h { Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ XOR Π±ΠΈΡ‚ ID Π² EFLAGS }

dd 20 0000h

db 66h

push ax { Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΊΠ΅ }

db 66h

popf { ЗанСсти Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² EFLAGS }

db 66h

pushf { Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΡΡ‚Π΅ΠΊ }

db 66h

pop ax { ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² EAX }

popf { Π’ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ EFLAGS }

db 66h

xor ax, cx { Если Π±ΠΈΡ‚ ID Π½Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ‚ся: }

je @end_cpuid { МП Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ CPUID }

{ Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID для опрСдСлСния }

{ Ρ„ΠΈΡ€ΠΌΡ‹, сСмСйства, ΠΌΠΎΠ΄Π΅Π»ΠΈ микропроцСссора }

mov id_flag, 1 { Установка Ρ„Π»Π°Π³Π° }

{ выполнСния ΠœΠŸ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID }

db 66h

xor ax, ax { ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для CPUID: EAX=0 }

db 0fh, 0a2h { Команда CPUID }

db 66h

mov ss:[bp+offset vend], bx { Из Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ² EBX, }

db 66h { EDX }

mov ss:[bp+offset vend+4], dx { ΠΈ ECX }

db 66h { Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ vend }

mov ss:[bp+offset vend+8], cx { заносится имя Ρ„ΠΈΡ€ΠΌΡ‹ }

cmp al, 1 { Π’ AL — наибольшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° CPUID }

jl @end_cpuid

mov par, al

db 66h

xor ax, ax

db 66h

inc ax { Установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° CPUID =1 }

db 0fh, 0a2h { Команда CPUID: Π² AL — сигнатура ΠœΠŸ }

db 66h { Π’ sn3 — ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ 32 разряда }

mov word ptr sn3, ax { сСрийного Π½ΠΎΠΌΠ΅Ρ€Π° ΠœΠŸ }

mov word ptr EBX_, bx { Π’ EBX_- Brand ID ΠΈ Π΄Ρ€. }

db 66h

mov word ptr ECX_, cx { Π’ EΠ‘X_- особСнности ΠœΠŸ }

db 66h

mov word ptr feature, dx { Π’ EDX_- особСнности ΠœΠŸ }

mov cx, ax

and ax, 0f0h

db 0c1h, 0e8h, 4 { Π‘Π΄Π²ΠΈΠ³ Π² AX Π½Π° 4 разряда Π²ΠΏΡ€Π°Π²ΠΎ }

mov model, al { Π’ AL — модСль ΠœΠŸ }

mov ax, cx

and ax, 0f00h

db 0c1h, 0e8h, 8 { Π‘Π΄Π²ΠΈΠ³ Π² AX Π½Π° 8 разрядов Π²ΠΏΡ€Π°Π²ΠΎ }

mov cpu_type, al { Π’ AL — Π½ΠΎΠΌΠ΅Ρ€ сСмСйства ΠœΠŸ }

mov ax, cx

and ax, 3000h

db 0c1h, 0e8h, 12 { Π‘Π΄Π²ΠΈΠ³ Π² AX Π½Π° 12 разрядов Π²ΠΏΡ€Π°Π²ΠΎ }

mov typ, al { Π’ AL — Π½ΠΎΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠ° ΠœΠŸ }

db 66h

mov word ptr feature, dx { Π’ feature — особСнности ΠœΠŸ }

cmp par, 1

jz @end_cpuid

db 66h, 0b8h { MOV EAX, 2: установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° }

dd 2 { ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID =2 }

db 0fh, 0a2h { Команда CPUID }

db 66h

mov ss:[bp+offset data_cach], ax { Π’ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ… EAX, }

db 66h { EBX, ECX }

mov ss:[bp+offset data_cach+4], bx { ΠΈ EDX — }

db 66h { информация ΠΎ }

mov ss:[bp+offset data_cach+8], cx { кэш-памяти МП, }

db 66h { которая заносится Π² ΠΌΠ°ΡΡΠΈΠ² }

mov ss:[bp+offset data_cach+12], dx { data_cach }

@end_cpuid:

end;

s:='';

clrscr;

if id_flag=0 then begin { ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠœΠŸ }

case cpu_type of { Π±Π΅Π· использования ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID }

0:s:='i8086';

2:s:='i80286';

3:s:='i80386';

4:s:='i486';

end;

writeln (s);

end else begin

brand:=EBX_; { Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ брэнд ID }

for i:=1 to 4 do { ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ дСскриптора }

for j:=1 to 4 do { кэша Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня }

if data_cach[i, 4] and 128=0 then

if (data_cach[i, j]=$ 41) or

(data_cach[i, j]=$ 42) or

(data_cach[i, j]=$ 43) or

(data_cach[i, j]=$ 44) or

(data_cach[i, j]=$ 45) then begin

desc_L2:=data_cach[i, j];

break

end;

case cpu_type of

4:case model of

0,1:s:='i486 DX';

2:s:='i486 SX';

3:s:='iDX2';

4:s:='i486 SL';

5:s:='iSX2';

7:s:='iDX2 WB';

8:if typ=0 then s:='iiDX4'

else s:='iDX4 OverDrive';

9:s:='AMD DX4';

14:s:='Am5x86 Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ WT';

15:s:='Am5x86 Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ WB';

else unknown:=true

end;

5: if vend='GenuineIntel' then

case model of

1:if typ=0 then s:='Pentium (60,66)'

else s:='Pentium OverDrive (60,66)';

2:if typ=0 then

s:='Pentium (75.200)'

else s:='Pentium OverDrive (75.133)';

3:s:='Pentium OverDrive для 486';

4:if typ=0 then s:='Pentium MMX (166,200)'

else s:='Pentium MMX OverDrive (75.133)';

end else if vend='AuthenticAMD' then

case model of

0:s:='AMD-K-PR75,90,100';

1:s:='AMD-K-PR120,133';

2:s:='AMD-K-PR120,166';

end;

6: case model of

1:s:='Pentium Pro';

3:if typ=0 then s:='Pentium II модСль 3'

else s:='Pentium II OverDrive';

5:case desc_L2 of

$ 41:s:='Celeron модСль 5';

$ 43:s:='Pentium II модСль 5';

$ 44:s:='Pentium II Xeon модСль 5';

end;

6:s:='Celeron модСль 6';

7:case desc_L2 of

$ 43: s:='Pentium III модСль 7';

$ 44,$ 45:s:='Pentium III Xeon модСль 7';

end;

8:case brand of

1:s:='Celeron модСль 8';

2:s:='Pentium III модСль 8';

3: if sn3=$ 6B1 then s:='Celeron модСль 8'

else s:='Pentium III Xeon модСль 8';

4: s:='Pentium III модСль 8';

6: s:='ΠœΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Pentium III-M модСль 8';

7: s:='ΠœΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Celeron модСль 8';

end;

$A:s:='Pentium III Xeon модСль A';

$B:s:='Pentium III Xeon модСль B';

else unknown:=true

end;

$F:case model of

0: begin

s:='0.18-ΠΌΠΈΠΊΡ€ΠΎΠ½Π½Ρ‹ΠΉ ';

case brand of

8: s:=s+'Pentium 4';

9: s:=s+'Pentium 4';

$B: s:=s+'Xeon';

end;

end;

1: begin

s:='0.18-ΠΌΠΈΠΊΡ€ΠΎΠ½Π½Ρ‹ΠΉ ';

case brand of

8: s :=s+'Pentium 4';

9: s:=s+'Pentium 4';

$A: s:=s+'Celeron';

$B: if sn3<$F13 then s:=s+'Xeon MP'

else s:=s+'Xeon';

$C: s:=s+'Xeon MP';

$E: s:=s+'Xeon';

end;

end;

2: begin

s:='0.13-ΠΌΠΈΠΊΡ€ΠΎΠ½Π½Ρ‹ΠΉ ';

case brand of

8: s:=s+'Pentium 4';

9: s:=s+'Pentium 4';

$A: s:=s+'Celeron';

$B: if sn3<$F13 then s:=s+'Xeon MP'

else s:=s+'Xeon';

$C: s:=s+'Xeon MP';

$E: if sn3<$F13 then s:=s+'Xeon'

else s:=s+'ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Pentium 4-M';

$F: s:=s+'ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Celeron';

end

end

end {else unknown:=true}

end;

for i:=1 to 12 do write (vend[i]);

if not unknown then writeln (' ', s)

else writeln ('МП сiмСйства — ', cpu_type, ' модСль — ', model);

asm

db 66h, 0b8h

dd 8 000 0000h { MOV EAX, 8 000 0000h }

db 0fh, 0a2h { CPUID }

db 66h

mov word ptr max_inp, ax

end;

if max_inp>$ 80 000 000 then begin

asm

db 66h, 0b8h { MOV EAX, 8 000 0002h }

dd 8 000 0002h

db 0fh, 0a2h { CPUID }

db 66h

mov ss:[bp+offset brand_str], ax { Из pСгистpΠΎΠ² EAX, }

db 66h

mov ss:[bp+offset brand_str+4], bx { EBX, }

db 66h

mov ss:[bp+offset brand_str+8], cx { ECX }

db 66h

mov ss:[bp+offset brand_str+12], dx { ΠΈ EDX }

{Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ brand_str заносятся ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 12 символов Π±Ρ€Π΅Π½Π΄-строки}

db 66h, 0b8h

dd 8 000 0003h { MOV EAX, 8 000 0003h }

db 0fh, 0a2h { CPUID }

db 66h

mov ss:[bp+offset brand_str+16], ax

db 66h

mov ss:[bp+offset brand_str+20], bx

db 66h

mov ss:[bp+offset brand_str+24], cx

db 66h

mov ss:[bp+offset brand_str+28], dx

db 66h, 0b8h { MOV EAX, 8 000 0004h }

dd 8 000 0004h

db 0fh, 0a2h { CPUID }

db 66h

mov ss:[bp+offset brand_str+32], ax

db 66h

mov ss:[bp+offset brand_str+36], bx

db 66h

mov ss:[bp+offset brand_str+40], cx

db 66h

mov ss:[bp+offset brand_str+44], dx

end;

for i:=1 to 48 do write (brand_str[i]);

writeln;

end;

if inf<>0 then begin

writeln ('ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ микропроцСссора:');

for i:=0 to 21 do

if not ((i=10) or (i=20) or (i=28)) then begin

s:='';

case i of

0:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'содСрТит FPU';

end;

1:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:='ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для Ρ€Π΅ΠΆΠΈΠΌΠ° ';

s:=s+'Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ 8086';

end;

2:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°ΡΡΡˆΠΈΡ€Π΅Π½Π½ΡƒΡŽ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ CR4. DE';

end;

3:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ страницы 4 ΠœΠ‘';

end;

4:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ RDTSC ΠΈ CR4. TSD';

end;

5:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ RDMSR ΠΈ WRMSR';

end;

6:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:='ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ физичСского адрСса';

s:=s+' ΠΈ CR4. PAE';

end;

7:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ 18 (MCE) ΠΈ CR4. MCE';

end;

8:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ CMPXCHG8B';

end;

9:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'содСрТит APIC';

end;

11:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SYSENTER ΠΈ SYSEXIT';

end;

12:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ рСгистры MTRR';

end;

13:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ страницы ΠΈ CR4. PGE';

end;

14:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ MCA ΠΈ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ MCG_CAP';

end;

15:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CMOV, FCMOV ΠΈ FCOMI';

end;

16:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² страниц PAT';

end;

17:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+ 'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 4 Мб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈ Π°Π΄Ρ€Π΅ΡΠ° Π±ΠΎΠ»Π΅Π΅ 4 Π“Π±';

end;

18:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 96-разрядный сСрийный Π½ΠΎΠΌΠ΅Ρ€ МП';

end;

19:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ CLFLUSH';

end;

21:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ запись истории ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ²';

end;

end;

writeln (' ', s);

end;

readkey;

clrscr;

writeln ('ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ микропроцСссора:');

for i:=22 to 31 do

if i<>30 then begin

s:='';

case i of

22:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ частоты МП';

end;

23:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ MMX ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹';

end;

24:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ FXSAVE ΠΈ FXRSTOR';

end;

25:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SSE';

end;

26:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SSE2';

end;

27:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² памятi';

end;

28:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+' ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ логичСскиС процСссоры ΠΈ HT';

end;

29:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π½Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³';

end;

31:begin

if (feature shr i) and 1=0 then s:='Π½Π΅ ';

s:=s+'ΠΏiΠ΄Ρ‚Ρ€ΠΈΠΌΡƒΡ” пСрСривання ΠΏΠΎ FERR';

end;

end;

writeln (' ', s);

end;

readkey; clrscr;

if par>1 then begin

writeln ('Число ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CPUID с EAX=2 — ',

data_cach[1,1]);

writeln ('МП ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ кэш-памяти:');

writeln;

for i:=1 to 4 do

for j:=1 to 4 do

if (i<>1) or (j<>1) then

if data_cach[i, 4] and 128=0 then begin

s:='';

if data_cach[i, j]<>0 then begin

case data_cach[i, j] of

1:s:='TLB ΠΊΠΎΠΌΠ°Π½Π΄: 4 Кб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹, 4-Π½Π°ΠΏΡ€., 32 Π²Ρ…ΠΎΠ΄Π°';

2:s:='TLB ΠΊΠΎΠΌΠ°Π½Π΄: 4 Мб ΡΡ‚Ρ€Π°Π½., ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ассоц., 2 Π²Ρ…ΠΎΠ΄Π°';

3:s:='TLB Π΄Π°Π½Π½Ρ‹Ρ…: 4 Кб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹, 4-Π½Π°ΠΏΡ€., 64 Π²Ρ…ΠΎΠ΄Π°';

4:s:='TLB Π΄Π°Π½Π½Ρ‹Ρ…: 4 Мб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹, 4-Π½Π°ΠΏΡ€., 8 Π²Ρ…ΠΎΠ΄ΠΎΠ²';

6:s:='Кэш ΠΊΠΎΠΌΠ°Π½Π΄: 8 Кб, 4-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

8:s:='Кэш ΠΊΠΎΠΌΠ°Π½Π΄: 16 Кб, 4-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$A:s:='Кэш Π΄Π°Π½Π½Ρ‹Ρ…: 8 Кб, 2-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$C:s:='Кэш Π΄Π°Π½Π½Ρ‹Ρ…: 16 Кб, 4-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$ 22:s:=' ОбъСдин. кэш L3: 512 Кб, 4-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚Π°';

$ 23:s:=' ОбъСдин. кэш L3: 1 Мб, 8-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚Π°';

$ 25:s:=' ОбъСдин. кэш L3: 2 Мб, 8-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚Π°';

$ 29:s:=' ОбъСдин. кэш L3: 4 Мб, 8-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚Π°';

$ 39:s:='ОбъСдин. кэш L2: 128 Кб, 4-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚Π°';

$ 3B:s:='ОбъСдин. кэш L2: 128 Кб, 2-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚Π°';

$ 3C:s:='ОбъСдин. кэш L2: 256 Кб, 4-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚Π°';

$ 40:if cpu_type=6 then s:='Кэш L2: Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ся'

else if cpu_type=$f then s:='Кэш L3: Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ся';

$ 40:s:='НСт кэша L2 (сСмСйство P6) ΠΈΠ»ΠΈ L3 (Pentium 4)';

$ 41:s:='ОбъСдин. кэш: 128 Кб, 4-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$ 42:s:='ОбъСдин. кэш: 256 Кб, 4-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$ 43:s:='ОбъСдин. кэш: 512 Кб, 4-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$ 44:s:='ОбъСдин. кэш: 1 Мб, 4-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$ 45:s:='ОбъСдин. кэш: 2 Мб, 4-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$ 50:begin

s:='TLB ΠΊΠΎΠΌΠ°Π½Π΄: 4 Кб, 2 Мб ΠΈΠ»ΠΈ 4 Мб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹,';

s:=s+'ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ассоц., 64 Π²Ρ…ΠΎΠ΄Π°';

end;

$ 51:begin

s:='TLB ΠΊΠΎΠΌΠ°Π½Π΄: 4 Кб, 2 Мб Π°Π±ΠΎ 4 Мб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹,';

s:=s+'ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ассоц., 128 Π²Ρ…ΠΎΠ΄ΠΎΠ²';

end;

$ 52:begin

s:='TLB ΠΊΠΎΠΌΠ°Π½Π΄: 4 Кб, 2 Мб Π°Π±ΠΎ 4 Мб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹,';

s:=s+'ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ассоц., 256 Π²Ρ…ΠΎΠ΄ΠΎΠ²';

end;

$ 5b:begin

s:='TLB Π΄Π°Π½Π½Ρ‹Ρ…: 4 Кб ΠΈΠ»ΠΈ 4 Мб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹.,';

s:=s+'ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ассоц., 64 Π²Ρ…ΠΎΠ΄Π°';

end;

$ 5C:begin

s:='TLB ΠΊΠΎΠΌΠ°Π½Π΄: 4 Кб Π°Π±ΠΎ 4 Мб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹.,';

s:=s+'ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ассоц., 128 Π²Ρ…ΠΎΠ΄ΠΎΠ²';

end;

$ 5D:begin

s:='TLB ΠΊΠΎΠΌΠ°Π½Π΄: 4 Кб Π°Π±ΠΎ 4 Мб ΡΡ‚Ρ€Π°Π½ΠΈΡ†Ρ‹.,';

s:=s+'ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ассоц., 256 Π²Ρ…ΠΎΠ΄ΠΎΠ²';

end;

$ 66:s:='Кэш Π΄Π°Π½Π½Ρ‹Ρ… сСкторный:8 Кб, 4-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚Π°';

$ 67:s:='Кэш Π΄Π°Π½Π½Ρ‹Ρ… сСкторный: 16 Кб, 4-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚ΠΈ';

$ 68:s:='Кэш Π΄Π°Π½Π½Ρ‹Ρ… сСкторный: 32 Кб, 4-Π½Π°ΠΏΡ€., строка 64 Π±Π°ΠΉΡ‚ΠΈ';

$ 70:s:='Кэш трас ΠΊΠΎΠΌΠ°Π½Π΄: 12 К ΠΌΠΈΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΉ, 4-Π½Π°ΠΏΡ€.';

$ 71:s:='Кэш трас ΠΊΠΎΠΌΠ°Π½Π΄: 16 К ΠΌΠΈΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΉ, 8-Π½Π°ΠΏΡ€. ';

$ 72:s:='Кэш трас ΠΊΠΎΠΌΠ°Π½Π΄: 32 К ΠΌΠΈΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΉ, 8-Π½Π°ΠΏΡ€. ';

$ 79:begin

s:='ОбъСдин. кэш сСкторный: 128 Кб, 8-Π½Π°ΠΏΡ€.,';

s:=s+' строка 64 Π±Π°ΠΉΡ‚Π°'

end;

$ 7A:begin

s:='ОбъСдин. кэш сСкторный: 256 Кб, 8-Π½Π°ΠΏΡ€.,';

s:=s+' строка 64 Π±Π°ΠΉΡ‚Π°'

end;

$ 7B:begin

s:='ОбъСдин. кэш сСкторный: 512 Кб, 8-Π½Π°ΠΏΡ€.,';

s:=s+' строка 64 Π±Π°ΠΉΡ‚Π°'

end;

$ 7C:begin

s:='ОбъСдин. кэш сСкторный: 1 Мб, 8-Π½Π°ΠΏΡ€.,';

s:=s+' строка 64 Π±Π°ΠΉΡ‚Π°'

end;

$ 82:s:='ОбъСдин. кэш: 256 Кб, 8-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$ 83:s:='ОбъСдин. кэш: 512 Кб, 8-Π½Π°ΠΏΡ€., рядок 32 Π±Π°ΠΉΡ‚ΠΈ';

$ 84:s:='ОбъСдин. кэш: 1 Мб, 8-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

$ 85:s:='ОбъСдин. кэш: 2 Мб, 8-Π½Π°ΠΏΡ€., строка 32 Π±Π°ΠΉΡ‚Π°';

else begin

write (' ДСскриптор: ', hex (data_cach[i, j]));

s:=''

end

end;

writeln (' ', s);

end

end

end;

if (feature shr 18) and 1<>0 then begin

asm

db 66h, 0b8h { MOV EAX, 3 }

dd 3 { CPUID с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ 3: ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ }

db 0fh, 0a2h { сСрийного Π½ΠΎΠΌΠ΅Ρ€Π° микропроцСссора }

db 66h { Π’ sn2 — срСдниС 32 разряда }

mov word ptr sn2, dx { сСрийного Π½ΠΎΠΌΠ΅Ρ€Π° ΠœΠŸ }

db 66h { Π’ sn1 — младшиС 32 разряда }

mov word ptr sn1, cx { сСрийного Π½ΠΎΠΌΠ΅Ρ€Π° ΠœΠŸ }

end;

writeln ('Π‘Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ микропроцСссора: ',

hw (sn3 shr 16),'-', hw (word (sn3)),'-',

hw (sn2 shr 16),'-', hw (word (sn2)),'-',

hw (sn1 shr 16),'-', hw (word (sn1)));

end;

end

end;

asm { Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cpu: }

mov bx, ss:[bp+offset cpu] { Π’ BX — адрСс cpu }

mov al, cpu_type

mov [bx], al

end;

end; {get_cpu_type}

{————ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ 0−18 (exc00-exc18)—————}

{——————выводят Π½Π° ΡΠΊΡ€Π°Π½ Π½ΠΎΠΌΠ΅Ρ€ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ————————}

{————ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ:——————-}

procedure exc00;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 0: }

asm { Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0 }

mov excep, 0

int 32h { Π’Ρ‹Π²ΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ }

cmp cpu_type, 2

jz @1

db 0ffh, 2eh { ΠœΠ΅ΠΆΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ }

dw ofs_ret_mov { Π½Π° ΠΌΠ΅Ρ‚ΠΊΡƒ ret_mov: }

@1:db 9ah { ΠœΠ΅ΠΆΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² }

dw offset reset { ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ сброса ΠœΠŸ reset }

dw code_sel2 { с ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° ΠΌΠ΅Ρ‚ΠΊΡƒ ret_r }

end;

procedure exc01;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 1: }

asm { - ΠΏΡ€ΠΈ TF=1 рСгистра EFLAGS; }

mov excep, 1 { - ΠΏΡ€ΠΈ T=1 сСгмСнта TSS; }

int 32h { - ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; }

cmp cpu_type, 2 { - ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…; }

jz @1 { - ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ Π£Π’Π’; }

db 0ffh, 2eh { - ΠΏΡ€ΠΈ Π·Π°Ρ‰ΠΈΡ‚Π΅ рСгистров ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ }

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc02;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 2: }

asm { нСмаскируСмоС ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ (NMI) }

mov excep, 2

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc03;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 3: }

asm { ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ INT 3 }

mov excep, 3

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc04;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 4: }

asm { ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ INTO ΠΏΡ€ΠΈ OF=1 }

mov excep, 4

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc05;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 5: }

asm { Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° }

mov excep, 5 { ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ BOUND }

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc06;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 6: }

asm { Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ }

mov excep, 6 { ΠΈΠ»ΠΈ адрСсации }

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc07;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 7: }

asm { нСдоступно устройство FPU }

mov excep, 7

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc08;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 8: }

asm { двойная ошибка }

mov excep, 8

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc10;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 10: }

asm { нСдоступСн TSS }

mov excep, 10

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc11;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 11: }

asm { нСдоступСн сСгмСнт }

mov excep, 11

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc12;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 12: }

asm { ошибка доступа ΠΊ ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Ρƒ стСка }

mov excep, 12

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc13;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 13: }

asm { Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅ΠΉ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ }

mov excep, 13

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc14;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 14: }

asm { нСдоступна страница }

mov excep, 14

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc16;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 16: }

asm { ошибка FPU ΠΏΡ€ΠΈ NE=1 рСгистра CR0 }

mov excep, 16

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc17;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 17: }

asm { ошибка выравнивания Π΄Π°Π½Π½Ρ‹Ρ… }

mov excep, 17

int 32h

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc18;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 18: }

asm { ошибка функционирования ΡƒΠ·Π»ΠΎΠ² ΠœΠŸ ΠΈ ΠœΠŸΠ‘ }

mov excep, 18

cmp cpu_type, 2

jz @1

db 0ffh, 2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

{————-ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ-Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ,————-}

{—————ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… Π½Π° 1-ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ—————-}

procedure PIC1;assembler;

asm

push ax

mov al,$ 20

out $ 20,al { Бброс Π±ΠΈΡ‚Π° рСгистра ISR 1-Π³ΠΎ ПКП }

pop ax

cmp cpu_type, 2 { Если 80 286 — Ρ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΡΡ‚ΡŒ 16, }

je @7 { ΠΈΠ½Π°Ρ‡Π΅ — 32 }

db 66h

@7:iret

end;

{————-ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ-Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ,————-}

{—————ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… Π½Π° 2-ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ—————-}

procedure PIC2;assembler;

asm

push ax

mov al,$ 20 { Бброс Π±ΠΈΡ‚Π° рСгистра ISR }

out $ 20,al { 1-Π³ΠΎ ΠΈ }

out $a0,al { ΠΈ 2-Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ }

pop ax

cmp cpu_type, 2

je @8

db 66h

@8:iret

end;

procedure keyb;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ }

asm { ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹: }

mov al, 20h

out 20h, al

in al, 60h { Π§Ρ‚Π΅Π½ΠΈΠ΅ скан-ΠΊΠΎΠ΄Π° наТатия/отТатия клавиши }

test al,$ 80

jnz @k1 { ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄, Ссли клавиша ΠΎΡ‚ΠΆΠ°Ρ‚Π° }

mov scan, al

@k1:cmp cpu_type, 2

je @k2

db 66h

@k2:iret

end;

procedure int_30h;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ }

asm { прСрывания 30h: }

cmp ah, 2 { AH — Π½ΠΎΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ }

jz @i2 { Al — Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ }

cmp ah, 3 { BL — Π½ΠΎΠΌΠ΅Ρ€ строки экрана }

jz @i3 { BH — Π½ΠΎΠΌΠ΅Ρ€ столбца экрана }

cmp ah, 4 { DL/DX/EDX — Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… }

jz @i4 { (Π±Π°ΠΉΡ‚Π°/слова/Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова) }

cmp ah, 5 { CL — Π²ΠΈΠ΄Π΅ΠΎ-Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ }

jz @i5 { SI — смСщСниС строки символов }

{ Ѐункция 1: установка ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° Π² Π·Π°Π΄Π°Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ экрана }

mov ax, bx

xor bh, bh

mov bl, ah

xor ah, ah

mov dl, 80

mul dl

add ax, bx

shl ax, 1

mov di, ax

jmp @end

@i2: { Ѐункция 2: Π²Ρ‹Π²ΠΎΠ΄ символа Π½Π° ΡΠΊΡ€Π°Π½ }

mov al, dl

mov ah, cl

stosw

jmp @end

@i3: { Ѐункция 3: Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡΠΊΡ€Π°Π½ Π² 16-Ρ€ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ }

{ AL=0 — Π²Ρ‹Π²ΠΎΠ΄ Π±Π°ΠΉΡ‚Π° }

{ AL=1 -Π²Ρ‹Π²ΠΎΠ΄ слова }

{ AL=2 — Π²Ρ‹Π²ΠΎΠ΄ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова }

lea bx, hex_tabl

mov ah, cl

cmp al, 0

jz @8

cmp al, 1

jz @16

add di, 14

mov cx, 8

jmp @1

@8:add di, 2

mov cx, 2

jmp @1

@16:add di, 6

mov cx, 4

@1:push cx

@lp:mov al, dl

and al, 0fh

db 66h

shr dx, 4

xlat

stosw

sub di, 4

loop @lp

pop cx

shl cx, 1

add cx, 4 {2}

add di, cx

jmp @end

@i4: { Ѐункция 4: Π²Ρ‹Π²ΠΎΠ΄ строки символов Π½Π° ΡΠΊΡ€Π°Π½ }

mov ah, cl

mov bx, si

inc si

mov cl,[bx]

xor ch, ch

@wxy:

lodsb

stosw

loop @wxy

jmp @end

@i5: { Ѐункция 5: Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡΠΊΡ€Π°Π½ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ }

{ AL=0 — Π²Ρ‹Π²ΠΎΠ΄ Π±Π°ΠΉΡ‚Π° }{ AL=1 -Π²Ρ‹Π²ΠΎΠ΄ слова }

{ AL=2 — Π²Ρ‹Π²ΠΎΠ΄ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова }

{ lea bx, duo_tabl}

mov ah, cl

cmp al, 0

jz @82

cmp al, 1

jz @162

mov cx, 8

jmp @2

@82:

mov cx, 2

jmp @2

@162:

mov cx, 4

@2:push cx

push cx

shl cx, 3

sub cx, 2

add di, cx { di+cx*8−2 }

pop cx

@lp1:push cx

xor ah, 8

mov cx, 4

@lp2:mov al, dl

and al, 01h

db 66h

shr dx, 1

xlat

stosw

sub di, 4

loop @lp2

pop cx

loop @lp1

pop cx

shl cx, 3

add cx, 2 { di+cx*8+2 }

add di, cx

@end:db 66h

iret

end;

procedure int_30hr;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ }

asm { прСрывания 30h: }

cmp ah, 2 { AH — Π½ΠΎΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ }

jz @i2 { Al — Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ }

cmp ah, 3 { BL — Π½ΠΎΠΌΠ΅Ρ€ строки экрана }

jz @i3 { BH — Π½ΠΎΠΌΠ΅Ρ€ столбца экрана }

cmp ah, 4 { DL/DX/EDX — Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… }

jz @i4 { (Π±Π°ΠΉΡ‚Π°/слова/Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова) }

cmp ah, 5 { CL — Π²ΠΈΠ΄Π΅ΠΎ-Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ }

jz @i5 { SI — смСщСниС строки символов }

{ Ѐункция 1: установка ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° Π² Π·Π°Π΄Π°Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ экрана }

mov ax, bx

xor bh, bh

mov bl, ah

xor ah, ah

mov dl, 80

mul dl

add ax, bx

shl ax, 1

mov di, ax

jmp @end

@i2: { Ѐункция 2: Π²Ρ‹Π²ΠΎΠ΄ символа Π½Π° ΡΠΊΡ€Π°Π½ }

mov al, dl

mov ah, cl

stosw

jmp @end

@i3: { Ѐункция 3: Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡΠΊΡ€Π°Π½ Π² 16-Ρ€ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ }

{ AL=0 — Π²Ρ‹Π²ΠΎΠ΄ Π±Π°ΠΉΡ‚Π° } { AL=1 -Π²Ρ‹Π²ΠΎΠ΄ слова }

{ AL=2 — Π²Ρ‹Π²ΠΎΠ΄ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова }

lea bx, hex_tabl

mov ah, cl

cmp al, 0

jz @8

cmp al, 1

jz @16

add di, 14

mov cx, 8

jmp @1

@8:add di, 2

mov cx, 2

jmp @1

@16:add di, 6

mov cx, 4

@1:push cx

@lp:mov al, dl

and al, 0fh

db 66h

shr dx, 4

xlat

stosw

sub di, 4

loop @lp

pop cx

shl cx, 1

add cx, 4 {2}

add di, cx

jmp @end

@i4: { Ѐункция 4: Π²Ρ‹Π²ΠΎΠ΄ строки символов Π½Π° ΡΠΊΡ€Π°Π½ }

mov ah, cl

mov bx, si

inc si

mov cl,[bx]

xor ch, ch

@wxy:

lodsb

stosw

loop @wxy

jmp @end

@i5: { Ѐункция 5: Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡΠΊΡ€Π°Π½ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ }

{ AL=0 — Π²Ρ‹Π²ΠΎΠ΄ Π±Π°ΠΉΡ‚Π° }

{ AL=1 -Π²Ρ‹Π²ΠΎΠ΄ слова }

{ AL=2 — Π²Ρ‹Π²ΠΎΠ΄ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова }

{ lea bx, duo_tabl}

mov ah, cl

cmp al, 0

jz @82

cmp al, 1

jz @162

mov cx, 8

jmp @2

@82:

mov cx, 2

jmp @2

@162:

mov cx, 4

@2:push cx

push cx

shl cx, 3

sub cx, 2

add di, cx { di+cx*8−2 }

pop cx

@lp1:push cx

xor ah, 8

mov cx, 4

@lp2:mov al, dl

and al, 01h

db 66h

shr dx, 1

xlat

stosw

sub di, 4

loop @lp2

pop cx

loop @lp1

pop cx

shl cx, 3

add cx, 2 { di+cx*8+2 }

add di, cx

@end: iret

end;

{—————————Π’Ρ‹Π²ΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ——————————}

procedure int_32h;assembler;

asm

mov ah, 1 { Ѐункция 1: установка ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° Π½Π° ΡΠΊΡ€Π°Π½Π΅ }

mov bl, 22 { с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ — строка 22, }

mov bh, 1 { столбСц 1 }

int 30h

mov ah, 4 { Ѐункция 4: Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ }

mov si, offset s2 { строки символов s2 }

mov cl, 1ah { Π²ΠΈΠ΄Π΅ΠΎΠ°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ }

int 30h

mov ax, 300h { Ѐункция 3, подфункция 0: }

mov dl, excep { Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ }

mov cl, 1ch { Π²ΠΈΠ΄Π΅ΠΎΠ°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ }

int 30h

db 66h

iret

end;

end.

(*16. Π°) Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΎΠΌ чтСния ΠΈΠ· ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° Π±) Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания ΠΎΡ‚ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 5 сСкунд мСняСт Ρ†Π²Π΅Ρ‚ Π±ΠΎΡ€Π΄ΡŽΡ€Π°.

I. Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ Π² ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

II. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… способов:

Π°) устранив ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ;

Π±) пропустив ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π²Ρ‹Π·Π²Π°Π²ΡˆΡƒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

III. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ внСшнСС ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅.*)

program p_intr;

{ ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ }

uses crt, prot; { ΠœΠΎΠ΄ΡƒΠ»ΡŒ PROT содСрТит константы, }

{ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ }

{ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ }

label ret_r; { Π’ΠΎΡ‡ΠΊΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ }

const

s:string='ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅';

s1:string='CS SS DS ES CR0 EFLAGS: ';

s2:string='ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ';

s3:string='Na 5 tik timera menyaem cvet BORDURA.';

s4:string='Press Esc to exit';

var

cs_real, { Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра CS Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ }

err, { Код ошибки }

lim1,lim2,count:word;

scan, i, al_, ah_, n_exc, row: byte;

sscan:byte;

eflags:longint;

quel, counter, color: byte;

dwd:word;

{———————Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ———————}

procedure out_exc;assembler; { Π’Ρ‹Π²ΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ }

asm

mov ah, 1 { Ѐункция 1: установка ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° Π½Π° ΡΠΊΡ€Π°Π½Π΅ }

mov bl, 22 { с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ — строка 22, }

mov bh, 1 { столбСц 1 }

int 30h

mov ah, 4 { Ѐункция 4: Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ }

mov si, offset s2 { строки символов s2 }

mov cl, 1eh

int 30h

mov ax, 300h { Ѐункция 3, подфункция 0: }

mov dl, excep { Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ }

mov cl, 1ch

int 30h

mov dx, dwd

ret

end;

procedure exc00;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 0 }

{——-Π”Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° устранСния зацикливания ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‚ΠΊΠ°Π·Π°——}

mov bl, 1 { Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 1: устранСниС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΎΡ‚ΠΊΠ°Π·Π° }

pusha

(* push bp { Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΊΠ΅ значСния }

mov bp, sp { счСтчика ΠΊΠΎΠΌΠ°Π½Π΄ IP Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ Π΄Π»ΠΈΠ½Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ }

inc word ptr [bp+2]

pop bp *)

mov excep, 0

call out_exc; { Π’Ρ‹Π²ΠΎΠ΄ сообщСния ΠΎΠ± ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ }

popa

cmp cpu_type, 2

jz @2

db 66h

@2:iret

end;

procedure exc13;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 0 }

{——-Π”Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° устранСния зацикливания ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‚ΠΊΠ°Π·Π°——}

asm

cmp cpu_type, 2

jz @1

db 66h

@1:pop bx

{——————-Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2: измСняСт Π² ΡΡ‚Π΅ΠΊΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅——————}

{——————-счСтчика ΠΊΠΎΠΌΠ°Π½Π΄ IP Π½Π° Π΄Π»ΠΈΠ½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹,——————}

{—————-Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (div bl — 1 Π±Π°ΠΉΡ‚)——————}

push bp

mov bp, sp

add word ptr [bp+2], 4 { ΠΈΠ»ΠΈ inc word ptr [bp+2] }

pop bp

{——————————-Π’Ρ‹Π²ΠΎΠ΄ сообщСния————————————-}

{————-ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ excep—————}

pusha

mov excep, 13

int 32h

(*push bx

mov ax, 501h { Ѐункция 5: Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ }

mov cl, 1eh { ΠΊΠΎΠ΄Π° ошибки Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ }

pop dx

int 30h *)

popa

{———-Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 3: выполняСт Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°———-}

{——Ρ‡Π΅Ρ€Π΅Π· мСТсСгмСнтный косвСнный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° ΠΌΠ΅Ρ‚ΠΊΡƒ ret_mov——}

(* db 0ffh, 2eh

dw ofs_ret_mov *)

cmp cpu_type, 2

jz @2

db 66h

@2:iret

end;

procedure exc_0b;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ 11 }

{ вызываСтся ΠΏΡ€ΠΈ отсутствии сСгмСнта Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅Ρ‚ }

{ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΡŽ дСскриптора сСгмСнта — востанавливаСт Π±ΠΈΡ‚ P }

asm

mov excep, 0bh

cmp cpu_type, 2

jz @1

db 66h

@1:pop bx { Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· ΡΡ‚Π΅ΠΊΠ° ΠΊΠΎΠ΄Π° ошибки }

mov err, bx { ΠΈ Π·Π°ΠΏΠΈΡΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ err }

and bx, not 7 { Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ смСщСния сСлСктора }

add bx, offset gdt+5 { Π’Ρ‹Π±ΠΎΡ€ поля Π±Π°ΠΉΡ‚Π° доступа Π² GDT }

push ax

mov al, [bx] { Π§Ρ‚Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚Π° доступа сСгмСнта }

or al, 80h

mov [bx], al { Установка Π±ΠΈΡ‚Π° P=1 Π² Π±Π°ΠΉΡ‚Π΅ доступа }

pop ax

cmp cpu_type, 2

jz @2

db 66h

@2:iret

end;

procedure keyb;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ }

asm { ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹: }

mov al, 20h

out 20h, al { Бброс ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ }

in al, 60h { Π§Ρ‚Π΅Π½ΠΈΠ΅ скан-ΠΊΠΎΠ΄Π° наТатия/отТатия клавиши }

test al, 80h

jnz @1 { ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄, Ссли клавиша ΠΎΡ‚ΠΆΠ°Ρ‚Π° }

mov scan, al

@1:cmp cpu_type, 2

jz @3

db 66h

@3:iret

end;

procedure ttim;assembler; { ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ }

asm { ΠΎΡ‚ timer: }

push ax

mov al,$ 20

out $ 20,al { Бброс Π±ΠΈΡ‚Π° рСгистра ISR 1-Π³ΠΎ ПКП }

pop ax

inc counter

cmp counter, 5

jnz @99

mov counter, 0

push dx

push ax

mov dx, 3dah

in al, dx

mov dx, 3c0h

mov al, 11h

out dx, al

inc color

mov al, color

out dx, al

mov al, 20h

out dx, al

pop dx

pop ax

@99:cmp cpu_type, 2 { Если 80 286 — Ρ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΡΡ‚ΡŒ 16, }

jz @l1 { ΠΈΠ½Π°Ρ‡Π΅ — 32 }

db 66h

@l1:iret

end;

begin

clrscr;

{———ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ значСния сСгмСнта ΠΊΠΎΠ΄Π° cs1 ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€,——-}

{—————————описанных Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ PROT—————————}

cs1:=Seg (int_30h);

excep:=$ff; { ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ FFh Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ excep }

{ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ возникшСго ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ }

sscan:=0; { Клавиша Π½Π΅ Π½Π°ΠΆΠ°Ρ‚Π° }

res:=0; { МП ΡΠ±Ρ€ΠΎΡˆΠ΅Π½ Π½Π΅ Π±Ρ‹Π» }

{—————-ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° микропроцСссора————————}

get_cpu_type (0,cpu_type); { Π’ cpu_type — Π½ΠΎΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠ° ΠœΠŸ }

if cpu_type=2 then t:=0 { 16-разрядный ΠœΠŸ }

else t:=8; { 32-разрядный ΠœΠŸ }

{ Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚Π° доступа прСрывания: }

acc_int:=present OR type_int OR t;

{ Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚Π° доступа Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ: }

acc_trap:=present OR type_trap OR t;

{————————-Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ GDT——————————}

{ ΠΡƒΠ»ΡŒ-дСскриптор: }

init_gdt (0,0,0,0,0);

{ ДСскриптор ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сСгмСнта ΠΊΠΎΠ΄Π°: }

init_gdt (1,$ffff, lin_adr (cseg, 0), acc_code1,0);

{ ДСскриптор Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ сСгмСнта ΠΊΠΎΠ΄Π°: }

init_gdt (2,$ffff, lin_adr (cs1,0), acc_code, 0);

{ ДСскриптор сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ…: }

init_gdt (3,$ffff, lin_adr (dseg, 0), acc_data, 0);

{————Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ отсутствия сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ:————}

{——————-Π±ΠΈΡ‚ P Π² Π΅Π³ΠΎ дСскрипторС Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ———————}

{ gdt[3]. acc:=gdt[3].acc and not present;

{ ДСскриптор сСгмСнта стСка: }

init_gdt (4,0,lin_adr (sseg, 0), acc_stack, 0);

{ ДСскриптор сСгмСнта видСопамяти: }

init_gdt (5,4000−1,lin_adr ($b800,0), acc_data, 0);

{———Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… рСгистра GDTR ΠΈ Π΅Π³ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°——-}

init_gdtr;

{——ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сСлСктора (cs_real) ΠΈ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡ (ofs_ret)—-}

{——————-Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ———————-}

cs_real:=Cseg;

asm mov ofs_ret, offset ret_r end;

{——————————-Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…—————————-}

{————-для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ΠΌΠ΅Ρ‚ΠΊΡƒ ret_r послС сброса МП———-}

{—————-с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ————-}

save_ret_real (cs_real, ofs_ret, 5);

{———Π—Π°ΠΏΡ€Π΅Ρ‚ маскируСмых ΠΈ Π½Π΅ΠΌΠ°ΡΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ————}

not_int;

{———————Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ IDT—————————— }

{ ДСскрипторы шлюзов ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ 0−18: }

init_idt (0,ofs (exc00), code_sel, acc_trap);

init_idt (1,ofs (exc01), code_sel2,acc_trap);

init_idt (2,ofs (exc02), code_sel2,acc_trap);

init_idt (3,ofs (exc03), code_sel2,acc_trap);

init_idt (4,ofs (exc04), code_sel2,acc_trap);

init_idt (5,ofs (exc05), code_sel2,acc_trap);

init_idt (6,ofs (exc06), code_sel2,acc_trap);

init_idt (7,ofs (exc07), code_sel2,acc_trap);

init_idt (8,ofs (exc08), code_sel2,acc_trap);

init_idt (10,ofs (exc10), code_sel2,acc_trap);

init_idt (11,ofs (exc_0b), code_sel, acc_trap);

init_idt (12,ofs (exc12), code_sel2,acc_trap);

init_idt (13,ofs (exc13), code_sel, acc_trap);

init_idt (14,ofs (exc14), code_sel2,acc_trap);

init_idt (16,ofs (exc16), code_sel2,acc_trap);

init_idt (17,ofs (exc17), code_sel2,acc_trap);

init_idt (18,ofs (exc18), code_sel2,acc_trap);

{ ДСскриптор шлюза ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° прСрывания ΠΎΡ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°: }

init_idt ($ 20,ofs (ttim), code_sel, acc_int);

{ ДСскриптор шлюза ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° прСрывания ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹: }

init_idt ($ 21,ofs (keyb), code_sel, acc_int);

{ ДСскрипторы шлюзов ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ IRQ2-IRQ7: }

for i:=2 to 7 do

init_idt ($ 20+i, ofs (PIC1), code_sel2,acc_int);

{ ДСскрипторы шлюзов ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ IRQ8-IRQ15: }

for i:=8 to 15 do

init_idt ($ 20+i, ofs (PIC2), code_sel2,acc_int);

{ ДСскриптор шлюза ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ прСрывания: }

init_idt ($ 30,ofs (int_30h), code_sel2,acc_trap);

init_idt ($ 32,ofs (int_32h), code_sel2,acc_int);

{———-Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… рСгистра IDTR Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ IDTR——-}

asm

db 0fh, 1,0eh { SIDT idtr }

dw idtr_r

end;

{———Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… рСгистра IDTR ΠΈ Π΅Π³ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°——-}

{———————для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅———————-}

init_idtr_p;

(* {———————Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… рСгистра IDTR——————}

{———————-для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅———————-}

init_idtr_r; *)

{—————ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ—————}

{———————для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅———————-}

pic (1);

{———-Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ содСрТимого рСгистров DS, SS, ES ΠΈ SP———}

save_sreg;

real_sp:=SPtr;

if cpu_type=2 then

{————-ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ для ΠœΠŸ 80 286—————-}

asm { Установка Π±ΠΈΡ‚Π° PE=1 Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ MSW: }

db 0fh, 01h, 0e0h { SMSW AX }

or ax, 1

db 0fh, 01h, 0f0h { LMSW AX }

end else

{———-ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ для ΠœΠŸ 80 386 ΠΈ Π²Ρ‹ΡˆΠ΅——-}

asm { Установка Π±ΠΈΡ‚Π° PE=1 Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ управлСния CR0: }

db 0fh, 20h, 0c0h { MOV EAX, CR0 }

db 66h, 0dh { OR EAX, 1 }

dd 1h

db 0fh, 22h, 0c0h { MOV CR0, EAX }

end;

asm

push code_sel { Π”Π°Π»ΡŒΠ½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° ΠΌΠ΅Ρ‚ΠΊΡƒ @prot }

push offset @prot { для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ CS ΠΈ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ }

retf

{————————Π Π°Π±ΠΎΡ‚Π° Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅————————-}

{———————-Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сСгмСнтных рСгистров———————-}

{———————-ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ сСлСкторами————————}

@prot:

mov ds, data_sel { DS, }

mov ss, stack_sel { SS }

mov es, video_sel { ΠΈ ES }

{—————————-Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ строки—————————-}

{————-" ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅" ————}

{—————-с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ 1 ΠΈ 4 прСрывания 30h—————}

mov ah, 1 { Установка ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π°: }

mov bx, 903h { строка 3, столбСц 9 }

int 30h

mov ah, 4 { Π’Ρ‹Π²ΠΎΠ΄ строки s Π½Π° ΡΠΊΡ€Π°Π½: }

mov cl, 1eh { Π²ΠΈΠ΄Π΅ΠΎΠ°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, }

mov si, offset s { адрСс строки }

int $ 30

mov ah, 1

mov bx, 705h

int 30h

mov ah, 4 { Ѐункция 4: Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ }

mov si, offset s1 { строки символов s1 }

mov cl, 1ch

int 30h

mov ax, 301h { Ѐункция 3, подфункция 1: }

mov dx, cs

mov cl, 1ch

int 30h { Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ CS }

mov ax, 301h

mov dx, ss

mov cl, 1ch { Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ SS }

int 30h

mov ax, 301h

mov dx, ds

mov cl, 1ch

int 30h { Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ DS }

mov ax, 301h

mov dx, es

mov cl, 1ch

int 30h { Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ ES }

mov ax, 302h { Ѐункция 3, подфункция 2: }

db 0fh, 20h, 0c2h { MOV EDX, CR0 }

mov cl, 1ch

int 30h { Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ CR0 }

mov ax, 302h

db 66h

pushf

db 66h

pop dx

mov cl, 1ch

int 30h { Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ EFLAGF }

mov ah, 1

mov bx, 510h

int 30h

mov ah, 4 { Ѐункция 4: Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ }

mov si, offset s3 { строки символов s3 }

mov cl, 1ch

int 30h

mov ah, 1

mov bx, 511h

int 30h

mov ah, 4 { Ѐункция 4: Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΡΠΊΡ€Π°Π½ }

mov si, offset s4 { строки символов s3 }

mov cl, 1ch

int 30h

{Virabotka zad isklucheniya}

mov ax, cs:[0]

{——————-Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ маскируСмых ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ——————-}

sti

{——ОТиданиС ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π΄ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΈ сСмафора——}

{mov ax, cs:[0]}

@wait:

cmp scan, 1h

jnz @wait

{int 13}

cmp cpu_type, 2

jnz @mov

{——Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎ ΡΠ±Ρ€ΠΎΡΡƒ микропроцСссора——-}

push code_sel2

push offset reset

retf

{—-ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Ρƒ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ MOV—-}

{————-Установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сСгмСнтов DS, SS ΠΈ ES————}

{———————-для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅————————}

@mov:

(* ARBEITEST an seleron 6 version !!!

push code_sel2

push offset reset

retf

*) cli

mov ds, data_sel

mov ss, data_sel

mov es, data_sel

{———————-ВосстановлСниС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² IDT————————}

{———————-для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅————————}

{———-Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ MOV——————-}

db 0fh, 01h, 1eh { LIDT idtr_r }

dw idtr_r

db 0fh, 20h, 0c0h { MOV EAX, CR0 }

db 66h, 25h { AND EAX, FFFFFFFEh }

dd 0fffffffeh

db 0fh, 22h, 0c0h { MOV CR0, EAX }

push cs_real

push ofs_ret

retf

{————————-Π Π°Π±ΠΎΡ‚Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅—————————}

{———————-ВосстановлСниС рСгистров послС———————}

{—————————Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ————————}

ret_r:

xor ax, ax

mov ds, ax

mov ds,[4*60h] { DS, }

mov ss, real_ss { SS, }

mov es, real_es { ES }

mov sp, real_sp { ΠΈ SP }

end;

if res=0 then

{———-ΠŸΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ————}

{——————-для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅—————————}

pic (0)

else

{————-РазмаскированиС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ—————-}

{———————-послС сброса микропроцСссора————————}

begin

port[$ 21]: =184;

port[$a1]:=13;

end;

{—-Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ маскируСмых ΠΈ Π½Π΅ΠΌΠ°ΡΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ—-}

en_int;

{——-Π’ случаС возникновСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ‹Π²ΠΎΠ΄ Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°——-}

gotoXY (1,20);

{—————Анализ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠœΠŸ ΠΈΠ· Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°————-}

if res=0 then s:='ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ MOV' else s:='Ρ‡Π΅Ρ€Π΅Π· сброс МП';

writeln ('Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ', s);

writeln ('Π‘ΠΊΠ°Π½-ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши — ', scan,' - ESC');

end.

5. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΈ Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ

Π ΠΎΠ·Ρ€ΠΎΠ±Π»Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Ρ€Π΅Π°Π»Ρ–Π·ΡƒΡ” ΠΏΠ΅Ρ€Π΅Ρ…Ρ–Π΄ Ρƒ Π·Π°Ρ…ΠΈΡ‰Π΅Π½ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ– Π²ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° Π΅ΠΊΡ€Π°Π½ відомості ΠΏΡ€ΠΎ Ρ‚ΠΈΠΏ процСсора Ρ– Π²ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ вміст рСгістру Ρ„Π»Π°Π³Ρ–Π² Ρ– Ρ–Π½ΡˆΡƒ Ρ–Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†Ρ–ΡŽ ΠΎ ΡΠΈΡΡ‚Π΅ΠΌΡ–. ΠŸΠΎΡ‚Ρ–ΠΌ Ρ€Π΅Π°Π»Ρ–Π·ΡƒΡ”Ρ‚ΡŒΡΡ Ρ†ΠΈΠΊΠ» чСкання пСрСривання Π²Ρ–Π΄ ΠΊΠ»Π°Π²Ρ–Π°Ρ‚ΡƒΡ€ΠΈ ΠΏΡ€ΠΈ натисканні ΠΊΠ»Π°Π²Ρ–ΡˆΡ– ESC, ΠΏΡ–Π΄ час Ρ†ΡŒΠΎΠ³ΠΎ ΠΎΠ±Ρ€ΠΎΠ±Π»ΡΡŽΡ‚ΡŒΡΡ пСрСривання Π²Ρ–Π΄ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ Ρ– ΠΏΠΎ ΠΊΠΎΠΆΠ½ΠΎΠΌΡƒ ΠΏ’ятому Ρ‚Ρ–ΠΊΡƒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ Π²ΠΈΠΊΠΎΠ½ΡƒΡ”Ρ‚ΡŒΡΡ змінСння ΠΊΠΎΠ»ΡŒΠΎΡ€Ρƒ Π±ΠΎΡ€Π΄ΡŽΡ€Ρƒ. ΠŸΡ–ΡΠ»Ρ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ Ρ†ΠΈΠΊΠ»Ρƒ чСкання натиску ΠΊΠ»Π°Π²Ρ–ΡˆΡ– ESC ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Ρ€Π΅Π°Π»Ρ–Π·ΡƒΡ” виняткову ΡΠΈΡ‚ΡƒΠ°Ρ†Ρ–ΡŽ для виникнСння 13 пСрСривання, якС ΠΎΠ±Ρ€ΠΎΠ±Π»ΡΡ”Ρ‚ΡŒΡΡ створСним пСрСриванням, якС Π²ΠΈΠ»ΡƒΡ‡Π°Ρ” Ρ–Π· стСку дСскриптор ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ Ρ– ΠΎΠ±ΠΌΠΈΠ½Π°Ρ” виняткову ΡΠΈΡ‚ΡƒΠ°Ρ†Ρ–ΡŽ. Π’ ΠΊΡ–Π½Ρ†Ρ– ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΏΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ”Ρ‚ΡŒΡΡ Ρƒ Ρ€Π΅Π°Π»ΡŒΠ½ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ– Π²Ρ–Π΄Π½ΠΎΠ²Π»ΡŽΡ” старі Ρ‚Π°Π±Π»ΠΈΡ†Ρ– GDT Ρ‚Π° IDT.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ