Π ΠΎΠ±ΠΎΡΠ° Π² Π·Π°Ρ ΠΈΡΠ΅Π½ΠΎΠΌΡ ΡΠ΅ΠΆΠΈΠΌΡ ΠΌΡΠΊΡΠΎΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°
Π ΠΎΠ·ΡΠΎΠ±ΠΈΡΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ ΡΡΡΡ Π½Π΅ΠΎΠ±Ρ ΡΠ΄Π½ΠΈΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡΠ² ΠΏΠ°ΠΌ’ΡΡΡ Ρ ΡΡΠΎΡΠΌΡΠ²Π°ΡΠΈ Π· Π½ΠΈΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ½Ρ ΡΠ°Π±Π»ΠΈΡΡ 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.