0% found this document useful (0 votes)
25 views88 pages

Jozveban - Ir Elegram - Me/jozveban T Ir/sopnuu App. S

داذرردذردذردذردذردذردذر

Uploaded by

fatanehbiusad
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
25 views88 pages

Jozveban - Ir Elegram - Me/jozveban T Ir/sopnuu App. S

داذرردذردذردذردذردذردذر

Uploaded by

fatanehbiusad
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 88

‫نم‬

‫آیا میدانستید با عضویت رد سایت زجوه بان میتوانید هب صورت رای گان زجوات و وهن‬

‫ن‬
‫سواالت دا ش گاهی را دانلود کنید ؟؟‬

‫فقط کافیه روی لینک زری رضهب زبنید‬

‫👇👇👇👇👇👇👇👇👇👇👇👇👇👇‬

‫ورود هب سایت زجوه بان‬

‫‪Jozveban.ir‬‬
‫‪telegram.me/jozveban‬‬
‫‪sapp.ir/sopnuu‬‬
‫ﺑﺴﻤﻪ ﺗﻌﺎﻟﻲ‬

‫داﻧﺸﮕﺎه ﻋﻠﻢ و ﺻﻨﻌﺖ اﻳﺮان‬


‫داﻧﺸﻜﺪه ﻣﻬﻨﺪﺳﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ‬

‫ﺟﺰوه درس ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬

‫ﻣﺪرس‪ :‬ﻣﺤﻤﺪ ﻋﺒﺪاﻟﻠﻬﻲ ازﮔﻤﻲ‬


‫ﻓﺼﻞ ‪ :1‬ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬
‫)‪(System Programming Basics‬‬

‫‪ 1-1‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﭼﻴﺴﺖ؟‬


‫از دﻳﺪ اﻓﺮاد ﻣﺨﺘﻠﻔﻲ ﻛﻪ ﺑﺎ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻛﺎر ﻣﻲﻛﻨﻨﺪ اﻳﻦ ﭘﺮﺳﺶ ﻣﻲﺗﻮاﻧﺪ ﭘﺎﺳﺨﻬﺎي ﻣﺘﻔﺎوﺗﻲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬ﺑﺮﺧﻲ ﺑﻪ ﻫﺮ ﺑﺮﻧﺎﻣﻪ ﺑﻪ دﻳﺪ ﻳﻚ "ﺳﻴﺴﺘﻢ" ﻧﮕﺎه‬
‫ﻣﻲﻛﻨﻨﺪ و ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ را ﻓﺮآﻳﻨﺪ ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﺴﺄﻟﻪ ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪي ﻗﺎﺑﻞ اﺟﺮا ﻣﻲداﻧﻨﺪ‪ .‬ﺑﺮﺧﻲ ﺑﻪ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪﻫﺎي ﺧﺎص ﺑﺮاي ﻳﻚ ﺳﻴﺴﺘﻢ ﻛﺎﻣﭙﻴﻮﺗﺮي‬
‫ﺧﺎص‪ ،‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﻣﻲﮔﻮﻳﻨﺪ‪.‬‬

‫ﮔﺮﭼﻪ ﺗﻌﺮﻳﻒ دوم ﺗﺎ ﺣﺪي درﺳﺖ اﺳﺖ‪ ،‬اﻣﺎ ﺑﻪﻃﻮر دﻗﻴﻖﺗﺮ از دﻳﺪ ﻣﺎ‪ ،‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ داراي ﺗﻌﺮﻳﻒ ﻣﺸﺨﺺ و ﻣﻌﻴﻨﻲ اﺳﺖ‪ :‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬
‫ﻧﻮع ﺧﺎﺻﻲ از ﺑﺮﻧﺎﻣﻪﺳﺎزي اﺳﺖ ﻛﻪ ﻧﻴﺎزﻣﻨﺪ اﻃﻼع از ﺟﺰﺋﻴﺎت ﻓﻨﻲ ﺳﻴﺴﺘﻢ ﻣﻮرد ﻧﻈﺮ و دﺳﺘﺮﺳﻲ و ﻣﺪﻳﺮﻳﺖ ﻣﻨﺎﺑﻊ ﺳﺨﺖاﻓﺰاري ﺳﻴﺴﺘﻢ‬
‫ﺑﻪﺻﻮرت دﻟﺨﻮاه اﺳﺖ‪ .‬اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪﺳﺎزي ﻋﻤﻮﻣﺎً ﺑﺮاي ﻧﻮﺷﺘﻦ ﻧﺮماﻓﺰارﻫﺎي ﺳﻴﺴﺘﻤﻲ‪ 1‬ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬

‫ﺑﺮﻧﺎﻣﻪﺳﺎزي ﻛﺎرﺑﺮدي‪ 2‬در ﻣﻘﺎﺑﻞ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‪ :‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﻛﺎرﺑﺮدي ﺷﺎﻣﻞ ﻣﺪﻳﺮﻳﺖ و اراﺋﻪي اﻃﻼﻋﺎت در ﻗﺎﻟﺐ ﻳﻚ ﺑﺮﻧﺎﻣﻪي ﻛﺎﻣﭙﻴﻮﺗﺮي‬
‫ﺑﻮده و ﻧﻴﺎزﻣﻨﺪ ﻧﮕﻬﺪاري اﻃﻼﻋﺎت در ﻗﺎﻟﺐ ﺳﺎﺧﺘﺎرﻫﺎي دادهاي )ﻧﻈﻴﺮ آراﻳﻪ‪ ،‬رﻛﻮرد و ﻏﻴﺮه( و ﭘﺮدازش آﻧﻬﺎ اﺳﺖ‪ .‬اﻟﮕﻮرﻳﺘﻢﻫﺎي ﻣﻮرد اﺳﺘﻔﺎده در ﺑﺮﻧﺎﻣﻪﺳﺎزي ﻛﺎرﺑﺮدي‬
‫ﻣﺴﺘﻘﻞ از ﺳﻴﺴﺘﻢ‪ 3‬ﺑﻮده و ﺑﺮاي اﻏﻠﺐ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﻗﺎﺑﻞ ﺗﻌﺮﻳﻒ ﻫﺴﺘﻨﺪ‪ .‬اﻣﺎ‪ ،‬روﺷﻲ ﻛﻪ اﻃﻼﻋﺎت ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد و ﻃﺮﻳﻘﻲ ﻛﻪ اﻃﻼﻋﺎت ﻧﻤﺎﻳﺶ داده ﻣﻲﺷﻮﻧﺪ‬
‫ﻳﺎ ﭼﺎپ ﻣﻲﺷﻮﻧﺪ‪ ،‬واﺑﺴﺘﻪ ﺑﻪ ﺳﻴﺴﺘﻢ‪ 4‬اﺳﺖ‪ .‬در ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‪ ،‬ﻛﻨﺘﺮل ﻫﺮﻧﻮع ﺳﺨﺖاﻓﺰاري ﻛﻪ اﻃﻼﻋﺎت را ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻲﻓﺮﺳﺘﺪ ﻳﺎ از آن درﻳﺎﻓﺖ ﻣﻲﻛﻨﺪ‪ ،‬اﻧﺠﺎم‬
‫ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ﭘﺮدازش اﻳﻦ اﻃﻼﻋﺎت ﻧﻴﺎز ﺑﻪ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﺎرﺑﺮدي ﻫﺴﺘﻴﻢ‪ .‬از اﻳﻦرو‪ ،‬ﺑﺮاي ﺑﻬﺮهﺑﺮداري از ﺳﺨﺖاﻓﺰار ﻛﺎﻣﭙﻴﻮﺗﺮ‪ ،‬ﻫﺮ دو ﻧﻮع ﺑﺮﻧﺎﻣﻪﺳﺎزي ﻻزم ﻫﺴﺘﻨﺪ‪.‬‬

‫‪ 2-1‬ﻣﺪل ﺳﻪ ﻻﻳﻪاي‬
‫ﻣﻬﻤﺘﺮﻳﻦ ﻫﺪف ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‪ ،‬دﺳﺘﺮﺳﻲ و ﻣﺪﻳﺮﻳﺖ ﺳﺨﺖاﻓﺰار ﻛﺎﻣﭙﻴﻮﺗﺮ اﺳﺖ‪ .‬ﻧﻮعِ ﺳﻴﺴﺘﻢِ ﻛﺎﻣﭙﻴﻮﺗﺮي ﻛﻪ ﻣﻮرد ﻧﻈﺮ ﻣﺎ اﺳﺖ‪ ،‬ﻛﺎﻣﭙﻴﻮﺗﺮ‬
‫ﺷﺨﺼﻲ)‪ 5(PC‬اﺳﺖ‪ .‬اﻳﻦ ﻧﻮع ﻛﺎﻣﭙﻴﻮﺗﺮ داراي ﻣﻌﻤﺎري ﺧﺎص ﺑﻮده و اﺟﺰاء ﺳﺨﺖاﻓﺰاري آن ﺑﺎ ﺳﺎﻳﺮ ﻣﻌﻤﺎريﻫﺎ ﻣﺘﻔﺎوت اﺳﺖ‪ .‬ﻧﻮﻋﻲ از ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﻛﻪ ﻣﻮرد‬
‫ﻧﻈﺮ ﻣﺎ اﺳﺖ‪ ،‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﻫﻤﻴﻦ ﻧﻮع ﺳﻴﺴﺘﻢ ﻛﺎﻣﭙﻴﻮﺗﺮي ﺑﻮده و ﻫﺪف آن دﺳﺘﺮﺳﻲ و ﻣﺪﻳﺮﻳﺖ ﺳﺨﺖاﻓﺰار ‪ PC‬اﺳﺖ‪.‬‬

‫در ﻣﺤﻴﻂ ‪ ،PC‬دﺳﺘﺮﺳﻲ ﺑﻪ ﺳﺨﺖاﻓﺰار از ﻃﺮﻳﻖ ‪ ROM-BIOS‬ﻳﺎ ‪ DOS‬ﻧﻴﺰ اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ‪ ،ROM-BIOS .‬ﻣﺨﻔﻒ ‪Read Only‬‬
‫‪ Memory-Basic Input/output System‬اﺳﺖ و ‪ DOS‬ﻫﻢ ﻣﺨﻔﻒ ‪ Disk Operating System‬اﺳﺖ‪ BIOS .‬و ‪ DOS‬واﺳﻄﻬﺎي ﻧﺮماﻓﺰاري‪6‬‬
‫ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪﻃﻮر ﺧﺎص ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﺳﺨﺖاﻓﺰار اﻳﺠﺎد ﺷﺪهاﻧﺪ‪ .‬در ﺷﻜﻞ )‪ (1-1‬ﻣﺪﻟﻲ ﺳﻪﻻﻳﻪاي از ارﺗﺒﺎط ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﺎ ‪ BIOS‬و ‪ DOS‬اراﺋﻪ ﺷﺪه اﺳﺖ‪.‬‬
‫ﺷﻜﻞ ‪ :1-1‬ﻣﺪل ﺳﻪﻻﻳﻪاي‬
‫‪Program‬‬

‫‪DOS‬‬

‫‪BIOS‬‬

‫‪Hardware‬‬

‫ﻣﻬﻤﺘﺮﻳﻦ ﻣﺰﻳﺖ اﺳﺘﻔﺎده از ‪ DOS‬ﻳﺎ ‪ BIOS‬اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎزﻣﻨﺪ دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﺳﺨﺖاﻓﺰار ﻧﻴﺴﺖ و در ﻋﻮض ﻳﻚ روال‪ BIOS 7‬ﻳﺎ‬
‫‪ DOS‬را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ ﺗﺎ ﻛﺎر ﻣﻮردﻧﻈﺮ را ﺑﺮاﻳﺶ اﻧﺠﺎم دﻫﺪ‪ .‬رواﻟﻬﺎي ‪ BIOS‬ﭘﺲ از اﻧﺠﺎم ﻳﻚ ﻛﺎر‪ ،‬اﻃﻼﻋﺎت وﺿﻌﻴﺖ‪ 8‬را ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮﻣﻲﮔﺮداﻧﻨﺪ ﺗﺎ ﺑﺮﻧﺎﻣﻪ از‬
‫ﻧﺘﻴﺠﻪي ﻋﻤﻞ آﮔﺎه ﺷﻮد‪ .‬اﻳﻦ واﺳﻄﻬﺎ ﺑﺎﻋﺚ ﻣﻲﺷﻮﻧﺪ ﻛﻪ ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ‪ ،‬ﻫﺰﻳﻨﻪ و زﻣﺎن ﻛﻤﺘﺮي ﺻﺮف ﺷﻮد‪.‬‬

‫_________________________________________________________________________________‬
‫‪system softwares ١‬‬
‫‪application programming ٢‬‬
‫‪system independent ٣‬‬
‫‪system dependent ٤‬‬
‫‪Personal Computer ٥‬‬
‫‪software interfaces ٦‬‬
‫‪routine ٧‬‬
‫‪status information ٨‬‬
‫‪2-1‬‬ ‫ﻓﺼﻞ ‪ :1‬ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬

‫ﻣﺰﻳﺖ دﻳﮕﺮ اﺳﺘﻔﺎده از واﺳﻄﻬﺎي ﻓﻮق‪ ،‬ﻋﺪم واﺑﺴﺘﮕﻲ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻣﺸﺨﺼﺎت ﻓﻴﺰﻳﻜﻲ ﺳﺨﺖاﻓﺰار اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل‪ ،‬ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت ﺑﺮ روي ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ‬
‫ﺑﺎ اﺳﺘﻔﺎده از ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‪ 1‬ﺗﻚ رﻧﮓ‪ 2‬و رﻧﮕﻲ )ﻧﻈﻴﺮ ‪ SuperVGA ،VGA ،EGA‬و ﻏﻴﺮه( ﺑﺎ ﻫﻢ داراي ﺗﻔﺎوﺗﻬﺎي اﺳﺎﺳﻲ اﺳﺖ‪ .‬اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﺑﺨﻮاﻫﺪ ﺧﻮدش‬
‫اﻃﻼﻋﺎت را ﺑﺎ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﻛﺎرت وﻳﺪﺋﻮﻳﻲ‪ ،‬ﻧﻤﺎﻳﺶ دﻫﺪ‪ ،‬ﺑﺎﻳﺪ رواﻟﻬﺎي ﻣﺠﺰاﻳﻲ ﺑﺮاي ﻫﺮ ﻛﺪام از اﻧﻮاع ﻛﺎرت وﻳﺪﺋﻮﻳﻲ ﻧﻮﺷﺘﻪ ﺷﻮد‪ .‬اﻣﺎ اﮔﺮ از رواﻟﻬﺎي ‪ BIOS‬اﺳﺘﻔﺎده‬
‫ﻧﻤﺎﻳﺪ‪ ،‬ﺑﺮﻧﺎﻣﻪ ﻣﺴﺘﻘﻞ از ﻧﻮع ﻛﺎرت وﻳﺪﺋﻮﻳﻲ ﺧﻮاﻫﺪ ﺑﻮد‪ .‬ﭼﻮن اﻧﻮاع ﻣﺨﺘﻠﻒ ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ ﺑﻮﺳﻴﻠﻪي ‪ BIOS‬ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫‪ROM-BIOS 3-1‬‬
‫در ﺷﻜﻞ )‪ (1-1‬ﻳﻚ ﻣﺪل ﺳﻪﻻﻳﻪاي را ﻣﺸﺎﻫﺪه ﻣﻲﻛﻨﻴﺪ ﻛﻪ واﺳﻂ ‪ BIOS‬از ‪ DOS‬ﺑﻪ ﺳﺨﺖاﻓﺰار ﻧﺰدﻳﻚﺗﺮ اﺳﺖ‪ BIOS .‬ﺗﻮاﺑﻌﻲ را ﺑﺮاي دﺳﺘﺮﺳﻲ و‬
‫ﻣﺪﻳﺮﻳﺖ ﻟﻮازم‪ 3‬زﻳﺮ ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪:‬‬

‫ﻛﺎرت وﻳﺪﺋﻮﻳﻲ‪،‬‬ ‫‪.1‬‬

‫ﺣﺎﻓﻈﻪ )‪،(RAM‬‬ ‫‪.2‬‬

‫دﻳﺴﻜﺖ‪،‬‬ ‫‪.3‬‬

‫دﻳﺴﻚ ﺳﺨﺖ‪،4‬‬ ‫‪.4‬‬

‫درﮔﺎﻫﻬﺎي ﺳﺮﻳﺎل‪ Com1) 5‬و ‪،(Com2‬‬ ‫‪.5‬‬

‫درﮔﺎﻫﻬﺎي ﻣﻮازي‪ LPT1) 6‬و ‪،(LPT2‬‬ ‫‪.6‬‬

‫ﺻﻔﺤﻪ ﻛﻠﻴﺪ‪،‬‬ ‫‪.7‬‬

‫ﺳﺎﻋﺖ ﺑﻲدرﻧﮓ ﻋﻤﻞﻛﻨﻨﺪهﺑﺎ ﺑﺎﺗﺮي‪.7‬‬ ‫‪.8‬‬

‫ﮔﺮﭼﻪ ﻣﻲﺗﻮان ﺑﺪون اﺳﺘﻔﺎده از ‪ BIOS‬ﻧﻴﺰ ﺑﺎ ﺳﺨﺖاﻓﺰار ارﺗﺒﺎط ﺑﺮﻗﺮار ﻧﻤﻮد‪ ،‬اﻣﺎ ﻋﻤﻮﻣﺎً ﺑﻬﺘﺮ اﺳﺖ از ﻃﺮﻳﻖ اﻳﻦ ﺗﻮاﺑﻊ اﺳﺘﺎﻧﺪارد ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ دﺳﺘﺮﺳﻲ ﭘﻴﺪا‬
‫ﻛﺮد‪ ،‬ﺗﺎ ﺑﺮﻧﺎﻣﻪ ﻣﺴﺘﻘﻞ از ﺳﺨﺖاﻓﺰار ﺑﺎﺷﺪ‪.‬‬

‫‪ BIOS‬در ﻳﻚ ﺗﺮاﺷﻪي ﺣﺎﻓﻈﻪ‪ 8‬از ﻧﻮع ‪ ROM‬در ﺑﺮد اﺻﻠﻲ‪ 9‬ﺳﻴﺴﺘﻢ ‪ PC‬وﺟﻮد دارد ‪ .‬ﺑﻼﻓﺎﺻﻠﻪ ﭘﺲ از روﺷﻦ ﺷﺪن ﻛﺎﻣﭙﻴﻮﺗﺮ‪ ،‬ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ‪.‬‬
‫ﺗﻮاﺑﻊ ﻣﻮﺟﻮد در ‪ ،BIOS‬وﻇﺎﻳﻘﻲ ﻧﻈﻴﺮ آزﻣﻮن ﺣﺎﻓﻈﻪ و ﺑﺮرﺳﻲ ﻟﻮازم ﺟﺎﻧﺒﻲ را ﭘﺲ از روﺷﻦ ﺷﺪن ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺮﻋﻬﺪه دارﻧﺪ‪ .‬ﺑﻪ ﻫﻤﺮاه ﻫﺮ ﻧﻮع ﺟﺪﻳﺪ ﺑﺮد اﺻﻠﻲ ‪ PC‬و ﻣﺪل‬
‫‪ ،CPU‬ﻧﮕﺎرﺷﻬﺎي‪ 10‬ﺟﺪﻳﺪﺗﺮي از ‪ BIOS‬ﻣﻌﺮﻓﻲ ﻣﻲﺷﻮﻧﺪ‪ .‬از ﻣﻌﺮوﻓﺘﺮﻳﻦ اﻧﻮاع ‪ BIOS‬ﻣﻲﺗﻮان از ‪ Award‬و ‪ AMI‬ﻧﺎم ﺑﺮد‪.‬‬

‫‪DOS 4-1‬‬
‫‪ DOS‬ﻛﻪ در ﺣﻘﻴﻘﺖ وﻇﻴﻔﻪي ﻳﻚ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ را ﺑﺮﻋﻬﺪه دارد‪ ،‬ﺑﻮﺳﻴﻠﻪي ‪ BIOS‬از روي دﻳﺴﻚ در ﺣﺎﻓﻈﻪي ﻛﺎﻣﭙﻴﻮﺗﺮ ﻗﺮار داده ﺷﺪه و اﺟﺮا ﻣﻲﺷﻮد‪ .‬از‬
‫ﺟﻤﻠﻪ ﺗﻮاﺑﻌﻲ ﻛﻪ در ‪ DOS‬ﻓﺮاﻫﻢ ﺷﺪه اﺳﺖ‪ ،‬ﺗﻮاﺑﻌﻲ ﻫﺴﺘﻨﺪ ﻛﻪ اﻣﻜﺎن ﻛﺎر ﺑﺎ دﻳﺴﻚ را ﻓﺮاﻫﻢ ﻣﻲﻧﻤﺎﻳﻨﺪ و اﻳﻦ اﻣﺮ دﻟﻴﻞ ﻧﺎمﮔﺬاري ‪ DOS‬اﺳﺖ‪ .‬ﻳﻌﻨﻲ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻠﻲ ﻛﻪ‬
‫ﺗﻮاﻧﺎﻳﻲ ﻛﺎر ﺑﺎ دﻳﺴﻚ را دارد‪.‬‬

‫در ﻛﻨﺎر ‪ DOS ،BIOS‬ﻧﻴﺰ ﺗﻮاﺑﻌﻲ را ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺳﺨﺖاﻓﺰار ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪ .‬از آﻧﺠﺎﻳﻲ ك ‪ DOS‬ﺑﻪ ﺳﺨﺖاﻓﺰار ﺑﻪ ﻋﻨﻮان ﻟﻮازم ﻣﻨﻄﻘﻲ‪ 11‬ﻧﮕﺎه‬
‫ﻣﻲﻛﻨﺪ‪ ،‬ﻧﻪ ﻣﺜﻞ ‪ BIOS‬ﺑﻪ ﻋﻨﻮان ﻟﻮازم ﻓﻴﺰﻳﻜﻲ‪ ،‬ﻟﺬا ﺗﻮاﺑﻊ ‪ DOS‬ﺳﺨﺖاﻓﺰار را ﺑﻪﻃﺮﻳﻘﻲ ﻣﺘﻔﺎوت ﻣﺪﻳﺮﻳﺖ ﻣﻲﻛﻨﻨﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل‪ BIOS ،‬ﺑﻪ ﮔﺮداﻧﻨﺪهﻫﺎي دﻳﺴﻚ‪12‬‬
‫ﺑﻪﻋﻨﻮان ﮔﺮوﻫﻲ از ﺷﻴﺎرﻫﺎ‪ 13‬و ﺑﺨﺸﻬﺎ‪ 14‬ﻧﮕﺎه ﻣﻲﻛﻨﺪ‪ ،‬اﻣﺎ ‪ DOS‬آﻧﻬﺎ را ﺑﻪﻋﻨﻮان ﮔﺮوهﻫﺎﻳﻲ از ﻓﺎﻳﻠﻬﺎ و ﻓﻬﺮﺳﺖﻫﺎ‪ 15‬ﻣﻲﺑﻴﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪video cards ١‬‬
‫‪monochrome ٢‬‬
‫‪devices ٣‬‬
‫‪harddisk ٤‬‬
‫‪serial ports ٥‬‬
‫‪parallel ports ٦‬‬
‫‪battery-operated real-time clock ٧‬‬
‫‪memory chip ٨‬‬
‫‪mother board ٩‬‬
‫‪version ١٠‬‬
‫‪logical devices ١١‬‬
‫‪disk drives ١٢‬‬
‫‪tracks ١٣‬‬
‫‪sectors ١٤‬‬
‫‪directory ١٥‬‬
‫‪3-1‬‬ ‫ﻓﺼﻞ ‪ :1‬ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬

‫اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ‪ 1000‬ﻛﺎراﻛﺘﺮ اول ﻳﻚ ﻓﺎﻳﻞ را ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﺑﺒﻴﻨﻴﺪ‪ ،‬از ﻃﺮﻳﻖ ‪ BIOS‬اﮔﺮ ﻋﻤﻞ ﻛﻨﻴﺪ‪ ،‬ﺑﺎﻳﺪ ﻣﻜﺎن ﻓﺎﻳﻞ ﺑﺮ روي دراﻳﻮ )ﺷﻤﺎره ﺷﻴﺎر و‬
‫ﺑﺨﺶ( را ﺑﻪ ‪ BIOS‬ﺑﮕﻮﻳﻴﺪ‪ .‬اﻣﺎ ﺑﺎ اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ ‪ ،DOS‬ﻛﺎﻓﻲ اﺳﺖ ﺑﻪ ‪ DOS‬ﺑﮕﻮﻳﻴﻢ ﻛﻪ ﻓﺎﻳﻞ ﺑﺎ ﻧﺎم دادهﺷﺪه را در ﮔﺮداﻧﻨﺪهي ‪ A:‬ﻳﺎ ‪ C:‬ﺑﺎز ﻧﻤﻮده و ﻧﻤﺎﻳﺶ دﻫﺪ‪.‬‬

‫ﮔﺮﭼﻪ اﻏﻠﺐ اوﻗﺎت ‪ DOS‬از ﻃﺮﻳﻖ ‪ BIOS‬ﺑﻪ ﺳﺨﺖاﻓﺰار دﺳﺘﺮﺳﻲ دارد‪ ،‬وﻟﻲ ﮔﺎﻫﻲ اوﻗﺎت ﻫﻢ ﺑﻪﺻﻮرت ﻣﺴﺘﻘﻴﻢ ﺑﺎ ﺳﺨﺖاﻓﺰار ارﺗﺒﺎط ﺑﺮﻗﺮار ﻣﻲﻛﻨﺪ‪.‬‬

‫‪ 5-1‬اﻧﺘﺨﺎب روش دﺳﺘﺮﺳﻲ ﺑﻪ ﺳﺨﺖاﻓﺰار‬


‫از ﻛﺪام ﺗﻮاﺑﻊ اﺳﺘﻔﺎده ﻛﻨﻴﻢ؟ در اداﻣﻪي درس در ﻣﻮرد اﻳﻨﻜﻪ ‪ DOS‬و ‪ BIOS‬ﭼﻪ ﺗﻮاﺑﻌﻲ دارﻧﺪ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻧﻤﻮد‪ .‬اﻣﺎ اﺑﺘﺪا ﺑﺎﻳﺪ ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮﻳﻢ‬
‫ﻛﻪ ﻛﺪام روش دﺳﺘﺮﺳﻲ را اﻧﺘﺨﺎب ﻧﻤﺎﻳﻴﻢ‪ DOS :‬ﻳﺎ ‪ BIOS‬ﻳﺎ دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﺳﺨﺖاﻓﺰار؟ ﮔﺎﻫﻲ اوﻗﺎت ﻣﺠﺒﻮر ﺑﻪ دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﻫﺴﺘﻴﻢ‪ .‬زﻳﺮا ﻣﻤﻜﻦ اﺳﺖ‬
‫ﻋﻤﻞ ﻣﻮردﻧﻈﺮ ﻣﺎ را ﻫﻴﭽﻜﺪام از ﺗﻮاﺑﻊ ‪ DOS‬ﻳﺎ ‪ BIOS‬اﻧﺠﺎم ﻧﺪﻫﻨﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﻛﺎرت وﻳﺪﺋﻮﻳﻲ ﺑﮕﻮﻳﻴﺪ ﻛﻪ ﻳﻚ ﺧﻂ ﻳﺎ داﻳﺮه رﺳﻢ ﻛﻨﺪ‪ ،‬ﻫﻴﭻ ﺗﺎﺑﻌﻲ در‬
‫‪ DOS‬ﻳﺎ ‪ BIOS‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﭘﻴﺪا ﻧﺨﻮاﻫﻴﺪ ﻛﺮد‪ .‬ﺑﻨﺎﺑﺮ اﻳﻦ‪ ،‬ﻣﺠﺒﻮرﻳﺪ ﻛﻪ ﻳﻚ روال ﺑﺮاي دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﺳﺨﺖاﻓﺰار و ﺑﺮﻧﺎﻣﻪرﻳﺰي آن ﺑﺮاي رﺳﻢ ﺧﻂ ﻳﺎ داﻳﺮه‬
‫ﺑﻨﻮﻳﺴﻴﺪ‪ ،‬ﻳﺎ آﻧﻜﻪ از ﻳﻚ ﺗﺎﺑﻊ ﻛﺘﺎﺑﺨﺎﻧﻪاي ﻧﺮماﻓﺰاري‪ 1‬ﺗﻬﻴﻪ ﺷﺪه ﺑﻮﺳﻴﻠﻪي دﻳﮕﺮان اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪.‬‬

‫اﻧﺘﺨﺎب ‪ DOS‬ﻳﺎ ‪ BIOS‬؟ اﻳﻦ اﻧﺘﺨﺎب ﺑﻪ ﻧﻮع ﻛﺎرﺑﺮد ﺑﺴﺘﮕﻲ دارد‪ .‬ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻣﻲﺧﻮاﻫﻴﺪ در ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﻓﺎﻳﻞ ﻛﺎر ﻛﻨﻴﺪ‪ ،‬ﺑﺎﻳﺪ از ﺗﻮاﺑﻊ ‪ DOS‬اﺳﺘﻔﺎده‬
‫ﻛﻨﻴﺪ‪ .‬وﻟﻲ اﮔﺮ ﻣﻲﺧﻮاﻫﻴﺪ ﻳﻚ دﻳﺴﻜﺖ را ﻗﺎﻟﺐﺑﻨﺪي‪ 2‬ﻛﻨﻴﺪ‪ ،‬ﺑﺎﻳﺪ از ﺗﻮاﺑﻊ ‪ BIOS‬اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ .‬ﻫﻢ ﺗﻮاﺑﻊ ‪ DOS‬و ﻫﻢ ﺗﻮاﺑﻊ ‪ ،BIOS‬در ﺑﺮﺧﻲ اوﻗﺎت ﻛﻨﺪ ﻫﺴﺘﻨﺪ‪ .‬زﻳﺮا‬
‫ﻣﺪل ﺳﻪﻻﻳﻪاي ﺷﻜﻞ )‪ (1-1‬و ﻧﻴﺰ ﻋﻤﻮﻣﻲ ﺑﻮدن ﺗﻮاﺑﻊ‪ ،‬ﺑﺎﻋﺚ ﻋﺪم ﺑﻬﻴﻨﻪﺑﻮدن ﺗﻮاﺑﻊ اﻳﻦ واﺳﻄﻬﺎ ﻣﻲﺷﻮد‪ .‬ﺣﺘﻲ ﺑﻪ اﻳﻦ دﻟﻴﻞ ﻫﻢ ﮔﺎﻫﻲ اوﻗﺎت ﻣﺠﺒﻮر ﺑﻪ ﺑﺮﻧﺎﻣﻪﺳﺎزي‬
‫ﻣﺴﺘﻘﻴﻢ ﺳﺨﺖاﻓﺰار ﻫﺴﺘﻴﻢ‪.‬‬

‫‪ 6-1‬ﺳﺨﺖاﻓﺰار ‪PC‬‬
‫ﺑﻠﻮك دﻳﺎﮔﺮام اﺟﺰاء ﺳﺨﺖاﻓﺰار ‪ PC‬در ﺷﻜﻞ )‪ (2-1‬ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ‪:‬‬

‫ﺷﻜﻞ ‪ :2-1‬ﺑﻠﻮك دﻳﺎﮔﺮام ﺳﺨﺖاﻓﺰار ‪PC‬‬

‫‪Expansion Slots‬‬

‫‪Bus‬‬

‫‪Support Chips‬‬ ‫‪CPU‬‬


‫‪Memory Modules‬‬

‫اﺟﺰاء ﺳﺨﺖاﻓﺰار ‪ PC‬ﺷﺎﻣﻞ ﻣﻮارد زﻳﺮ اﺳﺖ‪:‬‬

‫ﭘﺮدازﻧﺪه‪ CPU :‬در ‪ ،PC‬ﻳﻜﻲ از رﻳﺰﭘﺮدازﻧﺪهﻫﺎي ﺳﺮي ‪ 80X86‬ﺳﺎﺧﺖ ﺷﺮﻛﺖ ‪ Intel‬اﺳﺖ‪ .‬اوﻟﻴﻦ ‪ PC‬ﺳﺎﺧﺖ ﺷﺮﻛﺖ ‪ IBM‬ﺑﺎ ﻧﺎم ‪System/23‬‬ ‫•‬
‫‪ DataMaster‬داراي رﻳﺰﭘﺮدازﻧﺪهي ‪ 8‬ﺑﻴﺘﻲ ‪ 8085‬ﺑﻮد‪ .‬ﺳﭙﺲ ﺑﻪ ﺗﺮﺗﻴﺐ رﻳﺰﭘﺮدازﻧﺪهﻫﺎي ‪ 80486 ،80386 ،80286 ،8088 ،8086‬و ‪ Pentium‬از ﻃﺮف‬
‫ﺷﺮﻛﺖ ‪ Intel‬ﻣﻌﺮﻓﻲ ﺷﺪﻧﺪ و اﻳﻦ ﭘﺮدازﻧﺪهﻫﺎ در ﻣﺪﻟﻬﺎي ﻣﺨﺘﻠﻒ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺳﺎﺧﺖ ﺷﺮﻛﺖ ‪ IBM‬ﻳﺎ ﺷﺮﻛﺘﻬﺎي دﻳﮕﺮ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﺮﻓﺘﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪software library function ١‬‬
‫‪format ٢‬‬
‫‪4-1‬‬ ‫ﻓﺼﻞ ‪ :1‬ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬

‫ﮔﺬرﮔﺎه‪ :1‬ﻳﻜﻲ از ﺑﺨﺸﻬﺎي اﺳﺎﺳﻲ ﺳﻴﺴﺘﻢ ‪ PC‬اﺳﺖ ﻛﻪ وﻇﻴﻔﻪي اﺗﺼﺎل اﺟﺰاء ﻣﺨﺘﻠﻒ آﻧﺮا دارد‪ .‬ﮔﺬرﮔﺎه در ﺣﻘﻴﻘﺖ ﻳﻚ ﻛﺎﺑﻞ ﺑﺎ ‪ 62‬ﺧﻂ اﺗﺼﺎل اﺳﺖ‪ .‬ﭘﺮدازﻧﺪه‬ ‫•‬
‫از ﻃﺮﻳﻖ ﮔﺬرﮔﺎه اﻃﻼﻋﺎت را از ﺣﺎﻓﻈﻪ ﺧﻮاﻧﺪه و ﭘﺮدازش ﻣﻲﻛﻨﺪ و دوﺑﺎره در آن ﻣﻲﻧﻮﻳﺴﺪ‪.‬‬

‫ﺗﺮاﺷﻪﻫﺎي ﭘﺸﺘﻴﺒﺎﻧﻲ‪ :2‬ﭘﺮدازﻧﺪه ﺗﻮاﻧﺎﻳﻲ اﻧﺠﺎم ﻫﻤﻪي اﻋﻤﺎل ﻣﻮردﻧﻴﺎز در ﻳﻚ ﺳﻴﺴﺘﻢ ﻛﺎﻣﭙﻴﻮﺗﺮي را ﻧﺪارد‪ .‬از اﻳﻦرو ﺗﺮاﺷﻪﻫﺎي ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻮرد ﻧﻴﺎز ﻫﺴﺘﻨﺪ ﺗﺎ‬ ‫•‬
‫اﻋﻤﺎﻟﻲ را ﻛﻪ ﭘﺮدازﻧﺪه ﻗﺎدر ﺑﻪ اﻧﺠﺎم آن ﻧﻴﺴﺖ‪ ،‬ﺑﺮﻋﻬﺪه ﺑﮕﻴﺮﻧﺪ‪ .‬اﻳﻦ ﺗﺮاﺷﻪﻫﺎ ﻛﻪ ﺑﻪ آﻧﻬﺎ ﻛﻨﺘﺮﻟﺮ‪ 3‬ﻧﻴﺰ ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ ،‬ﺑﺨﺸﻲ از ﺳﺨﺖاﻓﺰار را ﻛﻨﺘﺮل ﻣﻲﻛﻨﻨﺪ و‬
‫ﻛﺎرﻫﺎﻳﻲ را اﻧﺠﺎم ﻣﻲدﻫﻨﺪ و ﭘﺮدازﻧﺪه را ﺑﺮاي اﻧﺠﺎم ﻛﺎرﻫﺎي ﻣﻬﻤﺘﺮ آزاد ﻣﻲﮔﺬارﻧﺪ‪ .‬ﺑﺮﺧﻲ از ﻣﻬﻤﺘﺮﻳﻦ اﻳﻦ ﺗﺮاﺷﻪﻫﺎ ﻛﻪ در ﺳﻴﺴﺘﻢ ‪ IBM PC‬وﺟﻮد داﺷﺖ ﻋﺒﺎرﺗﻨﺪ‬
‫از‪:‬‬

‫‪ DMA :DMA Controller (8237) -‬ﻣﺨﻔﻒ ‪ Direct Memory Access‬اﺳﺖ و اﻳﻦ ﺗﻜﻨﻴﻚ ﺑﻪ ﻟﻮازﻣﻲ ﻧﻈﻴﺮ دﻳﺴﻚ ﺳﺨﺖ اﺟﺎزه ﻣﻲدﻫﺪ‬
‫ﻛﻪ دادهﻫﺎ را ﺑﻪﻃﻮر ﻣﺴﺘﻘﻴﻢ ﺑﺮ روي ﺣﺎﻓﻈﻪ ﺑﻨﻮﻳﺴﻨﺪ‪ .‬اﻳﻦ ﺗﻜﻨﻴﻚ ﺿﻤﻦ آﻧﻜﻪ ﺑﺎﻋﺚ ﻧﻘﻞ و اﻧﺘﻘﺎل ﺳﺮﻳﻊ دادهﻫﺎ ﺑﻴﻦ ﻟﻮازم و ﺣﺎﻓﻈﻪ ﻣﻲﺷﻮد‪ ،‬ﺑﺎﻋﺚ آزاد ﻣﺎﻧﺪن‬
‫ﭘﺮدازﻧﺪه ﺑﺮاي اﻧﺠﺎم ﺳﺎﻳﺮ ﻛﺎرﻫﺎ ﻣﻲﺷﻮد‪.‬‬

‫‪ :Interrupt Controller (8259) -‬وﻗﻔﻪ‪ 4‬راﻫﻲ ﺑﺮاي آﮔﺎه ﻛﺮدن ﭘﺮدازﻧﺪه ﻧﺴﺒﺖ ﺑﻪ آﻣﺎدﮔﻲ ﻟﻮازم )ﻧﻈﻴﺮ دﻳﺴﻚ ﺳﺨﺖ‪ ،‬ﺻﺤﻔﻪ ﻛﻠﻴﺪ و ﻏﻴﺮه( ﺑﺮاي‬
‫ﻧﻘﻞ و اﻧﺘﻘﺎل داده اﺳﺖ‪ .‬ﺑﺎ اﺳﺘﻔﺎده از وﻗﻔﻪﻫﺎ‪ ،‬ﻧﻴﺎز ﻧﻴﺴﺖ ﻛﻪ ﭘﺮدازﻧﺪه ﻣﻨﺘﻈﺮ آﻣﺎدهﺷﺪن ﻳﻚ وﺳﻴﻠﻪ ﺑﺮاي ﺗﺒﺎدل داده ﺑﺎﺷﺪ)ﺑﺎ روش ﺳﺮﻛﺸﻲ‪ ،(5‬ﺑﻠﻜﻪ ﻫﺮ ﮔﺎه‬
‫وﺳﻴﻠﻪ آﻣﺎده ﺷﺪ‪ ،‬ﻳﻚ ﺳﻴﮕﻨﺎل ﻛﻨﺘﺮﻟﻲ ﺑﻪ ﭘﺮدازﻧﺪه ﻣﻲﻓﺮﺳﺘﺪ و ﺑﺎﻋﺚ ﺗﻮﻗﻒ در ﻋﻤﻠﻴﺎت آن ﺷﺪه و درﺧﻮاﺳﺖ ﺳﺮوﻳﺴﻲ از ﭘﺮدازﻧﺪه ﻣﻲﻛﻨﺪ‪ .‬ﻣﺜﻼً ﺑﺎ زدن ﻳﻚ‬
‫ﻛﻠﻴﺪ‪ ،‬ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻳﻚ ﺳﻴﮕﻨﺎل وﻗﻔﻪ ﺑﻪ ﭘﺮدازﻧﺪه ﻣﻲﻓﺮﺳﺘﺪ و زده ﺷﺪن ﻛﻠﻴﺪ را ﺑﻪ آن اﻃﻼع ﻣﻲدﻫﺪ‪ .‬وﻗﻮع وﻗﻔﻪ از ﻃﺮف ﻟﻮازم ﻣﺨﺘﻠﻒ ﺑﺎﻳﺪ داراي ﻧﻈﻢ ﺑﺎﺷﺪ ﺗﺎ‬
‫ﺗﺪاﺧﻠﻲ ﺑﻴﻦ آﻧﻬﺎ ﭘﻴﺶ ﻧﻴﺎﻳﺪ و ﻣﺘﻨﺎﺳﺐ ﺑﺎ اﻟﻮﻳﺖ ﻟﻮازم ﺑﻪ آﻧﻬﺎ ﺳﺮوﻳﺲ داده ﺷﻮد‪ .‬ﺗﺮاﺷﻪي ‪ 8259‬وﻇﻴﻔﻪي ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪﻫﺎي ﺳﺨﺖاﻓﺰاري را در ﺳﻴﺴﺘﻢ ‪PC‬‬
‫ﺑﺮﻋﻬﺪه دارد‪.‬‬

‫‪ :Programmable Peripheral Interface (8255) -‬اﻳﻦ ﺗﺮاﺷﻪ ﭘﺮدازﻧﺪه را ﺑﻪ ﻟﻮازم ﺟﺎﻧﺒﻲ‪ ،‬ﻧﻈﻴﺮ ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻳﺎ ﻣﻮﻟﺪ ﺻﻮت‪ 6‬ﻣﺘﺼﻞ ﻣﻲﻛﻨﺪ و‬
‫ﻧﻘﺶ ﻳﻚ ﻣﻴﺎﻧﺠﻲ را ﺑﺎزي ﻣﻲﻛﻨﺪ‪.‬‬

‫‪ :The Clock (8248) -‬اﮔﺮ ﭘﺮدازﻧﺪه را ﻣﻐﺰ ﺳﻴﺴﺘﻢ ﻛﺎﻣﭙﻴﻮﺗﺮي ﻓﺮض ﻛﻨﻴﻢ‪ ،‬ﺳﺎﻋﺖ ﻗﻠﺐ آن ﺧﻮاﻫﺪ ﺑﻮد‪ .‬اﻳﻦ ﻗﻠﺐ ﭼﻨﺪ ﻣﻴﻠﻴﻮن ﺑﺎر در ﺛﺎﻧﺒﻪ ﺿﺮﺑﺎن دارد‬
‫)ﻣﺜﻼً ‪ (233 MHZ‬و وﺳﻴﻠﻪاي ﺑﺮاي ﻫﻤﺰﻣﺎنﺳﺎزي ﭘﺮدازﻧﺪه و ﻟﻮازم دﻳﮕﺮ ﺳﻴﺴﺘﻢ ﻛﺎﻣﭙﻴﻮﺗﺮي اﺳﺖ‪.‬‬

‫‪ :The Timer (8253) -‬اﻳﻦ ﺗﺮاﺷﻪ ﺑﻪﻋﻨﻮان ﻳﻚ ﺷﻤﺎرﺷﮕﺮ و ﻧﮕﻬﺪارﻧﺪهي زﻣﺎن در ﺳﻴﺴﺘﻢ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬اﻳﻦ ﺗﺮاﺷﻪ داراي ﺧﺮوﺟﻲﻫﺎﻳﻲ‬
‫اﺳﺖ ﻛﻪ ﺳﻴﮕﻨﺎﻟﻬﺎي اﻟﻜﺘﺮﻳﻜﻲ ﻣﻨﻈﻤﻲ را ﺻﺎدر ﻣﻲﻛﻨﺪ و ﺗﻨﺎوب آن ﻗﺎﺑﻞ ﺑﺮﻧﺎﻣﻪرﻳﺰي اﺳﺖ‪ ،‬اﻳﻨﻜﻪ ﺳﻴﮕﻨﺎل ﺗﺎﻳﻤﺮ در ﭼﻪ ﻓﻮاﺻﻞ زﻣﺎﻧﻲ ﺻﺎدر ﺷﻮد‪-.‬‬

‫ﺣﻔﺮهﻫﺎي ﮔﺴﺘﺮش‪ :7‬ﺑﺮﺧﻲ از ﺗﺮاﺷﻪﻫﺎي دﻳﮕﺮ ﻣﻮرد ﻧﻴﺎز در ﺳﻴﺴﺘﻢ ‪ PC‬در اﻳﻦ ﻗﺴﻤﺖ ﻗﺮار داده ﻣﻲﺷﻮﻧﺪ‪ .‬دو ﻣﻮرد ﻣﻬﻢ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬ ‫•‬

‫‪ :CRT Controller (6845) -‬اﻳﻦ ﺗﺮاﺷﻪ وﻇﻴﻔﻪي ﻛﻨﺘﺮل ﻟﻮﻟﻪي اﺷﻌﻪي ﻛﺎﺗﺪي‪ 8‬را ﺑﺮ ﻋﻬﺪه دارد و در ﻛﺎرت وﻳﺪﺋﻮﻳﻲ ﻗﺮار دارد‪ .‬وﻇﻴﻔﻪي اﻳﻦ ﻛﻨﺘﺮﻟﺮ‪،‬‬
‫ﻣﺪﻳﺮﻳﺖ و ﻛﺪﺑﻨﺪي ﻧﺤﻮهي ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت در ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ اﺳﺖ‪.‬‬

‫‪ :Disk Controller (765) -‬اﻳﻦ ﻛﻨﺘﺮﻟﺮ ﻫﻢ در ﻗﺴﻤﺖ ﺣﻔﺮهﻫﺎي ﮔﺴﺘﺮش ﻧﺼﺐ ﻣﻲﺷﻮد و ﺗﻮﺳﻂ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻧﺸﺎندﻫﻲ ﺷﺪه و ﮔﺮداﻧﻨﺪهي دﻳﺴﻚ را‬
‫ﻣﺪﻳﺮﻳﺖ ﻣﻲﻛﻨﺪ‪ .‬ﺣﺮﻛﺖ دادن ﻫﺪ دﻳﺴﻚ ﺑﺮاي ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ اﻃﻼﻋﺎت در ﺑﺨﺸﻬﺎي ﻣﺨﺘﻠﻒ دﻳﺴﻚ‪ ،‬وﻇﻴﻔﻪي اﻳﻦ ﻛﻨﺘﺮﻟﺮ اﺳﺖ‪.‬‬

‫ﺣﺎﻓﻈﻪ‪ :‬در ﺳﻴﺴﺘﻤﻬﺎي ‪ PC‬دو ﻧﻮع ﺣﺎﻓﻈﻪ وﺟﻮد دارد‪ .‬ﺣﺎﻓﻈﻪﻫﺎي ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ ﻳﺎ ‪ ،9ROM‬ﻛﻪ دادهﻫﺎ و ﻛﺪﻫﺎي ﻏﻴﺮﻗﺎﺑﻞ ﺗﻐﻴﻴﺮ در آن ﻧﮕﻬﺪاري ﻣﻲﺷﻮد و‬ ‫•‬
‫ﻧﻤﻮﻧﻪي ﻣﺸﺨﺺ آن‪ ROM-BIOS ،‬اﺳﺖ‪ .‬ﻧﻮع دوم ﺣﺎﻓﻈﻪ‪ ،‬ﺣﺎﻓﻈﻪي ﺧﻮاﻧﺪﻧﻲ‪-‬ﻧﻮﺷﺘﻨﻲ اﺳﺖ ﻛﻪ ﺑﻪﺻﻮرت ﺗﺼﺎدﻓﻲ ﻗﺎﺑﻞ دﺳﺘﻴﺎﺑﻲ اﺳﺖ و ﺑﻪ آن ‪10RAM‬‬
‫ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﻧﻮع ﺣﺎﻓﻈﻪ ﻣﺤﻞ ﻧﮕﻬﺪاري دادهﻫﺎ و ﭘﺮدازش آﻧﻬﺎ ﺑﻮﺳﻴﻠﻪي ﭘﺮدازﻧﺪه اﺳﺖ‪ .‬اوﻟﻴﻦ ﻧﻮع ‪ PC‬داراي ‪ 16KB‬ﺣﺎﻓﻈﻪ ﺑﻮد و در ‪PC‬ﻫﺎي اﻣﺮوزي‬
‫اﻣﻜﺎن ﻗﺮار دادن ﭼﻨﺪ ﺻﺪ ‪ MB‬ﺣﺎﻓﻈﻪ وﺟﻮد دارد‪ .‬ﺗﺮاﺷﻪﻫﺎي ﺣﺎﻓﻈﻪ ﺑﻪ ﺻﻮرت ﻣﺎﺟﻮﻟﻬﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ در ﻣﻜﺎﻧﻬﺎي ﻣﺸﺨﺺ در ﺑﺮد اﺻﻠﻲ ﺳﻴﺴﺘﻢ ﻧﺼﺐ ﻣﻲﺷﻮﻧﺪ‬
‫و ﻗﺎﺑﻞ ﻛﻢ و زﻳﺎد ﺷﺪن ﻫﺴﺘﻨﺪ‪.‬‬

‫ﺳﻴﺴﺘﻢﻫﺎي ﻋﺎﻣﻞ ﻣﺨﺘﻠﻒ ﺗﻮاﻧﺎﻳﻲ اﺳﺘﻔﺎده از ﻫﻤﻪﻳﺎ ﺑﺨﺸﻬﺎﻳﻲ از ﺣﺎﻓﻈﻪ را دارﻧﺪ‪ .‬ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ DOS‬ﻧﻬﺎﻳﺘﺎً ﻣﻲﺗﻮاﻧﺪ ‪ 640KB‬ﺣﺎﻓﻈﻪ را ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار‬
‫دﻫﺪ و اﮔﺮ ﻣﻘﺪار ﺣﺎﻓﻈﻪ ﺑﻴﺸﺘﺮ ﺑﺎﺷﺪ‪ ،‬ﻣﺎﺑﻘﻲ ﺑﻼاﺳﺘﻔﺎده ﻣﻲﻣﺎﻧﺪ‪ .‬در ‪ ،PC‬ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ و ﺗﺨﺼﻴﺺ آن ﺑﻪ ﺑﺮﻧﺎﻣﻪﻫﺎ‪ ،‬ﺣﺎﻓﻈﻪﺑﻪ ﻗﻄﻌﻪﻫﺎي‪ 64KB 11‬ﺗﻘﺴﻴﻢ‬
‫ﻣﻲﺷﻮد‪ .‬ﺑﻨﺎﺑﺮ اﻳﻦ ﻛﻞ ﺣﺎﻓﻈﻪﻫﺎي ﻣﻮﺟﻮد در ﺳﻴﺴﺘﻢ ‪ PC‬داراي ﻧﻤﺎي زﻳﺮ اﺳﺖ‪:‬‬

‫_________________________________________________________________________________‬
‫‪Bus ١‬‬
‫‪support chips ٢‬‬
‫‪controler ٣‬‬
‫‪interrupt ٤‬‬
‫‪polling ٥‬‬
‫‪speaker ٦‬‬
‫‪expansion slots ٧‬‬
‫‪Cathode Ray Tube (CRT) ٨‬‬
‫‪Read Only Memory ٩‬‬
‫‪Random Access Memory ١٠‬‬
‫‪segment ١١‬‬
‫‪5-1‬‬ ‫ﻓﺼﻞ ‪ :1‬ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬

‫ﺷﻜﻞ ‪ :1-3‬ﻧﻤﺎﻳﻲ از ﻗﺴﻤﺖﺑﻨﺪي ﺣﺎﻓﻈﻪي ‪PC‬‬

‫‪Block‬‬ ‫‪Address‬‬ ‫‪Contents‬‬

‫‪15‬‬ ‫‪F000:0000 - F000:FFFF‬‬ ‫‪ROM-BIOS‬‬


‫‪14‬‬ ‫‪E000:0000 - E000:FFFF‬‬ ‫‪Free for ROM Cartridge‬‬
‫‪13‬‬ ‫‪D000:0000 - D000:FFFF‬‬ ‫‪Free for ROM Cartridge‬‬
‫‪12‬‬ ‫‪C000:0000 - C000:FFFF‬‬ ‫‪Additional ROM-BIOS‬‬
‫‪11‬‬ ‫‪B000:0000 - B000:FFFF‬‬ ‫‪Video RAM‬‬
‫‪10‬‬ ‫‪A000:0000 - A000:FFFF‬‬ ‫)‪Additional Video RAM (EGA/ VGA‬‬
‫‪9‬‬ ‫‪9000:0000 - 9000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪576K to 640K‬‬
‫‪8‬‬ ‫‪8000:0000 - 8000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪512K to 576K‬‬
‫‪7‬‬ ‫‪7000:0000 - 7000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪448K to 512K‬‬
‫‪6‬‬ ‫‪6000:0000 - 6000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪384K to 448K‬‬
‫‪5‬‬ ‫‪5000:0000 - 5000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪320K to 384K‬‬
‫‪4‬‬ ‫‪4000:0000 - 4000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪256K to 320K‬‬
‫‪3‬‬ ‫‪3000:0000 - 3000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪192K to 256K‬‬
‫‪2‬‬ ‫‪2000:0000 - 2000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪128K to 192K‬‬
‫‪1‬‬ ‫‪1000:0000 - 1000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪64K to 128K‬‬
‫‪0‬‬ ‫‪0000:0000 - 0000:FFFF‬‬ ‫‪RAM from‬‬ ‫‪0K to‬‬ ‫‪64K‬‬

‫ﭘﺮدازﻧﺪه‪1‬‬ ‫‪ 7-1‬ﺛﺒﺎﺗﻬﺎي‬
‫ﻧﻜﺘﻪي ﻣﻬﻢ در ﻣﻮرد اﻧﻮاع ﭘﺮدازﻧﺪهﻫﺎ‪ ،‬ﻣﺪل ﺑﺮﻧﺎﻣﻪﺳﺎزي آن اﺳﺖ و در اﻳﻦ ﻣﻴﺎن‪ ،‬ﺛﺒﺎﺗﻬﺎ ﻧﻘﺶ ﻣﻬﻤﻲ در ﺑﺮﻧﺎﻣﻪﺳﺎزي دارﻧﺪ‪ .‬ﺛﺒﺎﺗﻬﺎ‪ ،‬ﻣﻜﺎﻧﻬﺎي ﺣﺎﻓﻈﻪاي در‬
‫درون ﭘﺮدازﻧﺪه ﻫﺴﺘﻨﺪ‪ ،‬و ﺑﻪ اﻳﻦ دﻟﻴﻞ ﺑﻪ ﻣﺮاﺗﺐ ﺳﺮﻳﻊﺗﺮ از ‪ RAM‬ﻗﺎﺑﻞ دﺳﺘﻴﺎﺑﻲ ﻫﺴﺘﻨﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ‪ ،‬ﺛﺒﺎﺗﻬﺎ ﻣﻜﺎﻧﻬﺎي وﻳﮋهاي ﺑﺮاي اﻧﺠﺎم اﻋﻤﺎل ﺣﺴﺎﺑﻲ و ﻣﻨﻄﻘﻲ ﺑﻮﺳﻴﻠﻪي‬
‫ﭘﺮدازﻧﺪه ﻫﺴﺘﻨﺪ‪ .‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‪ ،‬آﺷﻨﺎﻳﻲ ﺑﺎ اﻳﻦ ﺛﺒﺎﺗﻬﺎ‪ ،‬ﺑﺴﻴﺎر ﻣﻬﻢ اﺳﺖ‪ .‬زﻳﺮا‪ ،‬ﺟﺮﻳﺎن اﻃﻼﻋﺎت ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪ‪ DOS ،‬و ‪ ،BIOS‬ﺑﺎ اﺳﺘﻔﺎده از ﺛﺒﺎﺗﻬﺎ ﺑﺮﻗﺮار‬
‫ﻣﻲﺷﻮد‪ .‬ﺑﺮﻧﺎﻣﻪﻫﺎ ﭘﺎراﻣﺘﺮﻫﺎ را از ﻃﺮﻳﻖ ﺛﺒﺎﺗﻬﺎ ﺑﻪ ﺗﻮاﺑﻊ واﺳﻄﻬﺎي ‪ DOS‬ﻳﺎ ‪ BIOS‬ارﺳﺎل ﻧﻤﻮده و ﻧﺘﺎﻳﺞ و اﻃﻼﻋﺎت وﺿﻌﻴﺖ را ﺑﻪ ﻋﻨﻮان ﻣﻘﺎدﻳﺮ ﺑﺎزﮔﺸﺘﻲ از اﻳﻦ ﺗﻮاﺑﻊ‬
‫درﻳﺎﻓﺖ ﻣﻲﻛﻨﻨﺪ‪.‬‬

‫از دﻳﺪﮔﺎه ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﺑﺎ وﺟﻮد ﻣﻌﺮﻓﻲ ﻣﺪﻟﻬﺎي ﺟﺪﻳﺪﺗﺮ ﭘﺮدازﻧﺪهﻫﺎي ‪ ،80X86‬اﻳﻦ ﺛﺒﺎﺗﻬﺎ از ‪ 8086‬ﺑﻪ ﺑﻌﺪ ﺗﻐﻴﻴﺮ ﻧﻜﺮدهاﻧﺪ‪ .‬اﻳﻦ اﻣﺮ ﺑﺪان دﻟﻴﻞ اﺳﺖ‬
‫ﻛﻪ ‪ BIOS‬و ‪ DOS‬واﺑﺴﺘﻪ ﺑﻪ اﻳﻦ ﭘﺮدازﻧﺪه اﻳﺠﺎد ﺷﺪهاﻧﺪ و ﺑﻪدﻻﻳﻞ ﺳﺎزﮔﺎري‪ ،‬ﺑﻌﺪاً ﺗﻐﻴﻴﺮ اﺳﺎﺳﻲ از دﻳﺪ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در آﻧﻬﺎ داده ﻧﺸﺪه اﺳﺖ‪ .‬ﭼﻮن ﺛﺒﺎﺗﻬﺎي اﻳﻦ‬
‫ﭘﺮدازﻧﺪه‪ 16 ،‬ﺑﻴﺘﻲ ﺑﻮد‪ ،‬ﺑﺎ اﺳﺘﻔﺎده از ‪ ،DOS‬ﺗﺤﺖ ﭘﺮدازﻧﺪهﻫﺎي ‪ 32‬ﺑﻴﺘﻲ ‪ 80386‬ﻳﺎ ‪ 80486‬ﻫﻢ ﻓﻘﻂ ﻧﺼﻒ ﺛﺒﺎت‪ ،‬ﻳﺎ ‪-16‬ﺑﻴﺖ آن ﻗﺎﺑﻞ دﺳﺘﻴﺎﺑﻲ اﺳﺖ‪.‬‬

‫ﺣﺎل ﺑﻪ اﻧﻮاع ﺛﺒﺎﺗﻬﺎي ‪ 8088‬ﻧﮕﺎه ﻣﻲﻛﻨﻴﻢ‪ .‬ﺛﺒﺎﺗﻬﺎ ﺑﻪ ﭼﻨﺪ دﺳﺘﻪ ﺗﻘﺴﻴﻢ ﻣﻲﺷﻮﻧﺪ‪:‬‬
‫‪1. Common Registers:‬‬
‫‪- AX (AH, AL) : Accumulator‬‬
‫‪- BX (BH, BL) : Base‬‬
‫‪- CX (CH, CL) : Count‬‬
‫‪- DX (DH, DL) : Data‬‬
‫‪- DI : Destination Index‬‬
‫‪- SI : Source Index‬‬
‫‪- SP :Stack Pointer‬‬
‫‪- BP : Base Pointer‬‬
‫‪2. Segment Registers:‬‬

‫_________________________________________________________________________________‬
‫‪processor registers ١‬‬
‫‪6-1‬‬ ‫ﻓﺼﻞ ‪ :1‬ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬

‫‪- DS : Data Segment‬‬


‫‪- CS : Code Segment‬‬
‫‪- ES : Extra Segment‬‬
‫‪- SS :Stack Segment‬‬
‫‪3. Program Counter:‬‬
‫‪- IP :Instruction Pointer‬‬
‫‪4. Flag Register‬‬
‫‪-‬‬ ‫‪ODITSZ A P C‬‬

‫ﺛﺒﺎﺗﻬﺎي ﻣﺸﺘﺮك‪ :‬ﻋﻤﻮﻣﺎً ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ‪ DOS‬و ‪ BIOS‬ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ اﻳﻦ ﺛﺒﺎﺗﻬﺎ ﺑﻮﺳﻴﻠﻪي اﻋﻤﺎل رﻳﺎﺿﻲ )ﻣﺜﻞ ﺟﻤﻊ‪،‬‬
‫ﺗﻔﺮﻳﻖ و ﻏﻴﺮه( دﺳﺘﻜﺎري ﻣﻲﺷﻮﻧﺪ‪ .‬ﭼﻬﺎر ﺛﺒﺎت ‪ 16‬ﺑﻴﺘﻲ ‪ CX ،BX ،AX‬و ‪ DX‬داراي وﻳﮋﮔﻲ ﻗﺎﺑﻞ ﻗﺴﻤﺖﺷﺪن ﺑﻪ دو ﺑﺨﺶ ‪ 8‬ﺑﻴﺘﻲ ‪ High‬و ‪ Low‬ﻫﺴﺘﻨﺪ‪ .‬ﺑﻨﺎﺑﺮ‬
‫اﻳﻦ‪ AL ،AX ،‬و ‪ ،AH‬ﻫﺮ ﺳﻪ ﻗﺎﺑﻞ دﺳﺘﻴﺎﺑﻲ ﻫﺴﺘﻨﺪ‪ .‬ﻣﻘﺪار ‪ AX‬ﺑﺎ اﺳﺘﻔﺎده از ﻣﻘﺎدﻳﺮ ‪ AL‬و ‪ AH‬ﻗﺎﺑﻞ ﻣﺤﺎﺳﺒﻪ اﺳﺖ‪AX = AH * 256 + AL :‬‬

‫‪bit 15‬‬ ‫‪bit 8 bit 7‬‬ ‫‪bit 0‬‬


‫‪AH‬‬ ‫‪AL‬‬

‫‪bit 15‬‬ ‫‪bit 0‬‬


‫‪AX‬‬
‫ﺛﺒﺎﺗﻬﺎي ‪ 8‬ﺑﻴﺘﻲ ﻣﺜﻞ ‪ CL‬ﻳﺎ ‪ CH‬ﺑﺮاي ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ دادهﻫﺎي ‪ 8‬ﺑﻴﺘﻲ در ﺣﺎﻓﻈﻪ و ﺛﺒﺎﺗﻬﺎي ‪ 16‬ﺑﻴﺘﻲ‪ ،‬ﻣﺜﻞ ‪ CX‬ﺑﺮاي ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ دادهﻫﺎي ‪16‬‬
‫ﺑﻴﺘﻲ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪.‬‬

‫ﺛﺒﺎت ﭘﺮﭼﻢ‪ :1‬اﻳﻦ ﺛﺒﺎت ﺑﺮاي ﺑﺮﻗﺮاري ارﺗﺒﺎط ﻣﺎﺑﻴﻦ دﺳﺘﻮرات ﭘﻲدرﭘﻲ اﺳﻤﺒﻠﻲ ﺑﻪﻛﺎر ﻣﻲرود و ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر وﺿﻌﻴﺖ ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ و ﻣﻨﻄﻘﻲ را‬
‫ﻧﮕﻬﺪاري ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل ﺑﺎ اﺳﺘﻔﺎده از ‪ Carry Flag‬ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻣﻲﺗﻮاﻧﺪ ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ ﻛﻪ آﻳﺎ در ﻫﻨﮕﺎم ﺟﻤﻊ دو ﺛﺒﺎت ‪ 16‬ﺑﻴﺘﻲ‪ ،‬ﺣﺎﺻﻞ ﺑﻴﺶ از ‪ 65535‬ﺷﺪه اﺳﺖ ﻳﺎ‬
‫ﻧﻪ‪.‬‬
‫اﻳﻦ ﺛﺒﺎت ﻫﻢ ‪ 16‬ﺑﻴﺘﻲ اﺳﺖ‪ ،‬وﻟﻲ ﻓﻘﻂ ‪ 9‬ﺑﻴﺖ آن ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ ﻛﻪ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬
‫)‪- Bit 0: CF (Carry Flag‬‬
‫)‪- Bit 2: PF (Parity Flag‬‬
‫)‪- Bit 4: AF (Auxiliary Flag‬‬
‫)‪- Bit 6: ZF (Zero Flag‬‬
‫)‪- Bit 7: SF (Sign Flag‬‬
‫)‪- Bit 8: TF (Trap Flag‬‬
‫)‪- Bit 9: IF (Interrupt Flag‬‬
‫)‪- Bit 10: DF (Direction Flag‬‬
‫)‪- Bit 11: OF (Overflow Flag‬‬
‫در ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﺑﺎ اﺳﺘﻔﺎده از زﺑﺎﻧﻬﺎي ﺳﻄﺢ ﺑﺎﻻ ﻓﻘﻂ دو ﭘﺮﭼﻢ ‪ ZF‬و ‪ CF‬ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪ .‬زﻳﺮا اﻏﻠﺐ ﺗﻮاﺑﻊ ‪ DOS‬و ‪ BIOS‬از آﻧﻬﺎ‬
‫ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن رﺧﺪاد ﺧﻄﺎ در ﻫﻨﮕﺎم ﻋﻤﻠﻴﺎت اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪.‬‬

‫ﺛﺒﺎت ﻧﺸﺎﻧﻲ‪ :2‬ﺗﻌﺪاد ﻣﻜﺎﻧﻬﺎي ﺣﺎﻓﻈﻪ ﻛﻪ ﻳﻚ ﭘﺮدازﻧﺪه ﻣﻲﺗﻮاﻧﺪ ﺑﻪ آﻧﻬﺎ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﺑﻪ اﻳﻦ ﺛﺒﺎت ﺑﺴﺘﮕﻲ دارد‪ .‬ﻫﺮ ﻗﺪر ﺗﻌﺪاد ﺑﻴﺘﻬﺎي اﻳﻦ ﺛﺒﺎت‬
‫ﺑﻴﺸﺘﺮ ﺑﺎﺷﺪ‪ ،‬ﺣﺪاﻛﺜﺮ ﺣﺎﻓﻈﻪي ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ‪ ،‬ﺑﻴﺸﺘﺮ ﻣﻲﺷﻮد‪ .‬اﮔﺮ اﻳﻦ ﺛﺒﺎت ‪ 16‬ﺑﻴﺘﻲ ﺑﺎﺷﺪ‪ ،‬ﺣﺪاﻛﺜﺮ ‪ 65535‬ﻣﻜﺎن ﺣﺎﻓﻈﻪ‪ ،‬ﻗﺎﺑﻞ دﺳﺘﻴﺎﺑﻲ اﺳﺖ‪ .‬ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ اﺳﺖ ﻛﻪ‬
‫ﭘﺮدازﻧﺪهﻫﺎي اوﻟﻴﻪ ﻓﻘﻂ ﻗﺎدر ﺑﻪ دﺳﺘﺮﺳﻲ ﺑﻪ ‪ 64K‬ﺣﺎﻓﻈﻪ ﺑﻮدﻧﺪ‪ .‬ﺑﺮاي ﻧﺸﺎﻧﻲدﻫﻲ ‪ 1MB‬ﺣﺎﻓﻈﻪ‪ ،‬اﻳﻦ ﺛﺒﺎت ﺑﺎﻳﺪ داراي ﺣﺪاﻗﻞ ‪ 20‬ﺑﻴﺖ ﺑﺎﺷﺪ‪ .‬اﻣﺎ در زﻣﺎن ﻃﺮاﺣﻲ ‪،8088‬‬
‫اﻣﻜﺎن اﺳﺘﻔﺎده از ﺛﺒﺎت ﻧﺸﺎﻧﻲ ‪ 20‬ﺑﻴﺘﻲ وﺟﻮد ﻧﺪاﺷﺖ‪ .‬از اﻳﻦرو‪ ،‬راه ﺣﻞ دﻳﮕﺮي ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﺮﻓﺖ و دو ﻋﺪد ‪ 16‬ﺑﻴﺘﻲ ﻣﺘﻔﺎوت ﺑﺮاي ﺗﺸﻜﻴﻞ ﻧﺸﺎﻧﻲ ‪ 20‬ﺑﻴﺘﻲ ﻣﻮرد‬
‫اﺳﺘﻔﺎده ﻗﺮا ﻣﻲﮔﻴﺮد‪ .‬ﻧﺨﺴﺘﻴﻦ ﻋﺪد در ﻳﻚ ﺛﺒﺎت ﻗﻄﻌﻪ‪ 3‬ﻗﺮار ﻣﻲﮔﻴﺮد و دوﻣﻴﻦ ﻋﺪد در ﻳﻚ ﺛﺒﺎت دﻳﮕﺮ ﻳﺎ در ﻳﻚ ﻣﻜﺎن ﺣﺎﻓﻈﻪ‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻧﺸﺎﻧﻲ داراي دو ﺑﺨﺶ‬
‫ﻗﻄﻌﻪ و ﻣﺒﺪأ‪ 4‬ﺧﻮاﻫﺪ ﺑﻮد‪ .‬ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ‪ ،‬ﻛﻪ در ﺛﺒﺎت ﻗﻄﻌﻪ وﺟﻮد دارد‪ ،‬ﺷﺮوع ﻳﻚ ﻗﻄﻌﻪ ﺣﺎﻓﻈﻪ را ﻧﺸﺎن ﻣﻲ دﻫﺪ‪ .‬ﻧﺸﺎﻧﻲ ﻣﺒﺪأ‪ ،‬ﺷﻤﺎرهي ﻣﻜﺎن ﺣﺎﻓﻈﻪ را در درون ﻗﻄﻌﻪ‬
‫ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ‪ .‬ﭼﻮن ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﻳﻚ ﻋﺪد ‪ 16‬ﺑﻴﺘﻲ اﺳﺖ‪ ،‬ﭘﺲ ﻳﻚ ﻗﻄﻌﻪ ﻧﻤﻲﺗﻮاﻧﺪ داراي ﺑﻴﺶ از ‪ 65535‬ﻳﺎ ‪ 64K‬ﻣﻜﺎن ﺣﺎﻓﻈﻪﺑﺎﺷﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪flag register ١‬‬
‫‪address register ٢‬‬
‫‪segment register ٣‬‬
‫‪offset ٤‬‬
‫‪7-1‬‬ ‫ﻓﺼﻞ ‪ :1‬ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬

‫ﭼﻬﺎر ﻧﻮع ﺛﺒﺎت ﻗﻄﻌﻪ در ‪ 8088‬وﺟﻮد دارد‪:‬‬

‫‪1. CS: Code Segment‬‬


‫‪2. DS: Data Segment‬‬
‫‪3. SS: Stack Segment‬‬
‫‪4. ES: Extra Segment‬‬
‫‪ ،CS‬از ﺛﺒﺎت )‪ IP (Instruction Pointer‬ﺑﻪ ﻋﻨﻮان ﻧﺸﺎﻧﻲ ﻣﺒﺪأ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪ .‬ﺑﻪ ‪ PC (Program Counter) ،IP‬ﻫﻢ ﮔﻔﺘﻪ ﻣﻲﺷﻮد و در‬
‫ﺣﻘﻴﻘﻴﺖ ﻧﺸﺎﻧﻲ دﺳﺘﻮر ﺑﻌﺪي ﺑﺮﻧﺎﻣﻪ را در ﺣﺎﻓﻈﻪ ﻧﺸﺎن ﻣﻲدﻫﺪ و ﺑﻪﻃﻮر ﺧﻮدﻛﺎر ﺑﺎ اﺟﺮاي ﻳﻚ دﺳﺘﻮر‪ ،‬ﻳﻚ واﺣﺪ اﻓﺰاﻳﺶ ﻣﻲﻳﺎﺑﺪ‪ ،DS .‬ﻧﺸﺎﻧﻲ ﻓﻄﻌﻪاي از ﺣﺎﻓﻈﻪ را ﻛﻪ‬
‫ﺷﺎﻣﻞ دادهﻫﺎي ﻣﻮرد دﺳﺘﻴﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ اﺳﺖ را ﻧﺸﺎن ﻣﻲدﻫﺪ‪ ،SS .‬ﻧﺸﺎﻧﻲ ﺷﺮوع ﭘﺸﺘﻪ‪ 1‬اﺳﺖ و ‪ ،ES‬ﺑﻮﺳﻴﻠﻪي ﺑﺮﺧﻲ از دﺳﺘﻮرات اﺳﻤﺒﻠﻲ ﺑﺮاي ﻧﺸﺎﻧﻲدﻫﻲ ﺑﻴﺶ از ‪64K‬‬
‫داده ﻳﺎ اﻧﺘﻘﺎل دادهﻫﺎ ﻣﺎﺑﻴﻦ ﻗﻄﻌﻪﻫﺎي ﻣﺨﺘﻠﻒ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬

‫درﮔﺎهﻫﺎ‪2‬‬ ‫‪8-1‬‬
‫درﮔﺎهﻫﺎ‪ ،‬واﺳﻄﻲ ﺑﻴﻦ ﭘﺮدازﻧﺪه و ﺳﺎﻳﺮ اﺟﺰاء ﺳﺨﺖاﻓﺰار ﺳﻴﺴﺘﻢ ﻫﺴﺘﻨﺪ‪ .‬ﻫﺮ درﮔﺎه ﻣﺸﺎﺑﻪ ﻳﻚ درﻳﭽﻪي ‪ 8‬ﺑﻴﺘﻲ ورودي ﻳﺎ ﺧﺮوﺟﻲ اﺳﺖ ﻛﻪ ﺑﻪ ﺑﺨﺶ ﺧﺎﺻﻲ‬
‫از ﻳﻚ ﺟﺰء ﺳﺨﺖاﻓﺰاري ﻣﺘﺼﻞ اﺳﺖ و ﺑﺎ ﻣﻘﺎدﻳﺮ ﺑﻴﻦ ‪ 0‬ﺗﺎ ‪ 65535‬ﻗﺎﺑﻞ ﻧﺸﺎﻧﻲدﻫﻲ اﺳﺖ‪ .‬درﮔﺎهﻫﺎ در ﺣﻘﻴﻘﺖ‪ ،‬ﺛﺒﺎﺗﻬﺎﻳﻲ در اﺟﺰاء ﺳﺨﺖاﻓﺰاري ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺮاي ارﺗﺒﺎط ﺑﺎ‬
‫آن‪ ،‬ﻣﻘﺪاري در آن ﻧﻮﺷﺘﻪ ﻳﺎ از آن ﺧﻮاﻧﺪه ﻣﻲﺷﻮد‪ .‬ﭘﺮدازﻧﺪه از ﮔﺬرﮔﺎه ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎهﻫﺎ اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ و در ﭘﺮدازﻧﺪهﻫﺎي ‪ 80x86‬از دو دﺳﺘﻮراﻟﻌﻤﻞ ‪ IN‬و‬
‫‪ OUT‬ﻣﻲﺗﻮان ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎهﻫﺎ در ﺑﺮﻧﺎﻣﻪﻫﺎي اﺳﻤﺒﻠﻲ اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬

‫‪ 9-1‬وﻗﻔﻪﻫﺎ‬
‫وﻗﻔﻪ ﻣﻜﺎﻧﻴﺴﻤﻲ اﺳﺖ ﻛﻪ ﭘﺮدازﻧﺪه را ﻣﺠﺒﻮر ﻣﻲﻛﻨﺪ ﺗﺎ اﺟﺮاي ﺑﺮﻧﺎﻣﻪي ﺟﺎري را ﻣﺘﻮﻗﻒ ﻧﻤﻮده و ﻳﻚ روال ﺧﺎﺻﻲ را ﻛﻪ وﻇﻴﻔﻪي ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪ‪ 3‬را دارد را‬
‫اﺟﺮا ﻛﻨﺪ‪ .‬وﻗﻔﻪﻫﺎ ﻫﻢ ﺑﺮاي ﻛﻨﺘﺮل ﺳﺨﺖاﻓﺰارﻫﺎ اﺳﺘﻔﺎده ﻣﻲﺷﻮﻧﺪ و ﻫﻢ ﺑﺮاي ﺑﺮﻗﺮار ارﺗﺒﺎط ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪ و ﺗﻮاﺑﻊ ‪ DOS‬و ‪ .BIOS‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ دو ﻧﻮع وﻗﻔﻪ دارﻳﻢ‪:‬‬
‫وﻗﻔﻪﻫﺎي ﻧﺮماﻓﺰاري‪ :4‬اﻳﻦ ﻧﻮع وﻗﻔﻪﻫﺎ ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ‪ DOS‬ﻳﺎ ‪ BIOS‬اﺳﺘﻔﺎده ﻣﻲﺷﻮﻧﺪ‪ .‬در اﻳﻦ ﺣﺎﻟﺖ‪ ،‬ﺗﻮاﺑﻊ ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه‪ ،‬ﻫﻤﺎﻧﻨﺪ ﻳﻚ زﻳﺮروال‪5‬‬ ‫•‬
‫ﺑﺮﻧﺎﻣﻪ ﻋﻤﻞ ﻣﻲﻛﻨﻨﺪ و ﭘﺲ از ﭘﺎﻳﺎن اﺟﺮاي ﺗﺎﺑﻊ‪ ،‬ﺑﻪ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﺑﺮﮔﺸﺖ اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬ﺗﻮاﺑﻊ ‪ DOS‬و ‪ BIOS‬ﺑﻪ ﺗﺮﺗﻴﺐ ﺧﺎﺻﻲ در ﺣﺎﻓﻈﻪ ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ و‬
‫ﺗﺸﻜﻴﻞ ﻳﻚ ﺟﺪول را ﻣﻲدﻫﻨﺪ ﻛﻪ ﺑﻪ آن ﺟﺪول ﺑﺮدار وﻗﻔﻪ‪ 6‬ﻣﻲﮔﻮﻳﻨﺪ‪ .‬اﻳﻦ ﺟﺪول داراي دو ﺳﺘﻮن ورودي ﻳﺎ ﺷﻤﺎره ﺗﺎﺑﻊ و ﻧﺸﺎﻧﻲ ﺷﺮوع ﻛﺪ ﻣﺮﺑﻮﻃﻪ در ﺣﺎﻓﻈﻪ‬
‫اﺳﺖ‪ .‬ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ﺑﺎ اﺳﺘﻔﺎده از ورودي ﻣﺮﺑﻮﻃﻪ در اﻳﻦ ﺟﺪول اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ﻣﺜﺎل‪ ،‬اﮔﺮ ﺗﺎﺑﻊ ‪ DOS 21H‬را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ‪ ،‬ﭘﺮدازﻧﺪه ﻧﺸﺎﻧﻲ ﺷﺮوع ﻛﺪ‬
‫ﺗﺎﺑﻊ ‪ 21H‬را از ﺟﺪول ﺑﺮدار وﻗﻔﻪﻫﺎ ﺑﺪﺳﺖ آورده و ﺑﻪ آن ﭘﺮش ﻣﻲﻛﻨﺪ‪.‬‬

‫وﻗﻔﻪﻫﺎي ﺳﺨﺖاﻓﺰاري‪ :7‬اﻳﻦ وﻗﻔﻪﻫﺎ ﺑﻮﺳﻴﻠﻪي اﺟﺰاء ﺳﺨﺖاﻓﺰاري ﺗﻮﻟﻴﺪ ﻣﻲﺷﻮﻧﺪ و از ﻃﺮﻳﻖ ﻛﻨﺘﺮﻟﺮ وﻗﻔﻪﻫﺎ ﺑﻪ ﭘﺮدازﻧﺪه ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﺮﺧﻲ از وﻗﻔﻪﻫﺎي‬ ‫•‬
‫ﺳﺨﺖاﻓﺰاري ﻗﺎﺑﻞ ﻧﺎﺗﻮانﺳﺎزي‪ 8‬ﻫﺴﺘﻨﺪ‪ .‬ﻳﻌﻨﻲ ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﻳﻚ ﺳﺨﺖاﻓﺰار ﻧﺘﻮاﻧﺪ ﺑﻪ ﭘﺮدازﻧﺪه وﻓﻘﻪ ﺑﺪﻫﺪ‪ .‬اﻣﺎ ﺑﺮﺧﻲ از وﻓﻘﻪﻫﺎ ﻏﻴﺮﻗﺎﺑﻞ ﻧﺎﺗﻮانﺳﺎزي ﻫﺴﺘﻨﺪ ﻛﻪ‬
‫ﺑﻪ آﻧﻬﺎ ‪ 9NMI‬ﻳﺎ ‪ Trap‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪.‬‬

‫ﺳﻴﺴﺘﻢ‪10‬‬ ‫‪ 7-1‬ﻣﺤﺎورهي‬
‫ﺑﺮاي اﻧﺠﺎم ﻛﺎرﻫﺎ در ﺳﻴﺴﺘﻢ ‪ ،PC‬اﺟﺰاء ﻣﺨﺘﻠﻒ ﺳﺨﺖاﻓﺰاري و ﻧﺮماﻓﺰاري ﺑﺎ ﻫﻢ ﻛﺎر ﻣﻲﻛﻨﻨﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل ﺑﺮاي ﺧﻮاﻧﺪن ﻳﻚ ﻛﻠﻴﺪ ﻓﺸﺎر داده ﺷﺪه ﺑﺮ روي‬
‫ﺻﻔﺤﻪ ﻛﻠﻴﺪ‪ ،‬ﻣﻮارد زﻳﺮ ﻣﻄﺮح ﻫﺴﺘﻨﺪ‪:‬‬

‫ﺳﺨﺖاﻓﺰار ﺻﻔﺤﻪ ﻛﻠﻴﺪ‪ :‬وﻗﺘﻲ ﻳﻚ ﻛﻠﻴﺪ ﻓﺸﺎر داده ﻣﻲﺷﻮد‪ ،‬ﺳﺨﺖاﻓﺰار ﺻﻔﺤﻪ ﻛﻠﻴﺪ)در ﺻﻮرت ﺗﻮاﻧﺎ ﺑﻮدن وﻗﻔﻪﻫﺎي ﺳﺨﺖاﻓﺰاري(‪ ،‬وﻗﻔﻪي ﺷﻤﺎرهي ‪ 09H‬را‬ ‫•‬
‫ﺑﻪ ﭘﺮدازﻧﺪه ﻣﻲﻓﺮﺳﺘﺪ‪ .‬ﭘﺮدازﻧﺪه ﭘﺲ از درﻳﺎﻓﺖ اﻳﻦ وﻗﻔﻪ‪ ،‬ﺑﺮاﺳﺎس اﻟﻮﻳﺖ وﻗﻔﻪﻫﺎ و اﮔﺮ درﺣﺎل اﺟﺮاي ﻳﻚ وﻗﻔﻪ ﺑﺎ اﻟﻮﻳﺖ ﺑﺎﻻﺗﺮ ﻧﺒﺎﺷﺪ‪ ،‬روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي‬
‫ﺷﻤﺎرهي ‪ 09H‬را اﺟﺮا ﺧﻮاﻫﺪ ﻛﺮد‪.‬‬

‫روال ﻣﺪﻳﺮﻳﺖ ﺻﻔﺤﻪﻛﻠﻴﺪ ‪ :BIOS‬رواﻟﻲ ﻛﻪ ﭘﺮدازﻧﺪه ﺑﺮاي ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ‪ 09H‬ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ‪ ،‬ﻣﺮﺑﻮط ﺑﻪ ﺗﻮاﺑﻊ ‪ BIOS‬اﺳﺖ‪ .‬اﻳﻦ روال ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ‬ ‫•‬
‫اﻳﻨﻜﻪ ﭼﻪ ﻛﻠﻴﺪي ﻓﺸﺎر داده ﺷﺪه اﺳﺖ‪ ،‬ﻛﺪ ﻣﺮﺑﻮﻃﻪ را ﺑﺪﺳﺖ ﻣﻲآورد و ﻣﻌﺘﺒﺮ ﺑﻮدن آن را ﺑﺮرﺳﻲ ﻣﻲﻛﻨﺪ‪.‬‬
‫_________________________________________________________________________________‬
‫‪stack ١‬‬
‫‪ports ٢‬‬
‫‪interrupt handler ٣‬‬
‫‪software interrupts ٤‬‬
‫‪subroutine ٥‬‬
‫‪interrupt vector table ٦‬‬
‫‪hardare interrupt ٧‬‬
‫‪disable ٨‬‬
‫‪Non-Maskable Interrupt ٩‬‬
‫‪system interaction ١٠‬‬
‫‪8-1‬‬ ‫ﻓﺼﻞ ‪ :1‬ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ‬

‫ﺑﺎﻓﺮ ﺻﻔﺤﻪﻛﻠﻴﺪ‪ :‬ﭘﺲ از آﻧﻜﻪ روال ﻣﺪﻳﺮﻳﺖ ﺻﻔﺤﻪﻛﻠﻴﺪ‪ ،‬ﻛﺪ ﻛﻠﻴﺪ ﻓﺸﺎر داده ﺷﺪه را ﻣﻌﺘﺒﺮ ﺗﺸﺨﻴﺺ داد‪ ،‬آﻧﺮا در ﻳﻚ ﺑﺎﻓﺮ ‪ 16‬ﺑﺎﻳﺘﻲ در ‪ RAM‬ذﺧﻴﺮه ﻣﻲﻛﻨﺪ‪.‬‬ ‫•‬
‫اﻳﻦ ﺑﺎﻓﺮ ﻣﺜﻞ ﻳﻚ ﺻﻒ اﺳﺖ و ﻛﻠﻴﺪﻫﺎ ﺑﻪ ﺗﺮﺗﻴﺐ ﻓﺸﺎر داده ﺷﺪن در آن ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ و ﭼﻮن ‪ 16‬ﺑﺎﻳﺘﻲ اﺳﺖ‪ ،‬در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺶ از ‪ 16‬ﻛﻠﻴﺪ ﻓﺸﺎر داده ﺷﻮد‪ ،‬ﭘﺮ‬
‫ﺧﻮاﻫﺪ ﺷﺪ و در اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ ﺻﺪاي ﺑﻮق ﺷﻨﻴﺪه ﻣﻲﺷﻮد‪.‬‬

‫وﻗﻔﻪي ﺻﻔﺤﻪﻛﻠﻴﺪ ‪ :BIOS‬ﻣﺮﺣﻠﻪي ﺑﻌﺪ‪ ،‬ﺧﻮاﻧﺪن ﻛﺎراﻛﺘﺮ از ﺑﺎﻓﺮ ﻓﻮق و آﻣﺎدهﺳﺎزي آن ﺑﺮاي ﺑﺮﻧﺎﻣﻪ اﺳﺖ‪ .‬اﻳﻦ ﻛﺎر ﺑﻮﺳﻴﻠﻪي وﻗﻔﻪي ﺷﻤﺎرهي ‪ 16H‬ﻗﺎﺑﻞ‬ ‫•‬
‫اﻧﺠﺎم اﺳﺖ‪ .‬ﭘﺲ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ وﻗﻔﻪي ﻧﺮماﻓﺰاري‪ ،‬ﻛﺎراﻛﺘﺮ ﻣﻮﺟﻮد در ﺑﺎﻓﺮ و وﺿﻌﻴﺖ ﺧﻮاﻧﺪه ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻣﻲﺗﻮان از دﺳﺘﻮر ‪ INT‬اﺳﻤﺒﻠﻲ اﺳﺘﻔﺎده‬
‫ﻛﺮد‪.‬‬

‫در ﺳﻄﺢ ‪ :DOS‬ﻫﻤﭽﻨﻴﻦ در ‪ DOS‬ﻧﻴﺰ ﺗﻮاﺑﻌﻲ ﺑﺮاي ﻛﺎر ﻛﺮدن ﺑﺎ ﺻﻔﺤﻪﻛﻠﻴﺪ وﺟﻮد دارد ﻛﻪ ﺟﺰو ﺗﻮاﺑﻊ ‪ 21H‬ﻫﺴﺘﻨﺪ‪ .‬اﻳﻦ ﺗﻮاﺑﻊ‪ ،‬ﻛﺎرﻫﺎي ﺑﻴﺸﺘﺮي را در‬ ‫•‬
‫ﻣﻘﺎﻳﺴﻪ ﺑﻪ ﺗﺎﺑﻊ ‪ BIOS 16H‬اﻧﺠﺎم ﻣﻲدﻫﻨﺪ‪ .‬ﺑﺮاي ﻧﻤﻮﻧﻪ ﻛﻠﻴﺪ زده ﺷﺪه را ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‪ ،‬ﻧﺸﺎن ﻣﻲدﻫﻨﺪ‪.‬‬
‫ﻓﺼﻞ ‪ :2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬
‫)‪(System Programming in Practice‬‬

‫‪ 1-2‬ﻣﻘﺪﻣﻪ‬
‫در اﻳﻦ ﺑﺨﺶ درﺑﺎرهي ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﺑﺎ اﺳﺘﻔﺎده از زﺑﺎن اﺳﻤﺒﻠﻲ‪ ،‬زﺑﺎن ﭘﺎﺳﻜﺎل )ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺗﻮرﺑﻮ ﻳﺎ ﺑﻮرﻟﻨﺪ ﭘﺎﺳﻜﺎل( و زﺑﺎن ‪) C‬ﺑﺎ ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي‬
‫ﻣﻴﻜﺮوﺳﺎﻓﺖ و ﺑﻮرﻟﻨﺪ(‪ ،‬ﻣﻄﺎﻟﺒﻲ اراﺋﻪ ﻣﻲﺷﻮد‪ .‬ﮔﺮﭼﻪ ﻫﺪف اﺻﻠﻲ زﺑﺎن ‪ ،C‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﺑﻮده و از اﻳﻦ ﻧﻈﺮ از زﺑﺎن ﭘﺎﺳﻜﺎل ﻣﻨﺎﺳﺐﺗﺮ اﺳﺖ‪ ،‬وﻟﻲ زﺑﺎن ﭘﺎﺳﻜﺎﻟﻲ ﻛﻪ از‬
‫ﻃﺮﻳﻖ ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ در اﺧﺘﻴﺎر ﻗﺮار ﮔﺮﻓﺘﻪ‪ ،‬ﺗﻤﺎﻣﻲ اﻣﻜﺎﻧﺎت ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻣﺤﻴﻂ ‪ DOS‬را در اﺧﺘﻴﺎر ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪ 2-2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﺑﺎ زﺑﺎن اﺳﻤﺒﻠﻲ‬


‫زﺑﺎن اﺳﻤﺒﻠﻲ‪ ،‬اﺻﻠﻲﺗﺮﻳﻦ و ﺑﻲﻣﺤﺪودﻳﺖﺗﺮﻳﻦ راه ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ اﺳﺖ‪ .‬زﺑﺎن اﺳﻤﺒﻠﻲ‪ ،‬اﻣﻜﺎن اﺳﺘﻔﺎده از ﺗﻤﺎﻣﻲ اﻣﻜﺎﻧﺎت ﺳﻴﺴﺘﻢ را داده و اﺟﺎزهي‬
‫ﻧﺰدﻳﻚﺷﺪن ﺑﻪ ﺳﺨﺖاﻓﺰار را ﺗﺎ ﭘﺎﺋﻴﻦﺗﺮﻳﻦ ﺳﻄﺢ در اﺧﺘﻴﺎر ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﺳﻄﺢﭘﺎﻳﻴﻦ‪ 1‬و ﺑﺎ زﺑﺎن ﺳﻄﺢﭘﺎﻳﻴﻦ اﺳﻤﺒﻠﻲ‪ ،‬ﮔﺮﭼﻪ ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﺎرﺑﺮدي‬
‫ﻣﺸﻜﻞآﻓﺮﻳﻦ اﺳﺖ‪ ،‬اﻣﺎ ﺑﺮاي ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﻣﺰﻳﺖ ﻋﻤﺪهاي ﻣﺤﺴﻮب ﻣﻲﺷﻮد‪.‬‬

‫ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪﻫﺎ در زﺑﺎن اﺳﻤﺒﻠﻲ‪ :‬دﺳﺘﻮراﻟﻌﻤﻞ ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪﻫﺎ در زﺑﺎن اﺳﻤﺒﻠﻲ ‪ ،80x86‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ int‬اﺳﺖ‪ ،‬ﻛﻪ ﻳﻚ ﻋﻤﻠﻮﻧﺪ دارد و آن‬
‫ﺷﻤﺎرهي وﻗﻔﻪ اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮ‪ ،‬ﺑﺎﻋﺚ ﻓﺮاﺧﻮاﻧﻲ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي‪ 2‬ﺷﻤﺎره ‪ 00H‬ﻛﻪ وﻗﻔﻪي "ﺗﻘﺴﻴﻢ ﺑﺮ ﺻﻔﺮ‪ "3‬اﺳﺖ‪ ،‬ﻣﻲﺷﻮد‪:‬‬

‫‪int 00H‬‬ ‫‪; call INT 00H: Division by 0‬‬


‫‪ ،00H‬ﺷﻤﺎره وﻗﻔﻪ در ﺟﺪول ﺑﺮدار وﻗﻔﻪﻫﺎ اﺳﺖ و ﺑﺎ اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ ،int 00H‬ﻧﺸﺎﻧﻲ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ‪ 00H‬از ﺟﺪول ﺑﺮدار وﻗﻔﻪﻫﺎ ﺑﺮداﺷﺘﻪ‬
‫ﺷﺪه و روال ﻣﺮﺑﻮﻃﻪ ﻛﻪ در ﺣﺎﻓﻈﻪي ‪) ROM‬ﺑﺮاي وﻗﻔﻪﻫﺎي ‪ (ROM-BIOS‬ﻳﺎ ‪) RAM‬ﺑﺮاي وﻗﻔﻪﻫﺎي ‪ DOS‬ﻳﺎ وﻗﻔﻪﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﻮﺳﻴﻠﻪي ﻛﺎرﺑﺮ( ﻗﺮار دارد‬
‫ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه و اﺟﺮا ﻣﻲﺷﻮد‪.‬‬

‫‪int interrupt_no‬‬
‫ﭘﺮدازﻧﺪهﻫﺎي ‪ 80x86‬ﺗﻮاﻧﺎﻳﻲ ﻣﺪﻳﺮﻳﺖ ‪ 256‬وﻗﻔﻪ را دارﻧﺪ‪ .‬ﭘﺲ ‪ interrupt_no‬ﻣﻘﺪاري ﺑﻴﻦ ‪ 00H‬و ‪ FFH‬را ﻣﻲﺗﻮاﻧﺪ داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪int‬‬
‫ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ‪ ،‬ﻣﻘﺪار ﺛﺒﺎت ﭘﺮﭼﻤﻬﺎ را در ﭘﺸﺘﻪ ‪ push‬ﻣﻲﻛﻨﺪ و ﺳﭙﺲ ﻣﻘﺎدﻳﺮ ﭘﺮﭼﻤﻬﺎي ‪ IF‬و ‪ TF‬را ‪ 0‬ﻣﻲﻛﻨﺪ‪ .‬ﻣﻘﺪار ‪ 0‬ﺑﺮاي ‪ IF‬ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ از وﻗﻮع ﺳﺎﻳﺮ‬
‫وﻗﻔﻪﻫﺎ ﺟﻠﻮﮔﻴﺮي ﺷﻮد‪ ،‬ﻣﮕﺮ آﻧﻜﻪ وﻗﻔﻪ ‪ NMI‬ﺑﺎﺷﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ ﻣﻘﺪار ‪ 1‬ﺑﺮاي ‪ TF‬ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﭘﺮدازﻧﺪه ﺑﻪ ﺣﺎﻟﺖ ﺗﻚﻣﺮﺣﻠﻪاي‪ 4‬ﺑﺮود ﻛﻪ‪ ،‬ﺣﺎﻟﺖ اﺷﻜﺎﻟﺰداﻳﻲ‪ 5‬اﺳﺖ و‬
‫ﺻﻔﺮ ﻛﺮدن آن اﻳﻦ ﺣﺎﻟﺖ را ﻏﻴﺮ ﻓﻌﺎل ﻣﻲﻛﻨﺪ‪ .‬دﻟﻴﻞ ﺻﻔﺮ ﻛﺮدن ‪ ،IF‬ﻧﺎﺗﻮانﺳﺎزي‪ 6‬وﻗﻔﻪﻫﺎي دﻳﮕﺮ اﺳﺖ‪ ،‬ﭼﻮن رواﻟﻬﺎي وﻗﻔﻪ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺑﻪ ﺻﻮرت ﻣﺘﺪاﺧﻞ اﺟﺮا ﺷﻮﻧﺪ‪.‬‬
‫ﺳﭙﺲ ﻳﻚ ‪ far call‬ﺑﻪ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪ‪ ،‬ﻛﻪ ﻧﺸﺎﻧﻲ آن در ﺟﺪول ﺑﺮدار وﻗﻔﻪﻫﺎ‪ 7‬و ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﺷﻤﺎرهي وﺟﻮد دارد‪ ،‬اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ﻣﻌﺮﻓﻲ ﻳﻚ روال ﻣﺪﻳﺮﻳﺖ‬
‫وﻗﻔﻪ ﺑﻪ ﺳﻴﺴﺘﻢ ﻳﺎ ﺗﻐﻴﻴﺮ روال ﻣﺪﻳﺮﻳﺖ ﻳﻚ وﻗﻔﻪي ﻣﻮﺟﻮد ﺑﺎﻳﺪ ﻧﺸﺎﻧﻲ روال ﺟﺪﻳﺪ در اﻳﻦ ﺟﺪول ﻗﺮار داده ﺷﻮد‪ .‬ﭼﻮن رواﻟﻬﺎ ‪ far‬ﻫﺴﺘﻨﺪ‪ ،‬ﭘﺲ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ و ﻣﺒﺪأ‪ ،‬ﻛﻪ ‪4‬‬
‫ﺑﺎﻳﺖ اﺳﺖ در اﻳﻦ ﺟﺪول ﻗﺮار ﮔﻴﺮد‪ .‬ﺑﻪ ﻋﺒﺎرت دﻗﻴﻖﺗﺮ‪ ،‬ﻧﺸﺎﻧﻲ ﻣﺒﺪأ روال ﺑﺎﻳﺪ در ﻧﺸﺎﻧﻲ ‪ 4*interrupt_no‬و ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪي آن در ﻧﺸﺎﻧﻲ ‪ 4*int_no+2‬ﺣﺎﻓﻈﻪ‬
‫ذﺧﻴﺮه ﺷﻮد‪ .‬در ﺻﻮرت ﺗﻐﻴﻴﺮ روال وﻗﻔﻪﻫﺎي ﺣﺴﺎس‪ ،‬روال ﻗﺒﻠﻲ ﺑﺎﻳﺪ در روال ﺟﺪﻳﺪ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد‪.‬‬

‫رواﻟﻬﺎي ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪ‪ :‬ﻳﻚ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪ‪ ،‬از ﻫﺮ ﺟﻬﺖ ﺷﺒﻴﻪ ﻳﻚ روال ﻣﻌﻤﻮﻟﻲ )اﻟﺒﺘﻪ ‪ (far proc‬در زﺑﺎن اﺳﻤﺒﻠﻲ اﺳﺖ‪ .‬ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺑﺮاي‬
‫ﺑﺮﮔﺸﺖ از اﻳﻦ ﮔﻮﻧﻪ رواﻟﻬﺎ ﺑﺎﻳﺪ از دﺳﺘﻮراﻟﻌﻤﻞ ‪ (interrupt return) iret‬ﺑﻪ ﺟﺎي ‪ ret‬اﺳﺘﻔﺎده ﺷﻮد‪ iret .‬ﻛﺎر اﺿﺎﻓﻪاي ﻛﻪ ﻧﺴﺒﺖ ﺑﻪ ‪ ret‬اﻧﺠﺎم ﻣﻲدﻫﺪ‪pop ،‬‬
‫ﻛﺮدن ﺧﻮدﻛﺎر ﻣﻘﺪار ﺛﺒﺎت ﭘﺮﭼﻤﻬﺎ از روي ﭘﺸﺘﻪ اﺳﺖ‪.‬‬

‫ﺳﺎﻳﺮ دﺳﺘﻮرات ﻣﺮﺑﻮط ﺑﻪ وﻗﻔﻪﻫﺎ‪ :‬دو دﺳﺘﻮر دﻳﮕﺮ ﻧﻴﺰ در ارﺗﺒﺎط ﺑﺎ وﻗﻔﻪﻫﺎ وﺟﻮد دارد‪ ،‬ﻛﻪ ﻳﻜﻲ ‪ cli‬اﺳﺖ و ﻣﻘﺪار ‪ IF=0‬و دﻳﮕﺮي ‪ sti‬اﺳﺖ ﻛﻪ‬
‫‪ IF=1‬ﻣﻲﻛﻨﺪ و ﺑﻪ ﺗﺮﺗﻴﺐ ﺑﺎﻋﺚ ﻧﺎﺗﻮانﺳﺎزي و ﺗﻮاﻧﺎﺳﺎزي وﻗﻔﻪﻫﺎ ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪low-level ١‬‬
‫‪interrupt handler or Interrupt Service Routine (ISR) ٢‬‬
‫‪dicision by zero ٣‬‬
‫‪single-step mode ٤‬‬
‫‪debugging mode ٥‬‬
‫‪disable ٦‬‬
‫‪interrupt vector table ٧‬‬
‫‪2-2‬‬ ‫ﻓﺼﻞ ‪ :2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬

‫دﺳﺘﻮرات دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎهﻫﺎ‪ :‬درﮔﺎهﻫﺎ‪ ،‬واﺳﻄﻲ ﺑﻴﻦ ﭘﺮدازﻧﺪه و ﺳﺎﻳﺮ اﺟﺰاء ﺳﺨﺖاﻓﺰار ﺳﻴﺴﺘﻢ ﻫﺴﺘﻨﺪ‪ .‬ﻫﺮ درﮔﺎه ﻣﺸﺎﺑﻪ ﻳﻚ درﻳﭽﻪي ‪ 8‬ﺑﻴﺘﻲ ورودي‬
‫ﻳﺎ ﺧﺮوﺟﻲ اﺳﺖ ﻛﻪ ﺑﻪ ﺑﺨﺶ ﺧﺎﺻﻲ از ﻳﻚ ﺟﺰء ﺳﺨﺖاﻓﺰاري ﻣﺘﺼﻞ اﺳﺖ و ﺑﺎ ﻣﻘﺎدﻳﺮ ﺑﻴﻦ ‪ 00H‬ﺗﺎ ‪ FFFFH‬ﻗﺎﺑﻞ ﻧﺸﺎﻧﻲدﻫﻲ اﺳﺖ‪ .‬درﮔﺎهﻫﺎ در ﺣﻘﻴﻘﺖ‪ ،‬ﺛﺒﺎﺗﻬﺎﻳﻲ در‬
‫اﺟﺰاء ﺳﺨﺖاﻓﺰاري ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺮاي ارﺗﺒﺎط ﺑﺎ آن‪ ،‬ﻣﻘﺪاري در آن ﻧﻮﺷﺘﻪ ﻳﺎ از آن ﺧﻮاﻧﺪه ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ﻣﺜﺎل ﺑﺮاي ﭼﺎپ ﻳﻚ ﻛﺎراﻛﺘﺮ ﺑﻮﺳﻴﻠﻪي ﭼﺎﭘﮕﺮ‪ ،‬ﺑﺎﻳﺪ ﻛﺪ اَﺳﻜﻲ آن‬
‫ﻛﺎراﻛﺘﺮ در درﮔﺎه ﻣﻮازي‪ 1‬ﻛﻪ ﭼﺎﭘﮕﺮ ﺑﻪ آن ﻣﺘﺼﻞ اﺳﺖ‪ ،‬ﻧﻮﺷﺘﻪ ﺷﻮد‪.‬‬

‫در ﭘﺮدازﻧﺪهﻫﺎي ‪ 80x86‬از دو دﺳﺘﻮراﻟﻌﻤﻞ ‪ in‬و ‪ out‬ﻣﻲﺗﻮان ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎهﻫﺎ در زﺑﺎن اﺳﻤﺒﻠﻲ اﺳﺘﻔﺎده ﻛﺮد‪:‬‬

‫‪Instuction‬‬ ‫‪Destination‬‬ ‫‪Source‬‬ ‫‪Instuction‬‬ ‫‪Destination‬‬ ‫‪Source‬‬


‫‪Operand‬‬ ‫‪Operand‬‬ ‫‪Operand‬‬ ‫‪Operand‬‬
‫‪in‬‬ ‫‪al‬‬ ‫‪port_number‬‬ ‫‪out‬‬ ‫‪port_number‬‬ ‫‪al‬‬
‫‪in‬‬ ‫‪ax‬‬ ‫‪port_number‬‬ ‫‪out‬‬ ‫‪port_number‬‬ ‫‪ax‬‬
‫‪in‬‬ ‫‪al‬‬ ‫‪dx‬‬ ‫‪out‬‬ ‫‪dx‬‬ ‫‪ax‬‬
‫‪in‬‬ ‫‪ax‬‬ ‫‪dx‬‬ ‫‪out‬‬ ‫‪dx‬‬ ‫‪al‬‬
‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﺧﻴﻠﻲ ﺷﺒﻴﻪ ﺑﻪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ mov‬ﻫﺴﺘﻨﺪ و ﻣﻲﺗﻮاﻧﻨﺪ ﻳﻚ ‪ byte‬ﻳﺎ ﻳﻚ ‪ word‬را ﻣﻨﺘﻘﻞ ﻛﻨﻨﺪ‪ .‬ﻫﺮ دو داراي دو ﺷﻜﻞ ﻫﺴﺘﻨﺪ‪ ،‬ﻛﻪ در آن‬
‫ﻣﻘﺼﺪ ﻳﺎ ﺷﻤﺎرهي درﮔﺎه ﻣﻲﺗﻮاﻧﺪ ﺑﻪﺻﻮرت ﺑﻼﻓﺼﻞ )ﻋﺪد( ﻳﺎ ﺛﺒﺎت ‪ DX‬ﺑﺎﺷﺪ ﻛﻪ ﻣﺤﺘﻮي آن ﺷﻤﺎرهي درﮔﺎه اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل دﺳﺘﻮراﻟﻌﻤﻞ )‪ (1‬ﻣﻌﺎدل دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي )‪(2‬‬
‫اﺳﺖ‪:‬‬

‫)‪(1‬‬ ‫‪in ax, 07ch‬‬ ‫)‪(2‬‬ ‫‪mov dx, 07ch‬‬


‫‪in ax, dx‬‬
‫اﻣﺎ ﺑﺮاي ﺷﻤﺎره درﮔﺎﻫﻬﺎي ﺑﺰرﮔﺘﺮ از ‪ ،FFH‬اﺳﺘﻔﺎده از ﺷﻜﻞ اول ﻏﻴﺮﻣﺠﺎز اﺳﺖ‪ .‬ﻣﺜﻼً دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮ درﺳﺖ ﻧﻴﺴﺖ‪:‬‬

‫‪out 04a5h, al‬‬ ‫‪; illegal port address for this format‬‬
‫و ﺑﺎﻳﺪ ﻣﻘﺪار ‪ 04a5h‬در ﺛﺒﺎت ‪ DX‬ﻗﺮار داده ﺷﻮد‪:‬‬

‫‪mov dx, 04a5h‬‬


‫‪out dx, al‬‬

‫‪ 3-2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﺑﺎ زﺑﺎن ﭘﺎﺳﻜﺎل‬


‫ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪﻫﺎ از ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل‪ :‬ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل دو روال ‪ Intr‬و ‪ MsDos‬را ﻓﺮاﻫﻢ ﻧﻤﻮده اﺳﺖ ﻛﻪ در ﻳﻮﻧﻴﺖ ‪ DOS‬ﺗﻌﺮﻳﻒ ﺷﺪهاﻧﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ در‬
‫اﻳﻦ ﻳﻮﻧﻴﺖ‪ ،‬اﻧﻮاع و ﺛﺎﺑﺖﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻣﻌﺮﻓﻲ ﺷﺪهاﻧﺪ‪.‬‬

‫;)‪Intr ( InterruptNumber: Byte, Regs: Registers‬‬


‫ﭘﺎراﻣﺘﺮ ‪ ،InterruptNumber‬ﺷﻤﺎرهي وﻗﻔﻪي ﻣﻮردﻧﻈﺮ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ‪ .‬از آﻧﺠﺎﻳﻲ ﻛﻪ اﻳﻦ ﭘﺎراﻣﺘﺮ ﻣﻲﺗﻮاﻧﺪ ﻣﻘﺪاري ﺑﻴﻦ ‪ 0‬ﺗﺎ ‪ 255‬را ﻗﺒﻮل ﻛﻨﺪ‪،‬‬
‫ﺑﻨﺎﺑﺮ اﻳﻦ ﻫﻤﻪي وﻗﻔﻪﻫﺎ‪ ،‬و از ﺟﻤﻠﻪ وﻗﻔﻪﻫﺎي ﺳﺨﺖاﻓﺰاري را ﻣﻲﺗﻮان ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮد‪ .‬روال ‪ MsDos‬ﺷﻜﻞ ﺧﺎﺻﻲ از روال ‪ Intr‬اﺳﺖ‪:‬‬

‫;)‪MsDos (Regs: Registers‬‬

‫اﻳﻦ روال ﺷﻤﺎرهي وﻗﻔﻪ را ﺑﻪﻋﻨﻮان ﭘﺎراﻣﺘﺮ اول ﻧﻴﺎز ﻧﺪارد‪ .‬اﻳﻦ روال اﻣﻜﺎن دﺳﺘﻴﺎﺑﻲ ﺑﻪ وﻗﻔﻪي ‪ 21H‬را ﻛﻪ ﺷﺎﻣﻞ ﺗﻮاﺑﻊ واﺳﻂ ﺑﺮﻧﺎﻣﻪي ﻛﺎرﺑﺮدي ‪ 2DOS‬اﺳﺖ را ﻓﺮاﻫﻢ‬
‫ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ ‪ API‬ﺷﺎﻣﻞ ﺣﺪود ‪ 200‬ﺗﺎﺑﻊ اﺳﺖ ﻛﻪ ﺑﻮﺳﻴﻠﻪي ﻓﺮﻣﺎﻧﻬﺎ و ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ DOS‬ﻓﺮاﻫﻢ ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫ﻧﻮﺷﺘﻦ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ﺟﺪﻳﺪ‪ :‬در ﺑﺮﻧﺎﻣﻪي زﻳﺮ‪ ،‬ﻧﻤﻮﻧﻪاي از ﻳﻚ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪ اراﺋﻪ ﺷﺪه اﺳﺖ‪ .‬روال‪ ، TimerHandler‬وﻗﻔﻪي‬
‫‪ 1CH‬را ﻛﻪ ﺑﻪ ”‪ “Clock Tick‬ﻣﻌﺮوف اﺳﺖ و در ﻫﺮ ﺛﺎﻧﻴﻪ ‪ 18.2‬ﺑﺎر ﻳﻚ ﺑﺎر ﻓﻌﺎل ﻣﻲﺷﻮد‪ ،‬ﻋﻮض ﻧﻤﻮده اﺳﺖ‪ .‬در اﻳﻦ روال ﻳﻚ ﺷﻤﺎرﺷﮕﺮ ﺳﺮاﺳﺮي ﻳﻚ واﺣﺪ‬
‫اﺿﺎﻓﻪ ﺷﺪه و ﺳﭙﺲ ﻧﻤﺎﻳﺶ داده ﻣﻲﺷﻮد‪ .‬در ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ‪ ،‬اﺑﺘﺪا ﻧﺸﺎﻧﻲ روال ﻗﺒﻠﻲ ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ‪ 1CH‬ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ‪ GetIntVec‬در ﻣﺘﻐﻴﺮ ‪ ،Int1CSave‬ذﺧﻴﺮه‬
‫ﺷﺪه اﺳﺖ و ﺳﭙﺲ روال ﺟﺪﻳﺪ ﺑﺮاي وﻗﻔﻪي ‪ 1CH‬ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ‪ ،SetIntVec‬ﻧﺼﺐ ﺷﺪه اﺳﺖ‪ .‬در ﺣﺎﻟﻴﻜﻪ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ‪ ،‬ﻣﻨﺘﻈﺮ زده ﺷﺪن ﻳﻚ ﻛﻠﻴﺪ اﺳﺖ‪ ،‬روال‬
‫وﻗﻔﻪي ‪ ،1CH‬ﺷﻤﺎرﺷﮕﺮ را اﻓﺰاﻳﺶ داده و ﻧﻤﺎﻳﺶ ﻣﻲدﻫﺪ‪ .‬ﭘﺲ از زدن ﻛﻠﻴﺪ‪ ،‬روال ﻗﺒﻠﻲ ‪ 1CH‬ﺑﺮﮔﺮداﻧﺪه ﻣﻲﺷﻮد‪.‬‬

‫;‪uses Dos, Crt‬‬


‫‪var‬‬
‫;‪Int1CSave : Pointer‬‬
‫} ‪Count : Integer; { Global counter‬‬
‫;‪Ch : Char‬‬
‫; ‪procedure TimerHandler; interrupt‬‬
‫‪begin‬‬
‫_________________________________________________________________________________‬
‫‪parallel port ١‬‬
‫‪DOS Application Program Interface (API) ٢‬‬
‫‪3-2‬‬ ‫ﻓﺼﻞ ‪ :2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬

‫} ‪{ New Timer ISR‬‬


‫;)‪Inc(Count‬‬
‫;)‪GotoXY(10, 10‬‬
‫;)‪WriteLn(Count‬‬
‫;‪end‬‬
‫} ‪begin { main program‬‬
‫;‪Count := 0‬‬
‫;)‪GetIntVec($1C, Int1CSave‬‬
‫;))‪SetIntVec($1C, Addr(TimerHandler‬‬
‫;)’‪writeln(‘Press any key to exit‬‬
‫;‪Ch := ReadKey‬‬
‫;)‪SetIntVec($01C, Int1CSave‬‬
‫‪end.‬‬
‫دﺳﺘﻴﺎﺑﻲ ﺑﻪ ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه‪ :‬ﻫﺮ دو ﺗﺎﺑﻊ ﻓﻮق ﺑﻪ ﻣﺘﻐﻴﺮي از ﻧﻮع ‪ Registers‬ﻧﻴﺎز دارﻧﺪ ﻛﻪ در ﻳﻮﻧﻴﺖ ‪ DOS‬ﺗﻌﺮﻳﻒ ﺷﺪهاﻧﺪ‪ .‬اﻳﻦ ﻧﻮع ﻣﺘﻐﻴﺮﻫﺎ ﻣﻘﺎدر‬
‫ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه را ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪ ﻣﻲﭘﺬﻳﺮﻧﺪ و ﺑﻪ وﻗﻔﻪ ارﺳﺎل ﻣﻲﻛﻨﻨﺪ‪ .‬ﭘﺲ از ﺑﺮﮔﺸﺖ از ﺗﻮاﺑﻊ ‪ Intr‬ﻳﺎ ‪ ،MsDos‬اﻳﻦ ﻣﺘﻐﻴﺮﻫﺎ ﺷﺎﻣﻞ ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه در‬
‫ﭘﺎﻳﺎن ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪﻫﺎ ﻫﺴﺘﻨﺪ‪.‬‬

‫ﺑﺮاي ﺳﺎدهﺳﺎزي ارﺟﺎع ﺑﻪ ﺛﺒﺎﺗﻬﺎ‪ ،‬ﻧﻮع ‪ Registers‬ﺑﻪﺻﻮرت ﻳﻚ رﻛﻮرد ﻣﺘﻐﻴﺮ‪ 1‬ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ‪:‬‬

‫‪type Registers = record‬‬


‫‪case integer of‬‬
‫;)‪0 : (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags : word‬‬
‫;)‪1 : (AL, AH, BL, BH, CL, CH, DL, DH : byte‬‬
‫;‪end‬‬
‫ﺛﺒﺎﺗﻬﺎي ‪ 16‬ﺑﻴﺘﻲ ﭘﺮدازﻧﺪه‪ ،‬ﻳﻌﻨﻲ ‪ AX‬ﺗﺎ ‪ BP‬ﺑﻮﺳﻴﻠﻪي ﻣﺘﻐﻴﺮﻫﺎﻳﻲ از ﻧﻮع ‪ word‬و ﺑﺎ ﻧﺎم ﻣﺸﺎﺑﻪ ﻧﻤﺎﻳﺶ داده ﺷﺪهاﻧﺪ‪ .‬ﺛﺒﺎﺗﻬﺎي ‪ 8‬ﺑﻴﺘﻲ ‪ AL‬ﺗﺎ ‪ DH‬ﻧﻴﺰ ﺑﺎ‬
‫ﻣﺘﻐﻴﺮﻫﺎي از ﻧﻮع ‪ byte‬اراﺋﻪ ﺷﺪهاﻧﺪ‪ .‬در ذﺧﻴﺮهﺳﺎزي ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ در ﺣﺎﻓﻈﻪ‪ ،‬ﺛﺒﺎﺗﻬﺎي ‪ 8‬ﺑﻴﺘﻲ و ‪ 16‬ﺑﻴﺘﻲ از ﻓﻀﺎي ﺣﺎﻓﻈﻪي ﻳﻜﺴﺎﻧﻲ اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪ .‬ﻳﻌﻨﻲ ‪ AL‬و‬
‫‪ AH‬دو ﺑﺎﻳﺖ از ﻳﻚ ﻛﻠﻤﻪي ‪ 16‬ﺑﻴﺘﻲ ‪ AX‬را ﺗﺸﻜﻴﻞ ﻣﻲدﻫﻨﺪ و داراي ﺣﺎﻓﻈﻪي ﻣﺴﺘﻘﻠﻲ ﻧﻴﺴﺘﻨﺪ‪.‬‬

‫اﮔﺮ ‪ Regs‬ﻳﻚ ﻣﺘﻐﻴﺮ از ﻧﻮع ‪ Registers‬ﺑﺎﺷﺪ‪ ،‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه ﺑﻪﺳﻬﻮﻟﺖ ﻣﻲﺗﻮان از ﻓﻴﻠﺪﻫﺎي اﻳﻦ ﻣﺘﻐﻴﺮ از ﻧﻮع رﻛﻮرد اﺳﺘﻔﺎده ﻧﻤﻮد‪:‬‬

‫‪- Regs.AX,‬‬
‫‪- Regs.BX,‬‬
‫‪- Regs.AH,‬‬
‫‪- Regs.DL, etc.‬‬
‫ﺑﺮاي ارﺳﺎل ﻣﻘﺪار ‪ D3H‬ﺑﻪ ﺛﺒﺎت ‪ DL‬ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﻳﻚ وﻗﻔﻪ‪ ،‬ﺑﻪﺻﻮرت زﻳﺮ ﻋﻤﻞ ﻛﻨﻴﺪ‪:‬‬

‫;‪Regs.DL := $D3‬‬
‫ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ ﻳﻚ وﻗﻔﻪ ﺑﺎ ‪ Intr‬ﻳﺎ ‪ ،MsDos‬ﻣﻘﺎدﻳﺮ ﻣﻮردﻧﻈﺮ را در ﺛﺒﺎﺗﻬﺎﻳﻲ ﻛﻪ ﺑﻮﺳﻴﻠﻪي ﺗﺎﺑﻊ‪ ،‬ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺧﻮاﻫﻨﺪ ﮔﺮﻓﺖ‪ ،‬ﻗﺮار دﻫﻴﺪ‪ .‬وﻗﻔﻪ ﻓﻘﻂ‬
‫از اﻃﻼﻋﺎت ﻗﺮار داده ﺷﺪه در ﺛﺒﺎﺗﻬﺎي ﻣﻮردﻧﻈﺮش اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ و از ﻣﺎﺑﻘﻲ ﺻﺮفﻧﻈﺮ ﻣﻲﻛﻨﺪ‪.‬‬

‫ﺧﻮاﻧﺪن ﭘﺮﭼﻢﻫﺎي ﺛﺒﺎت ﭘﺮﭼﻢ‪ :‬در ﺑﺴﻴﺎري از ﺣﺎﻟﺖﻫﺎ‪ ،‬ﺛﺒﺎت ﭘﺮﭼﻢ ﻣﻲﺗﻮاﻧﺪ اﻃﻼﻋﺎﺗﻲ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮﮔﺮداﻧﺪ‪ .‬ﺗﻮاﺑﻊ ‪ DOS‬ﺑﻪﻃﻮر ﮔﺴﺘﺮده از ‪Carry‬‬
‫‪ Flag‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪ ،‬ﻛﻪ ﭘﺲ از ﭘﺎﻳﺎن ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ﻳﺎ اﺟﺮاي ﻧﺎﻣﻮﻓﻖ آن‪ ،‬ﻣﻘﺪاردﻫﻲ ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ﺳﻬﻮﻟﺖ ﺑﺮرﺳﻲ ﭘﺮﭼﻢﻫﺎ‪ ،‬در ﻳﻮﻧﻴﺖ ‪ DOS‬ﺛﺎﺑﺖﻫﺎي ﻣﺨﺘﻠﻔﻲ‬
‫ﺗﻌﺮﻳﻒ ﺷﺪهاﺳﺖ و ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﻣﻘﺎدﻳﺮ ﺑﻴﺘﻬﺎي ﭘﺮﭼﻤﻬﺎي ﭘﺮدازﻧﺪه اﺳﺖ‪ .‬ﺑﺮاي ﺗﻌﻴﻴﻦ اﻳﻨﻜﻪ ﻛﺪاﻣﻴﻚ از ﺑﻴﺖﻫﺎ ﻣﻘﺪار ﮔﺮﻓﺘﻪ اﺳﺖ‪ ،‬ﻣﻲﺗﻮان از ﻋﻤﻠﮕﺮ ‪ AND‬اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫ﻋﺒﺎرت زﻳﺮ در ﺻﻮرﺗﻲﻛﻪ ﻣﻘﺪار ﺑﻴﺖ ‪ Carry Flag‬ﻳﻚ ﺷﺪه ﺑﺎﺷﺪ‪ ،‬ﺑﻪ ﻣﺘﻐﻴﺮ ﺑﻮﻟﻲ‪ Error‬ﻣﻘﺪار ‪ True‬ﻣﻲدﻫﺪ‪:‬‬

‫;)‪Error := ((Regs.Flags and FCarry) <> 0‬‬


‫‪Constant‬‬ ‫‪Bit Position‬‬ ‫‪Bit Value‬‬
‫‪FCarry‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪FParity‬‬ ‫‪2‬‬ ‫‪4‬‬
‫‪FAuxiliary‬‬ ‫‪4‬‬ ‫‪16‬‬
‫‪FZero‬‬ ‫‪6‬‬ ‫‪64‬‬
‫_________________________________________________________________________________‬
‫‪variant record ١‬‬
‫‪4-2‬‬ ‫ﻓﺼﻞ ‪ :2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬

‫‪FSign‬‬ ‫‪7‬‬ ‫‪128‬‬


‫‪FOverflow‬‬ ‫‪11‬‬ ‫‪2048‬‬

‫ﺑﺎﻓﺮﻫﺎ و ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل‪ :‬ﺑﺴﻴﺎري از ﺗﻮاﺑﻊ وﻗﻔﻪ ﺑﻪ ﭘﺎراﻣﺘﺮﻫﺎﻳﻲ از ﻧﻮع اﺷﺎرهﮔﺮ ﺑﻪ ﺑﺎﻓﺮ ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﻧﻴﺎز دارﻧﺪ‪ .‬اﻳﻦ ﺗﻮاﺑﻊ ﻳﺎ اﻃﻼﻋﺎت را از ﺑﺎﻓﺮ ﺑﺮﻣﻲدارﻧﺪ‬
‫ﻳﺎ در آن ﻗﺮار ﻣﻲدﻫﻨﺪ‪ .‬اﻳﻦ اﺷﺎرهﮔﺮﻫﺎ ﻫﻤﻴﺸﻪ ‪ FAR‬ﺑﻮده و ﺷﺎﻣﻞ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ و ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﻫﺴﺘﻨﺪ‪ .‬اﺷﺎرهﮔﺮﻫﺎي ‪ FAR‬ﺑﺮﺧﻼف اﺷﺎرهﮔﺮﻫﺎي ‪ ،NEAR‬ﺑﻪ‬
‫دادهﻫﺎي ﻣﻮﺟﻮد در ﻫﺮ ﺟﺎي ﺣﺎﻓﻈﻪ و ﺧﺎرج از ﻗﻄﻌﻪي ﺟﺎري ﺑﺮﻧﺎﻣﻪ ﻣﻲﺗﻮاﻧﻨﺪ اﺷﺎره ﻛﻨﻨﺪ‪.‬‬

‫ارﺳﺎل اﺷﺎرهﮔﺮﻫﺎ ﺑﻪ ﺗﻮاﺑﻊ وﻗﻔﻪ‪ :‬ﺗﺎﺑﻊ ‪ ،DOS 09H‬ﻣﺜﺎﻟﻲ از ﻳﻚ ﺗﺎﺑﻊ اﺳﺖ ﻛﻪ ﭘﺎراﻣﺘﺮي از ﻧﻮع اﺷﺎرهﮔﺮ دارد‪ .‬اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ رﺷﺘﻪ را ﺑﺮ روي‬
‫ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ و از ﻧﻘﻄﻪي ﺷﺮوع ﻣﺤﻞ ﻓﻌﻠﻲ ﻣﻜﺎنﻧﻤﺎ‪ ،‬ﻧﺸﺎن ﻣﻲدﻫﺪ‪ .‬ﻫﻤﺎﻧﻨﺪ ﻫﻤﻪي ﺗﻮاﺑﻊ ‪ ،DOS‬اﻳﻦ ﺗﺎﺑﻊ اﻧﺘﻈﺎر دارد ﻛﻪ ﺷﻤﺎرهي ﺗﺎﺑﻊ در ﺛﺒﺎت ‪ AH‬ﺑﺎﺷﺪ و ﻧﺸﺎﻧﻲ‬
‫ﺷﺮوع ﺑﺎﻓﺮ ﺣﺎوي رﺷﺘﻪاي ﻛﻪ ﻗﺮار اﺳﺖ ﻧﻤﺎﻳﺶ داده ﺷﻮد در زوج ﺛﺒﺎت ‪ DS:DX‬ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﺪ‪ DS .‬ﻣﻘﺪار ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ و ‪ DX‬ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﺑﺎﻓﺮ اﺳﺖ‪.‬‬

‫ﺑﺎ وﺟﻮدﻳﻜﻪ اﻳﺠﺎد رﺷﺘﻪ در ﭘﺎﺳﻜﺎل آﺳﺎن اﺳﺖ‪ ،‬وﻟﻲ ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻧﺸﺎﻧﻲ ﺑﺎﻓﺮ رﺷﺘﻪ را ﺑﺪﺳﺖ آورده و در ﺛﺒﺎﺗﻬﺎي ‪ DS‬و ‪ DX‬ﻗﺮار دﻫﻴﺪ‪ .‬ﺑﺮاي اﻳﻦ‬
‫ﻣﻨﻈﻮر در ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل دو ﺗﺎﺑﻊ )(‪ Seg‬و )(‪ Ofs‬وﺟﻮد دارد‪ ،‬ﻛﻪ ﺑﻪﺗﺮﺗﻴﺐ ﻧﺸﺎﻧﻲﻫﺎي ﻗﻄﻌﻪ و ﻣﺒﺪأ ﻳﻚ ﺷﺊ را در ﺣﺎﻓﻈﻪ ﺑﺪﺳﺖ ﻣﻲدﻫﻨﺪ‪.‬‬

‫ﻣﺜﺎل زﻳﺮ ﻧﺸﺎن ﻣﻲدﻫﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ ﺗﻮاﺑﻊ را ﺑﺎ ﺗﺎﺑﻊ ‪ DOS 09H‬ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار دﻫﻴﺪ‪ .‬اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﺗﺎﺑﻊ ‪ DOS 09H‬ﺑﺮاي ﻧﻤﺎﻳﺶ‬
‫رﺷﺘﻪي ﻣﻮﺟﻮد در ﻣﺘﻐﻴﺮ ﭘﻴﻐﺎم ﺑﺮ روي ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮﺧﻼف ﺳﺎﻳﺮ ﺗﻮاﺑﻊ ‪ ،DOS‬ﺗﺎﺑﻊ ‪ 09H‬ﻧﻴﺎز ﺑﻪ ﻣﺸﺨﺺ ﺷﺪن ﭘﺎﻳﺎن رﺷﺘﻪ ﺑﺎ ﻛﺎراﻛﺘﺮ ’‪ ‘$‬دارد‪،‬‬
‫ﻧﻪ ﺑﺎﻳﺖ ‪. null‬‬

‫;‪program 9HDemoP‬‬
‫‪uses‬‬ ‫;‪DOS‬‬
‫‪var‬‬ ‫‪Regs‬‬ ‫;‪: Registers‬‬
‫;]‪Message : string[20‬‬
‫‪begin‬‬
‫;’‪Message := ‘DOSPrint$‬‬
‫;‪Regs.AH := $09‬‬
‫;) ]‪Regs.DS := Seg( Message[1‬‬
‫;) ]‪Regs.DX := Ofs( Message[1‬‬
‫;) ‪MsDos (Regs‬‬
‫‪end.‬‬

‫درﻳﺎﻓﺖ اﺷﺎرهﮔﺮﻫﺎ از ﺗﻮاﺑﻊ وﻗﻔﻪ‪ :‬ﺑﺮﻧﺎﻣﻪي زﻳﺮ ﺗﺎﺑﻊ ‪ DOS 1BH‬را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ ﻛﻪ ﻳﻚ اﺷﺎرهﮔﺮ را در زوج ﺛﺒﺎت ‪ DS:BX‬ﺑﺮﻣﻲﮔﺮداﻧﺪ‪.‬‬
‫اﻳﻦ اﺷﺎرهﮔﺮ ﺑﻪ ﻳﻚ ﺑﺎﻳﺖ ﻛﻪ ﺷﺎﻣﻞ ﻛﺪ رﺳﺎﻧﻪي‪ 1‬ﮔﺮداﻧﻨﺪهي ﺟﺎري اﺳﺖ‪ ،‬اﺷﺎره ﻣﻲﻛﻨﺪ‪ DOS .‬از ﻛﺪﻫﺎي رﺳﺎﻧﻪ ‪ F0H‬ﺗﺎ ‪ FFH‬ﺑﺮاي ﺗﻮﺻﻴﻒ اﻧﻮاع ﻣﺨﺘﻠﻒ‬
‫ﮔﺮداﻧﻨﺪهﻫﺎ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪ .‬ﻣﻘﺪار ‪ F8H‬ﻫﻤﻪي اﻧﻮاع دﻳﺴﻚ ﺳﺨﺖ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ‪.‬‬

‫ﺑﺮاي ﺗﻌﻴﻴﻦ ﺷﻨﺎﺳﻪي رﺳﺎﻧﻪ از اﺷﺎرهﮔﺮ ﺑﺮﮔﺸﺘﻲ‪ ،‬ﻧﻮع ‪ MediaPtr‬ﺑﻪ ﻋﻨﻮان اﺷﺎرهﮔﺮي ﺑﻪ ﻳﻚ ﺑﺎﻳﺖ‪ ،‬در اﺑﺘﺪاي ﺑﺮﻧﺎﻣﻪ ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ‪ .‬از آﻧﺠﺎﻳﻲ ﻛﻪ‬
‫اﺷﺎرهﮔﺮﻫﺎ در ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل ﻫﻤﻴﺸﻪ ‪ FAR‬ﻫﺴﺘﻨﺪ‪ ،‬ﻣﻄﻤﺌﻦ ﺧﻮاﻫﻴﺪ ﺑﻮد ﻛﻪ ﻳﻚ اﺷﺎرهﮔﺮ ‪ FAR‬اﻳﺠﺎد ﻧﻤﻮدهاﻳﺪ‪ .‬در ﺑﺮﻧﺎﻣﻪ ‪ MP‬ﺑﻪﻋﻨﻮان ﻣﺘﻐﻴﺮي از اﻳﻦ ﻧﻮع ﺗﻌﺮﻳﻒ ﺷﺪه‬
‫اﺳﺖ‪ .‬ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ ،DOS 1BH‬ﺑﺮﻧﺎﻣﻪ اﺷﺎرهﮔﺮ ﺑﺮﮔﺸﺘﻲ را ﭘﺲ از ﺑﺪﺳﺖآوردن از زوج ﺛﺒﺎت ‪ DS:BX‬در ‪ MP‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﺑﺮﻧﺎﻣﻪ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر از ﺗﺎﺑﻊ‬
‫‪ Ptr‬ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ ﺗﺎﺑﻊ ﻧﺸﺎﻧﻲﻫﺎي ﻗﻄﻌﻪ و ﻣﺒﺪأ را درﻳﺎﻓﺖ ﻧﻤﻮده و ﻳﻚ اﺷﺎرهﮔﺮ از آﻧﻬﺎ ﺗﺸﻜﻴﻞ ﻣﻲدﻫﺪ‪ .‬اﻳﻦ اﺷﺎرهﮔﺮ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت‬
‫ﻣﻮرد اﺷﺎره‪ ،‬ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ‪ .‬دﺳﺘﻮر ‪ WriteLn‬در ﭘﺎﻳﺎن ﺑﺮﻧﺎﻣﻪ اﻳﻦ ﻣﺴﺄﻟﻪ را ﻧﺸﺎن ﻣﻲدﻫﺪ‪.‬‬

‫;‪program MediaIdP‬‬
‫‪uses‬‬ ‫;‪Dos‬‬
‫‪type‬‬ ‫;‪MediaPtr = ^byte‬‬
‫‪var‬‬ ‫‪Regs‬‬ ‫;‪: Registers‬‬
‫‪MP‬‬ ‫;‪: MediaPtr‬‬
‫‪begin‬‬
‫;‪Regs.AH := $1B‬‬
‫;) ‪MsDos ( Regs‬‬
‫;) ‪MP := Ptr (Regs.DS, Regs.BX‬‬
‫;) ^‪WriteLn ( ‘Media ID = ‘, MP‬‬
‫‪end.‬‬
‫دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪ ﺑﺎ ‪ MemW ،Mem‬و ‪ : MemL‬در ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل از ﺳﻪ ﺗﺎﺑﻊ ازﻗﺒﻞﺗﻌﺮﻳﻒ ﺷﺪهي ‪ MemW ،Mem‬و ‪ MemL‬ﺑﺮاي‬
‫دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪ ﺑﻪﺗﺮﺗﻴﺐ ﺑﺎ اﻧﻮاع ‪ word ،byte‬و )‪ longint(dwords‬ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻛﺮد‪ .‬از ﻳﻚ ﻧﺤﻮ ﺧﺎص ﺑﺮاي ﻛﺎر ﺑﺎ اﻳﻦ آراﻳﻪﻫﺎ اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﻛﻪ در‬
‫داﺧﻞ ﻛﺮوﺷﻪﻫﺎ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ از ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﺑﺎ ’‪ ‘:‬ﺟﺪا ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ﻣﺜﺎل ﺷﻨﺎﺳﻪي رﺳﺎﻧﻪ را ﻣﻲﺗﻮان ﺑﻪ ﺻﻮرت زﻳﺮ ﻫﻢ در ﺑﺮﻧﺎﻣﻪي ﻓﻮق ﺑﺪﺳﺖ آورد‪:‬‬

‫_________________________________________________________________________________‬
‫‪media code ١‬‬
‫‪5-2‬‬ ‫ﻓﺼﻞ ‪ :2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬

‫;] ‪mem[ Regs.DS :Regs.BX‬‬


‫دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎهﻫﺎ در ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل‪ :‬درﮔﺎﻫﻬﺎي ‪ PC‬ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ آراﻳﻪي ازﻗﺒﻞﺗﻌﺮﻳﻒ ﺷﺪه در ﺗﻮرﺑﻮ ﭘﺎﺳﻜﺎل ﺷﻨﺎﺳﺎﻳﻲ ﻣﻲﺷﻮﻧﺪ‪ .‬اﻣﺎ‪ ،‬ﺗﻮرﺑﻮ‬
‫ﭘﺎﺳﻜﺎل دو آراﻳﻪ را ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎهﻫﺎ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﻨﺪ‪) Port :‬ﺑﺮاي درﮔﺎهﻫﺎي ‪ 8‬ﺑﻴﺘﻲ( و ‪) PortW‬ﺑﺮاي درﮔﺎهﻫﺎي ‪ 16‬ﺑﻴﺘﻲ(‪ PortW .‬اﺟﺎزهي ارﺳﺎل ﻣﻘﺎدﻳﺮ‬
‫‪ 16‬ﺑﻴﺘﻲ را ﺑﻪ درﮔﺎهﻫﺎ اﺟﺎزه ﻣﻲدﻫﺪ‪ ،‬در ﺣﺎﻟﻴﻜﻪ ‪ Port‬ﻓﻘﻂ ﻣﻘﺎدﻳﺮ ‪ 8‬ﺑﻴﺘﻲ را ﻣﻲﭘﺬﻳﺮد‪ .‬اﻧﺘﺨﺎب ﻫﺮﻛﺪام از اﻳﻦ آراﻳﻪﻫﺎ ﺑﻪ ﻧﻮع ﺑﺮد ﻣﺘﺼﻞ ﻳﺎ ﺗﺮاﺷﻪ ﻣﻮرد دﺳﺘﻴﺎﺑﻲ ﺑﺴﺘﮕﻲ‬
‫دارد‪ .‬اﮔﺮ ﺑﺮد ﻳﺎ ﺗﺮاﺷﻪ ‪ 16‬ﺑﻴﺘﻲ اﺳﺖ ﻣﻲﺗﻮاﻧﻴﺪ از ‪ PortW‬اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ ،‬وﮔﺮﻧﻪ ﺑﺎﻳﺪ از ‪ Port‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪.‬‬
‫ﻣﻲﺗﻮاﻧﻴﺪ ﺑﺮاي ﺧﻮاﻧﺪن اﻃﻼﻋﺎت از درﮔﺎهﻫﺎ ﻳﺎ ﻧﻮﺷﺘﻦ اﻃﻼﻋﺎت در آﻧﻬﺎ از ﻧﺤﻮ ﻣﻌﻤﻮﻟﻲ آراﻳﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل ﻫﺮ دو ﺟﻤﻠﻪي زﻳﺮ ﻣﺤﺘﻮي درﮔﺎه‬
‫‪ 3C4H‬را ﻣﻲﺧﻮاﻧﻨﺪ‪ ،‬ﻛﻪ ﺑﺨﺸﻲ از ﻛﻨﺘﺮﻟﺮ ﮔﺮاﻓﻴﻜﻲ در ﻳﻚ ﻛﺎرت ‪ EGA/VGA‬اﺳﺖ‪:‬‬

‫;] ‪XByte := Port [ $3C4‬‬


‫;] ‪XWord := PortW [ $3C4‬‬
‫ﺟﻤﻠﻪﻫﺎي زﻳﺮ اﺟﺎزهﻣﻲدﻫﻨﺪ ﻛﻪ ﻳﻚ ﺑﺎﻳﺖ ﻳﺎ ﻛﻠﻤﻪ ﺑﻪ درﮔﺎه ارﺳﺎل ﺷﻮد‪:‬‬

‫;‪Port [ $3C4 ] := XByte‬‬


‫;‪PortW [ $3C4 ] := XWord‬‬

‫‪ 4-2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ ﺑﺎ زﺑﺎن ‪C‬‬


‫ﺑﺮﺧﻼف ﭘﺎﺳﻜﺎل‪ ،‬ﺑﺎزار ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ‪ C‬ﺑﻴﻦ ﻣﻴﻜﺮوﺳﺎﻓﺖ و ﺑﻮرﻟﻨﺪ ﺗﻘﺴﻴﻢ ﺷﺪه اﺳﺖ‪ .‬ﻫﺮ دو ﺷﺮﻛﺖ داراي ﭼﻨﺪ ﻣﺤﺼﻮل در اﻳﻦ زﻣﻴﻨﻪ ﻫﺴﺘﻨﺪ‪Microsoft :‬‬
‫‪ QuickC‬و ‪ Microsoft C 6.0‬و ‪ Turbo C++‬و ‪ .Borland C++‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ C‬اراﺋﻪ ﺷﺪه در اﻳﻦ ﻛﺘﺎب ﺑﺎ ﻫﻤﻪي ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﻓﻮق ﻛﺎﻣﭙﺎﻳﻞ ﻣﻲﺷﻮﻧﺪ و‬
‫ﻓﻘﻂ ﺗﻌﺪاي ﭘﻴﻐﺎم ﻫﺸﺪار ﻣﻤﻜﻦ اﺳﺖ ﺑﺮ روي ﺻﻔﺤﻪ ﻇﺎﻫﺮ ﺷﻮد‪ .‬ﺑﻪ دﻟﻴﻞ ﺗﻔﺎوت در ﻛﺘﺎﺑﺨﺎﻧﻪﻫﺎي ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﻓﻮق‪ ،‬در ﺑﺮﺧﻲ اوﻗﺎت در ﺑﺮﻧﺎﻣﻪﻫﺎ از ‪Directive‬ﻫﺎي‬
‫‪ #ifdef‬ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺎﻛﺮوﻫﺎﻳﻲ اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ‪ .‬ﭼﻮن ﻫﺪف ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ اﺳﺖ‪ ،‬ﺑﺮﻧﺎﻣﻪﻫﺎ از ﻗﺎﺑﻠﻴﺘﻬﺎي ﺷﺊﮔﺮاﻳﻲ زﺑﺎن ‪ C++‬اﺳﺘﻔﺎده ﻧﻤﻲﻛﻨﻨﺪ و ﺑﺮﻧﺎﻣﻪﻫﺎ‪ ،‬در‬
‫ﺣﻘﻴﻘﺖ ‪ C‬ﻫﺴﺘﻨﺪ‪.‬‬

‫ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪﻫﺎ از ‪ :C‬ﻫﻢ ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﻣﻴﻜﺮوﺳﺎﻓﺖ و ﻫﻢ ﺑﻮرﻟﻨﺪ‪ ،‬ﺗﻮاﺑﻊ )(‪ intdos() ،int86x() ،int86‬و )(‪ intdosx‬را ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ‬
‫وﻗﻔﻪﻫﺎي ﻧﺮماﻓﺰاري ﻓﺮاﻫﻢ ﻣﻲﻛﻨﻨﺪ‪ .‬درﺣﺎﻟﻴﻜﻪ ﺗﻮاﺑﻊ )(‪ int86‬و )(‪ int86x‬ﻣﻲﺗﻮاﻧﻨﺪ ﻫﻤﻪي ‪ 256‬وﻗﻔﻪي ﭘﺮدازﻧﺪهي ‪ Intel‬را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻨﺪ‪ ،‬ﺗﻮاﺑﻊ )(‪ intdos‬و‬
‫)(‪ intdosx‬ﻣﺨﺼﻮص وﻗﻔﻪي )‪ 21H (0x21‬ﻫﺴﺘﻨﺪ‪ ،‬ﻛﻪ ﺷﺎﻣﻞ ﺗﻮاﺑﻊ واﺳﻂ ﺑﺮﻧﺎﻣﻪي ﻛﺎرﺑﺮدي ‪ DOS‬اﺳﺖ و ﺑﻴﺶ از ‪ 200‬ﺗﺎﺑﻊ را ﻣﻲﭘﻮﺷﺎﻧﺪ‪.‬‬

‫اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻫﺮ دو ﻛﺎﻣﭙﺎﻳﻠﺮ در ﻓﺎﻳﻞ ‪ DOS.H‬ﻗﺮار دارد و ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬

‫;)‪int intdos( union REGS *inregs, union REGS *outregs‬‬


‫;)‪int intdosx( union REGS *inregs, union REGS *outregs, struct SREGS *segregs‬‬
‫;)‪int int86( int intno, union REGS *inregs, union REGS *outregs‬‬
‫;)‪int int86x( int intno, union REGS *inregs, union REGS *outregs, struct SREGS *segregs‬‬
‫دﺳﺘﺮﺳﻲ ﺑﻪ ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه‪ :‬ﻫﺮ ﭼﻬﺎر ﺗﺎﺑﻊ ﻓﻮق ﺑﻪ اﺷﺎرهﮔﺮﻫﺎﻳﻲ از ﻧﻮع ‪ REGS‬ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﻧﻴﺎز دارﻧﺪ‪ .‬ﺗﻮاﺑﻊ )(‪ intdosx‬و )(‪،int86x‬‬
‫ﺑﻪ ﻣﺘﻐﻴﺮي از ﻧﻮع ‪ SREGS‬ﻫﻢ ﻧﻴﺎز دارﻧﺪ‪ .‬اﻳﻦ ﺳﺎﺧﺘﺎرﻫﺎ ﺑﺮاي ﻧﻤﺎﻳﺶ ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪ .‬ﺗﻮاﺑﻊ ﻓﻮق ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪ‪ ،‬ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎي‬
‫ﭘﺮدازﻧﺪه را از ‪ inregs‬ﺑﺎرﻣﻲﻛﻨﺪ و ﭘﺲ از ﺧﺎﺗﻤﻪي ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪ‪ ،‬ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه را در ‪ outregs‬ﻗﺮار ﻣﻲدﻫﻨﺪ‪.‬‬

‫ﺑﺮاي ﺳﻬﻮﻟﺖ ﻧﺸﺎﻧﻲدﻫﻲ ﺑﻪ ﺛﺒﺎﺗﻬﺎي ‪ 8‬ﺑﻴﺘﻲ و ‪ 16‬ﺑﻴﺘﻲ‪ REGS ،‬ﻳﻚ ‪ union‬را ﻛﻪ ﺷﺎﻣﻞ دو ﺳﺎﺧﺘﺎر ‪ WORDREGS‬و ‪ BYTEREGS‬اﺳﺖ را‬
‫ﻧﺸﺎن ﻣﻲدﻫﺪ‪:‬‬

‫{ ‪union REGS‬‬
‫;‪struct WORDREGS x‬‬
‫;‪struct BYTEREGS h‬‬
‫;}‬
‫{ ‪struct WORDREGS‬‬
‫;‪unsigned int ax, bx, cx, dx, si, di, cflag‬‬
‫;}‬
‫{ ‪struct BYTEREGS‬‬
‫;‪unsigned char al, ah, bl, bh, cl, ch, dl, dh‬‬
‫;}‬
‫‪6-2‬‬ ‫ﻓﺼﻞ ‪ :2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬

‫ﺛﺒﺎﺗﻬﺎي ‪ 16‬ﺑﻴﺘﻲ ﭘﺮدازﻧﺪه)‪ AX‬ﺗﺎ ‪ (ES‬ﺑﺎ ﻣﺘﻐﻴﺮﻫﺎي ‪ unsigned int‬ﺑﺎ ﻧﺎﻣﻲ ﻣﺸﺎﺑﻪ در ﺳﺎﺧﺘﺎر ‪ WORDREGS‬ﻧﺸﺎن داده ﺷﺪهاﻧﺪ‪ .‬ﺛﺒﺎﺗﻬﺎي ‪ 8‬ﺑﻴﺘﻲ‬
‫ﭘﺮدازﻧﺪه )‪ AL‬ﺗﺎ ‪ (DH‬ﺑﺎ ﻣﺘﻐﻴﺮﻫﺎي ‪ unsigned char‬در ﺳﺎﺧﺘﺎر ‪ BYTEREGS‬اراﺋﻪ ﺷﺪهاﻧﺪ‪ .‬ﺳﺎﺧﺘﺎر ‪ REGS‬ﻳﻚ رﻛﻮرد ﻣﺘﻐﻴﺮ اﺳﺖ ﻛﻪ ﺣﺎﻓﻈﻪﻫﺎي ﺛﺒﺎﺗﻬﺎي‬
‫‪ 16‬و ‪ 8‬ﺑﻴﺘﻲ را ﺑﻪﻃﻮر اﺷﺘﺮاﻛﻲ ﻧﺸﺎن ﻣﻲدﻫﺪ‪.‬‬

‫اﮔﺮ ‪ pregs‬ﻣﺘﻐﻴﺮي از ﻧﻮع ‪ REGS‬ﺑﺎﺷﺪ‪ ،‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه ﻣﻲﺗﻮان ﺑﻪ ﺷﻜﻞ زﻳﺮ ﻋﻤﻞ ﻛﺮد‪:‬‬

‫‪- pregs.x.ax,‬‬
‫‪- pregs.x.bx,‬‬
‫‪- pregs.h.ah,‬‬
‫‪- pregs.h.dl, etc.‬‬
‫اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻣﻘﺪار )‪ D3H (0xD3‬را ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪ در ﺛﺒﺎت ‪ DL‬ﻗﺮار دﻫﻴﺪ‪ ،‬ﺑﻪﺻﻮرت زﻳﺮ ﻋﻤﻞ ﻛﻨﻴﺪ‪:‬‬

‫;‪pregs.h.dl = 0xD3‬‬
‫ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ ﻳﻚ وﻗﻔﻪ ﺑﺎ ﺗﻮاﺑﻊ ﻓﻮق‪ ،‬ﻣﻘﺎدﻳﺮ ﻣﻮردﻧﻈﺮ را در ﺛﺒﺎﺗﻬﺎﻳﻲ ﻛﻪ ﺑﻮﺳﻴﻠﻪي ﺗﺎﺑﻊ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺧﻮاﻫﻨﺪ ﮔﺮﻓﺖ‪ ،‬ﻗﺮار دﻫﻴﺪ‪ .‬وﻗﻔﻪ ﻓﻘﻂ از‬
‫اﻃﻼﻋﺎت ﻗﺮار داده ﺷﺪه در ﺛﺒﺎﺗﻬﺎي ﻣﻮردﻧﻈﺮش اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ و از ﻣﺎﺑﻘﻲ ﺻﺮفﻧﻈﺮ ﻣﻲﻛﻨﺪ‪.‬‬

‫در ﺗﻌﺮﻳﻒ ‪ WORDREGS‬دﻳﺪه ﻣﻲﺷﻮد ﻛﻪ ﺛﺒﺎﺗﻬﺎي ﻗﻄﻌﻪ در اﻋﻼن ﺳﺎﺧﺘﺎر وﺟﻮد ﻧﺪارﻧﺪ‪ .‬اﻳﻦ اﻣﺮ ﺑﻪ آن دﻟﻴﻞ اﺳﺖ ﻛﻪ اﻏﻠﺐ ﺗﻮاﺑﻊ ﺑﻪ اﻳﻦ ﺛﺒﺎﺗﻬﺎ ﻛﺎري‬
‫ﻧﺪارﻧﺪ‪ .‬اﮔﺮ ﺗﺎﺑﻌﻲ ﺑﻪ اﻳﻦ ﺛﺒﺎﺗﻬﺎ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﺪ ﺑﺎﻳﺪ از ﺗﻮاﺑﻊ )(‪ intdosx‬و )(‪ int86x‬اﺳﺘﻔﺎده ﻛﻨﻴﻢ ﻛﻪ ﻳﻜﻲ از ﭘﺎراﻣﺘﺮﻫﺎي آن از ﻧﻮع ‪ SREGS‬اﺳﺖ و در آن ﻣﻘﺎدﻳﺮ‬
‫ﺛﺒﺎﺗﻬﺎي ﻗﻄﻌﻪ ﺑﺎرﮔﺬاري ﻣﻲﺷﻮﻧﺪ‪ .‬ﺗﻌﺮﻳﻒ ‪ SREGS‬ﺑﻪﺷﻜﻞ زﻳﺮ اﺳﺖ‪:‬‬

‫{ ‪struct SREGS‬‬
‫‪unsigned int‬‬ ‫;‪es‬‬
‫‪unsigned int‬‬ ‫;‪cs‬‬
‫‪unsigned int‬‬ ‫;‪ss‬‬
‫‪unsigned int‬‬ ‫;‪ds‬‬
‫;}‬

‫ﻫﻤﭽﻨﻴﻦ در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﺑﻪ ﺛﺒﺎﺗﻬﺎ ﺑﺎ اﺳﺘﻔﺎده از ﺷﺒﻪﻣﺘﻐﻴﺮﻫﺎي‪ 1‬ﺛﺒﺎﺗﻬﺎ وﺟﻮد دارد‪ .‬ﺷﺒﻪﻣﺘﻐﻴﺮﻫﺎﻳﻲ ﺑﺎ ﻧﺎﻣﻬﺎي ‪ _BX ،_AX‬و ‪ ...‬و‬
‫‪ _BH ،_AH‬و ‪ ...‬و ‪ _ES‬و ‪ ...‬و ﻧﻴﺰ ‪ _FLAGS‬و ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه وﺟﻮد دارد ﻛﻪ اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺧﻮاﻧﺪﻧﻲ و ﻧﻮﺷﺘﻨﻲ ﺑﻪ ﺛﺒﺎﺗﻬﺎ را ﻣﻲدﻫﻨﺪ‪.‬‬

‫ﻧﻮﺷﺘﻦ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ﺟﺪﻳﺪ‪ :‬ﺑﺮﻧﺎﻣﻪي زﻳﺮ‪ ،‬ﻧﻤﻮﻧﻪاي از ﻳﻚ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪ ‪ 1CH‬ﺑﻪ زﺑﺎن ‪ C‬و ﺑﺎ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﻮرﻟﻨﺪ اﺳﺖ‪:‬‬
‫>‪#include <stdio.h‬‬
‫>‪#include <dos.h‬‬
‫>‪#include <conio.h‬‬

‫‪#define INTR 0X1C‬‬ ‫‪/* The clock tick interrupt */‬‬

‫‪#ifdef __cplusplus‬‬
‫‪#define __CPPARGS ...‬‬
‫‪#else‬‬
‫‪#define __CPPARGS‬‬
‫‪#endif‬‬

‫;)‪void interrupt ( *oldhandler)(__CPPARGS‬‬


‫‪int count=0; /* Global counter */‬‬
‫)‪void interrupt handler(__CPPARGS‬‬
‫{‬
‫‪/* increase the global counter */‬‬
‫;‪count++‬‬
‫;)‪gotoxy(10, 10‬‬
‫;)‪printf(“%d”, count‬‬
‫‪/* call the old routine */‬‬
‫;)(‪oldhandler‬‬
‫}‬

‫)‪int main(void‬‬

‫_________________________________________________________________________________‬
‫‪pseudovariables ١‬‬
‫‪7-2‬‬ ‫ﻓﺼﻞ ‪ :2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬

‫{‬
‫‪/* save the old interrupt vector */‬‬
‫;)‪oldhandler = getvect(INTR‬‬
‫‪/* install the new interrupt handler */‬‬
‫;)‪setvect(INTR, handler‬‬
‫;)”‪puts(“Press any key to exit‬‬
‫;)(‪getch‬‬
‫‪/* reset the old interrupt handler */‬‬
‫;)‪setvect(INTR, oldhandler‬‬
‫;‪return 0‬‬
‫}‬
‫ﺧﻮاﻧﺪن ﭘﺮﭼﻤﻬﺎ در ﺛﺒﺎت ﭘﺮﭼﻢ‪ :‬در ﺑﺴﻴﺎري از ﺣﺎﻟﺖﻫﺎ‪ ،‬ﺛﺒﺎت ﭘﺮﭼﻢ ﻣﻲﺗﻮاﻧﺪ اﻃﻼﻋﺎﺗﻲ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮﮔﺮداﻧﺪ‪ .‬ﺗﻮاﺑﻊ ‪ DOS‬ﺑﻪﻃﻮر ﮔﺴﺘﺮده از ‪Carry‬‬
‫‪ Flag‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪ ،‬ﻛﻪ ﭘﺲ از ﭘﺎﻳﺎن ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ﻳﺎ اﺟﺮاي ﻧﺎﻣﻮﻓﻖ آن‪ ،‬ﻣﻘﺪاردﻫﻲ ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ﺳﻬﻮﻟﺖ ﺑﺮرﺳﻲ ﭘﺮﭼﻤﻬﺎ‪ ،‬ﺳﺎﺧﺘﺎر ‪ WORDREGS‬داراي ﻳﻚ‬
‫ﻓﻴﻠﺪ ﺑﻪﻧﺎم ‪ cflag‬اﺳﺖ ﻛﻪ ﻣﻘﺪار ‪ Carry Flag‬ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪ در آن ﺑﺎر ﻣﻲﺷﻮد و ﻳﻜﻲ از ﻣﻘﺎدﻳﺮ ‪ 0‬ﻳﺎ ‪ 1‬را ﺧﻮاﻫﺪ داﺷﺖ‪ .‬در ﺑﺮﻧﺎﻣﻪي زﻳﺮ اﻳﻦ ﭘﺮﭼﻢ ﭘﺲ از‬
‫ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ 13H‬وﻗﻔﻪي ‪ 21H‬ﺑﺮرﺳﻲ ﻣﻲﺷﻮد‪:‬‬
‫>‪#include <dos.h‬‬
‫) ‪void test ( void‬‬
‫{‬
‫;‪union REGS pregs‬‬
‫;‪pregs.h.ah = 0x13‬‬
‫;‪pregs.h.dl = 0‬‬
‫;) ‪intdos( &pregs, &pregs‬‬
‫) ‪if ( &pregs.x.cflag‬‬
‫‪; /* Carry flag set */‬‬
‫‪else‬‬
‫‪; /* Carry flag unset */‬‬
‫}‬
‫اﮔﺮ ﻧﻴﺎز ﺑﻪ ﺧﻮاﻧﺪن ﻫﻤﻪي ﭘﺮﭼﻤﻬﺎ ﺑﺎﺷﺪ‪ ،‬در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﻣﻴﻜﺮوﺳﺎﻓﺖ راهﺣﻠﻲ ﺑﺮاي آن وﺟﻮد ﻧﺪارد‪ .‬وﻟﻲ در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ ﻓﻴﻠﺪ دﻳﮕﺮي ﺑﻪﻧﺎم ‪ flags‬در‬
‫ﺳﺎﺧﺘﺎر ‪ WORDREGS‬وﺟﻮد دارد ﻛﻪ ﻫﻤﻪي ﭘﺮﭼﻤﻬﺎي ﭘﺮدازﻧﺪه را ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ .‬ﺑﻨﺎﺑﺮ اﻳﻦ در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ دارﻳﻢ‪:‬‬

‫{ ‪struct WORDREGS‬‬ ‫‪/* Borland only! */‬‬


‫;‪unsigned int ax, bx, cx, dx, si, di, cflag, flags‬‬
‫;}‬
‫ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺟﺪول زﻳﺮ ﻣﻲﺗﻮاﻧﻴﻢ ﺗﻌﻴﻴﻦ ﻛﻨﻴﻢ ﻛﻪ ﻛﺪام ﭘﺮﭼﻢ ﻣﻘﺪار ﮔﺮﻓﺘﻪ اﺳﺖ‪:‬‬

‫‪Constant‬‬ ‫‪Bit Position‬‬ ‫‪Bit Value‬‬

‫‪Carry‬‬ ‫‪0‬‬ ‫‪1‬‬


‫‪Parity‬‬ ‫‪2‬‬ ‫‪4‬‬
‫‪Auxiliary‬‬ ‫‪4‬‬ ‫‪16‬‬
‫‪Zero‬‬ ‫‪6‬‬ ‫‪64‬‬
‫‪Sign‬‬ ‫‪7‬‬ ‫‪128‬‬
‫‪Overflow‬‬ ‫‪11‬‬ ‫‪2048‬‬

‫ﺑﺎﻓﺮﻫﺎ و زﺑﺎن ‪ :C‬ﺑﺴﻴﺎري از ﺗﻮاﺑﻊ وﻗﻔﻪ ﺑﻪ ﭘﺎراﻣﺘﺮﻫﺎﻳﻲ از ﻧﻮع اﺷﺎرهﮔﺮ ﺑﻪ ﺑﺎﻓﺮ ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﻧﻴﺎز دارﻧﺪ‪ .‬اﻳﻦ ﺗﻮاﺑﻊ ﻳﺎ اﻃﻼﻋﺎت را از ﺑﺎﻓﺮ ﺑﺮﻣﻲدارﻧﺪ ﻳﺎ در‬
‫آن ﻗﺮار ﻣﻲدﻫﻨﺪ‪ .‬اﻳﻦ اﺷﺎرهﮔﺮﻫﺎ ﻫﻤﻴﺸﻪ ‪ FAR‬ﺑﻮده و ﺷﺎﻣﻞ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ و ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﻫﺴﺘﻨﺪ‪ .‬اﺷﺎرهﮔﺮﻫﺎي ‪ FAR‬ﺑﺮﺧﻼف اﺷﺎرهﮔﺮﻫﺎي ‪ ،NEAR‬ﺑﻪ دادهﻫﺎي‬
‫ﻣﻮﺟﻮد در ﻫﺮ ﺟﺎي ﺣﺎﻓﻈﻪ و ﺧﺎرج از ﻗﻄﻌﻪي ﺟﺎري ﺑﺮﻧﺎﻣﻪ ﻣﻲﺗﻮاﻧﻨﺪ اﺷﺎره ﻛﻨﻨﺪ‪.‬‬

‫ارﺳﺎل اﺷﺎرهﮔﺮﻫﺎ ﺑﻪ ﺗﻮاﺑﻊ وﻗﻔﻪ‪ :‬ﺗﺎﺑﻊ ‪ ،DOS 09H‬ﻣﺜﺎﻟﻲ از ﻳﻚ ﺗﺎﺑﻊ اﺳﺖ ﻛﻪ ﭘﺎراﻣﺘﺮي از ﻧﻮع اﺷﺎرهﮔﺮ دارد‪ .‬اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ رﺷﺘﻪ را ﺑﺮ روي‬
‫ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ و از ﻧﻘﻄﻪي ﺷﺮوع ﻣﺤﻞ ﻓﻌﻠﻲ ﻣﻜﺎنﻧﻤﺎ‪ ،‬ﻧﺸﺎن ﻣﻲدﻫﺪ‪ .‬ﻫﻤﺎﻧﻨﺪ ﻫﻤﻪي ﺗﻮاﺑﻊ ‪ ،DOS‬اﻳﻦ ﺗﺎﺑﻊ اﻧﺘﻈﺎر دارد ﻛﻪ ﺷﻤﺎرهي ﺗﺎﺑﻊ در ﺛﺒﺎت ‪ AH‬ﺑﺎﺷﺪ و ﻧﺸﺎﻧﻲ‬
‫ﺷﺮوع ﺑﺎﻓﺮ ﺣﺎوي رﺷﺘﻪاي ﻛﻪ ﻗﺮار اﺳﺖ ﻧﻤﺎﻳﺶ داده ﺷﻮد در زوج ﺛﺒﺎت ‪ DS:DX‬ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﺪ‪ DS .‬ﻣﻘﺪار ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ و ‪ DX‬ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﺑﺎﻓﺮ اﺳﺖ‪.‬‬
‫‪8-2‬‬ ‫ﻓﺼﻞ ‪ :2‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬

‫ﺑﺎ وﺟﻮدﻳﻜﻪ اﻳﺠﺎد رﺷﺘﻪ در زﺑﺎن ‪ C‬آﺳﺎن اﺳﺖ‪ ،‬وﻟﻲ ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻧﺸﺎﻧﻲ ﺑﺎﻓﺮ رﺷﺘﻪ را ﺑﺪﺳﺖ آورده و در ﺛﺒﺎﺗﻬﺎي ‪ DS‬و ‪ DX‬ﻗﺮار دﻫﻴﺪ‪ .‬ﺑﺮاي اﻳﻦ‬
‫ﻣﻨﻈﻮر در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ و ﻣﻴﻜﺮوﺳﺎﻓﺖ دو ﻣﺎﻛﺮو ﺑﺎ ﻧﺎﻣﻬﺎي )(‪ FP_SEG‬و )(‪ FP_OFF‬وﺟﻮد دارد‪ ،‬ﻛﻪ ﺑﻪﺗﺮﺗﻴﺐ ﻧﺸﺎﻧﻲﻫﺎي ﻗﻄﻌﻪ و ﻣﺒﺪأ ﻳﻚ ﺷﺊ را در ﺣﺎﻓﻈﻪ‬
‫ﺑﺪﺳﺖ ﻣﻲدﻫﻨﺪ‪ .‬اﻣﺎ روش ﺗﻌﺮﻳﻒ آﻧﻬﺎ در اﻳﻦ دو ﻧﻮع ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﺎ ﻫﻢ ﻣﺘﻔﺎوت اﺳﺖ‪:‬‬

‫‪Borland:‬‬
‫))‪#define FP_SEG( fp ) ( (unsigned )( void _seg * )( void far * ) ( fp‬‬
‫))‪#define FP_OFF( fp ) ( (unsigned )( fp‬‬
‫‪Microsoft:‬‬
‫))‪#define FP_SEG( fp ) (*((unsigned _far *) & (fp)+1‬‬
‫)))‪#define FP_OFF( fp ) (*((unsigned _far *) & (fp‬‬
‫درﺣﺎﻟﻴﻜﻪ ﻣﺎﻛﺮوي ﺗﻌﺮﻳﻒ ﺷﺪه ﺑﻮﺳﻴﻠﻪي ﺑﻮرﻟﻨﺪ ﻳﻚ ﻣﺘﻐﻴﺮ را ﻣﻲﭘﺬﻳﺮد‪ ،‬ﻣﺎﻛﺮوي ﻣﻴﻜﺮوﺳﺎﻓﺖ‪ ،‬اﺷﺎرهﮔﺮي ﺑﻪ ﻳﻚ ﻣﺘﻐﻴﺮ و از ﻧﻮع ‪ FAR‬را ﻗﺒﻮل ﻣﻲﻛﻨﺪ‪ .‬در‬
‫ﻣﺜﺎل زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲﻛﻨﻴﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲﺗﻮاﻧﻴﺪ اﻳﻦ ﻣﺎﻛﺮوﻫﺎ را در دو ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﺎ ﺗﺎﺑﻊ ‪ DOS 09H‬ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار دﻫﻴﺪ‪ .‬اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﺗﺎﺑﻊ ‪ DOS 09H‬ﺑﺮاي‬
‫ﻧﻤﺎﻳﺶ رﺷﺘﻪي ﻣﻮﺟﻮد در ﻣﺘﻐﻴﺮ ﭘﻴﻐﺎم ﺑﺮ روي ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮﺧﻼف ﺳﺎﻳﺮ ﺗﻮاﺑﻊ ‪ ،DOS‬ﺗﺎﺑﻊ ‪ 09H‬ﻧﻴﺎز ﺑﻪ ﻣﺸﺨﺺ ﺷﺪن ﭘﺎﻳﺎن رﺷﺘﻪ ﺑﺎ ﻛﺎراﻛﺘﺮ‬
‫’‪ ‘$‬دارد‪ ،‬ﻧﻪ ﺑﺎﻳﺖ ‪. null‬‬

‫‪/* Borland Version */‬‬


‫>‪#include <dos.h‬‬
‫) ‪void main ( void‬‬
‫{‬
‫;‪union REGS pregs‬‬
‫;‪struct SREGS sregs‬‬
‫;”‪char Message[20] = “PC Interns$‬‬
‫;‪pregs.h.ah = 0x09‬‬
‫;) ‪pregs.h.ds = FP_SEG ( Message‬‬
‫;) ‪pregs.x.dx = FP_OFF ( Message‬‬
‫;) ‪intdosx ( &pregs, &pregs, &sregs‬‬
‫}‬

‫‪/* Microsoft Version */‬‬


‫>‪#include <dos.h‬‬
‫) ‪void main ( void‬‬
‫{‬
‫;‪union REGS pregs‬‬
‫;‪struct SREGS sregs‬‬
‫;”‪char Message[20] = “PC Interns$‬‬
‫‪void far *mesptr = Message; /* FAR pointer to string */‬‬
‫;‪pregs.h.ah = 0x09‬‬
‫;) ‪pregs.h.ds = FP_SEG ( mesptr‬‬
‫;) ‪pregs.x.dx = FP_OFF ( mesptr‬‬
‫;) ‪intdosx ( &pregs, &pregs, &sregs‬‬
‫}‬

‫درﻳﺎﻓﺖ اﺷﺎرهﮔﺮﻫﺎ از ﺗﻮاﺑﻊ وﻗﻔﻪ‪ :‬ﺑﺮﻧﺎﻣﻪي زﻳﺮ ﺗﺎﺑﻊ ‪ DOS 1BH‬را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ ﻛﻪ ﻳﻚ اﺷﺎرهﮔﺮ را در زوج ﺛﺒﺎت ‪ DS:BX‬ﺑﺮﻣﻲﮔﺮداﻧﺪ‪.‬‬
‫اﻳﻦ اﺷﺎرهﮔﺮ ﺑﻪ ﻳﻚ ﺑﺎﻳﺖ ﻛﻪ ﺷﺎﻣﻞ ﻛﺪ رﺳﺎﻧﻪي ﮔﺮداﻧﻨﺪهي ﺟﺎري اﺳﺖ‪ ،‬اﺷﺎره ﻣﻲﻛﻨﺪ‪ DOS .‬از ﻛﺪﻫﺎي رﺳﺎﻧﻪ ‪ F0H‬ﺗﺎ ‪ FFH‬ﺑﺮاي ﺗﻮﺻﻴﻒ اﻧﻮاع ﻣﺨﺘﻠﻒ ﮔﺮداﻧﻨﺪهﻫﺎ‬
‫اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪ .‬ﻣﻘﺪار ‪ F8H‬ﻫﻤﻪي اﻧﻮاع دﻳﺴﻚ ﺳﺨﺖ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ‪.‬‬

‫ﺑﺮاي ﺗﻌﻴﻴﻦ ﺷﻨﺎﺳﻪي رﺳﺎﻧﻪ از اﺷﺎرهﮔﺮ ﺑﺮﮔﺸﺘﻲ‪ ،‬ﻧﻴﺎز ﺑﻪ ﻳﻚ اﺷﺎرهﮔﺮ ‪ FAR‬اﺳﺖ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر در ‪ DOS.H‬ﻳﻚ ﻣﺎﻛﺮو ﺑﻪ ﻧﺎم ‪ MK_FP‬ﺗﻌﺮﻳﻒ‬
‫ﺷﺪه اﺳﺖ و ﺑﺎ اﺳﺘﻔﺎده از ﻧﺸﺎﻧﻲﻫﺎي ﻗﻄﻌﻪ و ﻣﺒﺪأ‪ ،‬ﻳﻚ اﺷﺎرهﮔﺮ ‪ FAR‬اﻳﺠﺎد ﻣﻲﻛﻨﺪ‪ .‬ﺗﻌﺮﻳﻒ اﻳﻦ ﻣﺎﻛﺮو در ﺑﺮﻧﺎﻣﻪي زﻳﺮ آﻣﺪه اﺳﺖ‪ .‬در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ‪ mp‬ﺑﻪﻋﻨﻮان ﻣﺘﻐﻴﺮي‬
‫‪ far‬و از ﻧﻮع ‪ unsigned char‬ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ‪ .‬ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ ،DOS 1BH‬ﺑﺮﻧﺎﻣﻪ اﺷﺎرهﮔﺮ ﺑﺮﮔﺸﺘﻲ را ﭘﺲ از ﺑﺪﺳﺖآوردن از زوج ﺛﺒﺎت ‪ DS:BX‬در‬
‫‪ mp‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﺑﺮﻧﺎﻣﻪ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر از ﻣﺎﻛﺮوي ‪ MK_FP‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ اﺷﺎرهﮔﺮ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت ﻣﻮرد اﺷﺎره‪ ،‬ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ‪ .‬دﺳﺘﻮر‬
‫‪ printf‬در ﭘﺎﻳﺎن ﺑﺮﻧﺎﻣﻪ اﻳﻦ ﻣﺴﺄﻟﻪ را ﻧﺸﺎن ﻣﻲدﻫﺪ‪.‬‬
‫>‪#include <dos.h‬‬
‫>‪#include <stdio.h‬‬
‫‪#ifndef MK_FP‬‬
‫)))‪#define MK_FP ( seg, ofs) ( (void far * ) ((unsigned long) (seg) << 16)(ofs‬‬
‫‪#endif‬‬
9-2 ‫ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ در ﻋﻤﻞ‬:2 ‫ﻓﺼﻞ‬

void main (void)


{ union REGS pregs;
struct SREGS sregs;
unsigned char far *mp;
pregs.h.ah = 0x1B;
intdosx( &pregs, &pregs, &sregs );
mp = MK_FP ( sregs.ds, pregs.x.bx );
printf (“Media ID = %d\n”, *mp);
}
‫ ﻣﻲﺗﻮان ﺑﺮاي ﻧﻮﺷﺘﻦ‬pokeb ‫ و‬poke ‫ از ﺗﻮاﺑﻊ‬،C ‫ در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ‬:peekb ‫ و‬peek ،pokeb ،poke ‫دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪ ﺑﺎ‬
segment:offset ‫ از ﻧﺸﺎﻧﻲ‬byte ‫ ﻳﺎ‬integer ‫ ﺑﺮاي ﺧﻮاﻧﺪن ﻳﻚ‬peekb ‫ و‬peek ‫ ﺣﺎﻓﻈﻪ و از ﺗﻮاﺑﻊ‬segment:offset ‫ در ﻧﺸﺎﻧﻲ‬byte ‫ ﻳﺎ‬integer
:‫ﺣﺎﻓﻈﻪ اﺳﺘﻔﺎده ﻧﻤﻮد‬

void poke(unsigned segment, unsigned offset, int value);


void pokeb(unsigned segment, unsigned offset, char value);
int peek(unsigned segment, unsigned offset);
char peekb(unsigned segment, unsigned offset);

‫ ﺗﻮاﺑﻊ ﻣﺘﻌﺪدي ﺑﺮاي ﻛﺎر ﺑﺎ درﮔﺎهﻫﺎ ﻣﻌﺮﻓﻲ ﺷﺪهاﻧﺪ ﻛﻪ در ﺑﻮرﻟﻨﺪ در‬،‫ ﻫﻢ در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ و ﻫﻢ ﻣﻴﻜﺮوﺳﺎﻓﺖ‬:C ‫دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎهﻫﺎ در‬
:‫ ﺗﻌﺮﻳﻒ اﻳﻦ ﺗﻮاﺑﻊ در دو ﻧﻮع ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﺎ ﻫﻢ ﻣﺘﻔﺎوت اﺳﺖ‬.‫ ﺗﻌﺮﻳﻒ ﺷﺪهاﻧﺪ‬CONIO.H ‫ و در ﻣﻴﻜﺮوﺳﺎﻓﺖ در‬DOS.H

Microsoft: Include File <CONIO.H>


int inp ( unsigned port );
unsigned inpw ( unsigned port );
int outp ( unsigned port, int databyte );
unsigned outpw ( unsigned port, int dataword );

Borland: Include File <DOS.H>


int inport ( int __portid );
unsigned char inportb ( int __portid );
void outport ( int __portid, int __value );
void outportb ( int __portid, unsigned char __value );

#define inp ( portid ) inportb ( portid )


#define outp ( portid, v ) outportb ( portid, v )
‫ و‬inp() ‫ در ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﻮرﻟﻨﺪ ﺑﺮاي ﺳﺎزﮔﺎري ﺑﺎ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻣﻴﻜﺮوﺳﺎﻓﺖ دو ﻣﺎﻛﺮوي‬.‫ ﺑﻴﺘﻲ دارﻧﺪ‬16 ‫ و‬8 ‫ﻫﺮ دو ﻛﺎﻣﭙﺎﻳﻠﺮ ﺗﻮاﺑﻌﻲ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎهﻫﺎي‬
.‫ ﺑﻴﺘﻲ ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ‬8 ‫ ﺑﺮاي درﮔﺎهﻫﺎي‬outp()

:‫ ﺧﻮاﻧﺪه ﻣﻲﺷﻮد‬،‫ اﺳﺖ‬EGA/VGA ‫ ﻛﻪ ﺑﺨﺸﻲ از ﻛﻨﺘﺮﻟﺮ ﮔﺮاﻓﻴﻜﻲ در ﻳﻚ ﻛﺎرت‬،3C4H ‫در ﻣﺜﺎل زﻳﺮ ﻣﺤﺘﻮي درﮔﺎه‬

XByte = inp (0x3C4 );


XWord = inpw ( 0x3C4 );
:‫ﺟﻤﻠﻪﻫﺎي زﻳﺮ اﺟﺎزهﻣﻲدﻫﻨﺪ ﻛﻪ ﻳﻚ ﺑﺎﻳﺖ ﻳﺎ ﻛﻠﻤﻪ ﺑﻪ درﮔﺎه ارﺳﺎل ﺷﻮد‬

outp ( 0x3C4, XByte);


outpw ( 0x3C4, XWord);
‫ﻓﺼﻞ ‪ :3‬ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎﻳﻲ ورودي‪/‬ﺧﺮوﺟﻲ‬
‫)‪(The BIOS‬‬

‫‪ 1-3‬ﻣﻘﺪﻣﻪ‬
‫ﺑﺴﻴﺎري از ﻛﺎرﺑﺮان اﺻﻄﻼح ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ در ‪ PC‬را ﺑﺎ ‪ DOS‬ﺑﺮاﺑﺮ ﻣﻲداﻧﻨﺪ‪ .‬اﻣﺎ‪ DOS ،‬ﺗﻨﻬﺎ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ در ‪ PC‬ﻧﻴﺴﺖ‪ .‬ﻗﺒﻞ از آﻧﻜﻪ ﮔﺮداﻧﻨﺪه دﻳﺴﻚ‬
‫ﺳﺨﺖ در ﺳﻴﺴﺘﻢ ﺷﻨﺎﺧﺘﻪ ﺷﺪه ﺑﺎﺷﺪ‪ PC ،‬ﺑﺮاي ‪ BIOS‬ﺟﺴﺘﺠﻮ ﻣﻲﻛﻨﺪ‪ ،‬ﺗﺎ رواﻟﻬﺎي ﻣﺒﻨﺎﻳﻲ ورودي و ﺧﺮوﺟﻲ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ارﺗﺒﺎط ﺳﺨﺖاﻓﺰار و ﻧﺮماﻓﺰار در اﺧﺘﻴﺎر‬
‫ﺑﮕﻴﺮد‪ BIOS .‬ﺑﺮ روي ﻳﻚ ‪ ROM‬در ﺣﺎﻓﻈﻪي در ﺑﺮد اﺻﻠﻲ ‪ PC‬وﺟﻮد دارد و ﺑﻼﻓﺎﺻﻠﻪ ﭘﺲ از روﺷﻦ ﺷﺪن ‪ ،PC‬در دﺳﺘﺮس اﺳﺖ‪ BIOS .‬ﺷﺎﻣﻞ ﻫﻤﻪي رواﻟﻬﺎي‬
‫اﺳﺎﺳﻲ ﻣﻮردﻧﻴﺎز ‪ PC‬ﺑﺮاي ارﺗﺒﺎط ﺑﺎ ﺳﺨﺖاﻓﺰار و ﻟﻮازم ﺟﺎﻧﺒﻲ اﺳﺖ‪ .‬اﻳﻦ رواﻟﻬﺎ ﺷﺎﻣﻞ دﺳﺘﻮرات ﻣﺪﻳﺮﻳﺖ ﺧﺮوﺟﻲ ﺻﻔﺤﻪﻧﻤﺎﻳﺶ‪ ،‬ﺧﺮوﺟﻲ ﭼﺎﭘﻲ‪ ،‬ﺗﺎرﻳﺦ‪ ،‬زﻣﺎن و ﻏﻴﺮه اﺳﺖ‪.‬‬

‫ﭼﺮا ‪ BIOS‬ﻣﻬﻢ اﺳﺖ؟ از آﻧﺠﺎﻳﻲ ﻛﻪ ﺗﻮاﺑﻊ ‪ BIOS‬اﺳﺘﺎﻧﺪارد ﻫﺴﺘﻨﺪ‪ ،‬ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ ﻣﺠﺒﻮر ﺑﻪ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺮاي ﻳﻚ ‪ PC‬ﺑﺎ ﭘﻴﻜﺮهﺑﻨﺪي‬
‫ﺳﺨﺖاﻓﺰاري ﺧﺎص ﻧﻴﺴﺖ‪ .‬ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ را ﻣﻲﺗﻮان ﺑﺮ روي ﻳﻚ ‪ PC‬ﻧﻮﺷﺖ و آﻧﺮا ﺑﺮ روي ﻫﻤﻪي ‪PC‬ﻫﺎي ﺳﺎزﮔﺎر‪ 1‬ﺑﺎ آن ﺑﺪون ﺧﻄﺎ اﺟﺮا ﻧﻤﻮد‪ ،‬ﺣﺘﻲ اﮔﺮ‬
‫ﺳﺨﺖاﻓﺰار ﻳﺎ رواﻟﻬﺎي ﺧﺎﺻﻲ از ‪ BIOS‬آﻧﻬﺎ ﺑﺎ ﻫﻢ ﺑﻪﻃﻮر ﻛﺎﻣﻞ ﺳﺎزﮔﺎر ﻧﺒﺎﺷﺪ‪.‬‬

‫‪ BIOS‬ﺑﺨﺶ ﻣﻬﻤﻲ از ‪ PC‬اﺳﺖ‪ .‬ﻣﻬﻢ ﻧﻴﺴﺖ ﻛﻪ ‪ PC‬ﺳﺎﺧﺖ ﻛﺪام ﺷﺮﻛﺖ اﺳﺖ ﻳﺎ ﻇﺮﻓﻴﺖ دﻳﺴﻚ ﺳﺨﺖ آن ﭼﻨﺪ ﻣﮕﺎﺑﺎﻳﺖ اﺳﺖ‪ .‬ﻣﻬﻢ اﻳﻦ اﺳﺖ ﻛﻪ در‬
‫ﻫﺮ ﺣﺎل‪ ،‬ﺗﻮاﺑﻊ ﭘﺸﺘﻴﺒﺎﻧﻲ دﻳﺴﻚ ﺳﺨﺖ در ‪ ،BIOS‬ﻳﻜﺴﺎن ﻫﺴﺘﻨﺪ‪.‬‬

‫‪ ،BIOS‬واﺑﺴﺘﻪ ﺑﻪ ﺳﺨﺖاﻓﺰار اﺳﺖ و ﻋﺎﻣﻞ اﺻﻠﻲ ﻣﺮﺳﻮم ﺷﺪن ‪ PC‬اﺳﺖ‪ ،BIOS .‬ﺳﺎزﻧﺪﮔﺎن ﻣﺨﺘﻠﻒ ‪ PC‬را ﻗﺎدر ﻣﻲﺳﺎزد ﻛﻪ ﻳﻚ ‪ PC‬ﻣﺘﻔﺎوت ﺑﺎ‬
‫‪ IBM PC‬ﺑﺴﺎزﻧﺪ‪ ،‬اﻣﺎ داراي ‪ BIOS‬ﻳﻜﺴﺎﻧﻲ ﺑﺎ آن ﺑﺎﺷﺪ و ﺑﺘﻮاﻧﺪ ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ را ﻛﻪ ﺑﺮ روي آن اﺟﺮا ﻣﻲﺷﻮﻧﺪ‪ ،‬اﺟﺮا ﻛﻨﺪ‪.‬‬

‫ﭼﻨﺪﻳﻦ ﺷﺮﻛﺖ ﺗﺮاﺷﻪﻫﺎي ‪ BIOS‬را ﻣﻲﺳﺎزﻧﺪ ﻛﻪ ﻣﻲﺗﻮان از ‪ Award ،Phoenix ،AMI‬و ‪ Quadtel‬ﻧﺎم ﺑﺮد‪ .‬ﮔﺮﭼﻪ اﻳﻦ ‪BIOS‬ﻫﺎ داراي‬
‫ﺗﻔﺎوﺗﻬﺎﻳﻲ ﺑﺎ ﻫﻢ ﻫﺴﺘﻨﺪن‪ ،‬وﻟﻲ وﻇﺎﻳﻒ اﺳﺎﺳﻲ آﻧﻬﺎ ﻳﻜﺴﺎن اﺳﺖ‪.‬‬

‫‪ 2-3‬اﺳﺘﺎﻧﺪارد ‪BIOS‬‬
‫‪ ،IBM‬اﻧﻮاع ﻣﺨﺘﻠﻒ ﺗﻮاﺑﻊ ‪ BIOS‬و ﭘﺎراﻣﺘﺮﻫﺎي ﻣﻮرد ﻧﻴﺎز در ‪ PC‬را ﺗﻌﺮﻳﻒ ﻧﻤﻮده اﺳﺖ‪ 256 .‬وﻗﻔﻪ در ‪ BIOS‬وﺟﻮد دارد ﻛﻪ ﺑﻪ ﺗﻮاﺑﻊ ﺗﻘﺴﻴﻢ ﺷﺪهاﻧﺪ‪.‬‬
‫اﻳﻦ ﺗﻮاﺑﻊ ارﺗﺒﺎط ﺑﺎ ﺳﺨﺖاﻓﺰار را ﻣﻴﺴﺮ ﻣﻲﺳﺎزﻧﺪ‪ .‬در ﺟﺪول زﻳﺮ اﻳﻦ ﺗﻮاﺑﻊ ﻧﻤﺎﻳﺶ دادهﺷﺪهاﻧﺪ‪ BIOS .‬ﺑﻪ ﺑﺮﺧﻲ از وﻗﻔﻪﻫﺎ ﺑﻪﻋﻨﻮان ﻣﺘﻐﻴﺮ ﻧﮕﺎه ﻣﻲﻛﻨﺪ‪ ،‬ﻧﻈﻴﺮ ﺗﻮاﺑﻊ ﻛﺎرت‬
‫وﻳﺪﺋﻮﻳﻲ و ﮔﺮداﻧﻨﺪهي دﻳﺴﻚ ﺳﺨﺖ‪ .‬در اﻳﻦ ﺑﺎره در اداﻣﻪ ﺑﻴﺸﺘﺮ ﺗﻮﺿﻴﺢ داده ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬

‫‪Number‬‬ ‫‪Meaning‬‬
‫‪10H‬‬ ‫‪Video card access‬‬
‫‪11H‬‬ ‫‪Configuration test‬‬
‫‪12H‬‬ ‫‪RAM test‬‬
‫‪13H‬‬ ‫‪BIOS disk functions‬‬
‫‪14H‬‬ ‫‪Serial interface functions‬‬
‫‪15H‬‬ ‫‪Cassette and extended AT functioms‬‬
‫‪16H‬‬ ‫‪Keyboard functions‬‬
‫‪17H‬‬ ‫‪Parallel interface functions‬‬
‫‪1AH‬‬ ‫‪Date/tme/realtime clock functions‬‬

‫_________________________________________________________________________________‬
‫‪compatilbe ١‬‬
‫‪2-3‬‬ ‫ﻓﺼﻞ ‪ :3‬ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎﻳﻲ ورودي ‪ /‬ﺧﺮوﺟﻲ‬

‫‪ 3-3‬ﺗﻌﻴﻴﻦ ﻧﮕﺎرش ‪BIOS‬‬


‫ﻧﮕﺎرش و ﺗﺎرﻳﺦ ‪ BIOS‬در ﻧﺸﺎﻧﻲ ‪ ROM-BIOS F000:FFF0‬وﺟﻮد دارد و ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻣﻲﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از ﺑﺮﻧﺎﻣﻪي‬
‫‪ DEBUG‬اﺳﺘﻔﺎده ﻧﻤﻮد‪:‬‬

‫‪C> debug‬‬
‫ﻓﺮﻣﺎن زﻳﺮ را وارد ﻛﻨﻴﺪ‪:‬‬

‫‪- d F000:FFF0 L 10‬‬


‫\‪F000:FFF0 CD 19 E0 00 F0 30 33 2F-32 37 2F 39 38 00 FC 5C .....03/27/98 ..‬‬
‫ﺗﺎرﻳﺦ ‪ BIOS‬در ﺳﻤﺖ راﺳﺖ ﺧﻂ ﻓﻮق ﻧﻤﺎﻳﺶ داده ﺷﺪهاﺳﺖ‪.‬‬

‫‪-q‬‬
‫>‪C‬‬
‫ﺗﻌﻴﻴﻦ ﻧﻮع ‪ :PC‬ﺗﻮاﺑﻊ ﻣﻌﻴﻨﻲ از ‪ BIOS‬ﺑﺮاي ﺷﻨﺎﺳﺎﻳﻲ ﻣﺪل ‪ PC‬ﺑﻪﻛﺎر ﻣﻲرود‪ .‬ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ ﻣﻲﺗﻮاﻧﺪ ﻣﺪل ‪ PC‬را از ﺑﺎﻳﺘﻲ ﻛﻪ در آﺧﺮﻳﻦ ﻣﻜﺎن‬
‫‪ ROM-BIOS‬در ﻧﺸﺎﻧﻲ ‪ F000:FFFE‬ﻗﺮار دارد‪ ،‬ﺷﻨﺎﺳﺎﻳﻲ ﻛﻨﺪ‪ .‬اﻳﻦ ﺑﺎﻳﺖ ﻣﻤﻜﻦ اﺳﺖ ﺷﺎﻣﻞ ﻳﻜﻲ از ﻛﺪﻫﺎي زﻳﺮ ﺑﺎﺷﺪ‪:‬‬

‫‪Model identification byte codes‬‬


‫‪Code‬‬ ‫‪Meaning‬‬

‫‪FCH‬‬ ‫‪AT‬‬
‫‪FEH‬‬ ‫‪XT‬‬
‫‪FBH‬‬
‫‪FFH‬‬ ‫‪PC‬‬

‫اﻳﻦ ﻣﻘﺎدﻳﺮ دﻗﻴﻖ ﻧﻴﺴﺘﻨﺪ و ﺗﻨﻬﺎ در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺳﺎﺧﺖ ﺷﺮﻛﺖ ‪ IBM‬ﺑﻪﻃﻮر دﻗﻴﻖ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﺷﻮﻧﺪ و ﺑﻪ دﻟﻴﻞ ﺗﻔﺎوﺗﻬﺎي ﺟﺰﺋﻲ در ‪BIOS‬ﻫﺎي ﺳﺎﺧﺖ‬
‫ﺷﺮﻛﺘﻬﺎي ﻣﺨﺘﻠﻒ اﻳﻦ روش ﺑﺮاي ﺷﻨﺎﺳﺎﻳﻲ ﻣﺪل ‪ ،PC‬روش ﻛﺎﻣﻠﻲ ﻧﻴﺴﺖ‪.‬‬

‫‪ 4-3‬ﻣﺘﻐﻴﺮﻫﺎي ‪BIOS‬‬
‫‪ BIOS‬در ‪ 256‬ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ )‪ ،(RAM‬ﻛﻪ ﻣﺤﺪودهي ﻣﺘﻐﻴﺮ ‪ 1BIOS‬ﻳﺎ ﻗﻄﻌﻪي ﻣﺘﻐﻴﺮ ‪ 2BIOS‬ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد‪ ،‬ﻣﺘﻐﻴﺮﻫﺎي داﺧﻠﻲ ﺧﻮد را ذﺧﻴﺮه‬
‫ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ روش ﺑﻪﺻﻮرت اﺳﺘﺎﻧﺪارد در ﻫﻤﻪي اﻧﻮاع ‪BIOS‬ﻫﺎ وﺟﻮد دارد‪ ،‬زﻳﺮا ﺑﻮﺳﻴﻠﻪي ﺑﺴﻴﺎري از ﺗﻮاﺑﻊ ‪ DOS‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬در ﻓﻬﺮﺳﺖ زﻳﺮ ﻣﺘﻐﻴﺮﻫﺎي ﻣﺨﺘﻠﻒ‪،‬‬
‫اﻫﺪاف و ﻧﺸﺎﻧﻲ ﻣﺒﺪأ آﻧﻬﺎ ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ‪ .‬ﻧﺸﺎﻧﻲ ﻛﺎﻣﻞ از ﺗﻠﻔﻴﻖ ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﺑﺎ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪي ‪ 0040H‬ﺑﺪﺳﺖ ﻣﻲآﻳﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل ﻧﺸﺎﻧﻲ ﻳﻚ ﻣﺘﻐﻴﺮ ﺑﺎ ﻣﺒﺪأ ‪،10H‬‬
‫‪ 0040H:0010H‬اﺳﺖ‪.‬‬

‫‪Offset‬‬ ‫‪Function‬‬ ‫‪Size‬‬ ‫‪Access‬‬


‫‪00H‬‬ ‫‪Serial interface port addresses‬‬ ‫‪4 words‬‬ ‫‪INT 14H‬‬

‫در ﻫﻨﮕﺎم روﺷﻦ ﺷﺪن ‪ ،PC‬ﺗﺴﺖ ﺧﻮدﻛﺎر زﻣﺎن روﺷﻦﺷﺪن ﻳﺎ ‪ ،3POST‬ﭘﻴﻜﺮهﺑﻨﺪي ﺳﻴﺴﺘﻢ را ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﺪ‪ .‬ﻳﻜﻲ از ﻣﻮاردي ﻛﻪ ﺟﺰو ﭘﻴﻜﺮهﺑﻨﺪي ﺳﻴﺴﺘﻢ‬
‫اﺳﺖ‪ ،‬ﻧﺸﺎﻧﻲ واﺳﻄﻬﺎي ﺳﺮﻳﺎل ﻳﺎ ‪ RS-232‬اﺳﺖ‪ ،‬ﻛﻪ ﺑﺎ ‪ COM1‬ﺗﺎ ‪ COM4‬ﻣﺸﺨﺺ ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﻪ ﺗﻌﺪادي ﻛﻪ واﺳﻂ ﺳﺮﻳﺎل ﻧﺼﺐ ﺷﺪه اﺳﺖ‪ ،‬ﻧﺸﺎﻧﻲ درﮔﺎه آﻧﻬﺎ‬
‫ﺗﻌﻴﻴﻦ ﺷﺪه و در ﭼﻬﺎر ﻛﻠﻤﻪ ﭘﺸﺖﺳﺮ ﻫﻢ ﻛﻪ از ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ‪ 00H‬ﺷﺮوع ﻣﻲﺷﻮﻧﺪ‪ ،‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪08H‬‬ ‫‪Parallel interface port addresses‬‬ ‫‪4 words‬‬ ‫‪INT 17H‬‬


‫در ﻣﻮرد واﺳﻄﻬﺎي ﻣﻮازي )‪ (LPT1-LPT4‬ﻫﻢ ﻧﺸﺎﻧﻲ درﮔﺎهآﻧﻬﺎ ﺗﻌﻴﻴﻦ ﺷﺪه و در ﭼﻬﺎر ﻛﻠﻤﻪ ذﺧﻴﺮه ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫‪10H‬‬ ‫‪Configuration‬‬ ‫‪1 word‬‬ ‫‪INT 11H‬‬

‫_________________________________________________________________________________‬
‫‪BIOS variable segment ١‬‬
‫‪BIOS variable range ٢‬‬
‫‪Power On Self Test ٣‬‬
3-3 ‫ ﺧﺮوﺟﻲ‬/ ‫ ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎﻳﻲ ورودي‬:3 ‫ﻓﺼﻞ‬

‫ ﺗﻌﺪاد واﺳﻄﻬﺎي ﺳﺮﻳﺎل و ﻣﻮازي و ﻏﻴﺮه ﺑﺎ اﻳﻦ ﻳﻚ‬،‫ ﺣﺎﻟﺖ وﻳﺪﺋﻮﻳﻲ‬،‫ از ﻗﺒﻴﻞ ﺗﻌﺪاد ﮔﺮداﻧﻨﺪهﻫﺎي دﻳﺴﻚ ﺳﺨﺖ‬،‫ﺳﺎﻳﺮ اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﭘﻴﻜﺮهﺑﻨﺪي ﺳﻴﺴﺘﻢ‬
.‫ﻛﻠﻤﻪ ﺗﻌﻴﻴﻦ ﻣﻲﺷﻮﻧﺪ‬

12H POST status #1 1 byte POST


13H RAM size 1 word INT 12H
15H POST status #2 1 word POST
17H Keyboard status byte 1 byte INT 16H
.‫ و ﻏﻴﺮه را ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﺪ‬Alt ،Ctrl ،Shift ‫ ﻧﻈﻴﺮ‬،‫وﺿﻌﻴﺖ ﻛﻠﻴﺪﻫﺎي ﻛﻨﺘﺮﻟﻲ‬

18H Extended keyboard status byte 1 byte INT 16H


19H ASCII code entry 1 byte INT 16H
1AH Next character in keyboard buffer 1 word INT 16H
1CH Last character in keyboard buffer 1 word INT 16H
1EH Keyboard buffer 16 words INT 16H
.‫ از اﻳﻦ ﻃﺮﻳﻖ ﻣﻲﺗﻮان دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد‬،‫ ﻛﺎراﻛﺘﺮ در ﻫﺮ زﻣﺎن ﻣﻲﺗﻮاﻧﺪ در آن ﺑﺎﺷﺪ‬16 ‫ ﻛﻪ ﺣﺪاﻛﺜﺮ‬،‫ﺑﻪ ﺑﺎﻓﺮ ﭼﺮﺧﻪاي ﺻﻔﺤﻪﻛﻠﻴﺪ‬

3EH Disk drive recalibration 1 byte INT 13H


3FH Disk drive motor status 1 byte INT 13H
40H Disk drive motor timer 1 byte INT 13H
40H Disk error status 1 byte INT 13H
42H Disk controller status 7 byte INT 13H
49H Current video mode 1 byte INT 10H
4AH Number of screen columns 1 word INT 10H
4CH Screen page size 1 word INT 10H
4EH Offset address of current screen page 1 word INT 10H
50H Cursor position in eight screen pages 8 words INT 10H
60H Starting line of screen cursor 1 byte INT 10H
61H Ending line of screen cursor 1 byte INT 10H
62H Current screen page namber 1 byte INT 10H
63H Port address of video controller 1 word INT 10H
65H Mode selector register contents 1 byte INT 10H
66H Palette register contents 1 byte INT 10H
67H Miscellaneous selector register contents 5 bytes POST
6CH Timer 1 dword INT 1AH
70H 24-hours flag 1 byte INT 1AH
71H CTRL-Break flag 1 byte INT 16H
‫ﻓﺼﻞ ‪ :4‬ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬
‫)‪(Video Cards‬‬

‫‪ 1-4‬ﻣﻘﺪﻣﻪ‬
‫ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ ﻣﺨﺘﻠﻔﻲ‪ ،‬از ﻗﺒﻴﻞ ‪ ،VGA ،EGA ،CGA ،MDA‬و ‪ Hercules‬ﺗﺎﻛﻨﻮن ﻣﻌﺮﻓﻲ ﺷﺪهاﻧﺪ و اﺳﺘﺎﻧﺪارد واﺣﺪي در اﻳﻦ زﻣﻴﻨﻪ وﺟﻮد‬
‫ﻧﺪارد‪ .‬ﺣﺘﻲ ﺑﺮﺧﻲ از اﻧﻮاع ﻛﺎرﺗﻬﺎي ﺟﺪﻳﺪ‪ ،‬ﻧﻈﻴﺮ ‪ Super VGA‬و ‪ ،TIGA‬ﺧﻮد ﻧﻴﺰ داراي ﮔﻮﻧﻪﻫﺎي ﻣﺘﻔﺎوﺗﻲ ﻫﺴﺘﻨﺪ‪ .‬ﺗﻔﺎوت ﮔﻮﻧﻪﻫﺎي ﻣﺨﺘﻠﻒ ﻛﺎرﺗﻬﺎي ﮔﺮاﻓﻴﻜﻲ در‬
‫وﺿﻮ ِح‪ 1‬ﺗﺼﻮﻳﺮ‪ ،‬ﻛﺎرآﻳﻲ ﻳﺎ ﺳﺮﻋﺖ ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت‪ ،‬ﻣﻴﺰان ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ‪ 2‬و روش ﻛﺪﺑﻨﺪي اﻃﻼﻋﺎت ﺟﻬﺖ ﻧﻤﺎﻳﺶ اﺳﺖ‪.‬‬
‫ﺑﺮﺧﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﮔﻮﻧﻪﻫﺎي ﻛﺎرﺗﻬﺎي ﮔﺮاﻓﻴﻜﻲ‪ ،‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺳﺎﺑﻘﻪي آﻧﻬﺎ ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬

‫)‪ :Monochrome Display Adapter (MDA‬ﺑﻪ ﻫﻤﺮاه ‪ CGA‬از ﻗﺪﻳﻤﻲﺗﺮﻳﻦ اﻧﻮاع ﻛﺎرﺗﻬﺎي ﮔﺮاﻓﻴﻜﻲ اﺳﺖ و ﻫﻤﺮاه ﺑﺎ ﻣﻌﺮﻓﻲ ‪ ،IBM PC‬در‬ ‫•‬
‫ﺳﺎل ‪ ،1981‬ﻋﺮﺿﻪ ﺷﺪ‪ .‬اﻳﻦ ﻛﺎرت ﻓﻘﻂ ﻳﻚ ﺣﺎﻟﺖ ﻋﻤﻠﻴﺎﺗﻲ‪ 3‬را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﻨﺪ ﻛﻪ ﻧﻤﺎﻳﺶ ﻣﺘﻦ ﺗﻚ رﻧﮓ‪ ،‬در ﻗﺎﻟﺐ ‪ 80‬ﺳﺘﻮن و ‪ 25‬ردﻳﻒ اﺳﺖ‪ .‬اﻳﻦ ﻛﺎرت‬
‫داراي ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﺴﻴﺎر ﻛﻤﻲ اﺳﺖ و ﺗﻨﻬﺎ ﻳﻚ ﺻﻔﺤﻪ ﻧﻤﺎﻳﺸﻲ را ﻣﻲﺗﻮاﻧﺪ در ‪ RAM‬ﻧﮕﻬﺪاري ﻛﻨﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ اﻳﻦ ﻧﻮع ﻛﺎرت ﻧﻤﻲﺗﻮاﻧﺪ ﮔﺮاﻓﻴﻚ را ﻧﻤﺎﻳﺶ‬
‫دﻫﺪ‪.‬‬

‫)‪ :Color/Graphics Adapter (CGA‬اﻳﻦ ﻧﻮع ﻛﺎرت ﻧﻴﺰ در ﺳﺎل ‪ 1981‬ﻣﻌﺮﻓﻲ ﺷﺪ و ﺗﻮاﻧﺎﻳﻲ ﻧﻤﺎﻳﺶ ﮔﺮاﻓﻴﻚ و ﻣﺘﻨﻬﺎي رﻧﮕﻲ را داﺷﺖ‪ .‬ﻛﺴﺎﻧﻲ ﻛﻪ از‬ ‫•‬
‫اﻳﻦ ﻧﻮع ﻛﺎرت اﺳﺘﻔﺎده ﻣﻲﻛﺮدﻧﺪ ﻣﻲﺗﻮاﻧﺴﺘﻨﺪ از ﺗﻠﻮﻳﺰﻳﻮن ﺑﻪ ﺟﺎي ﺻﻔﺤﻪﻧﻤﺎﻳﺶ‪ 4‬اﺳﺘﻔﺎده ﻛﻨﻨﺪ‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرت ﺗﻮاﻧﺎﻳﻲ ﺗﻮﻟﻴﺪ ﺧﺮوﺟﻲ ‪ RGB‬را داﺷﺖ ﻛﻪ در اﻳﻦ‬
‫روش‪ ،‬از ﺳﻴﮕﻨﺎﻟﻬﺎي اﻟﻜﺘﺮﻳﻜﻲ ﻣﺘﻔﺎوﺗﻲ ﺑﺮاي رﻧﮕﻬﺎي ﻗﺮﻣﺰ‪ ،‬ﺳﺒﺰ و آﺑﻲ اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرت ﻧﻴﺰ در ﺣﺎﻟﺖ ﻣﺘﻦ‪ 80 ،‬ﺳﺘﻮن در ‪ 25‬ردﻳﻒ را ﻧﻤﺎﻳﺶ‬
‫ﻣﻲدﻫﺪ و در ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻚ داراي وﺿﻮح ‪ 320x200‬ﻧﻘﻄﻪ‪ 5‬ﺑﺎ ﭼﻬﺎر رﻧﮓ اﺳﺖ‪.‬‬

‫)‪ :Hercules Graphics Card (HGC‬در ﻫﻤﺎن زﻣﺎﻧﻬﺎ‪ ،‬ﻛﺎرت دﻳﮕﺮي ﻛﻪ از ﻫﺮﺟﻬﺖ ﻣﺸﺎﺑﻪ ‪ MDA‬ﺑﻮد وﻟﻲ ﺗﻮاﻧﺎﻳﻲ ﻧﻤﺎﻳﺶ ﮔﺮاﻓﻴﻚ را ﻧﻴﺰ داﺷﺖ‪،‬‬ ‫•‬
‫ﻣﻌﺮﻓﻲ ﺷﺪ‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرت ﺗﻮاﻧﺎﻳﻲ ﻧﻤﺎﻳﺶ ﮔﺮاﻓﻴﻚ ﺑﺎ وﺿﻮح ‪ 720x348‬ﻧﻘﻄﻪ را در دو ﺻﻔﺤﻪ دارد‪.‬‬

‫)‪ :Enhanced Graphics Adapter (EGA‬اﻳﻦ ﻛﺎرت در ﺳﺎل ‪ 1985‬ﻣﻌﺮﻓﻲ ﺷﺪ و ﺿﻤﻦ ﻓﺮاﻫﻢﺳﺎزي وﺿﻮح ﺑﻬﺘﺮ‪ ،‬داراي ﻗﻴﻤﺖ ﻛﻤﺘﺮي ﺑﻮد‪ .‬اﻳﻦ ﻧﻮع‬ ‫•‬
‫ﻛﺎرت وﺿﻮح ‪ 640x350‬ﻧﻘﻄﻪ را ﺑﺎ ‪ 16‬رﻧﮓ در ﻳﻚ زﻣﺎن و ‪ 64‬ﺳﺮيرﻧﮓ‪ 6‬ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرت داراي ﺣﺪاﻛﺜﺮ ‪ 256K‬ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﻮد‪.‬‬
‫‪ EGA‬ﺑﻮﺳﻴﻠﻪي ‪ ROM-BIOS‬اﺳﺘﺎﻧﺪار ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲﺷﻮد‪ ،‬ﺑﻠﻜﻪ ‪ ،EGA ROM-BIOS‬ﺑﻪﺟﺎي ‪ BIOS‬اﺳﺘﺎﻧﺪارد ﺳﻴﺴﺘﻢ ﻗﺮار ﮔﺮﻓﺘﻪ و اﻣﻜﺎن دﺳﺘﺮﺳﻲ‬
‫ﺑﻪ ﻗﺎﺑﻠﻴﺖﻫﺎي اﻳﻦ ﻧﻮع ﻛﺎرت را ﻓﺮاﻫﻢ ﻣﻲﺳﺎزد‪ .‬ﻏﻴﺮ از ‪ ،IBM‬ﻋﺪهي دﻳﮕﺮي از ﺳﺎزﻧﺪﮔﺎن‪ ،‬ﺷﺮوع ﺑﻪ ﺗﻮﻟﻴﺪ ﮔﻮﻧﻪﻫﺎي دﻳﮕﺮي از ‪ EGA‬ﻧﻤﻮدﻧﺪ ﻛﻪ ﺣﺎﻟﺘﻬﺎي‬
‫ﻋﻤﻠﻴﺎﺗﻲ دﻳﮕﺮي را ﻓﺮاﻫﻢ ﻣﻲﻛﺮد‪ ،‬وﻟﻲ ﺑﺎ ‪ EGA‬ﺳﺎﺧﺖ ‪ ،IBM‬ﻧﺎﺳﺎزﮔﺎر ﺑﻮدﻧﺪ‪ .‬اﻳﻦ ﻣﺴﺄﻟﻪ‪ ،‬ﻛﺎر ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﺎن را دﭼﺎر ﻣﺸﻜﻞ ﻧﻤﻮد‪.‬‬

‫)‪ :Video Graphics Array (VGA‬اﻳﻦ ﻧﻮع ﻛﺎرت در ﺳﺎل ‪ 1987‬و ﻫﻤﺰﻣﺎن ﺑﺎ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ ،IBM PS/2‬ﻣﻌﺮﻓﻲ ﺷﺪ و ﭼﻮن از ﻓﻦآورﻳﻬﺎي ﺟﺪﻳﺪﺗﺮ‬ ‫•‬
‫اﺳﺘﻔﺎده ﻣﻲﻛﺮد‪ ،‬رﻧﮕﻬﺎي ﺑﻴﺸﺘﺮ‪ ،‬وﺿﻮح ﺑﺎﻻﺗﺮ و ﻧﻤﺎﻳﺶ ﺑﻬﺘﺮ ﻣﺘﻦ را ﻓﺮاﻫﻢ ﻧﻤﻮد‪ .‬ﺑﺮ ﺧﻼف ‪ ،EGA‬ﻛﺎرﺗﻬﺎي ‪ VGA‬ﺳﻴﮕﻨﺎﻟﻬﺎي رﻧﮓ را ﺑﻪﺻﻮرت آﻧﺎﻟﻮگ ﺑﻪ‬
‫ﺻﻔﺤﻪﻧﻤﺎﻳﺶ ارﺳﺎل ﻣﻲﻛﻨﻨﺪ‪ ،‬ﻧﻪ دﻳﺠﻴﺘﺎل‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ‪ ،‬ﻛﺎرﺗﻬﺎي ‪ ،VGA‬ﺑﻴﺶ از ‪ 260000‬رﻧﮓ ﻣﺘﻔﺎوت را در ﺣﺎﻟﺘﻬﺎي ﻋﻤﻠﻴﺎﺗﻲ ‪ 16 ،4 ،2‬و ‪ 256‬ﻧﻤﺎﻳﺶ‬
‫ﻣﻲدﻫﻨﺪ‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرت وﺿﻮح ‪ 640x480‬را ﺑﺎ ‪ ،4 ،2‬ﻳﺎ ‪ 16‬رﻧﮓ‪ ،‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺣﺎﻟﺖ ﻋﻤﻠﻴﺎﺗﻲ اﻧﺘﺨﺎبﺷﺪه‪ ،‬ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪ .‬در ﻳﻚ ﺣﺎﻟﺖ ﻋﻤﻠﻴﺎﺗﻲ دﻳﮕﺮ‪ ،‬ﺑﺎ وﺿﻮح‬
‫‪ 256 ،320x200‬رﻧﮓ ﻗﺎﺑﻞ ﻧﻤﺎﻳﺶ اﺳﺖ‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرت داراي ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ‪ 256K‬اﺳﺖ ﻛﻪ ﺗﺎ ‪ 512K‬ﻧﻴﺰ ﻗﺎﺑﻞ اﻓﺰاﻳﺶ اﺳﺖ‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرت ﻧﻴﺰ‬
‫داراي ‪ ROM-BIOS‬ﺧﺎص ﺧﻮد اﺳﺖ و ﺗﻮﻟﻴﺪ ﻛﻨﻨﺪﮔﺎن ﻣﺨﺘﻠﻒ‪ ،‬از اﺳﺘﺎﻧﺪارد ﻳﻜﺴﺎﻧﻲ ﺗﺒﻌﻴﺖ ﻧﻜﺮدهاﻧﺪ‪.‬‬

‫‪ :Super VGA‬اﻳﻦ ﻧﻮع ﻛﺎرت داراي ﺳﺨﺖاﻓﺰاري ﻣﺸﺎﺑﻪ ﺑﺎ ‪ VGA‬اﺳﺖ‪ ،‬اﻣﺎ ﻧﻘﻄﻪﻫﺎ را ﺳﺮﻳﻊﺗﺮ و ﺑﺎ ﺗﻌﺪاد رﻧﮓ ﺑﻴﺸﺘﺮ و وﺿﻮح ﺑﺎﻻﺗﺮ ﻧﻤﺎﻳﺶ ﻣﻲدﻫﺪ‪.‬‬ ‫•‬
‫ﺿﻤﻦآﻧﻜﻪ‪ ،‬ﺗﻤﺎﻣﻲ ﺣﺎﻟﺘﻬﺎي ﻋﻤﻠﻴﺎﺗﻲ ‪ VGA‬را ﻧﻴﺰ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﻨﺪ‪ .‬در ﺣﺎﻟﻴﻜﻪ‪ VGA ،‬در ﺣﺎﻟﺖ ﭼﻬﺎرم ﺗﻮاﻧﺎﻳﻲ ﻧﻤﺎﻳﺶ ‪ 320x200‬ﻧﻘﻄﻪ را ﺑﺎ ‪ 256‬رﻧﮓ‬
‫داﺷﺖ‪ ،‬ﻛﺎرﺗﻬﺎي ‪ ،Super VGA‬ﺳﻪ ﺣﺎﻟﺖ ﻋﻤﻠﻴﺎﺗﻲ دﻳﮕﺮ را ﻧﻴﺰ دارﻧﺪ ﻛﻪ وﺿﻮح ‪ ،640x350 ،640x200‬و ‪ 640x480‬را ﺑﺎ ‪ 256‬رﻧﮓ ﺗﺄﻣﻴﻦ ﻣﻲﻛﻨﻨﺪ‪.‬‬
‫ﺣﺎﻟﺘﻬﺎي ﻋﻤﻠﻴﺎﺗﻲ دﻳﮕﺮي ﻧﻴﺰ وﺟﻮد دارﻧﺪ ﻛﻪ وﺿﻮح ‪ 800x600‬و ‪ 1024x768‬ﻧﻘﻄﻪ را ﻧﻴﺰ‪ ،‬در ﺻﻮرﺗﻲ ﻛﻪ از ﻳﻚ ﺻﻔﺤﻪﻧﻤﺎﻳﺶ ﺳﺎزﮔﺎر ﺑﺎ ‪ VGA‬ﻳﺎ‬
‫‪ Multiscan‬اﺳﺘﻔﺎده ﺷﻮد‪ ،‬و ﻧﻴﺰ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﻪاﻧﺪازهي ﻛﺎﻓﻲ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬در دﺳﺘﺮس ﻗﺮار ﻣﻲدﻫﻨﺪ‪ .‬در ﻣﻮرد اﻳﻦ ﻧﻮع ﻛﺎرت ﻧﻴﺰ ﺗﺎ ﺳﺎل ‪،1990‬‬

‫_________________________________________________________________________________‬
‫‪resolution ١‬‬
‫‪video RAM ٢‬‬
‫‪operationg mode ٣‬‬
‫‪monitor ٤‬‬
‫‪pixel ٥‬‬
‫‪color palette ٦‬‬
‫‪2-4‬‬ ‫ﻓﺼﻞ ‪ :4‬ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬

‫اﺳﺘﺎﻧﺪاردي وﺟﻮد ﻧﺪاﺷﺖ و در اﻳﻦ ﺳﺎل ﻳﻚ ﻛﻨﺴﺮﺳﻴﻮم ﺑﺎ ﻧﺎم اﺧﺘﺼﺎري ‪ ،1VESA‬ﺳﻌﻲ در ﺗﻌﺮﻳﻒ ﺣﺎﻟﺘﻬﺎي ﻋﻤﻠﻴﺎﺗﻲ و ‪ BIOS‬اﺳﺘﺎﻧﺪارد ﺑﺮاي اﻳﻦ ﻧﻮع ﻛﺎرت‬
‫ﻧﻤﻮد‪.‬‬

‫)‪ :Texas Instrument Graphics Architecture (TIGA‬ﻧﻮﻋﻲ ﻛﺎرت اﺳﺖ ﻛﻪ ﺑﺮﻧﺎﻣﻪﭘﺬﻳﺮ‪ 2‬اﺳﺖ و داراي ﮔﻮﻧﻪﻫﺎي ﻣﺘﻔﺎوﺗﻲ‪ ،‬ﻧﻈﻴﺮ ‪ TI34010‬و‬ ‫•‬
‫‪ TI 34020‬اﺳﺖ‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرﺗﻬﺎ‪ ،‬ﺗﺎ ‪ 5‬ﺑﺎر ﺳﺮﻳﻊﺗﺮ از ﻛﺎرﺗﻬﺎي ‪ VGA‬ﻫﺴﺘﻨﺪ‪.‬‬

‫‪ BIOS 2-4‬وﻳﺪﺋﻮﻳﻲ‬
‫در ‪ ،ROM-BIOS‬ﺗﻮاﺑﻊ ﻣﺨﺘﻠﻔﻲ در ﻗﺎﻟﺐ وﻗﻔﻪي ﺷﻤﺎرهي ‪ 10H‬ﭘﻴﺶﺑﻴﻨﻲ ﺷﺪه اﺳﺖ ﻛﻪ اﺑﺘﺪاً ﻓﻘﻂ ﺑﺎ ﻛﺎرﺗﻬﺎي ‪ MDA‬و ‪ CGA‬ﻛﺎر ﻣﻲﻛﺮدﻧﺪ‪ .‬اﻣﺎ‪،‬‬
‫ﻛﺎرﺗﻬﺎي ‪ EGA‬و ‪ ،VGA‬داراي ‪ BIOS‬ﺧﺎص ﺧﻮد ﻫﺴﺘﻨﺪ ﻛﻪ در ﻳﻚ ﺗﺮاﺷﻪ ﺑﺮ روي اﻳﻦ ﻛﺎرﺗﻬﺎ وﺟﻮد دارﻧﺪ و ﺑﺎ روﺷﻦ ﺷﺪن ﺳﻴﺴﺘﻢ‪ ،‬ﺗﻮاﺑﻊ ﺑﺴﻂﻳﺎﻓﺘﻪ ﻓﻌﺎل‬
‫ﻣﻲﺷﻮﻧﺪ‪ .‬اﻳﻦ ﻣﺠﻤﻮﻋﻪ از ﺗﻮاﺑﻊ ﺑﺴﻂﻳﺎﻓﺘﻪي ‪ BIOS‬در ارﺗﺒﺎط ﺑﺎ وﻗﻔﻪي ‪ 10H‬ﻋﻤﻞ ﻧﻤﻮده و ﺗﻮاﺑﻊ ‪ EGA‬و ‪ VGA‬را ﺑﻪ ‪ BIOS‬ﻣﻮﺟﻮد اﺿﺎﻓﻪ ﻣﻲﻛﻨﻨﺪ‪ .‬ﺗﻮاﺑﻌﻲ ﻛﻪ‬
‫ﺑﺮاي ‪ EGA‬ﻫﺴﺘﻨﺪ‪ ،‬از ﺗﻮاﺑﻊ ‪ VGA‬ﻛﻤﺘﺮ ﻫﺴﺘﻨﺪ‪.‬‬

‫ﻋﻼوه ﺑﺮ ﺗﻮاﺑﻊ ‪ ،BIOS‬از ﺗﻮاﺑﻊ ‪ DOS‬ﻧﻴﺰ ﻣﻲﺗﻮان ﺑﺮاي ﻛﺎر ﺑﺎ ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬اﻣﺎ‪ ،‬اﻳﻦ ﺗﻮاﺑﻊ از ﺗﻮاﺑﻊ ‪ ،BIOS‬ﻛﻨﺪﺗﺮ ﻫﺴﺘﻨﺪ‪ .‬ﺗﻮاﺑﻊ‬
‫‪ ،DOS‬داراي درﺟﻪي ﺑﺎﻻﺗﺮي از ﺳﺎزﮔﺎري ﺑﺎ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﻣﺨﺘﻠﻒ ﻫﺴﺘﻨﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ روش دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﺳﺨﺖاﻓﺰار ﻛﺎرت وﻳﺪﺋﻮﻳﻲ ﻧﻴﺰ ﺑﺮاي ﻛﺎر ﺑﺎ ﺻﻔﺤﻪي‬
‫ﻧﻤﺎﻳﺶ‪ ،‬ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ و از دو روش دﻳﮕﺮ ﺳﺮﻳﻊﺗﺮ اﺳﺖ‪ .‬دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ در ﻣﻮرد ﺳﺨﺖاﻓﺰار ﻛﺎرت وﻳﺪﺋﻮﻳﻲ‪ ،‬ﻧﻮﺷﺘﻦ ﻣﺴﺘﻘﻴﻢ اﻃﻼﻋﺎت در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ از‬
‫ﻧﺸﺎﻧﻲ ‪ B800H:0000‬اﺳﺖ و دﻟﻴﻞ ﺳﺮﻳﻊﺗﺮ ﺑﻮدن اﻳﻦ روش‪ ،‬ﻋﺪم ﻧﻴﺎز ﺑﻪ اﻧﺠﺎم ﻛﺎرﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪﻫﺎي ‪ BIOS‬ﻳﺎ ‪ ،DOS‬از ﻗﺒﻴﻞ ذﺧﻴﺮه ﺳﺎزي‬
‫ﻧﺸﺎﻧﻲ ﺑﺮﮔﺸﺖ‪ ،‬ﺛﺒﺎﺗﻬﺎ و ﭘﺎراﻣﺘﺮﻫﺎ ﺑﺮ روي ﭘﺸﺘﻪ و ﻏﻴﺮه اﺳﺖ‪ .‬ﻋﻴﺐ ﻣﻬﻢ روش دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ‪ ،‬واﺑﺴﺘﮕﻲ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﻪ ﺳﺨﺖاﻓﺰار اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل‪ ،‬رواﻟﻲ ﻛﻪ ﻳﻚ‬
‫ﻛﺎراﻛﺘﺮ را ﺑﺮ روي ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ ﻧﺸﺎن ﻣﻲدﻫﺪ‪ ،‬ﺑﺮاي ‪ CGA‬و ‪ MDA‬ﻣﺘﻔﺎوت ﺧﻮاﻫﺪ ﺑﻮد و روال ﻣﺮﺑﻮط ﺑﻪ ﻫﺮ ﻛﺪام در دﻳﮕﺮي ﻋﻤﻞ ﻧﺨﻮاﻫﺪ ﻛﺮد‪.‬‬

‫در ﻣﻮرد ﺗﻮاﺑﻊ ‪ ،ROM BIOS‬ﻳﻚ دﻟﻴﻞ دﻳﮕﺮ ﻛﺎﻫﺶ ﺳﺮﻋﺖ‪ ،‬دﺳﺘﺮﺳﻲ ﺑﻪ ‪ ROM BIOS‬ﺑﺮاي اﺟﺮاي ﻛﺪﻫﺎي ﺗﻮاﺑﻊ اﺳﺖ‪ .‬زﻳﺮا ‪ ROM‬ﺑﻪﺻﻮرت‬
‫‪ 8‬ﺑﻴﺘﻲ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ و اﻳﻦ ﺑﺎﻋﺚ ﻛﻨﺪ ﺷﺪن ﺳﻴﺴﺘﻢ‪ ،‬ﺑﻪوﻳﮋه در ﭘﺮدازﻧﺪهﻫﺎي ‪ 32‬ﺑﻴﺘﻲ ﺑﻪ ﺑﺎﻻ ﻣﻲﺷﻮد‪ .‬ﻳﻚ راه رﻓﻊ اﻳﻦ ﻣﺸﻜﻞ‪ ،‬ﺑﺎرﻛﺮدن ‪ ROM BIOS‬در‬
‫‪ RAM‬و در ﻣﺤﺪودهي ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ و ﺣﺪ ‪ 1‬ﻣﮕﺎﺑﺎﻳﺖ اﺳﺖ ﻛﻪ ﺑﻪ آن‪ shadow ROM ،‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﻛﺎر‪ ،‬دﺳﺘﺮﺳﻲ ‪ 16‬ﻳﺎ ‪ 32‬ﺑﻴﺘﻲ ﺑﻪ ﺗﻮاﺑﻊ ‪ROM‬‬
‫‪ BIOS‬را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪.‬‬

‫ﺗﻮاﺑﻊ ‪ BIOS‬وﻳﺪﺋﻮﻳﻲ داراي ﺷﻤﺎرهﻫﺎي ‪ 00H‬ﺗﺎ ‪ 1CH‬ﻫﺴﺘﻨﺪ ﻛﻪ ﺳﺮوﻳﺴﻬﺎي ﻣﺨﺘﻠﻔﻲ را دراﺧﺘﻴﺎر ﻗﺮار ﻣﻲدﻫﻨﺪ‪ .‬ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﻫﺮ ﻛﺪام از اﻳﻦ ﺗﻮاﺑﻊ‪،‬‬
‫ﺑﺎﻳﺪ ﺛﺒﺎت ‪ AH‬ﺑﺎ ﺷﻤﺎرهي ﻣﻮردﻧﻈﺮ ﻣﻘﺪاردﻫﻲ ﺷﻮد‪ .‬اﮔﺮ ﻳﻚ زﻳﺮﺗﺎﺑﻊ ﻣﻮرد ﻧﻈﺮ ﺑﺎﺷﺪ‪ ،‬ﺷﻤﺎرهي آن در ﺛﺒﺎت ‪ AL‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫‪Video BIOS functions and support from EGA, VGA and standard BIOS‬‬
‫‪No.‬‬ ‫‪Meaning‬‬
‫‪00H‬‬ ‫‪Determine video mode‬‬
‫‪01H‬‬ ‫‪Define cursor size‬‬
‫‪02H‬‬ ‫‪Set cursor position‬‬
‫‪03H‬‬ ‫‪Read cursor position‬‬
‫‪04H‬‬ ‫‪Read light pen‬‬
‫‪05H‬‬ ‫‪Define current screen page‬‬
‫‪06H‬‬ ‫‪Scroll screen up‬‬
‫‪07H‬‬ ‫‪Scroll screen down‬‬
‫‪08H‬‬ ‫‪Read character and attribute‬‬
‫‪09H‬‬ ‫‪Write character and attribute‬‬
‫‪0AH‬‬ ‫‪Write character to cursor position‬‬
‫‪0BH‬‬ ‫‪Set color palette for graphics mode‬‬
‫‪0CH‬‬ ‫‪Set screen pixel in graphics mode‬‬
‫‪0DH‬‬ ‫‪Read screen pixel in graphics mod‬‬
‫‪...‬‬ ‫‪...‬‬

‫_________________________________________________________________________________‬
‫‪Video Electronic Standard Association (VESA) ١‬‬
‫‪programmable ٢‬‬
‫‪3-4‬‬ ‫ﻓﺼﻞ ‪ :4‬ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬

‫ﺗﻌﻴﻴﻦ ﻧﻮع ﻛﺎرت وﻳﺪﺋﻮﻳﻲ‪ :‬در ‪ VGA BIOS‬ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ‪ 1AH‬و زﻳﺮﺗﺎﺑﻊ ‪ ،00H‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺎدﻳﺮ ﺑﺮﮔﺸﺘﻲ زﻳﺮ ﻣﻲﺗﻮان ﻧﻮع ﻛﺎرت را‬
‫ﺗﺸﺨﻴﺺ داد‪:‬‬

‫‪Code‬‬ ‫‪Meaning‬‬
‫‪00H‬‬ ‫‪No video card‬‬
‫‪01H‬‬ ‫‪MDA card / monochrome monitor‬‬
‫‪02H‬‬ ‫‪CGA card / color monitor‬‬
‫‪03H‬‬ ‫‪Reserved‬‬
‫‪04H‬‬ ‫‪EGA card / high resolution monitor‬‬
‫‪05H‬‬ ‫‪EGA card / monochrome monitor‬‬
‫‪06H‬‬ ‫‪Reserved‬‬
‫‪07H‬‬ ‫‪VGA card / analog monochrome monitor‬‬
‫‪08H‬‬ ‫‪VGA card / analog color monitor‬‬

‫در ‪ EGA BIOS‬ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ‪ 12H‬و زﻳﺮﺗﺎﺑﻊ ‪ ،10H‬ﻣﻲﺗﻮان ﻧﻮع ﻛﺎرت را ﺗﺸﺨﻴﺺ داد‪.‬‬

‫وﻳﺪﺋﻮﻳﻲ‪1‬‬ ‫‪ 3-4‬ﺣﺎﻓﻈﻪي‬
‫ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺟﺰو ﻓﻀﺎي ﻧﺸﺎﻧﻲ‪ PC 2‬اﺳﺖ و ﻣﻲﺗﻮاﻧﺪ ﺑﺮ روي ﻛﺎرت وﻳﺪﺋﻮﻳﻲ ﺑﺎﺷﺪ ﻳﺎ آﻧﻜﻪ از ﻗﺴﻤﺘﻲ از ‪ RAM‬اﺳﺘﻔﺎده ﺷﻮد‪ .‬ﻣﺤﺘﻮﻳﺎت اﻳﻦ ﺣﺎﻓﻈﻪ‬
‫ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﺻﻔﺤﺎت ﻣﺘﻦ و ﮔﺮاﻓﻴﻚ اﺳﺖ ﻛﻪ ﺑﺮ روي ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ ﻧﺸﺎن داده ﻣﻲﺷﻮﻧﺪ‪ .‬ﻳﻌﻨﻲ در ﺣﺎﻟﺖ ﻣﺘﻦ‪ ،‬ﻫﺮ ﻛﺎراﻛﺘﺮ و رﻧﮓ آن‪ ،‬ﺑﺎ دو ﺑﺎﻳﺖ از اﻳﻦ ﺣﺎﻓﻈﻪ و درﺣﺎﻟﺖ‬
‫ﮔﺮاﻓﻴﻚ‪ ،‬ﻫﺮ ﻧﻘﻄﻪ‪ 3‬ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‪ ،‬ﻳﻚ ﻳﺎ ﺑﻴﺸﺘﺮ ﺑﻴﺖ اﻳﻦ ﺣﺎﻓﻈﻪ ﻣﺘﻨﺎﻇﺮ اﺳﺖ)ﻛﻪ در اداﻣﻪ دﻗﻴﻖﺗﺮ ﺗﻮﺿﻴﺢ داده ﻣﻲﺷﻮد(‪.‬‬

‫‪Video‬‬
‫‪CRT‬‬
‫‪RAM‬‬

‫در ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ ﺗﻚرﻧﮓ ﻣﺜﻞ ‪ ،MDA‬ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ در ﻣﺤﺪودهي ﻧﺸﺎﻧﻲ ‪ B000:0000-B000:7FFF‬ﻗﺮار دارد و در ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬
‫رﻧﮕﻲ‪ ،‬ﻣﺜﻞ ‪ ،EGA‬از ﻧﺸﺎﻧﻲ ‪ B800:0000‬ﺷﺮوع ﻣﻲﺷﻮد‪ .‬ﭼﻮن اﻳﻦ ﺣﺎﻓﻈﻪ در ﻓﻀﺎي ﻧﺸﺎﻧﻴﻬﺎي ﺳﻴﺴﺘﻢ ﻗﺮار دارد‪ ،‬ﺑﺎ روﺷﻬﺎي ﻣﻌﻤﻮﻟﻲ دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪ ﻗﺎﺑﻞ‬
‫دﺳﺘﻴﺎﺑﻲ اﺳﺖ‪ .‬ﻳﻌﻨﻲ ﺑﺮاي ﻧﻮﺷﺘﻦ ﻳﻚ ﻛﺎراﻛﺘﺮ ﺑﺮ روي ﺻﻔﺤﻪ‪ ،‬ﻣﻲﺗﻮان ﻳﻚ ﺑﺎﻳﺖ ﻛﺪ ﻛﺎراﻛﺘﺮ و ﺑﺎﻳﺖ رﻧﮓ )اﺻﻠﻲ‪ 4‬و زﻣﻴﻨﻪ‪ (5‬آﻧﺮا در اﻳﻦ ﺣﺎﻓﻈﻪ ﻧﻮﺷﺖ‪ .‬ﺣﺎﺻﻞ ﻛﺎر‪،‬‬
‫ﻧﻤﺎﻳﺶ ﻛﺎراﻛﺘﺮ ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ اﺳﺖ‪.‬‬

‫ﺳﺎﺧﺘﺎر ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ در ﺣﺎﻟﺖ ﻣﺘﻦ‪ :‬در ﺣﺎﻟﺖ ﻣﺘﻦ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻫﺮ ﻛﺎراﻛﺘﺮ ﺑﻪ دو ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﻧﻴﺎز اﺳﺖ‪ .‬در ﺑﺎﻳﺖ ﻧﺨﺴﺖ‪ ،‬ﻛﺪ‬
‫اَﺳﻜﻲ‪6‬ﻛﺎراﻛﺘﺮ و در ﺑﺎﻳﺖ دوم ﻣﺸﺨﺼﻪي‪ 7‬آن ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬در ﺑﺎﻳﺖ ﻣﺸﺨﺼﻪ‪ ،‬ﻣﺘﻨﺎﺳﺐ ﺑﺎ ﻧﻮع ﻛﺎرت و ﺑﺮاﺳﺎس ﻛﺪﺑﻨﺪي آن‪ ،‬رﻧﮓ اﺻﻠﻲ‪ ،‬رﻧﮓ زﻣﻴﻨﻪ‪ ،‬ﺷﺪت ﻧﻮر‪ ،‬و ﻏﻴﺮه‬
‫ﻣﺸﺨﺺ ﻣﻲﺷﻮﻧﺪ‪ .‬ﻣﺜﻼً در ‪ 4 ،MDA‬ﺑﻴﺖ ﻧﺨﺴﺖ اﻳﻦ ﺑﺎﻳﺖ رﻧﮓ اﺻﻠﻲ و ‪ 4‬ﺑﻴﺖ دوم رﻧﮓ زﻣﻴﻨﻪ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﻨﺪ‪.‬‬
‫اوﻟﻴﻦ ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﻣﺘﻨﺎﻇﺮ ﺑﺎ اوﻟﻴﻦ ﻛﺎراﻛﺘﺮ ﻧﻤﺎﻳﺶ داده ﺷﺪه ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ اﺳﺖ و ﺑﺎﻳﺖ دوم ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ‪ ،‬ﻣﺸﺨﺼﻪي آن اﺳﺖ‪.‬‬
‫ﻧﺸﺎﻧﻲ ﻣﺒﺪأ اوﻟﻴﻦ ﻛﺎراﻛﺘﺮ‪ 0000H ،‬و ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﻣﺸﺨﺼﻪي آن‪ 0001H ،‬اﺳﺖ‪ .‬ﻛﺎراﻛﺘﺮ دوم و ﻣﺸﺨﺼﻪي آن در ﻧﺸﺎﻧﻴﻬﺎي ‪ 0002H‬و ‪ 0003H‬ﻗﺮار دارﻧﺪ و اﻟﻲ‬
‫آﺧﺮ‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﻚ ﺻﻔﺤﻪ اﻃﻼﻋﺎت ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‪ ،‬ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﺎﻳﺪ ‪ 80x25x2 = 4000 byte‬ﻇﺮﻓﻴﺖ داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﻛﻪ ﺑﻪ آن‬

‫_________________________________________________________________________________‬
‫‪video RAM ١‬‬
‫‪address space ٢‬‬
‫‪pixel ٣‬‬
‫‪foreground ٤‬‬
‫‪background ٥‬‬
‫‪ASCII code ٦‬‬
‫‪attribute ٧‬‬
‫‪4-4‬‬ ‫ﻓﺼﻞ ‪ :4‬ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬

‫ﻳﻚ ﺻﻔﺤﻪ‪ 1‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬اﮔﺮ ﻇﺮﻓﻴﺖ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﻴﺶ از ‪ 4KB‬ﺑﺎﺷﺪ)ﻣﺜﻼً ‪ ،( 8KB‬ﻣﻲﺗﻮان ﺑﻴﺶ از ﻳﻚ ﺻﻔﺤﻪ را در ﺣﺎﻓﻈﻪ ﻧﮕﻬﺪاﺷﺖ‪ ،‬ﻛﻪ در ﻛﺎرﺗﻬﺎي‬
‫‪ EGA‬و ‪ VGA‬اﻳﻦ اﻣﻜﺎن وﺟﻮد دارد‪ ،‬وﻟﻲ در ﻛﺎرﺗﻬﺎي ‪ MDA‬اﻳﻦﮔﻮﻧﻪ ﻧﻴﺴﺖ‪ .‬ﺑﺎ اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ وﻗﻔﻪ ‪ ،10H‬ﻣﻲﺗﻮان اﻳﻦ ﺻﻔﺤﻪﻫﺎ را ﺗﻌﻮﻳﺾ ﻧﻤﻮد و روﺷﻲ ﻣﻔﻴﺪ‬
‫ﺑﺮاي ﺑﻬﺒﻮد ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ اﺳﺖ‪.‬‬

‫دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ‪ :‬از ﻓﺮﻣﻮل زﻳﺮ ﻣﻲﺗﻮان ﺑﺮاي ﻧﻮﺷﺘﻦ ﻣﺴﺘﻘﻴﻢ ﻳﻚ ﻛﺎراﻛﺘﺮ در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﻳﺎ ﺧﻮاﻧﺪن آن‪ ،‬اﺳﺘﻔﺎده‬
‫ﻧﻤﻮد‪:‬‬

‫‪character_offset_position (row, col) = row * 160 + col * 2‬‬


‫و ﻧﺸﺎﻧﻲ ﺑﺎﻳﺖ ﻣﺸﺨﺼﻪي آن ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد‪:‬‬

‫‪attribute_offset_position (row, col) = row * 160 + col * 2 + 1‬‬


‫ﺑﺮاي ﻧﻮﺷﺘﻦ ﻣﺴﺘﻘﻴﻢ ﻣﺘﻨﻬﺎ در زﺑﺎن ﭘﺎﺳﻜﺎل ﻣﻲﺗﻮان از دﺳﺘﻮر ‪ Mem‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ ،‬ﻛﻪ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ‪ ،‬ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ اﺳﺖ ﻛﻪ در ﻛﺎرﺗﻬﺎي‬
‫رﻧﮕﻲ‪ B800H ،‬و در ‪ B000H ،MDA‬اﺳﺖ و ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﻫﻢ از ﻓﺮﻣﻮل ﻓﻮق ﺑﺪﺳﺖ ﻣﻲآﻳﺪ‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲﺗﻮان رواﻟﻲ ﺑﻪﺻﻮرت زﻳﺮ ﺑﺮاي ﻧﻮﺷﺘﻦ ﻣﺴﺘﻘﻴﻢ ﻳﻚ‬
‫ﻛﺎراﻛﺘﺮ در ﻧﻘﻄﻪي )‪ ،(row, col‬ﻧﻮﺷﺖ‪:‬‬

‫;)‪procedure DirectWriteCh (row, col, ch, att : byte‬‬


‫‪begin‬‬
‫;‪Mem[$B800:(row * 160 + col * 2)] := ch‬‬
‫;‪Mem[$B800:(row * 160 + col * 2 + 1)] := att‬‬
‫;‪end‬‬
‫ﻫﻤﭽﻨﻴﻦ ﺑﺮاي ﺧﻮاﻧﺪن ﻳﻚ ﻛﺎراﻛﺘﺮ و ﻣﺸﺨﺼﻪي آن از ﻧﻘﻄﻪي )‪ ،(row, col‬ﻣﻲﺗﻮان ﺑﻪ ﺻﻮرت زﻳﺮ ﻋﻤﻞ ﻛﺮد‪:‬‬

‫;)‪procedure DirectReadCh (row, col : byte; var ch, att: byte‬‬


‫‪begin‬‬
‫;])‪ch := Mem[$B800:(row * 160 + col * 2‬‬
‫;])‪att := Mem[$B800:(row * 160 + col * 2 + 1‬‬
‫;‪end‬‬
‫در زﺑﺎن ‪ C‬از دو روش ﻣﻲﺗﻮان ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬روش ﻧﺨﺴﺖ اﺳﺘﻔﺎده از دﺳﺘﻮرات ‪ pokeb‬و ‪ peekb‬و روش دوم‪ ،‬اﻳﺠﺎد ﻳﻚ ‪far‬‬
‫‪ pointer‬ﺑﻪ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ اﺳﺖ‪.‬‬

‫اﻟﻒ( اﺳﺘﻔﺎده از دﺳﺘﻮرات ‪ pokeb‬و ‪:peekb‬‬


‫)‪void DirectWriteCh (unsigned char row, unsigned char col, unsigned char ch, unsigned char att‬‬
‫{‬
‫;)‪pokeb(0xB800, row * 160 + col * 2, ch‬‬
‫;)‪pokeb(0xB800, row * 160 + col * 2+1, att‬‬
‫}‬

‫)‪void DirectReadCh (unsigned char row, unsigned char col, unsigned char *ch, unsigned char *att‬‬
‫{‬
‫;)‪*ch = peekb(0xB800, row * 160 + col * 2‬‬
‫;)‪*att = peekb(0xB800, row * 160 + col * 2+1‬‬
‫}‬

‫ب(اﺳﺘﻔﺎده از دﺳﺘﻮرات ‪:far pointer‬‬


‫{ ‪struct VelB‬‬
‫;‪unsigned char ch, att‬‬
‫;}‬
‫;‪typedef struct VelB far *VP‬‬

‫)‪void DirectWriteCh (unsigned char row, unsigned char col, unsigned char ch, unsigned char att‬‬
‫{‬
‫;‪VP lptr‬‬
‫_________________________________________________________________________________‬
‫‪page ١‬‬
‫‪5-4‬‬ ‫ﻓﺼﻞ ‪ :4‬ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬

‫;‪lptr = MK_FP (0xB800, 0) + row * 80 + col‬‬


‫;‪lptr->ch = ch‬‬
‫;‪lptr->att = att‬‬
‫}‬

‫)‪void DirectReadCh (unsigned char row, unsigned char col, unsigned char *ch, unsigned char *att‬‬
‫{‬
‫;‪VP lptr‬‬
‫;‪lptr = MK_FP (0xB800, 0) + row * 80 + col‬‬
‫;‪*ch = lptr->ch‬‬
‫;‪*att = lptr->att‬‬
‫}‬
‫ﻣﺪﻳﺮﻳﺖ ﭘﻨﺠﺮهﻫﺎ‪ :1‬از روﺷﻬﺎي ﻓﻮق ﺑﺮاي دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﺣﺎﻓﻈﻪ ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮده و ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﻧﻮﺷﺖ ﻛﻪ در آﻧﻬﺎ از ﭘﻨﺠﺮهﻫﺎ اﺳﺘﻔﺎده‬
‫ﻣﻲﺷﻮد‪ .‬آﺷﻜﺎرﺳﺎزي و ﭘﻨﻬﺎن ﻛﺮدن ﭘﻨﺠﺮهﻫﺎ‪ ،‬ﻣﺴﺘﻠﺰم ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ ﺳﺮﻳﻊ اﻃﻼﻋﺎت ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ و ذﺧﻴﺮه و ﺑﺎزﻳﺎﺑﻲ اﻃﻼﻋﺎت ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺮ روي ﺻﻔﺤﻪ در‬
‫ﺑﺎﻓﺮﻫﺎي ﻣﻮﻗﺘﻲ اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﺑﺨﻮاﻫﻴﻢ در ﺷﻜﻞ زﻳﺮ ﭘﻨﺠﺮهي ‪ W1‬را ﺑﺮ روي ﺻﻔﺤﻪ ﻧﺸﺎن دﻫﻴﻢ‪ ،‬ﻻزم ﺑﻪ ﻧﮕﻬﺪاري اﻃﻼﻋﺎت ﭘﻨﺠﺮهي اﺻﻠﻲ ‪ W0‬ﻫﺴﺘﻴﻢ‪.‬‬
‫ﺑﻨﺎﺑﺮ اﻳﻦ‪ ،‬ﺑﺎﻳﺪ ﻳﻚ ﺑﺎﻓﺮ ﺑﺎ اﺑﻌﺎد ‪ (60-20+1)*(15-5+1)*2‬ﺑﺮاي ﻧﮕﻬﺪاري ﻛﺎراﻛﺘﺮﻫﺎ و ﻣﺸﺨﺼﻪﻫﺎي آﻧﻬﺎ ﻛﻪ در اﻳﻦ ﻣﺤﺪوده ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻗﺮار دارﻧﺪ‪ ،‬اﺧﺘﺼﺎص‬
‫دﻫﻴﻢ‪ .‬ﺳﭙﺲ ﺑﺎ روﺷﻬﺎي دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﻓﻮق و ﺑﺎ اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ ‪ ،DirectReadCh‬اﻃﻼﻋﺎت ﭘﻨﺠﺮه را در اﻳﻦ ﺑﺎﻓﺮ ذﺧﻴﺮه ﻛﻨﻴﻢ‪ .‬اﻳﻦ ﻛﺎر ﻗﺒﻞ از رﺳﻢ ﭘﻨﺠﺮه ‪W1‬‬
‫اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬ﭘﺲ از ﻧﻤﺎﻳﺶ ‪ W1‬و ﻋﺪم ﻧﻴﺎز ﺑﻪ آن‪ ،‬ﺑﺮاي ﭘﺎك ﻛﺮدن آن از روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ و ﺑﺮﮔﺸﺘﻦ ﺑﻪ ﺻﻔﺤﻪي ﻗﺒﻠﻲ‪ ،‬ﻛﺎﻓﻴﺴﺖ اﻃﻼﻋﺎت ﻣﻮﺟﻮد در ﺑﺎﻓﺮ‪ ،‬ﺑﺎ‬
‫اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ‪ ،DirectPutCh‬در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﺎزﻧﻮﻳﺴﻲ ﺷﻮد‪.‬‬
‫ﭘﻨﺠﺮه اﺻﻠﻲ)‪ (W0‬ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ )‪(80x25‬‬
‫)‪(20, 5‬‬ ‫)‪(60, 5‬‬

‫‪W1‬‬

‫)‪(20, 15‬‬ ‫)‪(60, 15‬‬

‫اﻧﺘﺨﺎب و ﺗﻌﺮﻳﻒ ﻓﻮﻧﺘﻬﺎ‪ :2‬ﻛﺎرﺗﻬﺎي ‪ EGA‬و ‪ VGA‬اﺟﺎزهي اﻧﺘﺨﺎب و ﺗﻌﺮﻳﻒ ﻓﻮﻧﺘﻬﺎي ﺟﺪﻳﺪ را ﻣﻲدﻫﻨﺪ‪ .‬اﻳﻦ ﻛﺎرﺗﻬﺎ از ﻣﻮﻟﺪﻫﺎي ﻗﻮي ﻛﺎراﻛﺘﺮ‬
‫اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ ﻛﻪ ﺷﻜﻞ ﻫﺮ ﻛﺎراﻛﺘﺮ را از روي ‪ bitmap‬آن ﻛﻪ در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﻗﺮار دارد‪ ،‬ﺑﺮ روي ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ ﺗﺮﺳﻴﻢ ﻣﻲﻛﻨﻨﺪ‪ .‬ﻛﺎرﺗﻬﺎي ‪ ،EGA‬ﺑﺎ ﺗﻮﺟﻪ‬
‫ﺑﻪ ﺣﺎﻟﺖ اﻧﺘﺨﺎبﺷﺪه‪ ،‬اﺟﺎزهي ﻧﻤﺎﻳﺶ ﻛﺎراﻛﺘﺮﻫﺎي ﺑﺎ اﺑﻌﺎد ‪ 8x8‬و ‪ 8x14‬ﻧﻘﻄﻪ را ﻣﻲدﻫﻨﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ‪ ،‬ﻛﺎرﺗﻬﺎي ‪ ،VGA‬اﺟﺎزهي ﻧﻤﺎﻳﺶ ﻛﺎراﻛﺘﺮﻫﺎي ﺑﺎ اﺑﻌﺎد ‪،8x8‬‬
‫‪ 8x14‬و ‪ 8x16‬ﻧﻘﻄﻪ را ﻣﻲدﻫﻨﺪ‪.‬‬

‫‪8x8‬‬ ‫‪8x14‬‬ ‫‪8x16‬‬

‫ﺑﻪ ازاي ﻫﺮ ردﻳﻒ در ﻣﺎﺗﺮﻳﺴﻬﺎي ﻓﻮق‪ ،‬ﻧﻴﺎز ﺑﻪ ﻳﻚ ﺑﺎﻳﺖ اﺳﺖ‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺮاي ﻫﺮ ﻛﺎراﻛﺘﺮ‪ ،‬در ﺳﻪ ﺣﺎﻟﺖ ﻓﻮق‪ ،‬ﺑﻪﺗﺮﺗﻴﺐ ﺑﻪ ‪ 14 ،8‬و ‪ 16‬ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ ﻧﻴﺎز‬
‫ﺧﻮاﻫﺪ ﺑﻮد و ﺑﺮاي ﺗﻌﺮﻳﻒ ﻓﻮﻧﺖ ﺑﺮاي ‪ 256‬ﻛﺎراﻛﺘﺮ‪ ،‬ﺑﻪ ‪ 256x14 ،256x8‬و ‪ 256x16‬ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ ﻧﻴﺎز اﺳﺖ‪ .‬ﭘﺲ ﺑﺮاي ﻣﻌﺮﻓﻲ ﻓﻮﻧﺘﻬﺎي ﺟﺪﻳﺪ)ﻣﺜﻼً ﻓﻮﻧﺘﻬﺎي‬
‫ﻓﺎرﺳﻲ( ﻣﻲﺗﻮان ﻳﻚ ﺑﺎﻓﺮ)‪ (character table‬ﺑﺎ اﻧﺪازهﻫﺎي ﻓﻮق ﺗﻌﺮﻳﻒ ﻧﻤﻮده و ﻣﺎﺗﺮﻳﺴﻬﺎي ﻓﻮﻧﺘﻬﺎي ﻃﺮاﺣﻲ ﺷﺪه را اﻳﺠﺎد ﻧﻤﻮد‪ .‬ﺳﭙﺲ ﺑﺮاي ﺗﻌﺮﻳﻒ ﻓﻮﻧﺘﻬﺎ‪ ،‬از‬
‫زﻳﺮﺗﺎﺑﻊ‪ 00H‬ﺗﺎﺑﻊ ‪ 11H‬وﻗﻔﻪي ‪ EGA/VGA BIOS 10H‬اﺳﺘﻔﺎده ﻛﺮد‪:‬‬
‫‪AH = 11H‬‬
‫‪AL = 00H‬‬
‫)‪BH = Lines per character (also bytes per character‬‬
‫_________________________________________________________________________________‬
‫‪window management ١‬‬
‫‪fonts ٢‬‬
‫‪6-4‬‬ ‫ﻓﺼﻞ ‪ :4‬ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬

‫)‪BL = Character table (0 or 1‬‬


‫‪CX = Number of character in table‬‬
‫‪DX = ASCII code of first character table‬‬
‫‪ES = Segment address of character table in RAM‬‬
‫‪BP = Offset address of character table in RAM‬‬

‫‪ 4-4‬ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻜﻲ در ﻛﺎرت ‪Hercules‬‬


‫ﻛﺎرت ‪ HGC‬در ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻜﻲ وﺿﻮح ‪ 348x720‬را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪ .‬ﻫﺮ ﻧﻘﻄﻪ ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‪ ،‬ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﻳﻚ ﺑﻴﺖ در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ اﺳﺖ‪.‬‬
‫اﮔﺮ ﻣﻘﺪار ﺑﻴﺖ ‪ 1‬ﺑﺎﺷﺪ‪ ،‬ﻳﻚ ﻧﻘﻄﻪ ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻳﺪه ﻣﻲﺷﻮد‪ .‬وﮔﺮﻧﻪ‪ ،‬ﻧﻘﻄﻪ وﺟﻮد ﻧﺪارد‪ .‬ﻣﺤﻮرﻫﺎي ﻣﺨﺘﺼﺎت ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ‪ ،‬از ﺻﻔﺮ ﺷﺮوع ﻣﻲﺷﻮﻧﺪ و در ﻫﺮ‬
‫ﺧﻂ از ‪ 0‬ﺗﺎ ‪ 719‬ﻧﻘﻄﻪ و ﺷﻤﺎره ﺧﻄﻮط ﻫﻢ ﺑﻴﻦ ‪ 0‬و ‪ 347‬اﺳﺖ‪.‬‬

‫ﺳﺎﺧﺘﺎر ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ در ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻜﻲ‪:‬‬

‫‪+0000H‬‬ ‫‪Line 0‬‬


‫‪Line 4‬‬
‫‪:‬‬
‫‪Block 1‬‬
‫‪+2000H‬‬ ‫‪Line 1‬‬
‫‪Line 5‬‬
‫‪:‬‬ ‫‪Block 2‬‬ ‫‪CRT‬‬
‫‪+4000H‬‬ ‫‪Line 2‬‬
‫‪Line 6‬‬
‫‪:‬‬
‫‪Block 3‬‬
‫‪+6000H‬‬ ‫‪Line 3‬‬
‫‪Line 7‬‬
‫‪:‬‬
‫‪Block 4‬‬

‫ﺣﺎﻓﻈﻪ وﻳﺪﺋﻮﻳﻲ ‪ 32K‬اﺳﺖ ﻛﻪ ﺑﻪ ‪ 4‬ﺑﻠﻮك ‪ 8K‬ﺗﻘﺴﻴﻢ ﺷﺪه اﺳﺖ‪ .‬ﺧﻄﻮط ﻣﺨﺘﻠﻒ ﭘﺸﺖ ﺳﺮ ﻫﻢ ﻧﻴﺴﺘﻨﺪ و ﺧﻄﻮط ﺑﺎ ﺷﻤﺎرهﻫﺎي ‪ ... ،8 ،4 ،0‬در ﺑﻠﻮك اول‪،‬‬
‫ﺧﻄﻮط ﺑﺎ ﺷﻤﺎرهﻫﺎي ‪ ... ،9 ،5 ،1‬در ﺑﻠﻮك دوم و اﻟﻲآﺧﺮ‪ .‬ﻫﺮ ﺧﻂ ﺷﺎﻣﻞ ‪ 90‬ﺑﺎﻳﺖ اﺳﺖ ﻛﻪ ﺗﻌﺪاد ﻧﻘﺎط ﻫﺮ ﺧﻂ‪ 90x8 = 720 ،‬اﺳﺖ‪ .‬در ﻫﺮ ﺑﻠﻮك ﻫﻢ ‪ 348‬ﺧﻂ وﺟﻮد‬
‫دارد و ﻣﺎﺑﻘﻲ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﻼاﺳﺘﻔﺎده اﺳﺖ‪.‬‬

‫ﺑﺮاي ﻣﺤﺎﺳﺒﻪي ﻧﺸﺎﻧﻲ ﻳﻚ ﻧﻘﻄﻪي ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ )‪ (X, Y‬در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﺎﻳﺪ ﻧﺸﺎﻧﻲ ﺑﺎﻳﺖ و ﺷﻤﺎرهي ﺑﻴﺖ آن ﺑﺎﻳﺖ را ﺑﺪﺳﺖ آورﻳﻢ‪:‬‬
‫)‪ByteAddress(X, Y) = 2000H * (Y mod 4) + 90 * int(Y/4) + int(X/8‬‬
‫} ﺑﻴﺖ ﻫﺸﺘﻢ ﻧﻘﻄﻪي ﺻﻔﺮم را و ﺑﻴﺖ اول ﻧﻘﻄﻪي ﻫﻔﺘﻢ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ { ‪BitNumber(X) = 7 - X mod 8‬‬

‫ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺎﻳﺪ ﺑﻴﺖ ﺑﺪﺳﺖ آﻣﺪه در ﺑﺎﻳﺖ ﻣﻮﺟﻮد در ﻧﺸﺎﻧﻲ داده ﺷﺪه‪ ،‬ﺑﺮاي روﺷﻦ ﺷﺪن ﻧﻘﻄﻪ‪ ،‬ﺑﻪ ‪ 1‬و ﺑﺮاي ﺧﺎﻣﻮش ﺷﺪن‪ ،‬ﺑﻪ ‪ 0‬ﻣﻘﺪاردﻫﻲ ﺷﻮد‪ .‬ﺑﺮاي‬
‫ﻣﺜﺎل در زﺑﺎن ﭘﺎﺳﻜﺎل ﺑﺮاي روﺷﻦ ﻛﺮدن ﺑﻴﺖ )‪: (X, Y‬‬
‫;)‪procedure PutPixel (X, Y : Integer‬‬
‫;‪var PixelByte, PixelBit : Byte‬‬
‫‪begin‬‬
‫;])‪PixelByte := Mem[$B000:ByteAddress(X, Y‬‬
‫;‪PixelBit := 1‬‬
‫} ‪PixelBit := PixelBit Shl BitNumber(X); { Shl = Shift Left‬‬
‫;‪PixelByte := PixelByte Or PixelBit‬‬
‫;‪Mem[$B000:ByteAddress(X, Y)] := PixelByte‬‬
‫;‪end‬‬
‫‪7-4‬‬ ‫ﻓﺼﻞ ‪ :4‬ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬

‫‪ 5-4‬ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻜﻲ در ﻛﺎرت ‪CGA‬‬


‫اﻳﻦ ﻧﻮع ﻛﺎرت ﺳﻪ ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻜﻲ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﻨﺪ‪ ،‬ﻛﻪ دو ﻣﻮرد ﺑﻴﺸﺘﺮ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﺮﻓﺘﻨﺪ‪:‬‬

‫‪ :Color-Suppressed‬وﺿﻮح ‪ 160x100‬ﺑﺎ ‪ 16‬رﻧﮓ‪ ،‬ﻛﻪ ‪ CRT controler‬اﻳﻦ ﺣﺎﻟﺖ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﺮد‪ ،‬اﻣﺎ ﺳﺎﻳﺮ ﺑﺨﺸﻬﺎي ﺳﺨﺖاﻓﺰار‪ ،‬اﻳﻦ ﺣﺎﻟﺖ را‬ ‫•‬
‫ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲﻛﺮدﻧﺪ‪.‬‬
‫وﺿﻮح ‪ 320x200‬ﺑﺎ ‪ 4‬رﻧﮓ‪،‬‬ ‫•‬
‫وﺿﻮح ‪ 640x200‬ﺑﺎ ‪ 2‬رﻧﮓ‪.‬‬ ‫•‬

‫وﺿﻮح ‪ :320x200‬ﻛﺎرت ‪ CGA‬ﻣﻲﺗﻮاﻧﺪ از ‪ 16K‬ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ اﺳﺘﻔﺎده ﻛﻨﺪ و اﻳﻦ وﺿﻮح را ﺑﺎ ‪ 4‬رﻧﮓ ﻓﺮاﻫﻢ ﻧﻤﺎﻳﺪ‪ .‬رﻧﮕﻬﺎﻳﻲ ﻛﻪ ﺑﺎ ﺑﺮﻧﺎﻣﻪرﻳﺰي‬
‫ﺛﺒﺎت اﻧﺘﺨﺎب رﻧﮓ ﻳﺎ ﺗﺎﺑﻊ ‪ 0BH‬وﻗﻔﻪي ‪ ،10H‬ﻗﺎﺑﻞ اﻧﺘﺨﺎب ﻫﺴﺘﻨﺪ‪ ،‬ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪ -‬رﻧﮓ زﻣﻴﻨﻪ‪ :‬از ‪ 16‬ﺳﺮي رﻧﮓ‪ 1‬ﻗﺎﺑﻞ اﻧﺘﺨﺎب اﺳﺖ‪.‬‬


‫‪ -‬رﻧﮓ اﺻﻠﻲ‪ :‬ﺳﻪ رﻧﮓ دﻳﮕﺮ‪ ،‬ﻛﻪ از دو ﺳﺮي رﻧﮓ زﻳﺮ ﻗﺎﺑﻞ اﻧﺘﺨﺎب ﻫﺴﺘﻨﺪ‪:‬‬

‫}‪Palette 1: { Cyan, Violet, White‬‬ ‫} ‪Palette 2: { Green, Red, Yellow‬‬

‫ﺳﺎﺧﺘﺎر ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ در ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻜﻲ‪ :‬ﺑﺮاي ﻫﺮ ﻧﻘﻄﻪ‪ ،‬ﺑﻪ دو ﺑﻴﺖ ﻧﻴﺎز دارﻳﻢ‪:‬‬

‫‪80 bytes‬‬

‫‪+0000H‬‬ ‫‪Line 0‬‬


‫‪Line 0‬‬
‫‪:‬‬ ‫‪Block 1‬‬ ‫‪CRT‬‬
‫‪+2000H‬‬ ‫‪Line 1‬‬
‫‪Line 3‬‬
‫‪:‬‬
‫‪Block 2‬‬

‫ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ‪ 16K‬اﺳﺖ ﻛﻪ ﺑﻪ دو ﺑﻠﻮك ‪ 8K‬ﺗﻘﺴﻴﻢ ﺷﺪه اﺳﺖ‪ .‬ﺧﻄﻮط زوج در ﺑﻠﻮك اول و ﺧﻄﻮط ﻓﺮد در ﺑﻠﻮك دوم ﻗﺮار دارﻧﺪ‪ .‬ﺑﺮاي ﻣﺤﺎﺳﺒﻪي‬
‫ﻧﺸﺎﻧﻲ ﻳﻚ ﻧﻘﻄﻪي ﺻﻔﺤﻪي ﻧﻤﺎﻳﺶ )‪ (X, Y‬در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﺑﺎﻳﺪ ﻧﺸﺎﻧﻲ ﺑﺎﻳﺖ و ﺷﻤﺎرهي اوﻟﻴﻦ ﺑﻴﺖ آن ﺑﺎﻳﺖ را ﺑﺪﺳﺖ آورﻳﻢ‪:‬‬

‫)‪ByteAddress(X, Y) = 2000H * (Y mod 2) + 80 * int(Y/2) + int(X/4‬‬


‫}ﺑﻴﺘﻬﺎي ‪ 7‬و ‪ 8‬ﻧﻘﻄﻪي ‪ 0‬را ﻣﺸﺨﺺ ﻣﻲﻛﻨﻨﺪ{ )‪BitNumber(X) = 6 - 2 *(X mod 4‬‬
‫ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ ﺑﺮاي ﻣﺜﺎل ﻓﺮﻣﻮل دوم ﻣﻘﺪار ‪ 4‬را ﺑﺮﮔﺮداﻧﺪ‪ ،‬اﻃﻼﻋﺎت ﻳﻚ ﻧﻘﻄﻪ در ﺑﻴﺘﻬﺎي ‪ 4‬و ‪ 5‬ﺑﺎﻳﺖ داده ﺷﺪه‪ ،‬ﻛﺪﺑﻨﺪي ﺷﺪه اﺳﺖ‪.‬‬

‫وﺿﻮح ‪ :640x200‬در اﻳﻦ ﺣﺎﻟﺖ‪ ،‬ﻓﻘﻂ ﻳﻚ ﺑﻴﺖ ﺑﺮاي ﻫﺮ ﻧﻘﻄﻪ ﻛﺎﻓﻲ اﺳﺖ و دو رﻧﮓ ﺑﻴﺸﺘﺮ ﻧﺪارﻳﻢ‪ .‬در ﻧﺘﻴﺠﻪ‪ ،‬ﻋﺮض ﺻﻔﺤﻪ دو ﺑﺮاﺑﺮ ﻣﻲﺷﻮد‪:‬‬

‫)‪ByteAddress(X, Y) = 2000H * (Y mod 2) + 80 * int(Y/2) + int(X/8‬‬


‫‪BitNumber(X) = 7 - X mod 8‬‬
‫ﺛﺒﺎﺗﻬﺎي ‪ :CGA‬اﻳﻦ ﻧﻮع ﻛﺎرت داراي ‪ 3‬ﺛﺒﺎت اﺳﺖ‪:‬‬

‫‪ :Mode Selection Register‬ﺑﺎ اﻳﻦ ﺛﺒﺎت ‪ 8‬ﺑﻴﺘﻲ ﻣﻲﺗﻮان ﺣﺎﻟﺘﻬﺎي ﺳﻪﮔﺎﻧﻪي ﻓﻮق را اﻧﺘﺨﺎب ﻧﻤﻮد و ﺛﺒﺎﺗﻲ ﻗﺎﺑﻞ ﻧﻮﺷﺘﻦ و ﻏﻴﺮﻗﺎﺑﻞ ﺧﻮاﻧﺪن اﺳﺖ‪ .‬ﻧﺸﺎﻧﻲ‬ ‫•‬
‫درﮔﺎه اﻳﻦ ﺛﺒﺎت‪ 3D8H ،‬اﺳﺖ‪ .‬ﺑﻴﺖ ‪ 0‬اﻳﻦ ﺛﺒﺎت‪ ،‬ﺗﻌﺪاد ﻛﺎراﻛﺘﺮﻫﺎي ﻗﺎﺑﻞ ﻧﻤﺎﻳﺶ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ ﻛﻪ اﮔﺮ ﻣﺴﺎوي ‪ 0‬ﺑﺎﺷﺪ‪ 40x25 ،‬و اﮔﺮ ﻣﺴﺎوي ‪ 1‬ﺑﺎﺷﺪ‪،‬‬
‫‪ 80x25‬ﻛﺎراﻛﺘﺮ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲﺷﻮد‪ .‬ﺑﻴﺖ ‪ ،1‬ﺣﺎﻟﺖ وﻳﺪﺋﻮﻳﻲ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ‪ ،‬ﻛﻪ ﻣﻘﺪار ‪ 0‬ﺑﺮاي ﺣﺎﻟﺖ ﻣﺘﻦ و ﻣﻘﺪار ‪ 1‬ﺑﺮاي ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻚ اﺳﺖ‪.‬‬
‫ﺑﺮاي ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ از ﻣﺘﻦ ﺑﻪ ﮔﺮاﻓﻴﻚ و ﺑﺮﻋﻜﺲ ﺑﺎﻳﺪ ﻣﻘﺪار اﻳﻦ ﺑﻴﺖ ﺗﻨﻈﻴﻢ ﺷﻮد‪.‬‬

‫‪ :Status Register‬وﺿﻌﻴﺖ ﻣﺎﻧﻴﺘﻮر و اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﺳﻴﮕﻨﺎﻟﻴﻨﮓ را ﺑﺮﻣﻲﮔﺮداﻧﺪ و ﻳﻚ ﺛﺒﺎت ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ ﻛﻪ ﻧﺸﺎﻧﻲ درﮔﺎه آن‪ 3DAH ،‬اﺳﺖ‪.‬‬ ‫•‬

‫‪ :Color Selection Register‬ﺑﺎ اﻳﻦ ﺛﺒﺎت ﻣﻲﺗﻮان ﺳﺮي رﻧﮓ زﻣﻴﻨﻪ و اﺻﻠﻲ را اﻧﺘﺨﺎب ﻧﻤﻮد‪ .‬اﻳﻦ ﺛﺒﺎت ﻓﻘﻂ ﻧﻮﺷﺘﻨﻲ اﺳﺖ و ﻧﺸﺎﻧﻲ درﮔﺎه آن‪3D9H ،‬‬ ‫•‬
‫اﺳﺖ‪.‬‬

‫_________________________________________________________________________________‬
‫‪color palette ١‬‬
‫‪8-4‬‬ ‫ﻓﺼﻞ ‪ :4‬ﻛﺎرﺗﻬﺎي وﻳﺪﺋﻮﻳﻲ‬

‫‪ 6-4‬ﻛﺎرﺗﻬﺎي ‪ EGA‬و ‪VGA‬‬


‫ﻫﻤﺎﻧﻄﻮري ﻛﻪ ﻗﺒﻼً ﮔﻔﺘﻪ ﺷﺪ‪ ،‬ﺳﺎزﻧﺪﮔﺎن ﻣﺨﺘﻠﻒ از ﻳﻚ اﺳﺘﺎﻧﺪارد واﺣﺪ ﭘﻴﺮوي ﻧﻜﺮدهاﻧﺪ‪ .‬از اﻳﻨﺮو‪ ،‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﻣﺴﺘﻘﻴﻢ آﻧﻬﺎ‪ ،‬ﺑﺴﻴﺎر ﭘﻴﭽﻴﺪه اﺳﺖ و ﮔﺎﻫﻲ ﺑﻬﺘﺮ‬
‫اﺳﺖ ﻛﻪ از ﺗﻮاﺑﻊ ‪ EGA/VGA BIOS‬اﺳﺘﻔﺎده ﺷﻮد‪.‬‬

‫ﻧﻮع ﻣﺎﻧﻴﺘﻮر‪ :‬ﻛﺎرآﻳﻲ ﻛﺎرﺗﻬﺎي ‪ EGA‬ﻳﺎ ‪ ،VGA‬ﺑﻪ ﻧﻮع ﻣﺎﻧﻴﺘﻮر واﺑﺴﺘﮕﻲ زﻳﺎدي دارد و درﺻﻮرﺗﻲﻛﻪ ﻣﺎﻧﻴﺘﻮر از ﻧﻮع ﻣﻨﺎﺳﺒﻲ ﻧﺒﺎﺷﺪ‪ ،‬ﻗﺎﺑﻠﻴﺖﻫﺎي اﻳﻦ ﻧﻮع‬
‫ﻛﺎرت در اﺧﺘﻴﺎر ﻗﺮار ﻧﻤﻲﮔﻴﺮد‪ .‬اﻳﻦ ﻧﻮع ﻛﺎرﺗﻬﺎ ﺑﻪ اﻧﻮاع ﻣﺎﻧﻴﺘﻮرﻫﺎي زﻳﺮ ﻗﺎﺑﻞ اﺗﺼﺎل ﻫﺴﺘﻨﺪ‪:‬‬
‫‪ :EGA‬ﻳﻚ ﻛﺎرت ‪ EGA‬ﻗﺎﺑﻞ اﺗﺼﺎل ﺑﻪ ﻣﺎﻧﻴﺘﻮرﻫﺎي ‪ multisync ،EGA ،CGA‬ﻳﺎ ‪ Monochrome‬اﺳﺖ و ﺑﺮاﺳﺎس ﻧﻮع ﻣﺎﻧﻴﺘﻮر‪ ،‬ﻛﺎرت‬ ‫•‬
‫‪ EGA‬ﻣﺸﺎﺑﻪ ﻳﻚ ﻛﺎرت ‪ CGA‬ﻳﺎ ‪ MDA‬ﻗﻮي ﻋﻤﻞ ﻣﻲﻛﻨﺪ‪.‬‬
‫‪ :VGA‬ﻛﺎرﺗﻬﺎي ‪ VGA‬ﻗﺎﺑﻞ اﺗﺼﺎل ﺑﻪ ﻣﺎﻧﻴﺘﻮرﻫﺎي ‪ Analog Monochrome‬و ﻧﻴﺰ ﻣﺎﻧﻴﺘﻮرﻫﺎي ‪ VGA‬ﻫﺴﺘﻨﺪ‪ .‬در ﺣﺎﻟﺖ ﺗﻚرﻧﮓ‪ ،‬وﺿﻮح‬ ‫•‬
‫ﺑﺎﻻي ﻛﺎرﺗﻬﺎي ‪ VGA‬در دﺳﺘﺮس ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬

‫ﺣﺮﻛﺖ آرام ﺗﺼﻮﻳﺮ‪ :1‬ﻛﺎرﺗﻬﺎي ‪ CGA‬و ‪ ،HGC‬ﺗﻮاﻧﺎﻳﻲ ﺣﺮﻛﺖ دادن آرام ﺗﺼﻮﻳﺮ را ﻧﺪاﺷﺘﻨﺪ‪ .‬اﻣﺎ‪ ،‬در ﺳﺨﺖاﻓﺰار اﻳﻦ ﻛﺎرﺗﻬﺎي ‪ EGA‬و ‪،VGA‬‬
‫ﻗﺎﺑﻠﻴﺖﻫﺎﻳﻲ ﺑﺮاي اﻳﺠﺎد ﺗﺼﺎوﻳﺮ ﻣﺘﺤﺮك‪ 2‬ﭘﻴﺶﺑﻴﻨﻲ ﺷﺪه اﺳﺖ‪ ،‬ﻛﻪ از آن ﺟﻤﻠﻪ‪ ،‬ﺣﺮﻛﺖ آرام ﺗﺼﻮﻳﺮ در ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻚ اﺳﺖ‪ .‬ﺑﺎ اﻳﻦ ﻗﺎﺑﻠﻴﺖ‪ ،‬ﻣﻲﺗﻮان ﺗﺼﻮﻳﺮ را در ﺟﻬﺘﻬﺎي‬
‫اﻓﻘﻲ و ﻋﻤﻮدي ﺣﺮﻛﺖ داد و ﻧﻴﺎزي ﺑﻪ ﺑﺎزﻧﻮﻳﺴﻲ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﻧﻴﺴﺖ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر دو ﺛﺒﺎت ﺑﺎ ﻧﺎم ‪ pel panning registers‬در اﻳﻦ ﻧﻮع ﻛﺎرﺗﻬﺎ وﺟﻮد دارد‪ ،‬ﻛﻪ‬
‫ﻳﻜﻲ ﺑﺮاي ﺣﺮﻛﺖ اﻓﻘﻲ و دﻳﮕﺮي ﺑﺮاي ﺣﺮﻛﺖ ﻋﻤﻮدي ﺗﺼﻮﻳﺮ اﺳﺖ و ﺑﺎ اﻓﺰاﻳﺶ ﻣﻘﺪار اﻳﻦ ﺛﺒﺎﺗﻬﺎ‪ ،‬ﺗﺼﻮﻳﺮ ﻳﻚ ﺧﻂ ﺑﻪ ﺳﻤﺖ ﭼﭗ ﻳﺎ ﺑﺎﻻ ﺣﺮﻛﺖ ﻣﻲﻛﻨﺪ‪ .‬ﻧﺸﺎﻧﻲ درﮔﺎه اﻳﻦ‬
‫ﺛﺒﺎﺗﻬﺎ اﺳﺘﺎﻧﺪارد ﻧﺒﻮده و ﺑﺮاي ﻧﻤﻮﻧﻪ ﺑﻪ ﺗﺮﺗﻴﺐ ‪ 3C0H‬و ‪ 3D4H‬ﻣﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬

‫ﺣﺎﻟﺖ ‪ 256‬رﻧﮓ ﻛﺎرت ‪ :VGA‬اﻳﻦ ﺣﺎﻟﺖ‪ ،‬ﻳﻜﻲ از ﺳﺎدهﺗﺮﻳﻦ ﺣﺎﻟﺘﻬﺎي ﻛﺎرت ‪ VGA‬اﺳﺖ‪ .‬ﻳﻜﻲ از ﻣﺰاﻳﺎي ﻛﺎرت ‪ VGA‬ﻧﺴﺒﺖ ﺑﻪ ‪ ،EGA‬ﺗﻮاﻧﺎﻳﻲ‬
‫ﻧﻤﺎﻳﺶ ‪ 256‬رﻧﮓ ﻣﺘﻔﺎوت ﺑﻪﺻﻮرت ﻫﻤﺰﻣﺎن ﺑﺮ روي ﺻﻔﺤﻪ اﺳﺖ‪ 256 .‬رﻧﮓ ﻣﺨﺘﻠﻒ را ﻣﻲﺗﻮان از ‪ 262000‬ﺳﺮيرﻧﮓ ﻣﺘﻔﺎوت اﻧﺘﺨﺎب ﻧﻤﻮد‪ .‬اﻣﺎ در ﺣﺎﻟﺖ ‪ 256‬رﻧﮓ‪،‬‬
‫وﺿﻮح‪ 320x200 ،‬ﻧﻘﻄﻪ ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ در اﻳﻦ ﺣﺎﻟﺖ وﺿﻮح ﻛﻤﺘﺮي را ﻧﺴﺒﺖ ﺑﻪ ﺣﺎﻟﺖ ‪ 16‬رﻧﮓ ﺧﻮاﻫﻴﻢ داﺷﺖ‪ ،‬ﻛﻪ ‪ 640x480‬ﻧﻘﻄﻪ اﺳﺖ‪.‬‬

‫ﺗﻨﻈﻴﻢ ﺣﺎﻟﺖ ‪ 256‬رﻧﮓ‪ :‬ﻧﺨﺴﺘﻴﻦ ﻛﺎر ﺑﺮاي ﺗﻨﻈﻴﻢ اﻳﻦ ﺣﺎﻟﺖ‪ ،‬ﻓﻌﺎلﺳﺎزي‪ 3‬آن اﺳﺖ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺗﺎﺑﻊ ‪ 00H‬وﻗﻔﻪي ‪ 10H‬ﺑﺎﻳﺪ اﺳﺘﻔﺎده ﺷﻮد‪.‬‬
‫ﺷﻤﺎرهي اﻳﻦ ﺣﺎﻟﺖ‪ 13H ،‬اﺳﺖ ﻛﻪ در ﺛﺒﺎت ‪ AL‬ﺑﺎﻳﺪ ﻗﺮار ﮔﻴﺮد‪ .‬در ﻧﺘﻴﺠﻪ‪ ،‬ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ ﺗﺎﺑﻊ ﺣﺎﻟﺖ ‪ 256‬رﻧﮓ ﺑﺎ وﺿﻮح ‪ 320x200‬ﻓﻌﺎل ﺧﻮاﻫﺪ ﺷﺪ‪:‬‬
‫‪mov ah, 00h‬‬
‫‪mov al, 13h‬‬
‫‪int 10h‬‬

‫ﺳﺎﺧﺘﺎر ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ در اﻳﻦ ﺣﺎﻟﺖ‪ :‬ﻫﺮ ﻧﻘﻄﻪ ﺑﻪ ﻳﻚ ﺑﺎﻳﺖ ﻧﻴﺎز دارد ﻛﻪ ﻛﺪ ﻧﻘﻄﻪ اﺳﺖ‪ .‬ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ‪ 64KB‬اﺳﺖ و ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪي آن‬
‫‪ B800H‬اﺳﺖ‪:‬‬
‫‪VideoSegAddr = B800H‬‬
‫در ﻫﺮ ﺧﻂ‪ 320 ،‬ﻧﻘﻄﻪ دارﻳﻢ‪ .‬ﭘﺲ ﺑﺮاي ﺑﺪﺳﺖآوردن ﻧﺸﺎﻧﻲ ﻫﺮ ﻧﻘﻄﻪ )‪ P(X, Y‬در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ‪:‬‬
‫‪PixelOffset (X, Y) = Y * 320 + X‬‬
‫و روال ‪ PutPixel‬ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد‪:‬‬
‫;)‪procedure PutPixel(X, Y : Integer; Color : Byte‬‬
‫‪begin‬‬
‫;‪Mem[VideoSegAddr:PixelOffset(X, Y)] := Color‬‬
‫;‪end‬‬
‫و ﺗﺎﺑﻊ ‪ GetPixel‬ﻫﻢ ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد‪ ،‬ﻛﻪ رﻧﮓ ﻳﻚ ﻧﻘﻄﻪ را ﺑﺮﻣﻲﮔﺮداﻧﺪ‪:‬‬
‫;‪function GetPixel(X, Y : Integer): Byte‬‬
‫‪begin‬‬
‫;])‪GetPixel := Mem[VideoSegAddr:PixelOffset(X, Y‬‬
‫;‪end‬‬

‫_________________________________________________________________________________‬
‫‪smooth scrolling ١‬‬
‫‪animation ٢‬‬
‫‪enabling ٣‬‬
‫ﻓﺼﻞ ‪ :5‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺻﻔﺤﻪ ﻛﻠﻴﺪ‬
‫)‪(Keyboard Programming‬‬

‫‪ 1-5‬ﻣﻘﺪﻣﻪ‬
‫ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻳﻜﻲ از ﻟﻮازم ورودي ‪ PC‬اﺳﺖ و ﺑﺎﻳﺪ ﺑﺘﻮان آﻧﺮا ﻣﺪﻳﺮﻳﺖ ﻧﻤﻮد‪ .‬ﺳﺨﺖاﻓﺰار ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﭘﺎﻟﺲﻫﺎي اﻟﻜﺘﺮﻳﻜﻲ ﺣﺎﺻﻞ از ﻓﺸﺎر دادن ﻛﻠﻴﺪ را ﺑﻪ‬
‫اﻋﺪادي ﺗﺒﺪﻳﻞ ﻧﻤﻮده و ﺑﻪ ‪ PC‬ارﺳﺎل ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ اﻋﺪاد ”‪ “Scan code‬ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮﻧﺪ و ﺗﻠﻔﻴﻖ ﻛﻠﻴﺪﻫﺎي ﻣﻌﻤﻮﻟﻲ ﺑﺎ ﻛﻠﻴﺪﻫﺎي ﻛﻨﺘﺮﻟﻲ‪ scan code ،‬ﻣﺘﻔﺎوﺗﻲ را‬
‫اﻳﺠﺎد ﻣﻲﻛﻨﺪ‪.‬‬

‫ارﺗﺒﺎط ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﺑﺎ ‪ PC‬از ﻃﺮﻳﻖ ﻳﻚ ﻛﺎﺑﻞ اﻧﺠﺎم ﻣﻲﺷﻮد ﻛﻪ ﻧﻮع ارﺗﺒﺎط‪ ،‬ﺳﺮﻳﺎل و ﻫﻤﮕﺎم‪ 1‬اﺳﺖ و از اﻳﻦ ﻧﻈﺮ ﺑﺎ واﺳﻂ ﺳﺮﻳﺎل ﻛﻪ ﻧﺎﻫﻤﮕﺎم‪ 2‬اﺳﺖ‪ ،‬داراي‬
‫ﺗﻔﺎوت اﺳﺖ‪.‬‬

‫‪ :make and break codes‬ﺑﻪ ازاي ﻓﺸﺎردادن و رﻫﺎﻛﺮدن ﻳﻚ ﻛﻠﻴﺪ‪ ،‬ﻛﺪﻫﺎي ﻣﺘﻔﺎوﺗﻲ ﺗﻮﻟﻴﺪ ﻣﻲﺷﻮد و ﺑﻪ ‪ PC‬ارﺳﺎل ﻣﻲﺷﻮد ﺗﺎ ﺗﻌﻴﻦ ﺷﻮد ﻛﻪ ﻳﻚ‬
‫ﻛﻠﻴﺪ زده ﺷﺪه ﻳﺎ رﻫﺎ ﺷﺪه اﺳﺖ و از ﻃﺮﻳﻖ ﻓﺸﺎردادن دو ﻛﻠﻴﺪ در ﻳﻚ زﻣﺎن ﻗﺎﺑﻞ ﺗﺸﺨﻴﺺ ﻣﻲﺷﻮد و ﺑﺪون اﻳﻦ روش ﻧﻤﻲﺗﻮان از ﻛﻠﻴﺪﻫﺎي ﺗﺮﻛﻴﺒﻲ ﻣﺜﻞ ‪ Shift+A‬ﻳﺎ‬
‫‪ Ctrl+X‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﻣﻮﻗﻌﻲ ﻛﻪ ﻳﻚ ﻛﻠﻴﺪ زده ﻣﻲﺷﻮد‪ ،‬ﺑﻴﺖ ﻫﻔﺘﻢ ‪ scan code‬ﺻﻔﺮ اﺳﺖ و اﻳﻦ ﻳﻚ ‪ make code‬اﺳﺖ و ﻣﻮﻗﻊ رﻫﺎﻛﺮدن اﻳﻦ ﻛﻠﻴﺪ‪ ،‬ﺑﻴﺖ ﻫﻔﺘﻢ‬
‫ﻳﻚ ﺧﻮاﻫﺪ ﺑﻮد و ﺑﻪ ﻋﻨﻮان ﻳﻚ ‪ break code‬ارﺳﺎل ﻣﻲﺷﻮد‪.‬‬

‫‪ scan code‬ﻳﻚ ﺑﺎﻳﺖ اﺳﺖ و ﺑﺎ اﺳﺘﻔﺎده از آن ﻧﻤﻲﺗﻮان ﺗﺮﻛﻴﺐ ﻫﻤﻪي ﻛﻠﻴﺪﻫﺎي ﻛﻨﺘﺮﻟﻲ و ﺣﺮوف ﺑﺰرگ و ﻛﻮﭼﻚ و ﻏﻴﺮه را اﻳﺠﺎد ﻧﻤﻮد‪ .‬راه ﺣﻞ اﻳﻦ‬
‫اﺳﺖ ﻛﻪ ﺑﻪازاي ﻫﺮ ﻛﻠﻴﺪ ﻣﻌﻤﻮﻟﻲ ﻳﺎ ﻛﻨﺘﺮﻟﻲ ﻳﻚ ‪ scan code‬ارﺳﺎل ﺷﻮد‪ .‬ﻳﻌﻨﻲ‪ ،‬ﻣﺜﻼً ﺑﺮاي ‪ ،Shift+A‬اﺑﺘﺪا ﻳﻚ ‪ make code‬ﻛﻠﻴﺪ ‪ (36H) Shift‬و ﺳﭙﺲ‬
‫‪ make code‬ﻛﻠﻴﺪ ‪ (1EH) A‬ارﺳﺎل ﻣﻲﺷﻮد‪ .‬ﺳﻴﺴﺘﻢ ﭼﻮن دوﺗﺎ ‪ make code‬درﻳﺎﻓﺖ ﺷﺪه و ‪ break code‬درﻳﺎﻓﺖ ﻧﺸﺪه‪ ،‬ﭘﺲ دو ﻛﺪ را در ﻫﻢ ﺗﺮﻛﻴﺐ ﻧﻤﻮده‬
‫و ﺣﺮف ﺑﺰرگ‪ A 3‬را اﻳﺠﺎد ﻣﻲﻛﻨﺪ و ﻛﺪ اَﺳﻜﻲ ﻣﺘﻨﺎﻇﺮ را ﺑﻪ ﺑﺮﻧﺎﻣﻪﻫﺎ ارﺳﺎل ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ ﮔﻮﻧﻪ ﺗﻔﺴﻴﺮﻫﺎ‪ ،‬ﺗﻮﺳﻂ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ﺻﻔﺤﻪ ﻛﻠﻴﺪ ‪4ROM-BIOS‬‬
‫)‪ (INT 09H‬اﻧﺠﺎم ﻣﻲﺷﻮد و ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ‪ ASCII code ،make & break codes‬اﻳﺠﺎد ﻣﻲﺷﻮد‪.‬‬

‫ﺗﺒﺪﻳﻞ ‪ scan code‬ﺑﻪ ‪ :ASCII code‬ﭼﻮن ‪ scan code‬ﺑﻪ ‪ ASCII code‬ﻣﻲﺷﻮد‪ ،‬ﭘﺲ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻳﻜﺴﺎن و اﺳﺘﺎﻧﺪارد ﺑﻮدن ‪ ،ASCII‬در‬
‫ﺻﻮرت ﺗﻐﻴﻴﺮ ﺳﺨﺖاﻓﺰار ﺻﻔﺤﻪ ﻛﻠﻴﺪ و ارﺳﺎل ‪scan code‬ﻫﺎي ﻣﺘﻔﺎوت‪ ،‬ﺑﺎ ﺗﻐﻴﻴﺮ روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ﺻﻔﺤﻪﻛﻠﻴﺪ در ‪ ،ROM-BIOS‬ﺑﺮﻧﺎﻣﻪﻫﺎ ﻣﺸﻜﻠﻲ ﻧﺨﻮاﻫﻨﺪ‬
‫داﺷﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ Laptop‬ﺳﺨﺖاﻓﺰار دﻳﮕﺮي ﺑﺮاي ﺻﻔﺤﻪ ﻛﻠﻴﺪ وﺟﻮد دارد ﻛﻪ ﻣﺘﻔﺎوت ﺑﺎ ﺻﻔﺤﻪ ﻛﻠﻴﺪﻫﺎي ﻣﻌﻤﻮﻟﻲ ‪ 101‬ﻳﺎ ‪ 102‬ﻛﻠﻴﺪي اﺳﺖ‪.‬‬

‫‪ 2-5‬دﺳﺘﺮﺳﻲ ﺑﻪ ﺻﻔﺤﻪ ﻛﻠﻴﺪ از ﻃﺮﻳﻖ ‪BIOS‬‬


‫وﻗﻔﻪي ‪ ،16H‬ﺳﻪ ﺗﺎﺑﻊ ﺑﺮاي ﺧﻮاﻧﺪن ﺻﻔﺤﻪ ﻛﻠﻴﺪ و وﺿﻌﻴﺖ آن ﻓﺮاﻫﻢ ﻧﻤﻮده اﺳﺖ‪ .‬اﻣﺎ اﻳﻦ ﺗﻮاﺑﻊ ﻧﺎﻗﺺ ﻫﺴﺘﻨﺪ و ﻣﺜﻼً ﺗﺎﺑﻌﻲ ﺑﺮاي ﺑﺮداﺷﺘﻦ ﻳﻚ ﻳﺎ ﭼﻨﺪ‬
‫ﻛﻠﻴﺪ از ﺑﺎﻓﺮ ﺻﻔﺤﻪﻛﻠﻴﺪ و دور رﻳﺨﺘﻦ آﻧﻬﺎ‪ ،‬وﺟﻮد ﻧﺪارد‪ ،‬ﻛﻪ ﺟﺰو ﺗﻮاﺑﻊ ‪ DOS‬اﺳﺖ و ﺑﺎ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﻣﺴﺘﻘﻴﻢ اﻣﻜﺎنﭘﺬﻳﺮ اﺳﺖ‪.‬‬

‫)‪Function 00H: Read keyboard (Remove character from buffer‬‬


‫در ﺻﻮرﺗﻴﻜﻪ ﻛﺎرﺑﺮ ﻗﺒﻼً ﻛﻠﻴﺪي را زده ﺑﺎﺷﺪ اﻳﻦ ﺗﺎﺑﻊ ﻛﺎراﻛﺘﺮ را از ﺑﺎﻓﺮ ﺑﺮ ﻣﻲدارد و ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ .‬در ﻏﻴﺮ اﻳﻦﺻﻮرت‪ ،‬ﻣﻨﺘﻈﺮ ﻣﻲﺷﻮد‪ .‬ﻣﻘﺎدﻳﺮ ﺑﺮﮔﺸﺘﻲ‬
‫اﻳﻦ ﺗﺎﺑﻊ در ﺛﺒﺎﺗﻬﺎي ‪ AL‬و ‪ AH‬ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪ .‬اﮔﺮ ﻛﻠﻴﺪ زده ﺷﺪه‪ ،‬ﺟﺰء ‪ 128‬ﻛﺎراﻛﺘﺮ اول ﺟﺪول ‪ ASCII‬و ﻏﻴﺮ ﻛﻨﺘﺮﻟﻲ ﺑﺎﺷﺪ‪ ،‬ﻳﻚ ﻣﻘﺪار ﻏﻴﺮ ‪ 00H‬در ‪ AL‬وﺟﻮد‬
‫ﺧﻮاﻫﺪ داﺷﺖ‪ .‬در ﻏﻴﺮ اﻳﻦﺻﻮرت‪ AH=00H ،‬اﺳﺖ و ﻛﺪ ﻣﺘﻨﺎﻇﺮ از ﺟﺪول ‪ Extended ASCII‬در ‪ AH‬وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ‪ .‬اﻳﻦ ﺗﺎﺑﻊ‪ ،‬ﻛﺎراﻛﺘﺮ را از ﺑﺎﻓﺮ‬
‫ﺑﺮﻣﻲﮔﺮداﻧﺪ و اﺷﺎرهﮔﺮ ﺑﺎﻓﺮ ﭼﺮﺧﻪاي ﺻﻔﺤﻪ ﻛﻠﻴﺪ را ﺑﻪ ﺟﻠﻮ ﻣﻲﺑﺮد‪ .‬اﻳﻦ ﺗﺎﺑﻊ ﻣﻌﺎدل ‪ ReadKey‬در زﺑﺎن ﭘﺎﺳﻜﺎل ﻳﺎ )(‪ getch‬در زﺑﺎن ‪ C‬اﺳﺖ‪.‬‬

‫)‪Function 01H: Read keyboard (Don’t remove character from buffer‬‬


‫ﺑﺮﺧﻼف ﺗﺎﺑﻊ ‪ ،00H‬اﻳﻦ ﺗﺎﺑﻊ ﻛﺎراﻛﺘﺮ را از ﺑﺎﻓﺮ ﺑﺮﻧﻤﻲدارد و دوﺑﺎره ﻣﻲﺗﻮان آﻧﺮا ﺧﻮاﻧﺪ‪ .‬ﺑﻪاﻳﻦ ﺗﺮﺗﻴﺐ‪ ،‬ﻣﻲﺗﻮان ﻓﻬﻤﻴﺪ ﻛﻪ ﻳﻚ ﻛﻠﻴﺪ زده ﺷﺪه اﺳﺖ ﺑﺎ ﻧﻪ؟ اﮔﺮ‬
‫زده ﻧﺸﺪه‪ ،‬ﻣﻨﺘﻈﺮ ﻧﺸﺪ ﻳﺎ ﺗﺎ زﻣﺎن زدن ﻳﻚ ﻛﻠﻴﺪ‪ ،‬ﻋﻤﻠﻲ اﻧﺠﺎم ﺷﻮد‪ .‬ﻛﺎري ﻛﻪ در زﺑﺎن ﭘﺎﺳﻜﺎل ﺑﺎ ﺗﺎﺑﻊ ‪ KeyPressed‬و در زﺑﺎن ‪ C‬ﺑﺎ ﺗﺎﺑﻊ )(‪ kbdhit‬اﻧﺠﺎم ﻣﻲﺷﻮد‪.‬‬
‫در ﺻﻮرت زده ﺷﺪن ﻳﻚ ﻛﻠﻴﺪ‪ ZF=0 ،‬اﺳﺖ و ﺛﺒﺎﺗﻬﺎ ﻫﻤﺎﻧﻨﺪ ﺗﺎﺑﻊ ﻗﺒﻠﻲ ﻣﻘﺪار ﻣﻲﮔﻴﺮﻧﺪ‪ ،‬و در ﻏﻴﺮ اﻳﻦﺻﻮرت‪ ZF=1 ،‬ﺧﻮاﻫﺪ ﺑﻮد و ﺑﺎ ﭼﻚ ﻛﺮدن ‪ ZF‬ﻣﻲﺗﻮان ﻓﻬﻤﻴﺪ‬
‫ﻛﻪ ﻛﻠﻴﺪي زده ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪syncronous ١‬‬
‫‪asynchronous ٢‬‬
‫‪upper case ٣‬‬
‫‪ROM-BIOS keyboard handler ٤‬‬
‫‪2-5‬‬ ‫ﻓﺼﻞ ‪ :5‬ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺻﻔﺤﻪ ﻛﻠﻴﺪ‬

‫‪Function 02H: Read control keys‬‬


‫ﺑﺎ اﻳﻦ ﺗﺎﺑﻊ‪ ،‬ﺑﺎﻳﺖ ﻛﻨﺘﺮﻟﻲ ﺻﻔﺤﻪﻛﻠﻴﺪ را ﻣﻲﺗﻮان ﺧﻮاﻧﺪ ﺗﺎ وﺿﻌﻴﺖ ﻛﻠﻴﺪﻫﺎي ﻛﻨﺘﺮﻟﻲ را ﺑﺮرﺳﻲ ﻛﺮد‪ .‬ﺑﻴﺘﻬﺎي ﻣﺨﺘﻠﻒ اﻳﻦ ﺑﺎﻳﺖ ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﻛﻠﻴﺪﻫﺎي زﻳﺮ اﺳﺖ‪:‬‬
‫ﺑﻴﺖ ‪Scroll Lock : 4‬‬ ‫ﺑﻴﺖ ‪Right Shift : 0‬‬
‫ﺑﻴﺖ ‪Num Lock : 5‬‬ ‫ﺑﻴﺖ ‪Left Shift: 1‬‬
‫ﺑﻴﺖ ‪Caps Lock : 6‬‬ ‫ﺑﻴﺖ ‪Ctrl : 2‬‬
‫ﺑﻴﺖ ‪Insert: 7‬‬ ‫ﺑﻴﺖ ‪Alt : 3‬‬

‫‪ 3-5‬ﻣﺘﻐﻴﺮﻫﺎي ﺻﻔﺤﻪ ﻛﻠﻴﺪ در ﻗﻄﻌﻪي ﻣﺘﻐﻴﺮﻫﺎي ‪BIOS‬‬


‫در ﻓﺼﻞ ‪ 3‬ﮔﻔﺘﻴﻢ ﻛﻪ ﺗﻌﺪادي از ﻣﺘﻐﻴﺮﻫﺎي ‪ BIOS‬ﻣﺮﺑﻮط ﺑﻪ ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻫﺴﺘﻨﺪ‪ .‬اﻳﻦ ﻣﺘﻐﻴﺮﻫﺎ ﺑﻮﺳﻴﻠﻪي ‪ INT 09H‬و ‪ INT 16H‬دﺳﺘﻜﺎري‬
‫ﻣﻲﺷﻮﻧﺪ‪ .‬اﻳﻦ ﻣﺘﻐﻴﺮﻫﺎ‪ ،‬اﻧﺪازه و ﻧﺸﺎﻧﻲ ﻣﺒﺪأ آﻧﻬﺎ ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ)ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ ‪:(0040H‬‬

‫‪Offset‬‬ ‫‪Meaning‬‬ ‫‪Size‬‬


‫‪0017H‬‬ ‫‪Keyboard status byte‬‬ ‫‪1 byte‬‬
‫‪0018H‬‬ ‫‪Extended keyboard status byte‬‬ ‫‪1 byte‬‬
‫‪0019H‬‬ ‫‪ASCII code entry‬‬ ‫‪1 byte‬‬
‫‪001AH‬‬ ‫‪Next character in keyboard buffer‬‬ ‫‪1 word‬‬
‫‪001CH‬‬ ‫‪Last character in keyboard buffer‬‬ ‫‪1 word‬‬
‫‪001EH‬‬ ‫‪Keyboard buffer‬‬ ‫‪16 words‬‬

‫ﺑﺎﻓﺮ ﭼﺮﺧﻪاي ﺻﻔﺤﻪ ﻛﻠﻴﺪ‬


‫‪0040:001E‬‬ ‫‪0040:003D‬‬

‫‪0040:001C‬‬ ‫‪0040:001A‬‬

‫‪Last Char‬‬ ‫‪Next Char‬‬

‫ﻣﺘﻐﻴﺮﻫﺎي ﻧﺸﺎﻧﻴﻬﺎي ‪ 1CH ،1AH‬و ‪ ،1EH‬ﺑﺎﻓﺮ ﭼﺮﺧﻪاي ﺻﻔﺤﻪﻛﻠﻴﺪ را ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﻨﺪ‪ .‬اوﻟﻴﻦ ﻣﺘﻐﻴﺮ‪ ،‬اﺷﺎرهﮔﺮي ﺑﻪ ﻛﺎراﻛﺘﺮ ﺑﻌﺪي در ﺑﺎﻓﺮ ﭼﺮﺧﻪاي‪،‬‬
‫دوﻣﻴﻦ ﻣﺘﻐﻴﺮ‪ ،‬اﺷﺎرهﮔﺮ ﺑﻪ آﺧﺮﻳﻦ ﻛﺎراﻛﺘﺮ و ﻣﺘﻐﻴﺮ ﺳﻮم ﻛﻪ از ‪ 1EH‬ﺷﺮوع ﺷﺪه و ﺗﺎ ‪ 3DH‬اداﻣﻪ ﻣﻲﻳﺎﺑﺪ و داراي ﻃﻮل ‪ 16‬ﻛﻠﻤﻪ ﻳﺎ ‪ 32‬ﺑﺎﻳﺖ اﺳﺖ‪ ،‬ﻣﺤﺪودهي ﺑﺎﻓﺮ‬
‫ﭼﺮﺧﻪاي اﺳﺖ‪ .‬دﻟﻴﻞ اﻧﺘﺨﺎب ﺑﺎﻓﺮ ﭼﺮﺧﻪاي‪ ،‬ﻋﺪم ﻧﻴﺎز ﺑﻪ ﺷﻴﻔﺖدادن ﺑﺎﻓﺮ در ﺻﻮرت ﺑﺮداﺷﺘﻦ ﻳﻚ ﻛﺎراﻛﺘﺮ از اﺑﺘﺪاي ﺑﺎﻓﺮ اﺳﺖ و ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﻓﻘﻂ اﺷﺎرهﮔﺮ ‪ Next‬ﻳﻜﻲ‬
‫اﺿﺎﻓﻪ ﺷﻮد‪ ،‬و در ﺻﻮرت رﺳﻴﺪن ﺑﺎ آﺧﺮ ﺑﺎﻓﺮ‪ ،‬دوﺑﺎره ﺑﻪ اﺑﺘﺪاي ﺑﺎﻓﺮ اﺷﺎره ﻛﻨﺪ‪ .‬اﻳﻦ روش زﻣﺎن ﭘﺮدازش ﺑﺎﻓﺮ ﺑﻮﺳﻴﻠﻪي ‪ INT 09H‬را ﻛﺎﻫﺶ ﻣﻲدﻫﺪ‪.‬‬

‫‪ 4-5‬ﺳﺎﻳﺮ ﻧﻜﺎت‬
‫روال ﺟﺪﻳﺪ ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ﺻﻔﺤﻪﻛﻠﻴﺪ‪ :‬اﮔﺮ ﺑﺨﻮاﻫﻴﻢ ﺗﻔﺴﻴﺮ ﺟﺪﻳﺪي از ﺗﺮﻛﻴﺐ ﻛﻠﻴﺪﻫﺎ داﺷﺘﻪ ﺑﺎﺷﻴﻢ‪ ،‬و ﺑﺮاي ﻧﻤﻮﻧﻪ ﺗﺮﻛﻴﺐ ﻛﻠﻴﺪﻫﺎي‬
‫‪ Alt+Ctrl+Delete‬ﺑﺎﻋﺚ ‪ reset‬ﺷﺪن ﺳﻴﺴﺘﻢ ﻧﺸﻮد‪ ،‬ﻳﺎ ﺑﺎ زدن ﺗﺮﻛﻴﺐ ﻛﻠﻴﺪﻫﺎي ﻣﺜﻼً ‪ Alt+F10‬ﻳﻚ ﺑﺮﻧﺎﻣﻪي ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ )‪ 1(TSR‬ﻓﻌﺎل ﺷﻮد‪ ،‬ﺑﺎﻳﺪ روال‬
‫ﺟﺪﻳﺪي ﺑﺮاي ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ﺻﻔﺤﻪ ﻛﻠﻴﺪ)‪ (INT 09H‬ﺑﻨﻮﻳﺴﻴﻢ و ﺑﺎ روال ﻣﻮﺟﻮد ﺟﺎﻳﮕﺰﻳﻦ ﻛﻨﻴﻢ‪.‬‬

‫ﺑﺮﻧﺎﻣﻪرﻳﺰي ﻣﺴﺘﻘﻴﻢ ﺻﻔﺤﻪ ﻛﻠﻴﺪ‪ :‬ﺑﺎﻳﺪ ﺗﺮاﺷﻪي ‪ 8255‬را ﺑﺮﻧﺎﻣﻪرﻳﺰي ﻛﺮد‪ 8255 .‬ﻳﻚ ﺗﺮاﺷﻪ ﻫﻤﻪﻣﻨﻈﻮره ﺑﺮاي ارﺗﺒﺎﻃﺎت ورودي‪-‬ﺧﺮوﺟﻲ اﺳﺖ‪،‬‬
‫ﻛﻪ دﺳﺘﮕﺎﻫﻬﺎﻳﻲ ﻣﺜﻞ ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﺑﻪ آن ﻣﺘﺼﻞ ﻣﻲﺷﻮﻧﺪ‪ .‬اﻳﻦ ﺗﺮاﺷﻪ ﺳﻪ درﮔﺎه ﺑﻪ ﻧﺎﻣﻬﺎي ‪ PB ،PA‬و ‪ PC‬دارد ﻛﻪ ﻧﺸﺎﻧﻴﻬﺎي آﻧﻬﺎ ﺑﻪ ﺗﺮﺗﻴﺐ ‪ 61H ،60H‬و ‪62H‬‬
‫ﻫﺴﺘﻨﺪ‪ .‬ارﺗﺒﺎط ﺑﻴﻦ ﺻﻔﺤﻪ ﻛﻠﻴﺪ و ﭘﺮدازﻧﺪه از ﻃﺮﻳﻖ ﻣﻜﺎﻧﻴﺰم وﻗﻔﻪ و درﮔﺎﻫﻬﺎي ‪ PA‬و ‪ PB‬ﺑﺮﻗﺮار ﻣﻲﺷﻮد‪ .‬در درون ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻳﻚ ﭘﺮدازﻧﺪه ﻛﻮﭼﻚ وﺟﻮد دارد ﻛﻪ‬
‫ﻫﻤﻴﺸﻪ وﺿﻌﻴﺖ ﻛﻠﻴﺪﻫﺎ را ﺑﺮرﺳﻲ ﻣﻲﻛﻨﺪ و ﻣﻨﺘﻈﺮ ﺗﻐﻴﻴﺮات در وﺿﻌﻴﺖ آﻧﻬﺎ اﺳﺖ و ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﻓﺸﺎر دادن ﻳﺎ رﻫﺎﻛﺮدن ﻛﻠﻴﺪﻫﺎ‪ make & break code ،‬را ﺑﻪ ﺳﻴﺴﺘﻢ‬
‫ارﺳﺎل ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮاي ﺧﻮاﻧﺪن ﻳﻚ ﻛﻠﻴﺪ‪ scan code ،‬آن از درﮔﺎه ‪ PA‬ﺧﻮاﻧﺪه ﻣﻲﺷﻮد و ﺳﭙﺲ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ‪ Ack ،7‬از ﻃﺮﻳﻖ ‪ PB‬ارﺳﺎل ﻣﻲﺷﻮد‪.‬‬

‫ﺣﺮﻛﺖ دادن ﻣﻜﺎنﻧﻤﺎ‪ :‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﺗﺮاﺷﻪي ‪ 6845‬ﻛﻪ ‪ CRT Controller‬اﺳﺖ‪ ،‬ﺑﺮﻧﺎﻣﻪرﻳﺰي ﺷﻮد‪ ،‬ﻛﻪ در اﻳﻨﺠﺎ ﺑﻪ آن ﻧﻤﻲﭘﺮدازﻳﻢ‪ .‬اﻣﺎ‬
‫ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ ﺑﻪ زﺑﺎن ‪ ،C‬ﻛﺎر ﺣﺮﻛﺖ دادن ﻣﻜﺎن ﻧﻤﺎ را ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ اﻧﺠﺎم ﻣﻲدﻫﺪ‪:‬‬

‫)‪void GoToXY(int X, int Y‬‬


‫{‬
‫_________________________________________________________________________________‬
‫‪Terminate Stay Resident ١‬‬
3-5 ‫ ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺻﻔﺤﻪ ﻛﻠﻴﺪ‬:5 ‫ﻓﺼﻞ‬

int V = X * 80 + Y;
outportb(0x3D4, 14);
outportb(0x3D5, (V >> 8) & 0xFF);
outportb(0x3D4, 15);
outportb(0x3D5, V & 0xFF);
}
‫ﻓﺼﻞ ‪ :6‬ﮔﺮداﻧﻨﺪﻫﺎي دﻳﺴﻜﺖ و دﻳﺴﻚ ﺳﺨﺖ‬
‫)‪(Diskette and Hard Disk Drives‬‬

‫‪ 1-6‬ﻣﻘﺪﻣﻪ‬
‫‪ BIOS‬و ‪ ،DOS‬ﻫﺮ دو ﺗﻮاﺑﻌﻲ را ﺑﺮاي ﻛﺎرﻛﺮدن ﺑﺎ دﻳﺴﻜﺖ و دﻳﺴﻚ ﺳﺨﺖ در اﺧﺘﻴﺎر ﻗﺮار ﻣﻲدﻫﻨﺪ‪ .‬ﺗﻮاﺑﻊ ‪ BIOS‬ﺳﻄﺢ ﭘﺎﻳﻴﻦ ﻫﺴﺘﻨﺪ و ﺑﻪ دﻳﺴﻚ ﺑﻪ‬
‫ﻋﻨﻮان ﻳﻚ وﺳﻴﻠﻪي ﻓﻴﺰﻳﻜﻲ ﻧﮕﺎه ﻣﻲﻛﻨﻨﺪ‪ .‬اﻣﺎ ﺗﻮاﺑﻊ ‪ DOS‬ﺳﻄﺢ ﺑﺎﻻ ﺑﻮده و ﺑﻪ دﻳﺴﻚ ﺑﻪﺻﻮرت ﻣﻨﻄﻘﻲ ﻧﮕﺎه ﻣﻲﻛﻨﻨﺪ‪ .‬ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﻤﻜﻲ ﻣﺜﻞ ‪Norton‬‬
‫‪ Utilities‬ﻳﺎ ‪ ،PC Tools‬ﻧﻴﺎز ﺑﻪ دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻚ درﺳﻄﺢ ‪ BIOS‬اﺳﺖ‪ .‬دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ دﻳﺴﻜﺖ و ﺑﻪوﻳﮋه دﻳﺴﻚ ﺳﺨﺖ ﻧﻴﺰ ﻣﻮرد ﻧﻴﺎز اﺳﺖ‪ .‬ﻣﺜﻼً در‬
‫ﺻﻮرﺗﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﻢ از ﻳﻚ ﻛﻨﺘﺮﻟﺮ ﺧﺎص ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻚ اﺳﺘﻔﺎده ﻛﻨﻴﻢ ﻛﻪ ﺑﻮﺳﻴﻠﻪي ‪ BIOS‬ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲﺷﻮد‪ ،‬ﻳﺎ آﻧﻜﻪ ﺑﺨﻮاﻫﻴﻢ ﻳﻚ روش دﺳﺘﺮﺳﻲ وﻳﮋه‬
‫ﭘﻴﺎدهﺳﺎزي ﻛﻨﻴﻢ‪ .‬دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ دﻳﺴﻚ ﺳﺨﺖ‪ ،‬ﻧﻴﺎزﻣﻨﺪ ﺑﺮﻧﺎﻣﻪرﻳﺰي ﻛﻨﺘﺮﻟﺮﻫﺎﻳﻲ ﻧﻈﻴﺮ ‪ IDE‬ﻳﺎ ‪ SCSI‬اﺳﺖ‪.‬‬

‫‪ 2-6‬ﺳﺎﺧﺘﺎر دﻳﺴﻜﺖ و دﻳﺴﻚ ﺳﺨﺖ‬


‫ﺳﺎﺧﺘﺎر دﻳﺴﻜﺖ‪ :‬ﻳﻚ دﻳﺴﻜﺖ ﻳﺎ دﻳﺴﻚ ﻧﺮم‪ 1‬داراي ﺗﻌﺪادي ﺷﻴﺎر‪ 2‬اﺳﺖ ﻛﻪ از ‪ 0‬ﺗﺎ ‪ N‬ﺷﻤﺎرهﮔﺬاري ﻣﻲﺷﻮﻧﺪ‪ .‬ﻫﺮ ﺷﻴﺎر ﺑﻪ ﺗﻌﺪادي ﺑﺨﺶ‪ 3‬ﺗﻘﺴﻴﻢ‬
‫ﻣﻲﺷﻮد و ﻣﻴﺰان ﻣﻌﻴﻨﻲ داده را ﻣﻲﺗﻮاﻧﺪ در ﺧﻮد ذﺧﻴﺮه ﻛﻨﺪ‪.‬‬
‫ﺗﻌﺪاد ﺑﺨﺸﻬﺎ در ﻫﺮ ﺷﻴﺎر ﺑﻪ ﻧﻮع دﻳﺴﻜﺖ و ﻧﻮع ﻗﺎﻟﺐﺑﻨﺪي ﻳﺎ ﻓﺮﻣﺖ‬
‫ﺑﺨﺶ‬ ‫آن ﺑﺴﺘﮕﻲ دارد‪ .‬از ﻧﻈﺮ اﻧﺪازه‪ ،‬دو ﻧﻮع دﻳﺴﻜﺖوﺟﻮد دارد ﻛﻪ ﻧﻮع ﻗﺪﻳﻤﻲ "‪5.25‬‬
‫و ﻧﻮﻋﻲ ﻛﻪ اﻻن اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ 3.5" ،‬اﺳﺖ‪ .‬در ﻓﺮﻣﺖ ‪ ،DOS‬ﻫﺮ ﺑﺨﺶ‬
‫ﺷﻴﺎر‬
‫دﻳﺴﻜﺖ ‪ 512‬ﺑﺎﻳﺖ اﺳﺖ و در ﻫﺮ ﺑﺎر دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻜﺖ‪ ،‬ﺣﺪاﻗﻞ ﻳﻚ ﺑﺨﺶ‬
‫ﺧﻮاﻧﺪه ﻳﺎ ﻧﻮﺷﺘﻪ ﻣﻲﺷﻮد و ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ ﻛﻤﺘﺮ از آن اﻣﻜﺎنﭘﺬﻳﺮ ﻧﻴﺴﺖ‪.‬‬

‫ﻣﺤﺎﺳﺒﻪ ﻇﺮﻓﻴﺖ دﻳﺴﻜﺖ‪ :‬ﺑﺎ ﻓﺮﻣﻮل زﻳﺮ ﻣﻲﺗﻮان ﻇﺮﻓﻴﺖ ﻳﻚ دﻳﺴﻜﺖ را ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮد‪:‬‬

‫‪Floppy Disk Capacity = Tracks * Sector_Per_Track * 512‬‬

‫_________________________________________________________________________________‬
‫‪floppy disk ١‬‬
‫‪track ٢‬‬
‫‪sector ٣‬‬
‫‪2-6‬‬ ‫ﻓﺼﻞ ‪ :6‬ﮔﺮداﻧﻨﺪهﻫﺎي دﻳﺴﻜﺖ و دﻳﺴﻚ ﺳﺨﺖ‬

‫اﻳﻦ ﻓﺮﻣﻮل ﺑﺮاي ﻣﺤﺎﺳﺒﻪي ﻓﺮﻣﻮل ﻳﻚ ﻃﺮف دﻳﺴﻜﺖ اﺳﺖ و اﮔﺮ ﮔﺮداﻧﻨﺪهي دﻳﺴﻜﺖ داراي دو ﻫِﺪ‪ 1‬ﺑﺎﺷﺪ‪ ،‬دوﻃﺮف دﻳﺴﻜﺖ ﻗﺎﺑﻞ ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ اﺳﺖ و‬
‫در اﻳﻦ ﺻﻮرت دﻳﺴﻜﺖ ﭼﮕﺎﻟﻲ دوﺑﺮاﺑﺮ‪ 2‬ﺧﻮاﻫﺪ ﺑﻮد و ﻇﺮﻓﻴﺖ دﻳﺴﻜﺖ دو ﺑﺮاﺑﺮ ﻣﻲﺷﻮد‪ .‬ﭘﺲ ﺳﺎﺧﺘﺎر دﻳﺴﻜﺖ ﺷﺎﻣﻞ ﺗﻌﺪادي ﻃﺮﻓﻬﺎ‪ ،‬ﺗﻌﺪاد ﺷﻴﺎرﻫﺎ‪ ،‬ﺗﻌﺪاد ﺑﺨﺸﻬﺎي ﻫﺮ ﺷﻴﺎر‬
‫و ﻇﺮﻓﻴﺖ ﻳﻚ ﺑﺨﺶ اﺳﺖ‪.‬‬

‫دﻳﺴﻜﺖﻫﺎي ”‪ ،3.5‬ﻳﺎ ﭼﮕﺎﻟﻲ دوﺑﺮاﺑﺮ ﻫﺴﺘﻨﺪ و ‪ 720KB‬ﻇﺮﻓﻴﺖ دارﻧﺪ و ﻳﺎ ﭼﮕﺎﻟﻲ ﺑﺎﻻ‪ 3‬ﺑﻮده و ‪ 1.44MB‬ﻇﺮﻓﻴﺖ دارﻧﺪ‪ .‬در دﻳﺴﻜﺘﻬﺎي ﭼﮕﺎﻟﻲ ﺑﺎﻻ‪،‬‬
‫ﺗﻌﺪاد ﺑﺨﺸﻬﺎ در ﻫﺮ ﺷﻴﺎر دو ﺑﺮاﺑﺮ ﭼﮕﺎﻟﻲ دوﺑﺮاﺑﺮ ﺑﻮده و ﻣﺴﺎوي ‪ 18‬اﺳﺖ‪ .‬ﺗﻌﺪاد ﺷﻴﺎرﻫﺎ در ﻫﺮ دو ﻧﻮع‪ 80 ،‬در ﻫﺮ ﻃﺮف اﺳﺖ‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ‪:‬‬

‫‪Double-dinsity: Capacity = 2 Side * 80 Tracks * 9 Sector_Per_Track * 512 Byte_Per_Sector = 720KB‬‬


‫‪High-dinsity: Capacity = 2 Side * 80 Tracks * 18 Sector_Per_Track * 512 Byte_Per_Sector = 1.44MB‬‬

‫ﺳﺎﺧﺘﺎر دﻳﺴﻚ ﺳﺨﺖ‪ :‬دﻳﺴﻜﺖ ﻓﻘﻂ ﻳﻚ ﺻﻔﺤﻪ ﻳﺎ دوﺻﻔﺤﻪ ﭘﺸﺖ و رو )‪ (Side 0, Side 1‬اﺳﺖ‪ .‬دﻳﺴﻚ ﺳﺨﺖ ﻫﻢ ﺗﻌﺪادي ﺻﻔﺤﻪ اﺳﺖ ﻛﻪ‬
‫روي ﻫﻢ ﻗﺮار ﮔﺮﻓﺘﻪاﻧﺪ و ﺑﻪ ﻫﺮ ﻛﺪام ﻳﻚ ﺳﻴﻠﻨﺪر‪ 4‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬ﺑﺮاي آﻧﻜﻪ ﺧﻮاﻧﺪن دادهﻫﺎ از ﺻﻔﺤﻪﻫﺎي ﻣﺨﺘﻠﻒ ﺳﺮﻳﻊﺗﺮ ﺑﺎﺷﺪ‪ ،‬ﺗﻌﺪاد ﻫﺪﻫﺎ زﻳﺎدﺗﺮ اﺳﺖ‪ .‬ﺣﺮﻛﺖدادن ﻳﻚ‬
‫ﻫﺪ روي ﺷﻴﺎرﻫﺎي ﻣﺨﺘﻠﻒ ﻛﻨﺪ اﺳﺖ‪ ،‬ﭘﺲ اﮔﺮ ﺑﺨﻮاﻫﻴﻢ دادهاي را ﻛﻪ ﺣﺠﻢ زﻳﺎدي دارد در ﭼﻨﺪ ﺷﻴﺎر ﺑﻨﻮﻳﺴﻴﻢ‪ ،‬ﻳﻚ راه‪ ،‬ﻧﻮﺷﺘﻦ آن در ﺷﻴﺎرﻫﺎي ﭘﺸﺖ ﺳﺮ ﻫﻢ اﺳﺖ‪ .‬اﻣﺎ‬
‫اﻳﻦ ﻛﺎر ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﺑﺎزوﻳﻲ‪ 5‬ﻛﻪ ﻫﺪﻫﺎ ﺑﻪ آن ﻣﺘﺼﻞ ﻫﺴﺘﻨﺪ‪ ،‬ﻧﻴﺎز ﺑﻪ ﺣﺮﻛﺖ داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬وﻟﻲ ﺑﺮاي آﻧﻜﻪ اﻳﻦ ﻛﺎر ﺳﺮﻳﻊﺗﺮ ﺑﺎﺷﺪ‪ ،‬دادهﻫﺎﻳﻲ را ﻛﻪ در ﻳﻚ ﺷﻴﺎر ﺟﺎ‬
‫ﻧﻤﻲﺷﻮﻧﺪ‪ ،‬در ﺷﻴﺎرﻫﺎي ﻫﻢﺷﻤﺎره در ﺻﻔﺤﺎت ﻣﺨﺘﻠﻒ ﻣﻲﻧﻮﻳﺴﻨﺪ‪ .‬اﻳﻦ ﻛﺎر ﻧﻴﺎز ﺑﻪ ﺣﺮﻛﺖ ﺑﺎزو را ﺑﺮﻃﺮف ﻣﻲﻛﻨﺪ و ﺑﺎﻋﺚ ﺗﺴﺮﻳﻊ در ﻧﻮﺷﺘﻦ و ﺧﻮاﻧﺪن دادهﻫﺎ ﻣﻲﺷﻮد‪.‬‬
‫ﻇﺮﻓﻴﺖ دﻳﺴﻚ ﺳﺨﺖ‪:‬‬

‫‪Hard Disk Capacity = Cylenders * Tracks * Sector_Per_Track * 512‬‬

‫‪ 3-6‬دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻜﺖ از ﻃﺮﻳﻖ ‪BIOS‬‬


‫وﻗﻔﻪي ‪ 13H‬ﺗﻮاﺑﻊ دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻜﺖ را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ ﺗﻮاﺑﻊ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪Function‬‬ ‫‪Task‬‬
‫‪00H‬‬ ‫‪Reset‬‬
‫‪01H‬‬ ‫‪Read status‬‬
‫‪02H‬‬ ‫‪Read‬‬
‫‪03H‬‬ ‫‪Write‬‬
‫‪04H‬‬ ‫‪Verify‬‬
‫‪05H‬‬ ‫‪Format‬‬
‫‪08H‬‬ ‫‪Request format‬‬
‫‪09H‬‬ ‫‪Define drive type‬‬
‫‪16H‬‬ ‫‪Detect diskette change‬‬
‫‪17H‬‬ ‫‪Determine diskette format‬‬
‫‪18H‬‬ ‫‪Determine diskette format‬‬
‫وﺿﻌﻴﺖ ﮔﺮداﻧﻨﺪه‪ :‬ﺗﺎﺑﻊ ‪ ،01H‬ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ‪ ،‬ﺑﺎﻳﺖ وﺿﻌﻴﺖ ﮔﺮداﻧﻨﺪه را در ﺛﺒﺎت ‪ AH‬ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ ﺳﺎﻳﺮ ﺗﻮاﺑﻊ‪ ،‬اﮔﺮ‬
‫ﻣﻘﺪاري ﻏﻴﺮﺻﻔﺮ در ‪ AH‬ﺑﺎﺷﺪ ﻳﺎ ‪ ،(Carry Flag) CF‬ﻣﻘﺪار ‪ 1‬داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﺧﻄﺎ رخ داده اﺳﺖ‪ .‬ﻣﻘﺎدﻳﺮ ﻣﺨﺘﻠﻒ ﺑﺎﻳﺖ وﺿﻌﻴﺖ ﮔﺮداﻧﻨﺪه‪ ،‬ﻧﻤﺎﻳﺶدﻫﻨﺪه اﻧﻮاع ﺧﻄﺎﻫﺎ‬
‫اﺳﺖ‪:‬‬

‫‪00H: No error‬‬
‫‪01H: Illegal function number‬‬
‫‪02H: Address marking not found‬‬
‫‪03H: Attempt to write to write-prootected diskette‬‬
‫‪...‬‬
‫ﻧﻮع ﮔﺮداﻧﻨﺪه و ﻓﺮﻣﺖ دﻳﺴﻜﺖ‪ :‬ﺗﺎﺑﻊ ‪ ،08H‬اﻃﻼﻋﺎت زﻳﺮ را در ﺛﺒﺎﺗﻬﺎي ﻣﺨﺘﻠﻒ ﺑﺮﻣﻲﮔﺮداﻧﺪ‪:‬‬

‫_________________________________________________________________________________‬
‫‪head ١‬‬
‫‪double-density ٢‬‬
‫‪high-density ٣‬‬
‫‪cylender ٤‬‬
‫‪arm ٥‬‬
‫‪3-6‬‬ ‫ﻓﺼﻞ ‪ :6‬ﮔﺮداﻧﻨﺪهﻫﺎي دﻳﺴﻜﺖ و دﻳﺴﻚ ﺳﺨﺖ‬

‫‪Register Information‬‬
‫‪BL‬‬ ‫‪Drive type :‬‬ ‫‪01H = 5.25”, 360KB‬‬
‫‪02H = 5.25”, 1.2MB‬‬
‫‪03H = 3.5”, 720KB‬‬
‫‪04H = 3.5”, 1.44MB‬‬
‫‪DH‬‬ ‫)‪Max. number of sides (always 1 for 2 sides‬‬
‫‪CH‬‬ ‫‪Max. number of tracks‬‬
‫‪CL‬‬ ‫‪Max. number of sectors‬‬
‫‪ES:DI‬‬ ‫)‪Pointer to DDPT (Disk Drive Parameter Table‬‬
‫* ‪ ،DDPT‬ﺟﺪوﻟﻲ اﺳﺖ ﻛﻪ ﭘﺎراﻣﺘﺮﻫﺎي ﻣﻮردﻧﻴﺎز ‪ BIOS‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻛﻨﺘﺮﻟﺮ دﻳﺴﻚ در آن ﻗﺮار دارد‪.‬‬

‫ﺗﺸﺨﻴﺺ ﺗﻌﻮﻳﺾ دﻳﺴﻜﺖ‪ :‬ﺗﺎﺑﻊ ‪ 16H‬ﺗﻌﻮﻳﺾ دﻳﺴﻜﺖ را ﭘﺲ از دﺳﺘﻴﺎﺑﻲ ﻗﺒﻠﻲ ﻛﻨﺘﺮل ﻣﻲﻛﻨﺪ و ﺗﺸﺨﻴﺺ ﻣﻲدﻫﺪ‪ .‬ﭘﺲ از ﺧﻮاﻧﺪن اﻃﻼﻋﺎت از‬
‫دﻳﺴﻜﺖ و ﻗﺒﻞ از ﻧﻮﺷﺘﻦ ﺑﺮ روي آن‪ ،‬ﺑﺎﻳﺪ ﻛﻨﺘﺮل ﺷﻮد ﻛﻪ دﻳﺴﻜﺖ ﺗﻌﻮﻳﺾ ﻧﺸﺪه ﺑﺎﺷﺪ‪ .‬در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻣﻤﻜﻦ اﺳﺖ ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻﺗﺮ‪ ،‬ﻣﺜﻞ ﺗﻮاﺑﻊ ‪ ،DOS‬اﻃﻼﻋﺎت‬
‫دﻳﺴﻜﺖ را ﺧﺮاب ﻛﻨﻨﺪ‪ .‬ﻣﺜﻼً ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ‪ FAT‬دﻳﺴﻜﺖ ﻗﺒﻠﻲ‪ ،‬اﻃﻼﻋﺎﺗﻲ را ﺑﺮ روي دﻳﺴﻜﺖ ﺗﻌﻮﻳﺾ ﺷﺪه ﺑﻨﻮﻳﺴﻨﺪ‪ .‬اﻳﻦ ﺗﺎﺑﻊ ﻣﻘﺎدﻳﺮ زﻳﺮ را در ﺛﺒﺎت ‪ AH‬ﺑﺮﻣﻲﮔﺮداﻧﺪ‪:‬‬

‫‪00H: Drive not present‬‬


‫‪01H: Disk drive does not recognize diskette change‬‬
‫‪02H: Disk drive recognize diskette change‬‬
‫!‪03H: Hard drive‬‬
‫ﺧﻮاﻧﺪن ﺑﺨﺸﻬﺎي دﻳﺴﻜﺖ‪ :‬ﺗﺎﺑﻊ ‪ 02H‬اﻳﻦ ﻛﺎر را ﻣﻲﻛﻨﺪ و ﺑﺎ ﻳﻚ ﺑﺎر ﻓﺮاﺧﻮاﻧﻲ آن ﻣﻲﺗﻮان ﭼﻨﺪ ﺑﺨﺶ را ﺧﻮاﻧﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﭘﺎراﻣﺘﺮﻫﺎي زﻳﺮ‬
‫ﻓﺮاﻫﻢ ﺷﻮد‪:‬‬

‫‪AL: No of sectores to be read‬‬


‫)‪DL: Drive specification value (0: A, 1:B, etc.‬‬
‫)‪DH: Side (0 or 1‬‬
‫)‪CL: Sector number (1...N‬‬
‫)‪CH: Track number (1..N-1‬‬
‫‪ES:BX: Address of buffer for the data to be read‬‬
‫ﭘﺲ از ﺧﻮاﻧﺪن‪ ،‬وﺿﻌﻴﺖ ﺧﻄﺎ در ‪ AH‬ﺑﺮﮔﺮداﻧﺪه ﻣﻲﺷﻮد و ﺗﻌﺪاد ﺑﺨﺸﻬﺎي ﺧﻮاﻧﺪه ﺷﺪه در ‪ AL‬ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬اﮔﺮ ‪ CF‬ﻣﻘﺪار ‪ 1‬داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﺧﻄﺎ رخ داده‬
‫اﺳﺖ‪.‬‬

‫ﻧﻮﺷﺘﻦ ﺑﺨﺸﻬﺎي دﻳﺴﻜﺖ‪ :‬ﺗﺎﺑﻊ ‪ 03H‬ﺑﺮاي اﻳﻦ ﻛﺎر ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ و ﺑﺎ ﻳﻚ ﺑﺎر ﻓﺮاﺧﻮاﻧﻲ‪ ،‬ﻣﻲﺗﻮان ﭼﻨﺪ ﺑﺨﺶ را ﺑﺮ روي دﻳﺴﻜﺖ ﻧﻮﺷﺖ‪ .‬ﺑﺮاي‬
‫اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﭘﺎراﻣﺘﺮﻫﺎي زﻳﺮ ﻓﺮاﻫﻢ ﺷﻮد‪:‬‬
‫‪AL: No of sectores to be written‬‬
‫)‪DL: Drive specification value (0: A, 1:B, etc.‬‬
‫)‪DH: Side (0 or 1‬‬
‫)‪CL: Sector number (1...N‬‬
‫)‪CH: Track number (1..N-1‬‬
‫‪ES:BX: Address of buffer for the data to be written‬‬
‫ﭘﺲ از ﻧﻮﺷﺘﻦ‪ ،‬وﺿﻌﻴﺖ ﺧﻄﺎ در ‪ AH‬ﺑﺮﮔﺮداﻧﺪه ﻣﻲﺷﻮد و ﺗﻌﺪاد ﺑﺨﺸﻬﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در ‪ AL‬ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬اﮔﺮ ‪ CF‬ﻣﻘﺪار ‪ 1‬داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﺧﻄﺎ رخ داده‬
‫اﺳﺖ‪.‬‬

‫وارﺳﻲ‪ 1‬ﺑﺨﺸﻬﺎي دﻳﺴﻜﺖ‪ :‬ﺗﺎﺑﻊ ‪ 04H‬اﻧﺘﻘﺎل درﺳﺖ دادهﻫﺎ ﺑﻪ دﻳﺴﻜﺖ را ﭘﺲ از ﻧﻮﺷﺘﻦ ﺑﺮرﺳﻲ ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر دادهﻫﺎي ﻣﻮﺟﻮد در ﺑﺎﻓﺮ و‬
‫ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺮ روي دﻳﺴﻜﺖ )ﺑﺎﻳﺖ ﺑﻪ ﺑﺎﻳﺖ( ﺑﺎ ﻫﻢ ﻣﻘﺎﻳﺴﻪ ﻧﻤﻲﺷﻮﻧﺪ‪ ،‬ﺑﻠﻜﻪ‪ ،‬ﻛﺪ ‪ 2CRC‬آﻧﻬﺎ ﺑﺎ ﻫﻢ ﻣﻘﺎﻳﺴﻪ ﻣﻲﺷﻮد‪ ،CRC .‬ﻳﻚ ﺗﺎﺑﻊ ﻣﺤﺎﺳﺒﻪي ﻣﺠﻤﻮع ﻣﻘﺎﺑﻠﻪاي‪3‬‬
‫اﺳﺖ ﻛﻪ ﭘﺎراﻣﺘﺮ ورودي آن دادهﻫﺎ اﺳﺖ و ﻣﻘﺪار ﺧﺮوﺟﻲ آن‪ ،‬ﻳﻚ ﻛﺪ اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل ﻣﻲﺗﻮان ﻫﻤﻪي دادهﻫﺎي ﻣﻮﺟﻮد در ﺑﺎﻓﺮ را ﺑﺎﻳﺖ ﺑﻪ ﺑﺎﻳﺖ ﺑﺎﻫﻢ ‪ XOR‬ﻧﻤﻮد ﺗﺎ ﻳﻚ‬

‫_________________________________________________________________________________‬
‫‪verifying ١‬‬
‫‪Cyclic Redundancy Check ٢‬‬
‫‪checksum ٣‬‬
‫‪4-6‬‬ ‫ﻓﺼﻞ ‪ :6‬ﮔﺮداﻧﻨﺪهﻫﺎي دﻳﺴﻜﺖ و دﻳﺴﻚ ﺳﺨﺖ‬

‫ﺑﺎﻳﺖ ﺣﺎﺻﻞ ﺷﻮد و ﻫﻤﻴﻦ ﻛﺎر را ﺑﺮ روي دادهﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺮ روي دﻳﺴﻚ اﻧﺠﺎم داد و ﺳﭙﺲ اﻳﻦ دو ﺑﺎﻳﺖ را ﺑﺎ ﻫﻢ ﻣﻘﺎﻳﺴﻪ ﻧﻤﻮد‪ .‬ﻣﺤﺎﺳﺒﻪي ﻣﺠﻤﻮع ﻣﻘﺎﺑﻠﻪاي و‬
‫ﻣﻘﺎﻳﺴﻪي ﺗﻨﻬﺎ دو ﺑﺎﻳﺖ‪ ،‬از ﻣﻘﺎﻳﺴﻪي ﻫﻤﻪي دادهﻫﺎ ﺑﻪﻣﺮاﺗﺐ ﺳﺮﻳﻊﺗﺮ اﺳﺖ‪ ،CRC .‬ﻧﻮﻋﻲ ﻣﺠﻤﻮع ﻣﻘﺎﺑﻠﻪاي اﺳﺖ ﻛﻪ ﺣﺎﺻﻞ آن ﺑﺴﻴﺎر ﻣﻄﻤﺌﻦ ﺑﻮده و ﺑﺎ اﺣﺘﻤﺎل ﺑﺴﻴﺎر‬
‫ﭘﺎﻳﻴﻦ ﺑﺮاي دادهﻫﺎي ﻣﺘﻔﺎوت ﺣﺎﺻﻞ آن ﻳﻜﺴﺎن اﺳﺖ و ﺑﻪ ﻛﻤﻚ ﺳﺨﺖاﻓﺰار ﻧﻴﺰ ﻗﺎﺑﻞ ﻣﺤﺎﺳﺒﻪ اﺳﺖ‪.‬‬

‫ﻗﺎﻟﺐﺑﻨﺪي)ﻓﺮﻣﺖﻛﺮدن( ﺷﻴﺎرﻫﺎ‪ :‬ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ 05H‬اﻧﺠﺎم ﻣﻲﺷﻮد و ﭘﺎراﻣﺘﺮﻫﺎي ﻻزم ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ‪:‬‬

‫‪AL: Number of sectors in the track‬‬


‫‪BL: Number of the drive‬‬
‫‪CH: Number of the track‬‬
‫‪ES:BX: Pointer to format table, containing the following information:‬‬
‫‪Offset Information‬‬
‫‪0:‬‬ ‫‪Track to be formatted‬‬
‫‪1:‬‬ ‫)‪Side (0 or 1‬‬
‫‪2:‬‬ ‫‪Number of sectors‬‬
‫‪3:‬‬ ‫‪Number of bytes in sector:‬‬
‫‪0:‬‬ ‫‪128 bytes‬‬
‫‪1:‬‬ ‫‪256 bytes‬‬
‫‪2:‬‬ ‫‪512 bytes‬‬
‫‪3:‬‬ ‫‪1024 bytes‬‬

‫‪ 4-6‬دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻚ ﺳﺨﺖ از ﻃﺮﻳﻖ ‪BIOS‬‬


‫از ﻫﻤﺎن ﺗﻮاﺑﻊ وﻗﻔﻪي ‪ 13H‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻚ ﺳﺨﺖ اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬اﻟﺒﺘﻪ ﺗﻌﺪادي از ﺗﻮاﺑﻊ اﻳﻦ وﻗﻔﻪ ﻓﻘﻂ ﺑﺎ دﻳﺴﻚ ﺳﺨﺖ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪.‬‬
‫اﻳﻦ ﺗﻮاﺑﻊ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪Function‬‬ ‫‪Task‬‬
‫‪00H‬‬ ‫‪Reset‬‬
‫‪01H‬‬ ‫‪Read status‬‬
‫‪02H‬‬ ‫‪Read‬‬
‫‪03H‬‬ ‫‪Write‬‬
‫‪04H‬‬ ‫‪Verify‬‬
‫‪05H‬‬ ‫‪Format‬‬
‫‪08H‬‬ ‫‪Check format‬‬
‫‪09H‬‬ ‫)‪Adapt to foreign drives (not defined in BIOS‬‬
‫‪0AH‬‬ ‫‪Extended Read‬‬
‫‪0BH:‬‬ ‫‪Extended Write‬‬
‫‪0CH:‬‬ ‫‪Move read/write head‬‬
‫‪0DH:‬‬ ‫‪Reset‬‬
‫‪10H:‬‬ ‫‪Drive ready‬‬
‫‪11H:‬‬ ‫‪Recalibrate drive‬‬
‫‪14H‬‬ ‫‪Controller diagnostic‬‬
‫‪15H‬‬ ‫‪Determine drive type‬‬

‫‪ 5-6‬ﺗﻘﺴﻴﻤﺎت‪ 1‬دﻳﺴﻚ ﺳﺨﺖ‬


‫ﺑﺮاي آﻣﺎدهﻛﺮدن دﻳﺴﻚ ﺳﺨﺖ‪ ،‬ﺳﻪ ﻛﺎر ﺑﺎﻳﺪ اﻧﺠﺎم ﺷﻮد‪:‬‬

‫ﻗﺎﻟﺐﺑﻨﺪي ﺳﻄﺢﭘﺎﻳﻴﻦ‪ :2‬ﺑﻪ ﻣﻨﻄﻮر ﺳﺎزﻣﺎﻧﺪﻫﻲ ﮔﺮداﻧﻨﺪه ﺑﻪ ﺳﻴﻠﻨﺪرﻫﺎ‪ ،‬ﺷﻴﺎرﻫﺎ و ﺑﺨﺸﻬﺎ‪ ،‬ﺑﺎ ﻧﻮﺷﺘﻦ ﻋﻼﻣﺘﻬﺎي ﻧﺸﺎﻧﻲ‪ 3‬ﻣﻨﺎﺳﺐ در ﺳﻄﺢ ﮔﺮداﻧﻨﺪه‬ ‫•‬
‫اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﻋﻼﻣﺘﻬﺎي ﻧﺸﺎﻧﻲ ﺑﻌﺪاً ﺑﻮﺳﻴﻠﻪي ﻛﻨﺘﺮﻟﺮ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻚ ﺳﺨﺖ و ﺗﺸﺨﻴﺺ ﺑﺨﺸﻬﺎ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬ﻗﺎﻟﺐﺑﻨﺪي‬
‫_________________________________________________________________________________‬
‫‪patritions ١‬‬
‫‪low-level format ٢‬‬
‫‪address marker ٣‬‬
‫‪5-6‬‬ ‫ﻓﺼﻞ ‪ :6‬ﮔﺮداﻧﻨﺪهﻫﺎي دﻳﺴﻜﺖ و دﻳﺴﻚ ﺳﺨﺖ‬

‫ﺳﻄﺢ ﭘﺎﻳﻴﻦ ﻫﻤﭽﻨﻴﻦ ﺑﺮاي ﺧﺎرج ﻛﺮدن ﺑﺨﺸﻬﺎﻳﻲ از دﻳﺴﻚ ﻛﻪ ﺑﻪﻃﻮر ﻓﻴﺰﻳﻜﻲ ﺧﺮاب ﺷﺪهاﻧﺪ از ﻓﻬﺮﺳﺖ ﺑﺨﺸﻬﺎي ﻗﺎﺑﻞ اﺳﺘﻔﺎدهي دﻳﺴﻚ ﻣﻮرد‬
‫اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬اﻳﻦ ﻧﻮع ﻗﺎﻟﺐﺑﻨﺪي ﺑﺮاي ﻛﻨﺘﺮﻟﺮﻫﺎي ‪ SCSI‬ﻣﻮرد ﻧﻴﺎز ﻧﺒﻮده و ﻓﻘﻂ ﺑﺮاي ﻛﻨﺘﺮﻟﺮﻫﺎي ‪ IDE‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬ﺑﺮﻧﺎﻣﻪي‬
‫ﻗﺎﻟﺐﺑﻨﺪي ﻋﻤﻮﻣﺎً در ﺑﺮﻧﺎﻣﻪي ﺗﻨﻈﻴﻢ‪ BIOS 1‬ﻳﺎ در ﺑﺮﺧﻲ از ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﻤﻜﻲ وﺟﻮد دارد‪.‬‬

‫ﺗﻘﺴﻴﻢﺑﻨﺪي‪ :‬ﻳﻚ دﻳﺴﻚ ﺳﺨﺖ ﺑﻪ ﻗﺴﻤﺘﻬﺎﻳﻲ‪ ،‬ﺗﻘﺴﻴﻢ ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﻛﺎر ﺑﻪﻛﻤﻚ ﺑﺮﻧﺎﻣﻪي ‪ DOS FDISK‬اﻧﺠﺎم ﻣﻲﺷﻮد و ﺑﻪ دو دﻟﻴﻞ ﻣﻮرد‬ ‫•‬
‫ﻧﻴﺎز اﺳﺖ‪ .‬ﻧﺨﺴﺖ‪ ،‬ﺑﺮاي ﺗﻘﺴﻴﻢ ﻳﻚ دﻳﺴﻚ ﺑﺰرگ ﺑﻪ ﮔﺮداﻧﻨﺪهﻫﺎي ﻣﻨﻄﻘﻲ‪ ،‬ﺗﺎ ﺑﺘﻮان از دﻳﺴﻜﻬﺎي ﺑﺰرﮔﺘﺮ از ‪ 2Giga Byte‬ﺗﺤﺖ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ‬
‫‪ DOS‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬زﻳﺮا ‪ DOS‬ﻧﻤﻲﺗﻮاﻧﺪ ﺑﻪ ﮔﺮداﻧﻨﺪهﻫﺎي ﺑﻴﺶ از ‪ 2GB‬دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ)ﺑﻪ دﻟﻴﻞ ﻣﺤﺪودﻳﺖ ‪ .(FAT‬دوم‪ ،‬ﻧﮕﻬﺪاري‬
‫ﺳﻴﺴﺘﻤﻬﺎي ﻋﺎﻣﻞ ﻣﺨﺘﻠﻒ ﺑﺮ روي ﻳﻚ دﻳﺴﻚ ﺳﺨﺖ‪ .‬ﻣﺜﻼً‪ ،‬ﻧﮕﻬﺪاري ﻫﻤﺰﻣﺎن ﺳﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ NT ،DOS‬و ‪ ..Linux‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲﺗﻮان‬
‫ﻫﺮ ﻛﺪام از ﻗﺴﻤﺖﻫﺎ را ﻓﻌﺎل ﻧﻤﻮد ﺗﺎ آن ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ اﺟﺮا ﺷﻮد‪.‬‬

‫ﻗﺎﻟﺐﺑﻨﺪي دﻳﺴﻚ‪ :‬اﻳﻦ ﻛﺎر ﻫﻤﺎن ﻗﺎﻟﺐﺑﻨﺪي ﻣﻌﻤﻮﻟﻲ اﺳﺖ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﺑﺮﻧﺎﻣﻪ ‪ DOSFormat‬اﻧﺠﺎم ﻣﻲﺷﻮد‪.‬‬ ‫•‬

‫وﻗﺘﻲ ﺑﺎ ﺑﺮﻧﺎﻣﻪي ‪ DOS FDISK‬ﻳﻚ دﻳﺴﻚ را ﺗﻘﺴﻴﻢﺑﻨﺪي ﻣﻲﻛﻨﻴﻢ‪ ،‬دﻳﺴﻚ ﺑﻪ دو ﺑﺨﺶ ﻓﻴﺰﻳﻜﻲ ﺗﻘﺴﻴﻢ ﻣﻲﺷﻮد‪:‬‬

‫‪1. PRI DOS:‬‬ ‫)‪Primary DOS partition (drive C:‬‬


‫‪2. EXT DOS:‬‬ ‫‪Extended DOS partition‬‬
‫ﻗﺴﻤﺖ دوم )‪ ،(extended‬ﻗﺎﺑﻞ ﺗﻘﺴﻴﻢﺑﻨﺪي ﺑﻪ ﺗﻌﺪادي ﮔﺮداﻧﻨﺪهي ﻣﻨﻄﻘﻲ اﺳﺖ ﻛﻪ ﻣﻲﺗﻮاﻧﺪ از ‪ D:‬ﺗﺎ ‪ Z:‬ﺑﺎﺷﺪ‪.‬‬

‫ﺑﺨﺶ ﻧﺨﺴﺖ ﻫﺮ دﻳﺴﻚ ﺳﺨﺖ‪ ،‬ﺑﺨﺶ ﺗﻘﺴﻴﻢﺑﻨﺪي‪ 2‬اﺳﺖ و ﻣﺤﻞ ﻧﮕﻬﺪاري اﻃﻼﻋﺎت ﻧﺸﺎﻧﻲ ﺷﺮوع‪ ،‬ﺧﺘﻢ‪ ،‬ﻧﻮع و ﻏﻴﺮه در ﻣﻮرد ﺗﻘﺴﻴﻤﺎت دﻳﺴﻚ اﺳﺖ‪ ،‬ﻛﻪ ﺑﻪ‬
‫آن ﺟﺪول ﺗﻘﺴﻴﻤﺎت‪ 3‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﺑﺨﺶ در ﻫﻨﮕﺎم روﺷﻦ ﺷﺪن ﻛﺎﻣﭙﻴﻮﺗﺮ در ﺣﺎﻓﻈﻪ ﺑﺎرﻣﻲﺷﻮد و در ﻧﺸﺎﻧﻲ ‪ 0000:7C00‬ﻗﺮار ﻣﻲﮔﻴﺮد)در ﺻﻮرﺗﻴﻜﻪ دﻳﺴﻜﺘﻲ در‬
‫ﮔﺮداﻧﻨﺪهي ‪ A:‬ﻗﺮار ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ(‪.‬‬

‫اﮔﺮ ‪ BIOS‬ﭘﺲ از ﺑﺎرﻛﺮدن ﺑﺨﺶ ﺗﻘﺴﻴﻢﺑﻨﺪي در دو ﺑﺎﻳﺖ آﺧﺮ آن ﻣﻘﺎدﻳﺮ ‪ 55H‬و ‪ AAH‬را ﺑﺒﻴﻨﺪ‪ ،‬ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ آن ﺑﺨﺶ ﻗﺎﺑﻞاﺟﺮا ﻳﺎ‬
‫ﺑﻮتﻛﻨﻨﺪه اﺳﺖ و از ﺑﺎﻳﺖ اول‪ ،‬آﻧﺮا اﺟﺮا ﻣﻲﻛﻨﺪ‪ .‬در ﻏﻴﺮ اﻳﻦﺻﻮرت ﭘﻴﻐﺎم ﻗﺮار دادن دﻳﺴﻜﺖ ﺑﻮتﻛﻨﻨﺪه ﺑﻪ ﻛﺎرﺑﺮ داده ﻣﻲﺷﻮد‪.‬‬

‫در ﻣﻮرد دﻳﺴﻜﺖﻫﺎ‪ ،‬ﺑﺨﺶ ‪ 0‬ﺣﺎوي ﺑﺮﻧﺎﻣﻪي ﺑﺎرﻛﻨﻨﺪه ﻳﺎ ﺑﻮتﻛﻨﻨﺪهي‪ 4‬ﺳﻴﺘﺴﻢ ﻋﺎﻣﻞ اﺳﺖ‪ .‬درﺻﻮرﺗﻲﻛﻪ‪ ،‬ﻳﻚ دﻳﺴﻜﺖ در ﮔﺮداﻧﻨﺪهي ‪ A:‬ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﺪ‪،‬‬
‫ﺑﺨﺶ ‪ 0‬آن ﺧﻮاﻧﺪه ﺷﺪه و در ﻧﺸﺎﻧﻲ ﻓﻮق در ﺣﺎﻓﻈﻪ ﻗﺮار ﻣﻲﮔﻴﺮد و آﻧﮕﺎه در ﺻﻮرﺗﻲﻛﻪ اﺟﺮاﻳﻲ ﺑﺎﺷﺪ‪ ،‬اﺟﺮا ﺷﺪه و در ﻏﻴﺮ اﻳﻦﺻﻮرت‪ ،‬ﭘﻴﻐﺎم ﺗﻌﻮﻳﺾ دﻳﺴﻜﺖ داده ﻣﻲﺷﻮد‪.‬‬
‫ﺑﺮﻧﺎﻣﻪاي ﻛﻪ در ﺑﺎﻳﺖ اول ﺑﺨﺶ ﺗﻘﺴﻴﻢﺑﻨﺪي وﺟﻮد دارد‪ ،‬ﻗﺴﻤﺖ ﻓﻌﺎل ﻛﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﺎﻳﺪ از آن ﺑﺎرﺷﻮد را ﭘﻴﺪا ﻧﻤﻮده آﻧﺮا اﺟﺮا ﻣﻲﻛﻨﺪ‪ .‬در ﻫﺮ زﻣﺎن‪ ،‬ﻳﻜﻲ از‬
‫ﻗﺴﻤﺖﻫﺎي ﻣﺨﺘﻠﻒ دﻳﺴﻚﺳﺨﺖ ﻣﻲﺗﻮاﻧﺪ ﻓﻌﺎل ﺑﺎﺷﺪ‪ .‬ﺑﺮﻧﺎﻣﻪي ﺑﻮتﻛﻨﻨﺪه‪ ،‬از ﺑﺨﺶ ﺑﻮت )ﻧﺨﺴﺘﻴﻦ ﺑﺨﺶ( آن ﻗﺴﻤﺖ‪ ،‬اﺟﺮا ﻣﻲﺷﻮد‪ .‬در ﺻﻮرﺗﻲﻛﻪ‪ ،‬ﺑﺨﺶ ‪ 0‬ﻗﺴﻤﺖ ﻓﻌﺎل‪،‬‬
‫اﺟﺮاﻳﻲ ﻳﺎ ﺑﻮتﺷﺪﻧﻲ‪ 5‬ﻧﺒﺎﺷﺪ‪ ،‬ﭘﻴﻐﺎم ﻗﺮار دادن دﻳﺴﻜﺖ در ﮔﺮداﻧﻨﺪه داده ﻣﻲﺷﻮد‪.‬‬

‫‪Partition‬‬
‫‪Sector‬‬ ‫‪1BEH‬‬ ‫‪.........‬‬
‫‪Partition Table‬‬

‫‪Boot Sector of C:‬‬

‫‪Drive C:‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬

‫‪Boot Sector of D:‬‬

‫‪Drive D:‬‬ ‫‪.‬‬


‫‪.‬‬
‫‪.‬‬

‫‪.‬‬
‫‪.‬‬
‫‪.‬‬

‫_________________________________________________________________________________‬
‫‪setup ١‬‬
‫‪partition sector ٢‬‬
‫‪partition table ٣‬‬
‫‪boot strap ٤‬‬
‫‪bootable ٥‬‬
6-6 ‫ ﮔﺮداﻧﻨﺪهﻫﺎي دﻳﺴﻜﺖ و دﻳﺴﻚ ﺳﺨﺖ‬:6 ‫ﻓﺼﻞ‬

:‫ﺳﺎﺧﺘﺎر ﻫﺮ ردﻳﻒ ﺟﺪول ﺗﻘﺴﻴﻤﺎت ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ‬

Address Contents Type


+00H Partition Status: 1 Byte
00H = Inactive
01H = Active (Boot-Partition)
+01H Read/write head, with which the partition begins 1Byte
+02H Sector and cylender, with which the partition begins 1 Word
+04H Partition type:
00H = Entry not allocated
01H = DOS with 12-bit-FAT (primary partition) 1 Byte
02H = XENIX
03H = XENIX
04H = DOS with 16-bit-FAT (primary partition)
05H = Extended DOS partition
06H = DOS-4.0 partition with more than 32MB
DBH = Concurrent DOS
**H = Other codes possible in combination with
other operations systems or special driver
software.
+05H Read/write head, with which the partition ends 1Byte
+06H Sector and cylender, with which the partition ends 1 Word
+08H Removal of first sector of the partition (boot-sector) 1 DWord
of partition sector in sectors.
+0CH Number of sectors in this partition 1 DWord

‫ ﺑﻮﺳﻴﻠﻪي ﺑﺮﻧﺎﻣﻪي‬،‫ ﺑﺮاي ﻓﻴﻠﺪ ﻧﻮع ﻗﺴﻤﺖ ﻗﺮار دﻫﻨﺪ‬NetWare ‫ ﻳﺎ‬Linux ‫ ﻧﻈﻴﺮ‬،‫** ﻣﻘﺎدﻳﺮ دﻳﮕﺮي ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺑﻮﺳﻴﻠﻪي ﺳﺎﻳﺮ ﺳﻴﺴﺘﻤﻬﺎي ﻋﺎﻣﻞ‬
.‫ ﻧﻤﺎﻳﺶ داده ﻣﻲﺷﻮد‬Non-DOS ‫ ﺗﺤﺖ ﻋﻨﻮان‬DOS FDisk

“Current ‫ ﺷﻤﺎرهي دﻳﺴﻚ ﺟﺎري ﻳﺎ‬،FDisk ‫ در اﻳﻦ ﺻﻮرت ﺑﺎﻳﺪ در ﺑﺮﻧﺎﻣﻪي‬.‫ ﻣﻲﺗﻮان ﺑﻴﺶ از ﻳﻚ دﻳﺴﻚ ﺳﺨﺖ ﻧﻴﺰ ﻗﺮار داد‬PC ‫ﺑﺮ روي ﻳﻚ‬
‫ اﮔﺮ ﻫﺮﻛﺪام ﻗﺴﻤﺘﻬﺎي‬.‫ ﻧﺨﺴﺘﻴﻦ ﻗﺴﻤﺖ دﻳﺴﻚ دوم ﺧﻮاﻫﺪ ﺑﻮد‬D: ‫ ﻧﺨﺴﺘﻴﻦ ﻗﺴﻤﺖ اوﻟﻴﻦ دﻳﺴﻚ و‬،C: ‫ ﮔﺮداﻧﻨﺪهي‬،‫ در اﻳﻦ ﺻﻮرت‬.‫ را اﻧﺘﺨﺎب ﻛﺮد‬Fixed-Disk”
‫ ﻗﺴﻤﺖﻫﺎي دﻳﮕﺮ ﻳﺎ‬،‫ آﻧﮕﺎه‬.‫ اداﻣﻪ ﻣﻲﻳﺎﺑﻨﺪ‬G: ‫ ﺷﺮوع ﻣﻲﺷﻮﻧﺪ و ﻣﺜﻼً ﺗﺎ‬E: ‫ از‬،‫ ﺳﺎﻳﺮ ﻗﺴﻤﺘﻬﺎي دﻳﺴﻚ دوم ﻳﺎ ﮔﺮداﻧﻨﺪهﻫﺎي ﻣﻨﻄﻘﻲ آن‬،‫دﻳﮕﺮي ﻧﻴﺰ داﺷﺘﻪ ﺑﺎﺷﻨﺪ‬
.‫ ﺷﺮوع ﺧﻮاﻫﺪ ﺷﺪ‬H: ‫ﮔﺮداﻧﻨﺪهﻫﺎي ﻣﻨﻄﻘﻲ دﻳﺴﻚ دوم از‬
‫ﻓﺼﻞ ‪ :7‬درﮔﺎه ﻣﻮازي‬
‫)‪(The Parallel Port‬‬

‫‪ 1-7‬ﻣﻘﺪﻣﻪ‬
‫وﺳﺎﻳﻠﻲ ﻧﻈﻴﺮ ﭼﺎﭘﮕﺮ‪ ،‬از ﻃﺮﻳﻖ درﮔﺎه ﻣﻮازي ﺑﻪ ‪ PC‬وﺻﻞ ﻣﻲﺷﻮﻧﺪ‪ .‬ﺳﻪ روش ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎه ﻣﻮازي وﺟﻮد دارد‪:‬‬
‫‪ (1‬ﺑﺮﻧﺎﻣﻪرﻳﺰي ﻣﺴﺘﻘﻴﻢ ﺳﺨﺖاﻓﺰار درﮔﺎه ﻣﻮازي‪،‬‬

‫‪ (2‬از ﻃﺮﻳﻖ ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ‪،ROM-BIOS‬‬

‫‪ (3‬از ﻃﺮﻳﻖ ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ‪.DOS‬‬

‫اﮔﺮ ﺑﺨﻮاﻫﻴﻢ ﭼﺎﭘﮕﺮ را ﺑﻬﺘﺮ ﻣﺪﻳﺮﻳﺖ ﻛﻨﻴﻢ‪ ،‬ﻧﻤﻲﺗﻮاﻧﻲ ﺑﻪ ﺗﻮاﺑﻊ‪ DOS‬ﺑﺴﻨﺪه ﻛﻨﻴﻢ‪ .‬ﭼﻮن اﻳﻦ ﺗﻮاﺑﻊ در ﻫﻨﮕﺎه ﭼﺎپ ﺑﺎ ﺑﺮﺧﻮرد ﺑﻪ اوﻟﻴﻦ ﺧﻄﺎ‪ ،‬ﻣﺜﻼً آﻣﺎده ﻧﺒﻮدن‬
‫ﻛﺎﻏﺬ‪ ،‬ﺧﻄﺎي ﺑﺤﺮاﻧﻲ‪ 1‬داده و اﻏﻠﺐ اوﻗﺎت ﭼﺎپ ﻗﻄﻊ ﻣﻲﺷﻮد و اﻳﻦ ﻣﺴﺄﻟﻪ ﻣﺸﻜﻼت زﻳﺎدي را ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﺎرﺑﺮدي اﻳﺠﺎد ﻣﻲﻛﻨﻨﺪ‪ .‬از اﻳﻨﺮو‪ ،‬در اﻳﻦ ﻓﺼﻞ ﺑﺎ روﺷﻬﺎي‬
‫دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎه ﻣﻮازي از ﻃﺮﻳﻖ ‪ BIOS‬و ﺑﺮﻧﺎﻣﻪرﻳﺰي ﻣﺴﺘﻘﻴﻢ ﺳﺨﺖاﻓﺰار درﮔﺎه ﻣﻮازي آﺷﻨﺎ ﻣﻲﺷﻮﻳﺪ‪.‬‬

‫‪ 2-7‬دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎه ﻣﻮازي از ﻃﺮﻳﻖ ‪BIOS‬‬


‫وﻗﻔﻪي ‪ ،17H‬ﺑﺮاي ارﺗﺒﺎط ﺑﺎ درﮔﺎه ﻣﻮازي اﺧﺘﺼﺎص داده ﺷﺪه اﺳﺖ و ﻋﻤﻮﻣﺎً ﺑﻪ اﻳﻦ وﻗﻔﻪ‪ ،‬وﻗﻔﻪي ﭼﺎپ‪ 2‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬وﻟﻲ ﻫﺮ وﺳﻴﻠﻪي دﻳﮕﺮي را ﻧﻴﺰ‬
‫ﻣﻲﺗﻮان ﺑﻪ اﻳﻦ درﮔﺎه ﻣﺘﺼﻞ ﻧﻤﻮد و ﻣﺨﺘﺺ ﭼﺎﭘﮕﺮ ﻧﻴﺴﺖ‪.‬‬

‫ﺗﺤﺖ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ ،DOS‬ﺑﻪ ﺣﺪاﻛﺜﺮ ﺳﻪ ﺗﺎ از ﭼﻬﺎر درﮔﺎه ﻣﻮازي ﻣﻤﻜﻦ در ‪ PC‬ﻣﻲﺗﻮان دﺳﺘﺮﺳﻲ داﺷﺖ ﻛﻪ ﺗﺤﺖ ﻧﺎﻣﻬﺎي ﻣﻨﻄﻘﻲ ‪ LPT1:‬ﻳﺎ ‪،PRN‬‬
‫‪ LPT2:‬و ‪ LPT3:‬ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻫﺴﺘﻨﺪ‪ .‬ﺗﻮاﺑﻊ ‪ .DOS‬ﺑﻪﻃﻮر ﭘﻴﺶﻓﺮض ﺑﺎ ‪ LPT1:‬ﻛﺎر ﻣﻲﻛﻨﻨﺪ‪ .‬اﻣﺎ در وﻗﻔﻪي ‪ ،17H‬ﺳﻪ ﺗﺎﺑﻊ ﺑﺮاي ﻛﺎر ﺑﺎ درﮔﺎه ﻣﻮازي وﺟﻮد‬
‫دارد ﻛﻪ ﺑﺎ ﻫﺮ ﺳﻪ درﮔﺎه ﻛﺎر ﻣﻲﻛﻨﻨﺪ‪ .‬ﺑﺮاي ﺗﻌﻴﻴﻦ ﺷﻤﺎرهي درﮔﺎه ﺑﺎﻳﺪ ﻣﺘﻨﺎﻃﺮ ﺑﺎ ‪ ،LPT1:‬ﻣﻘﺪار ‪ ،0‬ﻣﺘﻨﺎﻇﺮ ﺑﺎ ‪ ،LPT2:‬ﻣﻘﺪار ‪ 1‬و ﻣﺘﻨﺎﻇﺮ ﺑﺎ ‪ ،LPT3‬ﻣﻘﺪار ‪ 2‬را در‬
‫ﺛﺒﺎت ‪ DX‬ﻗﺮار داد‪:‬‬

‫‪Function‬‬ ‫‪Task‬‬
‫‪00H‬‬ ‫‪Display (write or send) character‬‬
‫‪01H‬‬ ‫‪Initialize printer‬‬
‫‪02H‬‬ ‫)‪Request printer status (read or receive character‬‬
‫وﺿﻌﻴﺖ ﭼﺎﭘﮕﺮ‪ :‬ﻫﺮﻛﺪام از ﺗﻮاﺑﻊ ﻓﻮق‪ ،‬ﭘﺲ از اﺟﺮا وﺿﻌﻴﺖ ﭼﺎﭘﮕﺮ را در ﺛﺒﺎت ‪ AH‬ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ .‬ﺑﻴﺘﻬﺎي ﻣﺨﺘﻠﻒ ﺑﺎﻳﺖ وﺿﻌﻴﺖ ﭼﺎﭘﮕﺮ‪ ،‬ﻧﺸﺎﻧﺪﻫﻨﺪهي‬
‫وﺿﻌﻴﺖﻫﺎي زﻳﺮ اﺳﺖ‪:‬‬

‫‪Bit 0: Time out error‬‬


‫‪Bit 1: Unused‬‬
‫‪Bit 2: Unused‬‬
‫‪Bit 3: Transfer error‬‬
‫‪Bit 4: Printer online‬‬
‫‪Bit 5: Printer out of paper‬‬
‫‪Bit 6: Receive mode selected‬‬
‫‪Bit 7: Printer busy‬‬
‫ﺳﺮﻋﺖ درﮔﺎه ﻣﻮازي ‪ 100000‬ﻛﺎراﻛﺘﺮ در ﺛﺎﻧﻴﻪ اﺳﺖ‪ .‬اﮔﺮ در ﻳﻚ دورهي زﻣﺎﻧﻲ ﻛﻤﺘﺮ از ‪ 1/100000‬ﺛﺎﻧﻴﻪ داده ﺑﻪ درﮔﺎه ارﺳﺎل ﺷﻮد‪ ،‬ﺑﻴﺖ ‪ 7‬ﻣﺴﺎوي ‪1‬‬
‫ﻣﻲﺷﻮد و ﭼﺎﭘﮕﺮ ﻣﺸﻐﻮل دﻳﺪه ﻣﻲﺷﻮد و ﺑﻪ اﻳﻦ دﻟﻴﻞ ﺧﻄﺎي ”‪ “Time out error‬اﺗﻔﺎق اﻓﺘﺎده و ﺑﻴﺖ ‪ 0‬ﻣﺴﺎوي ‪ 1‬ﻣﻲﺷﻮد‪.‬‬

‫_________________________________________________________________________________‬
‫‪critical error ١‬‬
‫‪print interrupt ٢‬‬
‫‪2-7‬‬ ‫ﻓﺼﻞ ‪ :7‬درﮔﺎه ﻣﻮازي‬

‫ﺗﺎﺑﻊ ﭼﺎپ ﻳﺎ ارﺳﺎل دادهﻫﺎ‪ :‬ﺗﺎﺑﻊ ‪ 00H‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬ﺷﻤﺎرهي ﺗﺎﺑﻊ)‪ (00H‬ﺑﺎﻳﺪ در ﺛﺒﺎت ‪ AH‬و ﻛﺪ اَﺳﻜﻲ ﻛﺎراﻛﺘﺮ در‬
‫ﺛﺒﺎت ‪ AL‬ﻗﺮار ﮔﻴﺮد‪ .‬ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ‪ ،‬ﺛﺒﺎت ‪ AH‬ﺣﺎوي ﺑﺎﻳﺖ وﺿﻌﻴﺖ ﭼﺎﭘﮕﺮ ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬

‫ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪي درﮔﺎه‪ :‬ﺗﺎﺑﻊ ‪ 00H‬ﺑﺎﻳﺪ ﻫﻤﻮاره ﻗﺒﻞ از ﺷﺮوع ارﺳﺎل دادهﻫﺎ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد و درﮔﺎه ﻳﺎ ﭼﺎﭘﮕﺮ را ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪ ﻧﻤﺎﻳﺪ‪ .‬ﭘﺲ از‬
‫ﻓﺮاﺧﻮاﻧﻲ‪ ،‬ﺛﺒﺎت ‪ AH‬ﺣﺎوي ﺑﺎﻳﺖ وﺿﻌﻴﺖ ﭼﺎﭘﮕﺮ ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬

‫ﺗﺎﺑﻊ درﺧﻮاﺳﺖ ﺑﺮرﺳﻲ وﺿﻌﻴﺖ ﭼﺎﭘﮕﺮ‪ :‬ﺗﺎﺑﻊ ‪ 03H‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر اﺳﺘﻔﺎده ﻣﻲﺷﻮد و ﺑﺎﻳﺖ وﺿﻌﻴﺖ را در ‪ AH‬ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ .‬اﻳﻦ ﺑﺎﻳﺖ را در‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ C‬ﻳﺎ ﭘﺎﺳﻜﺎل ﺑﺮاي ﻳﺎﻓﺘﻦ ﻧﻮع ﺧﻄﺎ ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ‪.‬‬

‫ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ‪ BIOS‬در زﺑﺎن ‪ :C‬ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ‪ Borland C++‬و ‪ ،QuickC‬ﺑﻪ ﺗﺮﺗﻴﺐ ﺗﻮاﺑﻊ ‪ biosprint‬و ‪ bios_print‬را ﺑﺮاي ﭼﺎپ‬
‫ﻛﺎراﻛﺘﺮ ﺑﺎ اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ ‪ BIOS‬ﻓﺮاﻫﻢ ﻛﺮدهاﻧﺪ‪.‬‬

‫ﻧﻮﺷﺘﻦ روال ﺟﺪﻳﺪ ﺑﺮاي ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ﭼﺎپ‪ :‬ﺑﺮاي آﻧﻜﻪ ﺧﻄﺎﻫﺎي ﭼﺎپ در ﻫﻤﻪي ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ اﺟﺮاﻳﻲ ﺗﺤﺖ ‪ DOS‬ﻛﻨﺘﺮل ﺷﻮد‪ ،‬ﺑﻪ دﻟﻴﻞ آﻧﻜﻪ‬
‫ﺗﻮاﺑﻊ ‪ DOS‬از ﺗﻮاﺑﻊ ‪ BIOS‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪ ،‬ﻣﻲﺗﻮان روال ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪي ‪ 17H‬را ﺗﻐﻴﻴﺮ داد و ﻗﺒﻞ از ﭼﺎپ ﻫﺮ ﻛﺎراﻛﺘﺮ‪ ،‬وﺿﻌﻴﺖ ﭼﺎﭘﮕﺮ را ﻛﻨﺘﺮل ﻧﻤﻮد و در ﺻﻮرت‬
‫آﻣﺎده ﻧﺒﻮدن ﭼﺎﭘﮕﺮ‪ ،‬ﭘﻴﻐﺎم ﻣﻨﺎﺳﺐ ﺑﺮ روي ﺻﻔﺤﻪ ﭼﺎپ ﻛﺮد‪.‬‬

‫ارﺳﺎل دادﻫﺎ از ﻃﺮﻳﻖ درﮔﺎه ﻣﻮازي‪ :‬ﮔﺮﭼﻪ اﻳﻦ درﮔﺎه ﺑﺮاي ارﺳﺎل دادهﻫﺎ از ‪ PC‬ﺑﻪ ﻟﻮازم ﺧﺮوﺟﻲ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ‪ ،‬وﻟﻲ از ﺗﺎﺑﻊ ‪ 02H‬ﻣﻲﺗﻮان‬
‫ﺑﺮاي درﻳﺎﻓﺖ دادﻫﻬﺎﻧﻴﺰ اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬وﻟﻲ ﺳﺮﻋﺖ ﺑﺴﻴﺎر ﭘﺎﺋﺌﻦ ﺑﻮده و اﻳﻦ درﮔﺎه درﺣﻘﻴﻘﻴﺖ ﻣﺴﺮ ﻳﻜﻄﺮﻓﻪاي ﺑﺮاي ارﺳﺎل دادهﻫﺎ اﺳﺖ‪ ،‬ﻧﻪ درﻳﺎﻓﺖ آن‪.‬‬

‫‪ 3-7‬دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ درﮔﺎه ﻣﻮازي‬


‫ﻧﺸﺎﻧﻴﻬﺎي درﮔﺎﻫﻬﺎي ﻣﻮازي ﻧﺼﺐ ﺷﺪه در ‪ ،PC‬در ﻫﻨﮕﺎم روﺷﻦ ﺷﺪن ﻛﺎﻣﭙﻴﻮﺗﺮ ﺗﻮﺳﻂ ‪ BIOS‬ﭘﻴﺪا ﺷﺪه و در ﻗﻄﻌﻪي ﻣﺘﻐﻴﺮﻫﺎي ‪ BIOS‬ﻗﺮار داده‬
‫ﻣﻲﺷﻮد‪ .‬از ﻃﺮﻳﻖ اﻳﻦ ﻧﺸﺎﻧﻴﻬﺎ‪ ،‬ﺑﺎ دﺳﺘﻮرات دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎﻫﻬﺎ‪ ،‬ﻣﻲﺗﻮان ﺑﻪ درﮔﺎﻫﻬﺎي ﻣﻮازي دﺳﺘﺮﺳﻲ داﺷﺖ‪:‬‬
‫‪Port‬‬ ‫‪Interface‬‬
‫‪3BCH-3BFH‬‬ ‫‪Parallel interface on MDA card‬‬
‫‪378H-37FH‬‬ ‫‪Parallel interface #1‬‬
‫‪278H-37FH‬‬ ‫‪Parallel interface #2‬‬
‫* ﻛﺎرﺗﻬﺎي وﻳﺪﻳﻮﻳﻲ ﻗﺪﻳﻤﻲ ‪ ،MDA‬داراي ﻳﻚ درﮔﺎه ﻣﻮازي ﻧﻴﺰ ﺑﻮدﻧﺪ‪ ،‬ﻛﻪ ﻧﺸﺎﻧﻲ اﻳﻦ ﮔﻮﻧﻪ درﮔﺎﻫﻬﺎ‪ 3BCH-3BFH ،‬ﺑﻮد‪.‬‬

‫* ﻧﺸﺎﻧﻴﻬﺎي ﻓﻮق ﺑﻪﺗﺮﺗﻴﺐ ﭼﻚ ﻣﻲﺷﻮﻧﺪ‪ .‬اﮔﺮ در ‪ 3BCH-3BFH‬ﻳﻚ درﮔﺎه ﻳﺎﻓﺘﻪ ﺷﻮد‪ ،‬ﺑﻪ ﻋﻨﻮان درﮔﺎه ﻧﺨﺴﺖ ﺑﻪ ‪ LPT1:‬ﻣﻨﺴﻮب ﻣﻲﺷﻮد و در‬
‫ﻓﻀﺎﻫﺎي ﺑﻌﺪي ﻫﻢ اﮔﺮ ﭘﻴﺪا ﺷﺪه ﺑﻪ ‪ LPT2:‬و ‪. LPT3:‬‬

‫* ﻫﻤﺎﻧﻄﻮري ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ‪ ،‬ﻧﺸﺎﻧﻴﻬﺎي ﺑﺪﺳﺖ آﻣﺪه در ﻗﻄﻌﻪي ﻣﺘﻐﻴﺮﻫﺎي ‪ BIOS‬ذﺧﻴﺮه ﻣﻲﺷﻮﻧﺪ‪:‬‬

‫‪Address‬‬ ‫‪Contents‬‬
‫‪0040:0008H‬‬ ‫‪Base address of LPT1‬‬
‫‪0040:000AH‬‬ ‫‪Base address of LPT2‬‬
‫‪0040:000CH‬‬ ‫‪Base address of LPT3‬‬
‫‪0040:000EH‬‬ ‫‪Base address of LPT4‬‬
‫ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻫﺮ درﮔﺎه ﺑﺎﻳﺪ اﺑﺘﺪا ﻧﺸﺎﻧﻲ آن از ﻣﻄﺎﺑﻖ ﺟﺪول ﻓﻮق ﻧﺸﺎﻧﻴﻬﺎي ﻣﺸﺨﺺ ﺷﺪه ﺑﺪﺳﺖ آﻳﺪ‪ .‬ﻣﺜﻼً ﺑﺮاي ﺑﺪﺳﺖ آوردن ﻧﺸﺎﻧﻲ ‪ LPT1:‬در زﺑﺎن‬
‫ﭘﺎﺳﻜﺎل ﺑﻪ ﺻﻮرت زﻳﺮ ﻋﻤﻞ ﻣﻲﺷﻮد‪:‬‬

‫;]‪LPT1Addr := Mem[$0040:$0008‬‬
‫;‪Port[Lpt1Addr] := XByte‬‬ ‫ارﺳﺎل ﻳﻚ ﺑﺎﻳﺖ ‪//‬‬

‫ﺗﻐﻴﻴﺮ ﻧﺸﺎﻧﻲ درﮔﺎﻫﻬﺎ‪ :‬ﻣﻲﺗﻮان ﺑﺎ ﺗﻌﻮﻳﺾ ﻣﻘﺎدﻳﺮ ردﻳﻘﻬﺎي ﺟﺪول ﻓﻮق‪ ،‬ﻧﺸﺎﻧﻲ درﮔﺎﻫﻬﺎ را ﻋﻮض ﻛﺮد‪ .‬ﺑﺮاي ﻣﺜﺎل ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ در ﭘﺎﺳﻜﺎل‪ ،‬ﻧﺸﺎﻧﻲ‬
‫‪ LPT1:‬و ‪ LPT2:‬را ﺗﻌﻮﻳﺾ ﻣﻲﻛﻨﺪ‪:‬‬

‫;]‪DummyWord := Mem[$0040:$0008‬‬
‫;]‪Mem[$0040:$0008] := Mem[$0040:$000A‬‬
‫;‪Mem[$0040:$000A] := DummyWord‬‬
‫ﺛﺒﺎﺗﻬﺎي درﮔﺎه ﻣﻮازي‪ :‬ﻫﺮ درﮔﺎه ﺳﻪ ﺛﺒﺎت دارد‪:‬‬

‫ﺛﺒﺎت ‪ :(Data Lines) 1‬ﺣﺎوي ﺑﻴﺘﻬﺎي ‪ 0‬ﺗﺎ ‪ 7‬دادهي ارﺳﺎﻟﻲ اﺳﺖ و داده ﺑﺮاي ارﺳﺎل در آن ﻗﺮار ﻣﻲﮔﻴﺮد و در ﻧﺸﺎﻧﻲ ‪ 378H‬ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ‬ ‫•‬
‫اﺳﺖ‪.‬‬
‫‪3-7‬‬ ‫ﻓﺼﻞ ‪ :7‬درﮔﺎه ﻣﻮازي‬

‫ﺛﺒﺎت ‪ :(Printer Status) 2‬ﺣﺎوي ﺑﺎﻳﺖ وﺿﻌﻴﺖ ﭼﺎﭘﮕﺮ اﺳﺖ و ﻧﺸﺎﻧﻲ آن‪ 379H ،‬اﺳﺖ‪.‬‬ ‫•‬

‫ﺛﺒﺎت ‪ :(Printer Control) 3‬ﺳﻴﮕﻨﺎﻟﻬﺎي ﻛﻨﺘﺮﻟﻲ ﭼﺎﭘﮕﺮ )ﻧﻈﻴﺮ ‪ INT ،ACK‬و ‪ (...‬را ﻧﺸﺎن ﻣﻲدﻫﺪ و ﻧﺸﺎﻧﻲ آن ‪ 37AH‬اﺳﺖ‪.‬‬ ‫•‬
‫‪ 5-8‬دﺳﺘﺮﺳﻲ ﺑﻪ درﮔﺎه ﺳﺮﻳﺎل از ﻃﺮﻳﻖ ‪BIOS‬‬
‫ﻋﻼوه ﺑﺮ روش ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﻣﺴﺘﻘﻴﻢ‪ ،‬ﺗﻮاﺑﻊ وﻗﻔﻪي ‪ BIOS 14H‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ درﮔﺎه ﺳﺮﻳﺎل ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ‪ .‬ﺗﻮاﺑﻊ اﻳﻦ وﻗﻔﻪﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪Function 0:‬‬ ‫‪Passing protocol‬‬


‫ﺑﺎ اﻳﻦ ﺗﺎﺑﻊ‪ ،‬ﭘﺎراﻣﺘﺮﻫﺎي ارﺗﺒﺎﻃﻲ ﭘﺮوﺗﻜﻞ ﺗﻌﻴﻴﻦ ﻣﻲﺷﻮﻧﺪ و ﺑﺎﻳﺖ ﺣﺎوي ﭘﺎراﻣﺘﺮﻫﺎي ارﺗﺒﺎﻃﻲ را در ﺛﺒﺎت ‪ AL‬ﻗﺮارداده و اﻳﻦ ﺗﺎﺑﻊ را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﻴﻢ‪:‬‬
‫‪Bits 0-1:‬‬ ‫‪Data length:‬‬
‫‪10 = 7 bits‬‬
‫‪11 = 8 bits‬‬
‫‪Bit 2:‬‬ ‫‪Number of stop bits:‬‬
‫‪0 = 1 stop bit‬‬
‫‪1 = 2 stop bits‬‬
‫‪Bits 3-4:‬‬ ‫‪Parity check:‬‬
‫‪00 = None‬‬
‫‪01 = Odd‬‬
‫‪10 = Even‬‬
‫‪Bits 5-7:‬‬ ‫‪Baud rate:‬‬
‫‪000 = 110 baud‬‬
‫‪001 = 150 baud‬‬
‫‪010 = 300 baud‬‬
‫‪011 = 600 baud‬‬
‫‪100 = 1200 baud‬‬
‫‪101 = 2400 baud‬‬
‫‪110 = 4800 baud‬‬
‫‪111 = 9600 baud‬‬
‫‪Function 1: Transmit character‬‬
‫ﺑﺎ اﻳﻦ ﺗﺎﺑﻊ ﻣﻲﺗﻮان ﻳﻚ ﻛﺎراﻛﺘﺮ را ارﺳﺎل ﻧﻤﻮد‪ .‬ﻛﺪ ﻛﺎراﻛﺘﺮ ﺑﺎﻳﺪ در ‪ AL‬و ﻣﻘﺪار ‪ 1‬در ‪ AH‬ﻗﺮار داده ﺷﻮد‪ .‬ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ اﮔﺮ ﻣﻘﺪار ‪ 0‬در ‪AH‬‬
‫ﺑﺎﺷﺪ‪ ،‬داده ﺑﻪدرﺳﺘﻲ ارﺳﺎل ﺷﺪه اﺳﺖ و اﮔﺮ ﺧﻄﺎﻳﻲ رخ داده ﺑﺎﺷﺪ‪ ،‬ﻣﻘﺪار ‪ 1‬در ‪ AH‬ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﺪ‪.‬‬

‫‪Function 2: Receive character‬‬


‫ﻣﻘﺪار ﻛﺪ ﻛﺎراﻛﺘﺮ در ﺛﺒﺎت ‪ AL‬درﻳﺎﻓﺖ ﻣﻲﺷﻮد‪ .‬اﮔﺮ ‪ AH=0‬ﺑﺎﺷﺪ‪ ،‬ﺧﻄﺎﻳﻲ رخ ﻧﺪاده اﺳﺖ‪ ،‬و در ﻏﻴﺮ اﻳﻦﺻﻮرت‪ AH ،‬ﺣﺎوي ﻛﺪ ﻧﻮع ﺧﻄﺎ اﺳﺖ‪.‬‬

‫‪Function 3: Line/Modem Status‬‬


‫اﻃﻼﻋﺎت ﺛﺒﺎت ‪ Line Control‬ﻳﺎ ‪ Line Status‬را در ‪ AH‬و ‪ Modem Status‬را در ‪ AL‬ﺑﺮ ﻣﻲﮔﺮداﻧﺪ‪ ،Line Status .‬ﺷﺎﻣﻞ اﻃﻼﻋﺎت‬
‫ﭘﺎراﻣﺘﺮﻫﺎي ارﺗﺒﺎﻃﻲ )ﻧﻈﻴﺮ ﻃﻮل ﻛﻠﻤﻪ‪،‬ﺑﻴﺖ ﺗﻮﻗﻒ و ﻏﻴﺮه( ﺑﻮده و ‪ Modem Status‬ﺷﺎﻣﻞ اﻃﻼﻋﺎت زﻳﺮ اﺳﺖ‪:‬‬

‫‪Bit 0: (Delta) Modem ready to send‬‬ ‫‪Bit 4: Modem ready to send‬‬


‫‪Bit 1: (Delta) Modem is on‬‬ ‫‪Bit 5: Modem is on‬‬
‫‪Bit 2: (Delta) Telephone is ringing‬‬ ‫‪Bit 6: Telephone is ringing‬‬
‫‪Bit 3: (Delta) Connection to receiver modemBit 7: Connection to receiver modem‬‬
‫ﺑﻴﺘﻬﺎي ‪ 4‬ﺗﺎ ‪ ،7‬ﺗﻜﺮار ﺑﻴﺘﻬﺎي ‪ 0‬ﺗﺎ ‪ 3‬ﻫﺴﺘﻨﺪ و ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﺗﻐﻴﻴﺮ از آﺧﺮﻳﻦ ﺑﺎر ﻗﺮاﺋﺖ وﺿﻌﻴﺖ ﺑﻪﻛﺎر ﻣﻲروﻧﺪ‪ .‬اﮔﺮ ﺗﻐﻴﻴﺮي در وﺿﻌﻴﺖ رخ داده ﺑﺎﺷﺪ‪،‬‬
‫ﺑﻴﺘﻬﺎي ﻣﺘﻨﺎﻇﺮ ‪ 1‬ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﺑﻴﺖ ﺷﻤﺎره ‪ 2‬ﻣﻘﺪار ‪ 1‬داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﺑﺎ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻣﻘﺪار ﺑﻴﺖ ‪ 6‬از آﺧﺮﻳﻦ ﻗﺮاﺋﺖ ﻗﺒﻠﻲ‪ ،‬ﺗﻐﻴﻴﺮ ﻛﺮده اﺳﺖ‪.‬‬
‫ﻓﺼﻞ ‪ :9‬ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﻣﺎوس‬
‫)‪(Mouse Programming‬‬

‫‪ 1-9‬ﻣﻘﺪﻣﻪ‬
‫ﺗﻮاﺑﻊ ﻣﻌﺮﻓﻲ ﺷﺪه ﺑﻮﺳﻴﻠﻪي ﻣﻴﻜﺮوﺳﺎﻓﺖ ﺑﺮاي ﻣﺎوس‪ ،‬ﺑﻪ ﻋﻨﻮان اﺳﺘﺎﻧﺪاردي ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﺎوس ﭘﺬﻳﺮﻓﺘﻪ ﺷﺪه اﺳﺖ‪ .‬اﻳﻦ ﺗﻮاﺑﻊ ﻛﻪ ﺗﺸﻜﻴﻞ دﻫﻨﺪهي‬
‫واﺳﻂ ﻧﺮماﻓﺰاري ﻣﺎوس ﻳﺎ دراﻳﻮر ﻣﺎوس‪ 1‬ﻫﺴﺘﻨﺪ‪ ،‬در ﻗﺎﻟﺐ وﻗﻔﻪي ‪ 33H‬در اﺧﺘﻴﺎر ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ ﻛﻪ ﺑﻮﺳﻴﻠﻪي ﻧﺼﺐ ﺑﺮﻧﺎﻣﻪي ‪ MOUSE.DRV‬در ﻓﺎﻳﻞ‬
‫‪ CONFIG.SYS‬ﻳﺎ اﺟﺮاي ﺑﺮﻧﺎﻣﻪي ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪي‪ MOUSE.COM 2‬ﺗﺤﺖ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ ،DOS‬ﻓﺮاﻫﻢ ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫‪ 2-9‬ﻧﻤﺎﻳﺶ ﻣﻜﺎنﻧﻤﺎي ﻣﺎوس‬


‫در ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﻛﻪ ﻣﺎوس را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﻨﻨﺪ‪ ،‬در ﺻﻮرت ﻧﺼﺐﺑﻮدن واﺳﻂ ﻧﺮماﻓﺰاري ﻣﺎوس‪ ،‬ﻣﻜﺎنﻧﻤﺎي ﻣﺎوس‪ 3‬را ﻧﻤﺎﻳﺶ ﻣﻲدﻫﻨﺪ‪ .‬ﻣﻜﺎنﻧﻤﺎي ﻣﺎوس‪،‬‬
‫در دو ﺣﺎﻟﺖ ﻣﺘﻦ و ﮔﺮاﻓﻴﻚ ﻗﺎﺑﻞ ﻧﻤﺎﻳﺶ اﺳﺖ‪ ،‬ﻛﻪ در ﺣﺎﻟﺖ ﮔﺮاﻓﻴﻚ‪ ،‬واﺑﺴﺘﻪ ﺑﻪ ﻛﺎرت وﻳﺪﺋﻮﻳﻲ و وﺿﻮح ﺗﺼﻮﻳﺮ اﺳﺖ‪ .‬ﺷﻜﻞ ﻣﻜﺎن ﻧﻤﺎ در ﺣﺎﻟﺖ ﻣﺘﻦ‪ ،‬ﺑﺎ دو ﻣﻘﺪار ‪16‬ﺑﻴﺘﻲ‬
‫ﻣﺸﺨﺺ ﻣﻲﺷﻮد ﻛﻪ ‪ Screen Mask‬و ‪ Cursor Mask‬ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮﻧﺪ‪ ،‬ﻛﻪ در ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﻗﺮار دارﻧﺪ‪ .‬ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﻜﺎن ﻧﻤﺎ در ﻫﺮ ﻧﻘﻄﻪ از ﺻﻔﺤﻪ‬
‫ﻧﻤﺎﻳﺶ‪ ،‬ﺷﻜﻞ ﻣﻜﺎن ﻧﻤﺎ ﺑﺎ ‪ AND‬ﻛﺮدن ﻣﻘﺪار دو ﺑﺎﻳﺖ ‪ S.M.‬ﺑﺎ ﻣﻘﺪار دو ﺑﺎﻳﺖ ﻣﺸﺨﺺﻛﻨﻨﺪهي ﻛﺎراﻛﺘﺮ و ﻣﺸﺨﺼﻪ در آن ﻧﻘﻄﻪ‪ ،‬و ﺳﭙﺲ ‪ XOR‬ﻛﺮدن ﻣﻘﺪار ﺣﺎﺻﻠﻪ‬
‫ﺑﺎ ‪ C.M.‬و ﻧﻮﺷﺘﻦ ﻧﺘﻴﺠﻪي ﻧﻬﺎﻳﻲ در ﻫﻤﺎن ﻧﻘﻄﻪ ﺑﺪﺳﺖ ﻣﻲآﻳﺪ‪ .‬اﻳﻦ روش‪ ،‬اﻧﺘﺨﺎﺑﻬﺎي ﻣﺨﺘﻠﻔﻲ را ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﻜﺎنﻧﻤﺎي ﻣﺎوس در اﺧﺘﻴﺎر ﻗﺮار ﻣﻲدﻫﺪ ﻛﻪ ﺑﻪﻃﺮح زﻳﺮ‬
‫اﺳﺖ‪:‬‬

‫ﻳﻚ ﻛﺎراﻛﺘﺮ ﺧﺎص ﺑﺎ رﻧﮓ ﺧﺎص‪ ،‬ﻣﺜﻼً ﻫﻤﻴﺸﻪ ﺑﺎ ﻛﺎراﻛﺘﺮ ↑‪ ،‬رﻧﮓ ﺳﻔﻴﺪ در زﻣﻴﻨﻪي آﺑﻲ‪،‬‬ ‫•‬

‫ﻳﻚ ﻛﺎراﻛﺘﺮ ﺧﺎص ﺑﺎ رﻧﮓ ﻛﺎراﻛﺘﺮ ﻣﻮﺟﻮد در ﻧﻘﻄﻪي ﺟﺎري‪،‬‬ ‫•‬

‫ﺗﻐﻴﻴﺮ رﻧﮓ ﻛﺎراﻛﺘﺮ ﻣﻮﺟﻮد در ﻧﻘﻄﻪي ﺟﺎري ﺑﻪ ﺻﻮرت ﺳﺨﺖاﻓﺰاري و ﺑﺎ اﺳﺘﻔﺎده از ﺣﺎﻟﺖ ﻣﻌﻜﻮس‪ 4‬ﻛﺎرت وﻳﺪﺋﻮﻳﻲ‪ ،‬ﺑﻪ اﻳﻦ ﺻﻮرت ﻛﻪ ﺑﻪ ﻛﺎرت‬ ‫•‬
‫وﻳﺪﺋﻮﻳﻲ ﻓﺮﻣﺎن داد ﺗﺎ رﻧﮓ ﺑﻴﺘﻬﺎي ﺻﻔﺮ رﻧﮓ را ‪ 1‬و ﺑﻴﺘﻬﺎي ‪ 1‬را ﺻﻔﺮ ﻛﻨﺪ‪ .‬ﻳﻌﻨﻲ‪ ،‬ﺑﺎﻳﺖ رﻧﮓ را ﺑﺎ ‪ XOR ،FFH‬ﻛﻨﺪ‪.‬‬

‫ﺗﻐﻴﻴﺮ رﻧﮓ ﻛﺎراﻛﺘﺮ ﻣﻮﺟﻮد در ﻧﻘﻄﻪي ﺟﺎري ﺑﻪ ﺻﻮرت ﻧﺮماﻓﺰاري‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﻣﻘﺪار ﺑﺎﻳﺖ رﻧﮓ در ﻧﻘﻄﻪ ي ﺟﺎري ﺧﻮاﻧﺪه ﺷﺪه و ﭘﺲ از‬ ‫•‬
‫‪ XOR‬ﻛﺮدن در ﻫﻤﺎن ﻧﻘﻄﻪ ﻧﻮﺷﺘﻪ ﺷﻮد‪ .‬اﻳﻦ ﻛﺎر ﺑﻮﺳﻴﻠﻪي دراﻳﻮر ﻣﺎوس اﻧﺠﺎم ﻣﻲﺷﻮد‪.‬‬
‫ﻗﻄﻌﻪ ﻛﺪﻫﺎي زﻳﺮ ﺑﺮاي ﻣﻮارد ‪ 2‬و ‪ 4‬ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪:‬‬

‫;)‪Procedure ShowCursor2(row, col : Byte‬‬


‫‪var‬‬
‫;‪ChAtt, CursorShape : Word‬‬
‫‪begin‬‬
‫;])‪ChAtt := Mem[$B800:(row * 160 + col * 2‬‬
‫} ‪CursorShape := CharAtt AND $FF00 ; {FF00H is the S.M.‬‬
‫} ’↑‘ ‪CursorShape := CursorShape XOR $0018H; { 0018H is the C.M. and 18H is ASCII code of‬‬
‫} ‪Mem[$B800:(row * 160 + col * 2)] := CursorShape; { mouse cursor = ‘↑’: yellow over black‬‬
‫;‪end‬‬

‫;)‪Procedure ShowCursor4(row, col : Byte‬‬


‫‪var‬‬
‫;‪ChAtt, CursorShape : Word‬‬
‫‪begin‬‬
‫} ‪ChAtt := Mem[$B800:(row * 160 + col * 2)]; { ‘A’: yellow over black‬‬
‫} ‪CursorShape := CharAtt AND $FFFF ; {FFFFH is the S.M.‬‬
‫_________________________________________________________________________________‬
‫‪mouse driver ١‬‬
‫‪TSR ٢‬‬
‫‪mouse cursor ٣‬‬
‫‪inverse mode ٤‬‬
‫‪2-9‬‬ ‫ﻓﺼﻞ ‪ :9‬ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﻣﺎوس‬

‫} ‪CursorShape := CursorShape XOR $FF00H; { FF00H: to inverse the attribute‬‬


‫} ‪Mem[$B800:(row * 160 + col * 2)] := CursorShape; { mouse cursor = ‘A’: white over blue‬‬
‫;‪end‬‬

‫‪ 3-9‬واﺣﺪ اﻧﺪازهﮔﻴﺮي دﻗﺖ ﻣﺎوس‬


‫از واﺣﺪ ﻣﻴﻜﻲ‪ 1‬ﺑﺮاي اﻧﺪازهﮔﻴﺮي دﻗﺖ ﻣﺎوس اﺳﺘﻔﺎده ﻣﻲﺷﻮد و ﻧﻤﺎﻳﺶ دﻫﻨﺪهي ﺗﻌﺪاد ﻧﻘﻄﻪﻫﺎ در ﻫﺮ اﻳﻨﭻ اﺳﺖ‪ .‬ﻣﺎوﺳﻬﺎي ﻗﺪﻳﻤﻲ داراي دﻗﺖ ‪ 200‬ﻧﻘﻄﻪ‬
‫در اﻳﻨﭻ ﻳﺎ ﻣﻴﻜﻲ ﺑﻮدﻧﺪ‪ ،‬اﻣﺎ ﻣﺎوﺳﻬﺎي ﺟﺪﻳﺪ ﺗﺎ دﻗﺖ ‪ 400‬ﻣﻴﻜﻲ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﻨﻨﺪ‪ .‬اﻟﺒﺘﻪ اﻳﻦ ﻣﺴﺄﻟﻪ ﺑﻪ ﻧﻮع دراﻳﻮر ﻣﺎوس واﺑﺴﺘﻪ اﺳﺖ‪.‬‬

‫‪ 4-9‬ﺗﻮاﺑﻊ وﻗﻔﻪي ﻣﺎوس‬


‫وﻗﻔﻪي ‪ 33H‬داراي ﺗﻮاﺑﻊ اﺻﻠﻲ زﻳﺮ اﺳﺖ‪:‬‬

‫‪Function‬‬ ‫‪Task‬‬
‫‪00H:‬‬ ‫‪Reset mouse drivers‬‬
‫‪01H:‬‬ ‫‪Display mouse cursor‬‬
‫‪02H:‬‬ ‫‪Remove(hide) mouse cursor‬‬
‫‪03H:‬‬ ‫‪Move mouse cursor‬‬
‫‪07H & 08H:‬‬ ‫)ﻣﺤﺪودهي ﺣﺮﻛﺖ ﻣﺎوس در ﺻﻔﺤﻪ( ‪Set range of movement‬‬

‫‪10H:‬‬ ‫)ﻣﺤﺪودهي ﻋﺪم ﻧﻤﺎﻳﺶ ﻣﻜﺎن ﻧﻤﺎي ﻣﺎوس( ‪Exclusion area‬‬

‫‪1DH:‬‬ ‫‪Set display page‬‬


‫‪0FH:‬‬ ‫‪Set cursor speed‬‬
‫‪0AH:‬‬ ‫‪Set cursor shape: passing S.M. & C.M. and selecting the method for updating the‬‬
‫‪mouse cursor:‬‬ ‫‪- Software Specific or Hardware Specific‬‬
‫‪- Polling or Interrupt‬‬
‫‪03H:‬‬ ‫‪Get cursor position/button status‬‬
‫‪Function 0CH:‬‬ ‫‪Set event handler‬‬

‫اﻳﻨﻜﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺣﺮﻛﺖ دادن ﻣﺎوس و زدن دﻛﻤﻪﻫﺎ‪ ،‬ﭼﻪ ﻛﺎري اﻧﺠﺎم ﺷﻮد را ﻣﻲﺗﻮان در ﻳﻚ ‪ 2ISR‬ﻗﺮار داد و ﺑﻪ دراﻳﻮر ارﺳﺎل ﻧﻤﻮد‪.‬‬

‫‪Function 18H:‬‬ ‫‪Install alternate event handler‬‬


‫ﺗﺮﻛﻴﺐ رﺧﺪادﻫﺎي ﻣﺎوس)ﻧﻈﻴﺮ ﺣﺮﻛﺖ ﻛﺮدن ﻳﺎ زدن دﻛﻤﻪﻫﺎ( ﺑﺎ ﺑﺮﺧﻲ از ﻛﻠﻴﺪﻫﺎي ﻛﻨﺘﺮﻟﻲ ﻣﺎوس را ﻣﻲﺗﻮان ﺑﺎ اﻳﻦ ﺗﺎﺑﻊ و ﺑﺎ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ در ‪ ISR‬ارﺳﺎﻟﻲ‬
‫ﺑﻪ دراﻳﻮر ﻣﺎوس‪ ،‬ﭘﺮدازش ﻧﻤﻮد‪ .‬ﻣﺜﻼً ﺑﺎ ﮔﺮﻓﺘﻦ ﻛﻠﻴﺪ ﺷﻴﻔﺖ و ﺣﺮﻛﺖ دادن ﻣﻜﺎنﻧﻤﺎي ﻣﺎوس در ﻳﻚ ادﻳﺘﻮر‪ ،‬ﻣﺘﻦ اﻧﺘﺨﺎب ﻣﻲﺷﻮد و ﻏﻴﺮه‪.‬‬

‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﻣﺴﺘﻘﻴﻢ ﻣﺎوس‪ :‬ﺑﺎﻳﺪ از ﻃﺮﻳﻖ درﮔﺎه ﺳﺮﻳﺎل اﻳﻦ ﻛﺎر را ﻛﺮد‪ .‬ﭼﻮن ﻣﺎوس ﺑﻪ ﻳﻜﻲ از درﮔﺎﻫﻬﺎي ﺳﺮﻳﺎل‪ ،‬ﻧﻈﻴﺮ ‪ COM1‬ﻳﺎ ‪COM2‬‬
‫ﻣﺘﺼﻞ ﻣﻲﺷﻮد‪ .‬ﻛﺴﺎﻧﻲ ﻛﻪ دراﻳﻮر ﻣﺎوس را ﻣﻲﻧﻮﻳﺴﻨﺪ‪ ،‬ﻧﻴﺎزﻣﻨﺪ اﻳﻦ ﻛﺎر ﻫﺴﺘﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪ ،Mickey ١‬ﭘﺲ از آﺎرﺗﻮن ‪ Mickey Mouse‬واﻟﺖ دیﺴﻨﻲ!‬
‫‪Interrupt Service Routine ٢‬‬
‫ﻓﺼﻞ ‪ :11‬دﺳﺘﺮﺳﻲ و ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﺳﺎﻋﺖ‬
‫)‪(Accessing and Programming the Real-time Clock‬‬

‫‪ 1-11‬اﻧﺪازهﮔﻴﺮي زﻣﺎن ﺑﺎ وﻗﻔﻪي ‪08H‬‬


‫ﺗﺮاﺷﻪي ﺗﺎﻳﻤﺮ)‪ ،(Intel 8254‬در ﻫﺮ ﺛﺎﻧﻴﻪ ‪ 1,193,180‬ﺑﺎر از ﻣﻮﻟﺪ ارﺗﻌﺎش‪ ،1‬ﺳﻴﮕﻨﺎل درﻳﺎﻓﺖ ﻣﻲﻛﻨﺪ‪ .‬ﭘﺲ از ‪ 65536‬ﺳﻴﮕﻨﺎل‪ ،‬ﻳﺎ ﺗﻘﺮﻳﺒﺎً ‪ 18.2‬ﺑﺎر در‬
‫ﺛﺎﻧﻴﻪ‪ ،‬اﻳﻦ ﺗﺮاﺷﻪ وﻗﻔﻪي ﺳﺨﺖاﻓﺰاري ‪ 08H‬را ﻓﻌﺎل ﻣﻲﻛﻨﺪ‪ .‬ﻛﻨﺘﺮﻟﺮ وﻗﻔﻪ‪ ،2‬اﻳﻦ وﻗﻔﻪ را ﺑﻪ ‪ CPU‬ﻣﻨﺘﻘﻞ ﻣﻲﻛﻨﺪ و روال ﺳﺮوﻳﺲ اﻳﻦ وﻗﻔﻪ‪ ،‬اﺟﺮا ﻣﻲﺷﻮد‪ .‬اﻳﻦ روال‬
‫وﻗﻔﻪ‪ ،‬ﻳﻚ ﺷﻤﺎرﺷﮕﺮ ﺑﺮاي زﻣﺎن )‪ (time counter‬را ﻛﻪ ﺟﺰو ﻣﺘﻐﻴﺮﻫﺎي ‪ BIOS‬اﺳﺖ را اﻓﺰاﻳﺶ ﻣﻲدﻫﺪ‪ .‬اﻳﻦ ﺷﻤﺎرﺷﮕﺮ‪ ،‬ﻳﻚ ﻣﺘﻐﻴﺮ ‪ 32‬ﺑﻴﺘﻲ اﺳﺖ و در اﺑﺘﺪاي‬
‫روﺷﻦ ﺷﺪن ﺳﻴﺴﺘﻢ داراي ﻣﻘﺪار اوﻟﻴﻪي ﺻﻔﺮ اﺳﺖ‪ ،‬ﻣﮕﺮ آﻧﻜﻪ ﺑﻪﻃﻮر دﺳﺘﻲ ﻳﺎ ﺑﻮﺳﻴﻠﻪي ﺳﺎﻋﺖ ﺑﻲدرﻧﮓ)‪ (RTC‬ﻣﻘﺪاردﻫﻲ ﺷﻮد‪.‬‬
‫از اﻳﻦ ﺷﻤﺎرﺷﮕﺮ زﻣﺎن‪ ،‬ﻣﻲﺗﻮان ﺛﺎﻧﻴﻪﻫﺎ‪ ،‬و از ﺛﺎﻧﻴﻪﻫﺎ‪ ،‬دﻗﻴﻘﻪ و ﺳﺎﻋﺖ را ﻣﺤﺎﺳﺒﻪ ﻛﺮد‪:‬‬

‫‪seconds = time_counter /18.2‬‬


‫ﻛﺎر دﻳﮕﺮ وﻗﻔﻪي ‪ ،08H‬ﺧﺎﻣﻮش ﻛﺮدن ﻣﻮﺗﻮر ﮔﺮداﻧﻨﺪهي دﻳﺴﻚ اﺳﺖ‪ ،‬ﻛﻪ اﻳﻦ ﻛﺎر ﭘﺲ از ﻳﻚ ﻣﺪت زﻣﺎن ﻏﻴﺮﻓﻌﺎل ﺑﻮدن ﮔﺮداﻧﻨﺪه اﻧﺠﺎم ﻣﻲﺷﻮد و در‬
‫ارﺗﺒﺎط ﺑﺎ وﻗﻔﻪي ‪ ،13H‬اﻳﻦ ﻛﺎر اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬ﭘﺲ از اﻧﺠﺎم اﻳﻦ ﻛﺎر‪ ،‬وﻗﻔﻪي ‪ ،08H‬وﻗﻔﻪي ‪ 1CH‬را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ‪ .‬در ﺣﺎﻟﺖ ﻋﺎدي‪ ،‬روال ﺳﺮوﻳﺲ وﻗﻔﻪي ‪،1CH‬‬
‫ﻓﻘﻂ ﺷﺎﻣﻞ ﻳﻚ دﺳﺘﻮراﻟﻌﻤﻞ ‪ iret‬اﺳﺖ‪ ،‬وﻟﻲ ﻣﻲﺗﻮان اﻳﻦ وﻗﻔﻪ را ﺗﻌﻮﻳﺾ ﻧﻤﻮد ﺗﺎ ﻛﺎرﻫﺎي دﻳﮕﺮي اﻧﺠﺎم دﻫﺪ‪.‬‬

‫‪ 2-11‬ﺗﻨﻈﻴﻢ زﻣﺎن ﺑﺎ وﻗﻔﻪي ‪1AH‬‬


‫اﻳﻦ وﻗﻔﻪ‪ ،‬ﺗﻮاﺑﻊ ﺧﻮاﻧﺪن و ﺗﻨﻈﻴﻢ ﺗﺎرﻳﺦ و ﺳﺎﻋﺖ را در اﺧﺘﻴﺎر ﻗﺮار ﻣﻲدﻫﺪ‪:‬‬

‫‪Function‬‬ ‫‪Task‬‬
‫‪00H‬‬ ‫)‪Get clock (32-bit time_counter‬‬
‫‪01H‬‬ ‫‪Set clock‬‬
‫‪02H‬‬ ‫)‪Get current time (HH:MM:SS.PP‬‬
‫‪03H‬‬ ‫)‪Set current time (HH:MM:SS.PP‬‬
‫‪04H‬‬ ‫)‪Get current date (CCYY/MM/DD‬‬
‫‪05H‬‬ ‫)‪Set current date (CCYY/MM/DD‬‬
‫‪06H‬‬ ‫*‪Set alarm time‬‬
‫‪07H‬‬ ‫‪Reset alarm time‬‬
‫* ‪ ،alarm time‬زﻣﺎﻧﻲ اﺳﺖ در روز ﺟﺎري ﻛﻪ در آن زﻣﺎن وﻗﻔﻪي ‪ 4AH‬ﻓﻌﺎل ﻣﻲﺷﻮد و ﻣﻲﺗﻮان ﺑﺎ ﺗﻌﻮﻳﺾ روال ﺳﺮوﻳﺲ اﻳﻦ وﻗﻔﻪ‪ ،‬ﭘﻴﻐﺎم ﺧﺎﺻﻲ را‬
‫ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داد‪ ،‬و ﻳﺎ ﺑﺎ زدن زﻧﮓ‪ ،‬ﻣﻄﻠﺒﻲ را ﺑﻪ ﻛﺎرﺑﺮ ﻳﺎدآوري ﻧﻤﻮد‪.‬‬

‫‪ 3-11‬ﺳﺎﻋﺖ ﺑﻲدرﻧﮓ‬
‫ﺳﺎﻋﺖ ﺑﻲدرﻧﮓ)‪ (RTC‬در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ AT‬ﺑﻪ ﺑﻌﺪ وﺟﻮد دارد و ﺑﺎ ﺑﺎﺗﺮي ﻛﺎر ﻣﻲﻛﻨﺪ و ﺑﺎ ﺧﺎﻣﻮش ﺷﺪن ﻛﺎﻣﭙﻴﻮﺗﺮ‪ reset ،‬ﻧﻤﻲﺷﻮد‪ .‬اﻳﻦ ﺳﺎﻋﺖ ﻳﻚ‬
‫ﺣﺎﻓﻈﻪ از ﻧﻮع ‪ RAM‬دارد ﻛﻪ ‪ 64‬ﺑﺎﻳﺖ ﻇﺮﻓﻴﺖ دارد و از ﻃﺮﻳﻖ درﮔﺎه ‪ 70H‬ﺗﺎ ‪ 7FH‬ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ‪ .‬اﻳﻦ ﺣﺎﻓﻈﻪ‪ ،‬در ﺣﻘﻴﻘﺖ ﺛﺒﺎﺗﻬﺎي ‪ RTC‬اﺳﺖ‪ ،‬ﻛﻪ ﻋﺒﺎرﺗﻨﺪ‬
‫از‪:‬‬

‫‪Register‬‬ ‫‪Meaning‬‬
‫‪00H‬‬ ‫‪Current second‬‬
‫‪01H‬‬ ‫‪Alarm second‬‬
‫‪02H‬‬ ‫‪Current minute‬‬

‫_________________________________________________________________________________‬
‫‪quartz crystal ١‬‬
‫‪interrupt controller ٢‬‬
2-11 ‫ دﺳﺘﺮﺳﻲ و ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﺳﺎﻋﺖ‬:11 ‫ﻓﺼﻞ‬

03H Alarm minute


04H Current hour
05H Alarm hour
06H Day of week (1=Sunday, ...)
07H Number of day
08H Month
09H Year
0AH Clock status register A
0BH Clock status register B
0CH Clock status register C
0DH Clock status register D
32H Century (19 or 20)

.‫ ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﻣﻲﺷﻮد‬،RTC ‫ ﺑﺎ اﺳﺘﻔﺎده از ﻣﻘﺎدﻳﺮ زﻣﺎن‬،‫ ﻣﻘﺪار ﺷﻤﺎرﺷﮕﺮ زﻣﺎن‬،‫در اﺑﺘﺪاي روﺷﻦ ﺷﺪن ﺳﻴﺴﺘﻢ‬
:‫ ﻫﻤﺎﻧﻨﺪ دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪ اﺳﺖ‬،‫روش دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻦ ﺛﺒﺎﺗﻬﺎ‬

:‫ﺑﺮاي ﺧﻮاﻧﺪن ﺛﺒﺎﺗﻬﺎ‬

mov al, mem_loc ; ‫ﺧﻮاﻧﺪن ﻳﻚ ﺛﺒﺎت ﺑﺎ ﺷﻤﺎره ﻣﺸﺨﺺ‬


out 70h, al ; ‫درﮔﺎه ﻧﻮﺷﺘﻦ‬
in al, 71h ; ‫درﮔﺎه ﺧﻮاﻧﺪن‬

:‫ﺑﺮاي ﻧﻮﺷﺘﻦ در ﺛﺒﺎﺗﻬﺎ‬

mov al, mem_loc


out 70h, al
mov al, new_content
out 71h, al
‫ﻓﺼﻞ ‪ :12‬ﮔﺴﺘﺮش ﺣﺎﻓﻈﻪ‬
‫)‪(Memory Expansion‬‬

‫‪ 1-12‬ﻣﻘﺪﻣﻪ‬
‫در ﺳﺎل ‪ 1980‬ﻛﻪ ﻧﺨﺴﺘﻴﻦ ‪ PC‬ﻋﺮﺿﻪ ﺷﺪ‪ 640KB ،‬ﺣﺎﻓﻈﻪ‪ ،‬ﺧﻴﻠﻲ زﻳﺎد ﺑﻮد و ‪PC‬ﻫﺎي اوﻟﻴﻪ ‪ 64KB‬ﻳﺎ ‪ 128KB‬ﻳﺎ ﺣﺪاﻛﺜﺮ ‪ 256KB‬ﺣﺎﻓﻈﻪ‬
‫داﺷﺘﻨﺪ‪ DOS .‬ﻫﻢ ﺑﺮاي ﭼﻨﻴﻦ ﻧﻴﺎزﻫﺎﻳﻲ ﻃﺮاﺣﻲ ﺷﺪه ﺑﻮد و ﺣﺪاﻛﺜﺮ ‪ 640KB‬ﺣﺎﻓﻈﻪ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﻨﺪ ﻛﻪ در ﺣﺎل ﺣﺎﺿﺮ ﺣﺪاﻗﻞ ﺣﺎﻓﻈﻪي ﻣﻮردﻧﻴﺎز ﺑﻮﺳﻴﻠﻪي اﻛﺜﺮ‬
‫ﻛﺎرﺑﺮان اﺳﺖ‪ .‬در ﺷﻜﻞ )‪ (1-12‬ﭘﻴﻜﺮهﺑﻨﺪي ﺣﺎﻓﻈﻪي ‪ PC‬ﻧﺸﺎن داده ﺷﺪه اﺳﺖ‪.‬‬

‫ﺷﻜﻞ ‪ :1-12‬ﭘﻴﻜﺮهﺑﻨﺪي ﺣﺎﻓﻈﻪ ‪ PC‬و ﺑﺴﻂ ﺣﺎﻓﻈﻪ ﻣﻄﺎﺑﻖ اﺳﺘﺎﻧﺪارد ‪LIM‬‬

‫‪Segment‬‬
‫‪Address‬‬
‫‪Main Memory‬‬ ‫‪EMS Memory‬‬
‫‪FFFF‬‬
‫‪BIOS‬‬
‫‪E000‬‬
‫‪DC00‬‬
‫‪D800‬‬ ‫‪EMS Window‬‬
‫‪D400‬‬ ‫‪D000‬‬
‫‪ROM Extentions‬‬
‫‪C000‬‬
‫‪Video RAM‬‬
‫‪B000‬‬
‫‪EGA/VGA Video RAM‬‬
‫‪16K Pages‬‬
‫‪A000‬‬ ‫‪.‬‬
‫‪.‬‬
‫‪Working‬‬
‫‪.‬‬
‫‪RAM‬‬
‫‪or‬‬
‫‪Conventional‬‬
‫‪Memory‬‬

‫‪0000‬‬

‫ﻣﻄﺎﺑﻖ اﻳﻦ ﺷﻜﻞ ﻓﻘﻂ ‪ 640KB‬از ﺣﺎﻓﻈﻪ ﺑﻪﻋﻨﻮان ﺣﺎﻓﻄﻪي اﺻﻠﻲ ﻣﻲﺗﻮاﻧﺪ ﻣﻮرد اﺳﺘﻔﺎدهي ﺑﺮﻧﺎﻣﻪﻫﺎ ﻗﺮار ﮔﻴﺮد‪ .‬اﻣﺎ ﺑﺮﺧﻼف ‪ PC‬ﻛﻪ داراي ﭘﺮدازﻧﺪهي‬
‫‪ 8086‬ﺑﻮد‪ ،‬ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺑﻌﺪي‪ ،‬داراي ﭘﺮدازﻧﺪهﻫﺎي ‪ 80286‬ﻳﺎ ﺑﺎﻻﺗﺮ‪ ،‬اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﻴﺶ از ‪ 1MB‬ﺣﺎﻓﻈﻪ را ﻓﺮاﻫﻢ ﻣﻲﻛﺮدﻧﺪ‪ .‬اﻣﺎ ﺗﺤﺖ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ‬
‫‪ ،DOS‬ﻣﺎﺑﻘﻲ ﺣﺎﻓﻈﻪ ﻗﺎﺑﻞ ﻧﺸﺎﻧﻲدﻫﻲ ﻧﻴﺴﺖ‪ .‬دﻟﻴﻞ اﻳﻦ اﻣﺮ اﻳﻦ اﺳﺖ ﻛﻪ ‪ DOS‬در ﺣﺎﻟﺖ واﻗﻌﻲ‪ 1‬اﻳﻦ ﭘﺮدازﻧﺪهﻫﺎ ﻛﺎر ﻣﻲﻛﻨﺪ و ﭘﺮدازﻧﺪه در اﻳﻦ ﺣﺎﻟﺖ‪ ،‬ﻛﻪ ﺳﺎزﮔﺎر ﺑﺎ‬

‫_________________________________________________________________________________‬
‫‪real mode ١‬‬
‫‪2-12‬‬ ‫ﻓﺼﻞ ‪ :12‬ﮔﺴﺘﺮش ﺣﺎﻓﻈﻪ‬

‫روش ﻧﺸﺎﻧﻲدﻫﻲ ‪ 8086‬اﺳﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﻴﺶ از ‪ 1MB‬ﻧﺸﺎﻧﻲدﻫﻲ ﻛﻨﺪ‪ .‬ﻗﺎﺑﻠﻴﺖ ﻧﺸﺎﻧﻲدﻫﻲ ﺑﻴﺶ از ‪ 1MB‬در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه‪ 1‬ﻓﺮاﻫﻢ ﻣﻲﺷﻮد و ﺳﻴﺴﺘﻤﻬﺎي‬
‫ﻋﺎﻣﻠﻲ ﻧﻈﻴﺮ ‪ Windows‬ﻳﺎ ‪ Unix‬ﻛﻪ ﺗﻮاﻧﺎﻳﻲ دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﻴﺶ از ‪ 1MB‬ﺣﺎﻓﻈﻪ را دارﻧﺪ در اﻳﻦ ﺣﺎﻟﺖ ﭘﺮدازﻧﺪه ﻋﻤﻞ ﻣﻲﻛﻨﻨﺪ‪.‬‬

‫ﺗﺤﺖ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ ،DOS‬راه ﺣﻠﻬﺎي ﻣﺨﺘﻠﻔﻲ ﺑﺮاي ﺣﻞ ﻣﺸﻜﻞ ﻛﻤﺒﻮد ﺣﺎﻓﻈﻪ اراﺋﻪ ﮔﺮدﻳﺪ ﻛﻪ دو راه ﺣﻞ ﻣﻬﻢ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬
‫‪ (1‬ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮش ﻳﺎﻓﺘﻪ‪2‬‬
‫‪ (2‬ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‪3‬‬

‫اﻳﻦ روﺷﻬﺎ ﻣﻴﺰان ﺣﺎﻓﻈﻪي ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﻮﺳﻴﻠﻪي ﺑﺮﻧﺎﻣﻪﻫﺎ را ﺗﺎ ﭼﻨﺪ ﻣﮕﺎﺑﺎﻳﺖ اﻓﺰاﻳﺶ ﻣﻲدﻫﻨﺪ و دﺳﺘﺮﺳﻲ ﺑﻪاﻳﻦ ﻧﻮع ﺣﺎﻓﻈﻪﻫﺎ‪ ،‬ﻣﺴﺘﻠﺰم ﭘﻴﺶﺑﻴﻨﻲ ﺗﺮﺗﻴﺒﺎت‬
‫ﻻزم در ﺑﺮﻧﺎﻣﻪﻫﺎ اﺳﺖ‪ .‬ﺗﻔﺎوت اﻳﻦ دو روش ﺑﻪﻃﻮر ﺧﻼﺻﻪ ﻋﺒﺎرت اﺳﺖ از‪:‬‬

‫ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮش ﻳﺎﻓﺘﻪ‪ :‬ﺣﺎﻓﻈﻪي اﺿﺎﻓﻲ در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ PC‬و ‪ XT‬اﺳﺖ و ﺑﻪ دﻟﻴﻞ ﻣﺤﺪودﻳﺖ ‪ 8086‬و ‪ 8088‬ﺑﺮاي ﻛﺎرﻛﺮدن ﺑﺎ ﺑﻴﺶ از‬ ‫•‬
‫‪ 640KB‬ﺣﺎﻓﻈﻪ‪ ،‬ﺑﺎ اﻳﻦ روش ﻣﻴﺰان ﺣﺎﻓﻈﻪ ﺑﺎ ﺗﻜﻨﻴﻜﻲ ﻛﻪ ﻣﻔﺼﻼً ﻣﻮرد ﺑﺤﺚ واﻗﻊ ﻣﻲﺷﻮد‪ ،‬ﺑﻪ ﺑﻴﺶ از ‪ 1MB‬ﮔﺴﺘﺮش داده ﻣﻲﺷﻮد‪.‬‬

‫ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‪ :‬ﺣﺎﻓﻈﻪي اﺿﺎﻓﻲ در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي داراي ﭘﺮدازﻧﺪهﻫﺎي ‪ 80286‬ﺑﻪ ﺑﺎﻻ اﺳﺖ و ﻣﻴﺰان ﺣﺎﻓﻈﻪ ﺑﺎ ﺗﻜﻨﻴﻜﻲ ﻛﻪ ﻣﺴﺘﻠﺰم ﻋﻤﻞ‬ ‫•‬
‫ﻧﻤﻮدن در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪهي ﭘﺮدازﻧﺪه اﺳﺖ‪ ،‬ﺑﻪ ﺑﻴﺶ از ‪ 1MB‬ﺑﺴﻂ ﻣﻲﻳﺎﺑﺪ‪.‬‬

‫‪ 2-12‬ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮش ﻳﺎﻓﺘﻪ‬


‫ﺣﺎﻓﻈﻪي ﻣﺘﻌﺎرف‪ 4‬در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ PC/XT‬ﺑﻪ ‪ 640KB‬ﻣﺤﺪود ﺑﻮد‪ .‬ﺷﺮﻛﺘﻬﺎﻳﻲ ﺑﺮاي ﻏﻠﺒﻪ ﺑﺮ ﻣﺸﻜﻞ ﻣﺤﺪودﻳﺖ ﺣﺎﻓﻈﻪ‪ ،‬اﻗﺪام ﺑﻪ اراﺋﻪي راهﺣﻠﻬﺎﻳﻲ‬
‫ﺑﺮاي اﻓﺰودن ﺣﺎﻓﻈﻪي ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺗﺤﺖ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ DOS‬ﻧﻤﻮدﻧﺪ ﺗﺎ ﺑﺮﻧﺎﻣﻪﻫﺎ در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ PC‬و ‪ XT‬ﺑﺘﻮاﻧﻨﺪ از آن اﺳﺘﻔﺎده ﻧﻤﺎﻳﻨﺪ‪ .‬ﺳﻪ ﺷﺮﻛﺖ ﻣﻌﺮوف در اﻳﻦ‬
‫زﻣﻴﻨﻪ ﻋﺒﺎرت ﺑﻮدﻧﺪ از ‪ Intel ،Lotus‬و ‪ ،Microsoft‬ﻛﻪ اﺳﺘﺎﻧﺪاردي را ﺑﺎ ﻧﺎم ‪ ،LIM‬ﻛﻪ ﺑﺮﮔﺮﻓﺘﻪ از ﺣﺮوف ﻧﺨﺴﺖ ﻧﺎﻣﻬﺎي آﻧﻬﺎ اﺳﺖ‪ ،‬ﻣﻌﺮﻓﻲ ﻧﻤﻮدﻧﺪ‪ .‬اﻳﻦ اﺳﺘﺎﻧﺪارد‬
‫اﺟﺎزه ﻣﻲدﻫﺪ ﻛﻪ ﺗﺎ ‪ 8MB‬ﺣﺎﻓﻈﻪ ﺑﺎ ﺑﻬﺮهﮔﻴﺮي از ﻳﻚ ﺳﺨﺖاﻓﺰار ﻛﺎرت ﮔﺴﺘﺮش‪ 5‬ﺑﻪ ﺣﺎﻓﻈﻪي ‪ PC‬اﺿﺎﻓﻪ ﺷﻮد‪ .‬ﻣﺎﺟﻮﻟﻬﺎ ﺑﺎ ﺑﺎﻧﻜﻬﺎي ﺣﺎﻓﻈﻪي اﺿﺎﻓﻲ‪ ،‬ﻛﻪ ﻫﺮ ﻛﺪام‬
‫‪ 16KB‬ﻇﺮﻓﻴﺖ داﺷﺘﻨﺪ‪ ،‬ﺑﺮ روي اﻳﻦ ﻛﺎرت ﻗﺮار داﺷﺘﻨﺪ و در ﻫﺮ زﻣﺎن ﺗﻨﻬﺎ ﭼﻬﺎر ﺑﺎﻧﻚ ﻳﺎ ‪ 64KB‬از اﻳﻦ ﺣﺎﻓﻈﻪي اﺿﺎﻓﻲ در ﻓﻀﺎي ﻧﺸﺎﻧﻲدﻫﻲ ‪ PC‬زﻳﺮ ‪ 1MB‬و در‬
‫ﻣﺤﺪودهي ‪ D000H‬ﺗﺎ ‪ E000H‬و ﺗﺤﺖ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ DOS‬ﻗﺎﺑﻞ دﺳﺘﻴﺎﺑﻲ اﺳﺖ و ﺑﻪ آن ﻳﻚ ﻗﺎب ﺻﻔﺤﻪ‪ 6‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﻧﻮع ﺣﺎﻓﻈﻪ ﻳﺎ ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‬
‫ﻛﻪ در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ AT‬ﺑﻪ ﺑﺎﻻ و ﺑﺎﻻﺗﺮ از ﻓﻀﺎي ﻧﺸﺎﻧﻲدﻫﻲ ‪ 1MB‬وﺟﻮد دارد‪ ،‬ﻣﺘﻔﺎوت اﺳﺖ‪ .‬ﺑﻪ ﺳﻴﺴﺘﻤﻲ ﻛﻪ داراي ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮش ﻳﺎﻓﺘﻪ ﺑﺎﺷﺪ‪ 7EMS ،‬ﮔﻔﺘﻪ‬
‫ﻣﻲﺷﻮد‪.‬‬

‫اﺳﺘﺎﻧﺪارد ‪ LIM‬از ﻳﻚ ﺗﻜﻨﻴﻚ ﻣﻄﻤﺌﻦ ﺑﻪ ﻧﺎم ﺗﻌﻮﻳﺾ ﺑﺎﻧﻚ‪ 8‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪي اﺿﺎﻓﻲ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪ .‬در اﻳﻦ روش از ﻳﻚ ﭘﻨﺠﺮهي ﺣﺎﻓﻈﻪ‬
‫در ﻣﺤﺪودهي ‪ D00H‬ﺗﺎ ‪ ،E000H‬ﺑﻪﻧﺎم ‪ EMS Window‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺎﻧﻜﻬﺎي ‪ 16MB‬ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮشﻳﺎﻓﺘﻪ اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬ﻧﺮماﻓﺰار ﺑﻪﻃﻮر‬
‫ﺗﻨﮕﺎﺗﻨﮓ ﺑﺎ ﺳﺨﺖاﻓﺰار ﻛﺎر ﻣﻲﻛﻨﺪ و ﭘﻨﺠﺮه را در ﻛﻞ ﻣﺤﺪودهي ﺣﺎﻓﻈﻪ ﺣﺮﻛﺖ ﻣﻲدﻫﺪ ﺗﺎ در ﻫﺮ زﻣﺎن ﺑﻪ ‪ 4‬ﺻﻔﺤﻪ ﻳﺎ ﺑﺎﻧﻚ آن دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﻛﻪ ﻇﺮﻓﻴﺖ ﻫﺮ ﻛﺪام‬
‫‪ 16MB‬اﺳﺖ و در ﻣﺠﻤﻮع ‪ 4‬ﺻﻔﺤﻪ در ﻧﺸﺎﻧﻴﻬﺎي ‪ D800H ،D400H ،D000H‬و ‪ DC00H‬ﻛﻪ در ﺷﻜﻞ )‪ (1-12‬ﻣﺸﺨﺺ ﺷﺪهاﻧﺪ‪ ،‬ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ در‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﻮده و ﻣﺎﺑﻘﻲ ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮش ﻳﺎﻓﺘﻪ ﻏﻴﺮﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ در آن زﻣﺎن اﺳﺖ‪.‬‬

‫ﺑﺎز ﻛﺮدن ﻳﻚ ﭘﻨﺠﺮه ﺣﺎﻓﻈﻪ‪ :‬ﺗﺤﺖ ‪ DOS‬ﺣﺪاﻗﻞ ‪ 64KB‬در ﻓﻀﺎي ﻧﺸﺎﻧﻲدﻫﻲ ‪ ،1MB‬ﻋﻠﻲرﻏﻢ وﺟﻮد ﺣﺎﻓﻈﻪي ﻣﺘﻌﺎرف‪Video ،BIOS ،‬‬
‫‪ ،RAM‬ﻳﺎ ﺳﺎﻳﺮ ﻣﻮارد‪ ،‬ﺑﺪون اﺳﺘﻔﺎده ﻣﻲﻣﺎﻧﺪ‪ .‬ﻃﺮاﺣﺎن ‪ EMS‬از اﻳﻦ ﻣﺤﺪوده ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮشﻳﺎﻓﺘﻪ اﺳﺘﻔﺎده ﻛﺮدهاﻧﺪ‪ .‬ﻋﻤﻮﻣﺎً اﻳﻦ ﭘﻨﺠﺮه در ﻧﺸﺎﻧﻲ‬
‫ﻗﻄﻌﻪي ‪ D000H‬ﻗﺮار ﻣﻲﮔﻴﺮد‪ ،‬اﻣﺎ ﺳﺨﺖاﻓﺰار ‪ EMS‬اﺟﺎزه ﻣﻲدﻫﺪ ﻛﻪ در ﺟﺎي دﻳﮕﺮي ﻫﻢ ﺑﺎﺷﺪ‪ .‬ﭼﻮن اﻳﻦ ﭘﻨﺠﺮه در ﻓﻀﺎي ﻧﺸﺎﻧﻲدﻫﻲ ‪ 1MB‬ﻗﺮار دارد ﭘﺲ‬
‫ﺑﻮﺳﻴﻠﻪي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻋﺎدي زﺑﺎن اﺳﻤﺒﻠﻲ‪ ،‬ﻫﻤﺎﻧﻨﺪ ﺣﺎﻓﻈﻪي وﻳﺪﺋﻮﻳﻲ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ)ﺧﻮاﻧﺪﻧﻲ ‪ /‬ﻧﻮﺷﺘﻨﻲ( اﺳﺖ‪.‬‬

‫ﺗﻘﺴﻴﻢﺑﻨﺪي ﻗﺎب ﺻﻔﺤﻪ‪ :‬ﻗﺎب ﺻﻔﺤﻪ ﺑﻪ ‪ 4‬ﺻﻔﺤﻪي ‪ 16KB‬ﺗﻘﺴﻴﻢ ﺷﺪه اﺳﺖ و ﺑﻪ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ اﺟﺎزه ﻣﻲدﻫﺪ ﻛﻪ در ﻫﺮ زﻣﺎن ﺑﻪ ﭼﻬﺎر ﺻﻔﺤﻪي‬
‫ﻣﺘﻔﺎوت در ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮشﻳﺎﻓﺘﻪ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬ﺛﺒﺎﺗﻬﺎي ‪ EMS‬ﺑﻪ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ اﺟﺎزه ﻣﻲدﻫﻨﺪ ﻛﻪ ﺻﻔﺤﺎت ﻣﻮرد ﻧﻈﺮش را اﻧﺘﺨﺎب ﻧﻤﺎﻳﺪ ﻛﻪ ﺑﺮاﺳﺎس آن‬
‫ﺧﻄﻮط ﻧﺸﺎﻧﻲ ‪ EMS‬ﺗﻨﻈﻴﻢ ﻣﻲﺷﻮﻧﺪ ﺗﺎ ﺻﻔﺤﺎت ﻣﻮردﻧﻈﺮ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺑﺎﺷﻨﺪ و ﺑﺮ اﻳﻦ اﺳﺎس آن ﺻﻔﺤﺎت در ﻓﻀﺎي ﻧﺸﺎﻧﻲدﻫﻲ ‪ 8088‬ﻧﮕﺎﺷﺖ‪ 9‬ﻣﻲﺷﻮﻧﺪ‪ ،‬و اﻳﻦ‬
‫ﻫﻤﺎن ﺗﻜﻨﻴﻨﻚ ﺗﻌﻮﻳﺾ ﺑﺎﻧﻚ اﺳﺖ‪.‬‬

‫_________________________________________________________________________________‬
‫‪protected mode ١‬‬
‫‪expanded memory ٢‬‬
‫‪extended memory ٣‬‬
‫‪conventional memory ٤‬‬
‫‪expansion card ٥‬‬
‫‪page frame ٦‬‬
‫‪Expanded Memory System ٧‬‬
‫‪bank switching ٨‬‬
‫‪map ٩‬‬
‫‪3-12‬‬ ‫ﻓﺼﻞ ‪ :12‬ﮔﺴﺘﺮش ﺣﺎﻓﻈﻪ‬

‫‪ ،EMS‬ﻋﻼوه ﺑﺮ ﺳﺨﺖاﻓﺰار داراي ﻳﻚ واﺳﻂ ﻧﺮماﻓﺰاري ﻧﻴﺰ ﻫﺴﺖ‪ ،‬ﻛﻪ وﻇﺎﻳﻒ ﺑﺮﻧﺎﻣﻪرﻳﺰي ﺛﺒﺎﺗﻬﺎي ‪ EMS‬و ﺳﺎﻳﺮ وﻇﺎﻳﻒ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ را اﻧﺠﺎم‬
‫ﻣﻲدﻫﺪ‪ ،‬ﻛﻪ ﺑﻪ آن واﺳﻂ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮشﻳﺎﻓﺘﻪ‪ (EMM)1‬ﮔﻮﻳﻨﺪ و واﺳﻂ اﺳﺘﺎﻧﺪاردي ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻛﺎرﺗﻬﺎي ‪ EMS‬ﺳﺎﺧﺖ ﺷﺮﻛﺘﻬﺎي ﻣﺨﺘﻠﻒ ﻓﺮاﻫﻢ‬
‫ﻣﻲﻛﻨﺪ‪.‬‬

‫ﺑﺮﺧﻲ از ﻧﺮماﻓﺰارﻫﺎي ‪ ،EMM‬ﻧﻈﻴﺮ ‪ QEMM386‬ﺑﺮ روي ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ 386‬ﺑﻪ ﺑﻌﺪ‪ ،‬دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ را ﺑﺎ ﻫﻤﻴﻦ روش و ﻫﻤﺎﻧﻨﺪ‬
‫ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮشﻳﺎﻓﺘﻪ و ﺑﺎ ﻣﻜﺎﻧﻴﺴﻢ ‪ EMS‬ﻓﺮاﻫﻢ ﻧﻤﻮدهاﻧﺪ‪.‬‬

‫ﺑﺮﻧﺎﻣﻪﻫﺎي ﮔﺮداﻧﻨﺪهي ‪ :2EMM‬اﻳﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﻪﺻﻮرت ﻣﻘﻴﻢ درﺣﺎﻓﻈﻪ‪ (TSR) 3‬ﻫﺴﺘﻨﺪ و ﻳﻜﻲ از وﻗﻔﻪﻫﺎ‪ ،‬ﻣﺜﻞ ‪ 67H‬را ﺗﻌﻮﻳﺾ ﻧﻤﻮده و از اﻳﻦ‬
‫ﻃﺮﻳﻖ اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪي ﮔﺴﺘﺮشﻳﺎﻓﺘﻪ را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﻨﺪ‪ .‬ﺗﻮاﺑﻊ ﻣﺨﺘﻠﻔﻲ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﭘﻴﺶﺑﻴﻨﻲ ﺷﺪه اﺳﺖ‪ ،‬ﻛﻪ ﺷﻤﺎرهي ﺗﺎﺑﻊ ﻣﺜﻞ ﺗﻮاﺑﻊ ‪ DOS‬در ﺛﺒﺎت‬
‫‪ AH‬ﻗﺮار داده ﻣﻲﺷﻮد‪ .‬ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ‪ AH ،‬ﺣﺎوي وﺿﻌﻴﺖ ﺧﻄﺎ ﺧﻮاﻫﺪ ﺑﻮد و اﮔﺮ ﻣﻘﺪار آن ﻣﺴﺎوي ‪ 00H‬ﺑﺎﺷﺪ‪ ،‬ﺑﻪ ﻣﻌﻨﻲ ﻋﺪم وﻗﻮع ﺧﻄﺎ اﺳﺖ و ﻣﻘﺎدﻳﺮ ﻣﺴﺎوي ﻳﺎ‬
‫ﺑﺰرﮔﺘﺮ ‪ 80H‬ﻧﺸﺎﻧﺪﻫﻨﺪهي ﺧﻄﺎ ﺧﻮاﻫﻨﺪ ﺑﻮد‪ .‬ﺑﺮﺧﻲ از ﺗﻮاﺑﻊ ﮔﺮداﻧﻨﺪهي ‪ EMS‬در اﻳﻨﺠﺎ ﺗﺸﺮﻳﺢ ﻣﻲﺷﻮﻧﺪ‪:‬‬

‫‪40H: Get EMM status‬‬


‫اﻳﻦ ﺗﺎﺑﻊ ﺑﺮاي ﺑﺮرﺳﻲ وﺿﻌﻴﺖ ﻧﺼﺐ ﺑﻮدن ‪ EMM‬ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮد و اﮔﺮ ‪ AH=00H‬ﺑﺎﺷﺪ‪ ،‬ﺑﻪ ﻣﻌﻨﻲ آن اﺳﺖ ﻛﻪ ‪ EMM‬ﻧﺼﺐ ﺷﺪه اﺳﺖ‪.‬‬

‫‪41H: Get segment address of page frame‬‬


‫در ﻫﻨﮕﺎم روﺷﻦ ﺷﺪن ‪ ،PC‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ ﻛﺪام ﻣﺤﺪوده از ﻓﻀﺎي ﺑﻴﻦ ‪ 640KB‬و ‪ 1MB‬ﺑﻼاﺳﺘﻔﺎده اﺳﺖ‪ EMS ،‬ﻗﻄﻌﻪاي را ﺑﻪ ﻋﻨﻮان ‪EMS‬‬
‫‪ Window‬ﻳﺎ ﻗﺎب ﺻﻔﺤﻪ درﻧﻈﺮ ﻣﻲﮔﻴﺮد‪ ،‬ﻛﻪ ﻋﻤﻮﻣﺎً ‪ D000H‬اﺳﺖ‪ .‬ﺑﺎ اﻳﻦ ﺗﺎﺑﻊ ﻣﻲﺗﻮان ﻧﺸﺎﻧﻲ ﺷﺮوع آﻧﺮا ﺑﺪﺳﺖ آورد‪.‬‬

‫‪42H: Get number of pages‬‬


‫ﺑﺮﻧﺎﻣﻪ ﻣﻲﺗﻮاﻧﺪ ﺗﻌﺪادي از ﺻﻔﺤﺎت ‪ EMS‬را ﺑﻪﻃﻮر ﻣﻨﻄﻘﻲ ﺗﺨﺼﻴﺺ دﻫﺪ‪ ،‬ﻛﻪ ﺗﻌﺪاد ﺻﻔﺤﺎت ﺗﺨﺼﻴﺺ داده ﺷﺪه را ﻣﻲﺗﻮان ﺑﺎ اﻳﻦ ﺗﺎﺑﻊ ﺑﺪﺳﺖ آورد‪ ،‬ﺗﺎ‬
‫اﻣﻜﺎن ﺗﺨﺼﻴﺺ اﺿﺎﻓﻲ ﺑﺮرﺳﻲ ﺷﻮد‪.‬‬

‫‪43H: Allocate EMS pages‬‬

‫اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺻﻔﺤﻪي ‪ EMS‬را ﺑﻪﺻﻮرت ﻣﻨﻄﻘﻲ ﺗﺨﺼﻴﺺ داده و ﻳﻚ ﺷﻤﺎره ﺑﻪ ﻋﻨﻮان دﺳﺘﻪ‪ 4‬ﺑﺮاي ارﺟﺎﻋﺎت ﺑﻌﺪي ﺑﻪ آن ﺑﺮﻣﻲﮔﺮداﻧﺪ‪.‬‬

‫‪44H: Set mapping‬‬


‫اﻳﻦ ﺗﺎﺑﻊ ﻳﻜﻲ از ﺻﻔﺤﺎت ﻓﻴﺰﻳﻜﻲ ‪ EMS‬را ﺑﻪ ﻳﻜﻲ از ﺻﻔﺤﺎت ﻣﻨﻄﻘﻲ در ﻗﺎب ﺻﻔﺤﻪ ﻧﮕﺎﺷﺖ ﻣﻲﻛﻨﺪ‪ .‬در اﻳﻦ ﺻﻮرت‪ ،‬ﺧﻮاﻧﺪن ﻳﺎ ﻧﻮﺷﺘﻦ در ﺻﻔﺤﻪي‬
‫ﻣﻨﻄﻘﻲ در ﻣﺤﺪودهي ﻗﺎب ﺻﻔﺤﻪ‪ ،‬ﺑﻪ ﻣﻨﺰﻟﻪي اﻧﺠﺎم اﻳﻦ ﻛﺎر ﺑﺮروي ﺻﻔﺤﻪي ﻣﺘﻨﺎﻇﺮ ‪ EMS‬اﺳﺖ‪.‬‬

‫‪45H: Release EMS pages‬‬


‫ﻳﻜﻲ از ﺻﻔﺤﺎت از ﻗﺒﻞ ﺗﺨﺼﻴﺺ دادهﺷﺪهي ‪ EMS‬را ﺑﺎ دادن ﺷﻤﺎرهي دﺳﺘﻪي آن آزاد ﻣﻲﻛﻨﺪ‪.‬‬

‫‪ 3-12‬ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‬
‫ﻗﺒﻼً اﺷﺎره ﺷﺪ ﻛﻪ ﭘﺮدازﻧﺪهﻫﺎي ﺑﻌﺪ از ‪ ،8088‬ﻧﻈﻴﺮ ‪ ،386 ،286‬و ﻏﻴﺮه‪ ،‬ﺗﻮاﻧﺎﻳﻲ ﻛﺎر در دو ﺣﺎﻟﺖ واﻗﻌﻲ و ﻣﺤﺎﻓﻈﺖﺷﺪه را دارﻧﺪ‪ .‬در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖ ﺷﺪه‪ ،‬اﻳﻦ‬
‫ﭘﺮدازﻧﺪهﻫﺎ ﺗﻮاﻧﺎﻳﻲ دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﻴﺶ از ‪ 1MB‬ﺣﺎﻓﻈﻪ را دارﻧﺪ‪ .‬در ﺣﺎﻟﺖ واﻗﻌﻲ‪ ،‬ﭘﺮدازﻧﺪه ﺗﻮاﻧﺎﻳﻲ دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﻴﺶ از ‪ 1MB‬ﺣﺎﻓﻈﻪ را ﻧﺪارد و ﺑﺎ ‪،EMS‬ﺣﺎﻓﻈﻪي‬
‫اﺿﺎﻓﻲ در ﻫﻤﺎن ﻓﻀﺎي ﻧﺸﺎﻧﻲ ‪ 1MB‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ DOS .‬ﭼﻮن در ﺣﺎﻟﺖ واﻗﻌﻲ ﻛﺎر ﻣﻲﻛﻨﺪ‪ ،‬ﺗﻨﻬﺎ ﻣﻲﺗﻮاﻧﺪ ﺑﻪ ‪ 1MB‬ﺣﺎﻓﻈﻪ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬اﻣﺎ اﮔﺮ ﺑﺨﻮاﻫﻴﻢ‬
‫از ﻛﻞ ﺣﺎﻓﻈﻪي ﻣﻮﺟﻮد ﺑﺮ روي ﺳﻴﺴﺘﻢ اﺳﺘﻔﺎده ﻛﻨﻴﻢ‪ ،‬ﺑﺎﻳﺪ ﭘﺮدازﻧﺪه را ﺑﻪ ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه ﺑﺒﺮﻳﻢ‪ .‬اﻳﻦ ﻛﺎر ﺑﺎ ‪ 1‬ﻛﺮدن ﻳﻚ ﺑﻴﺖ در ﺛﺒﺎت ﭘﺮﭼﻢ اﻳﻦ ﭘﺮدازﻧﺪهﻫﺎ اﻣﻜﺎﻧﭙﺬﻳﺮ‬
‫اﺳﺖ‪.‬‬

‫اﮔﺮ در ﻳﻚ ﺑﺮﻧﺎﻣﻪي اﺳﻤﺒﻠﻲ ﺗﺤﺖ ‪ DOS‬اﻳﻦ ﻛﺎر را ﺑﻜﻨﺒﻢ‪ ،‬ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه ﻣﻲرود‪ ،‬اﻣﺎ ﺑﺮﻧﺎﻣﻪ ﺑﻼﻓﺎﺻﻠﻪ ﻗﻔﻞ ﻣﻲﻛﻨﺪ‪ .‬زﻳﺮا ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در‬
‫ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه ﺑﺎ ﺣﺎﻟﺖ واﻗﻌﻲ ﻛﺎﻣﻼً ﻣﺘﻔﺎوت اﺳﺖ‪ .‬در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه ﭘﺮدازﻧﺪه از ﻃﺮﻳﻖ ﻣﻔﻬﻮم ﺗﻮﺻﻴﻒﮔﺮﻫﺎي ﻗﻄﻌﻪ‪ 5‬ﻋﻤﻞ ﻣﻲﻛﻨﺪ‪ ،‬ﻧﻪ ﻣﻔﻬﻮم ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ‪،6‬‬
‫ﻛﻪ در آن ﻫﺮ ﻧﺸﺎﻧﻲ از دو ﺑﺨﺶ ﻣﺒﺪاً و ﻗﻄﻌﻪ ﺗﺸﻜﻴﻞ ﻳﺎﻓﺘﻪ اﺳﺖ‪ .‬در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه‪،‬ﺗﻮﺻﻴﻒﮔﺮ ﻗﻄﻌﻪ ﻳﻚ ﺟﺪول اﺳﺖ ﻛﻪ ﻟﻴﺴﺖ ﺗﻮﺻﻴﻒﮔﺮﻫﺎي ﻣﺤﻠﻲ و ﺳﺮاﺳﺮي‬
‫در آن ﻗﺮار دارﻧﺪ‪ DOS .‬ﺑﻪ اﻳﻦ ﺟﺪول دﺳﺘﺮﺳﻲ ﻧﺪارد‪ ،‬ﭼﻮن در ﺣﺎﻟﺖ واﻗﻌﻲ ﻛﺎر ﻣﻲﻛﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪Extended Memory Management ١‬‬
‫‪EMM drivers ٢‬‬
‫‪Terminate Stay Resident ٣‬‬
‫‪handle ٤‬‬
‫‪segment descriptor ٥‬‬
‫‪segment address ٦‬‬
‫‪4-12‬‬ ‫ﻓﺼﻞ ‪ :12‬ﮔﺴﺘﺮش ﺣﺎﻓﻈﻪ‬

‫ﻗﺒﻞ از اﻧﺘﻘﺎل ﺑﻪ ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه‪ ،‬ﺑﺎﻳﺪ ﺟﺪول ﺗﻮﺻﻴﻒﮔﺮ ﻗﻄﻌﻪ اﻳﺠﺎد و ﻣﻘﺪار دﻫﻲ ﺷﻮد‪ .‬اﻳﻦ ﻛﺎر ﻧﻴﺎزﻣﻨﺪ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ اﺳﻤﺒﻠﻲ و آﺷﻨﺎﻳﻲ ﺑﺎ ﻋﻤﻠﻜﺮد‬
‫ﭘﺮدازﻧﺪه در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه اﺳﺖ‪ .‬واﺳﻄﻬﺎي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﻣﺘﻌﺪدي ﻧﻴﺰ وﺟﻮد دارﻧﺪ ﻛﻪ اﻧﺠﺎم اﻳﻦ ﻛﺎر را ﺗﺴﻬﻴﻞ ﻣﻲﻛﻨﻨﺪ‪ .‬ﻧﻈﻴﺮ واﺳﻂ ‪ ،DPMI‬ﻛﻪ در ﻓﺼﻞ آﺧﺮ‬
‫درس ﺑﻪ آن ﻣﻲﭘﺮدازﻳﻢ‪.‬‬

‫ﺑﺮﺧﻲ ﺗﻮاﺑﻊ ‪ BIOS‬و ﮔﺮداﻧﻨﺪهﻫﺎي ‪ ،XMS‬دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﻨﺪ‪ ،‬و ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﭘﺮدازﻧﺪه را ﺑﻪﺻﻮرت ﻣﻮﻗﺘﻲ ﺑﻪ ﺣﺎﻟﺖ‬
‫ﻣﺤﺎﻓﻈﺖﺷﺪه ﺑﺮده و ﺳﭙﺲ ﺑﻪ ﺣﺎﻟﺖ واﻗﻌﻲ ﺑﺮ ﻣﻲﮔﺮداﻧﻨﺪ‪ .‬ﺗﻮاﺑﻊ ‪ ،XMS‬ﺑﻬﺘﺮ از ﺗﻮاﺑﻊ ‪ BIOS‬ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ را ﻣﺪﻳﺮﻳﺖ ﻣﻲﻛﻨﻨﺪ و ﺗﻮاﻧﺎﻳﻲ اﺳﺘﻔﺎده اﺷﺘﺮاﻛﻲ از‬
‫ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﻨﺪ‪ ،‬در ﺣﺎﻟﻴﻜﻪ ﺗﻮاﺑﻊ ‪ BIOS‬اﺳﺘﻔﺎده ﻣﺠﺰا را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﻨﺪ‪.‬‬
‫در اداﻣﻪ در ﻣﻮرد ﺳﻪ ﻣﻮﺿﻮع ﺻﺤﺒﺖ ﻣﻲﻛﻨﻴﻢ‪:‬‬

‫‪ (1‬ﺗﻮاﺑﻊ ‪ BIOS‬ﺑﺮاي ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‪،‬‬


‫‪ (2‬ﻣﻔﻬﻮم ﻧﺎﺣﻴﻪي ﺑﺎﻻي ﺣﺎﻓﻈﻪ‪،(HMA) 1‬‬
‫‪ (3‬ﺗﻮاﺑﻊ ﮔﺮداﻧﻨﺪهي ‪ XMS‬ﺑﺮاي ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‪.‬‬

‫‪ 4-12‬ﺗﻮاﺑﻊ ‪ BIOS‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‬


‫‪PC‬ﻫﺎﻳﻲ ﻛﻪ ﺑﻴﺶ از ‪ RAM 640KB‬دارﻧﺪ‪ ،‬داراي ‪ XM‬ﻫﺴﺘﻨﺪ‪ .‬ﻳﻌﻨﻲ ﺣﺘﻲ اﮔﺮ ﻳﻚ ‪ PC‬ﺗﻨﻬﺎ ‪ RAM 1MB‬داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﻣﻴﺰان ‪ XM‬آن‪1MB ،‬‬
‫‪ - 640KB = 360KB‬اﺳﺖ‪ .‬اﻳﻦ ‪ 360KB‬ﺑﺎﻻﺗﺮ از ﻓﻀﺎي ﻧﺸﺎﻧﻲ ‪ 1MB‬ﻗﺮار دارد‪:‬‬

‫‪360KB‬‬ ‫‪Extended Memory‬‬

‫‪ROM-BIOS‬‬

‫‪...‬‬
‫‪1MB Address Space‬‬
‫‪640KB‬‬
‫‪C.M.‬‬

‫ﺑﺮﺧﻲ از ﺗﻮاﺑﻊ وﻗﻔﻪي ‪ ،15H‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ‪ XM‬ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪ .‬وﻗﻔﻪي ‪ ،15H‬در اﺻﻞ ﺑﺮاي واﺳﻂ ﻧﻮار ﻛﺎﺳﺖ ﻃﺮاﺣﻲ ﺷﺪه ﺑﻮد‪ ،‬اﻣﺎ ﺑﻪ دﻟﻴﻞ‬
‫ﻣﺮﺳﻮم ﺷﺪن دﻳﺴﻜﻬﺎ‪ ،‬اﻳﻦ ﺗﻮاﺑﻊ اﺳﺘﻔﺎده ﻧﺸﺪﻧﺪ‪ .‬از اﻳﻨﺮو‪ ،‬ﺑﺮﺧﻲ از ﺗﻮاﺑﻊ اﻳﻦ وﻗﻔﻪ ﺑﺮاي ﭘﺸﺘﻴﺒﺎﻧﻲ ‪ XM‬و ‪ Joystick‬در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪﻧﺪ‪.‬‬

‫ﺗﺎﺑﻊ ‪ 88H‬وﻗﻔﻪ ‪ ،15H‬ﻣﻘﺪار ‪ XM‬را در ‪ AX‬ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ .‬ﺣﺎل ﻣﻲداﻧﻴﻢ ﭼﻘﺪر ‪ XM‬دارﻳﻢ‪ .‬ﭼﮕﻮﻧﻪ ﻣﻲﺗﻮاﻧﻴﻢ از آن اﺳﺘﻔﺎده ﻛﻨﻴﻢ؟ ﺗﺎﺑﻊ ‪ ،87H‬ﺑﻠﻮﻛﻬﺎي‬
‫ﺣﺎﻓﻈﻪ را در ﻛﻞ ﺣﺎﻓﻈﻪ‪ ،‬ﻳﻌﻨﻲ ﺑﻴﻦ ‪ 640KB‬و ﺑﺎﻻﺗﺮ از ‪ 1MB‬ﻣﺒﺎدﻟﻪ ﻣﻲﻛﻨﺪ‪ .‬ﻳﻌﻨﻲ ﻣﻲﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از آن‪ ،‬ﻳﻚ ﺑﻠﻮك ﺣﺎﻓﻈﻪ را از زﻳﺮ ﻓﻀﺎي ‪ 1MB‬ﺑﻪ ﺑﺎﻻي‬
‫ﻓﻀﺎي ‪ 1MB‬و ﺑﺮﻋﻜﺲ ﻣﻨﺘﻘﻞ ﻧﻤﻮد‪ .‬ﺗﺎﺑﻊ ‪ ،87H‬ﺗﺎﺑﻌﻲ ﭘﻴﭽﻴﺪه اﺳﺖ و ﺑﻪ اﻳﻦ دﻟﻴﻞ زﻳﺎد اﺳﺘﻔﺎده ﻧﺸﺪه اﺳﺖ‪.‬‬

‫ﭘﺎراﻣﺘﺮﻫﺎي ورودي ﺑﻪ ﺗﺎﺑﻊ ‪:87H‬‬

‫‪AH = 87H‬‬
‫ﺗﻌﺪاد ﻛﻠﻤﺎت اﻧﺘﻘﺎﻟﻲ = ‪CX‬‬
‫‪ES:SI = Address of GDT‬‬
‫در ‪ CX‬ﺑﺎﻳﺪ ﺗﻌﺪاد ﻛﻠﻤﺎت )دو ﺑﺎﻳﺘﻲ( ﻗﺮار داده ﺷﻮد و ﺣﺪاﻛﺜﺮ ﻣﻘﺪار ‪ 8000H‬اﺳﺖ و ﻟﺬا ﻣﻲﺗﻮان ‪ 64K‬را ﻫﺮ ﺑﺎر ﻣﻨﺘﻘﻞ ﻧﻤﻮد‪.‬‬

‫ﺟﺪول ﺗﻮﺻﻴﻒﮔﺮ ﺳﺮاﺳﺮي‪:(GDT)2‬در زوج ﺛﺒﺎت ‪ ،ES:SI‬ﺑﺎﻳﺪ ﻧﺸﺎﻧﻲ ‪ GDT‬ﻗﺮار داده ﺷﻮد‪ ،‬ﻛﻪ ﺑﺎﻳﺪ در ﺑﺮﻧﺎﻣﻪي ﻛﺎرﺑﺮ ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﺪ‪GDT .‬‬
‫ﻗﻄﻌﺎت ﻣﺠﺰاي ﺣﺎﻓﻈﻪ را ﺗﻮﺻﻴﻒ ﻣﻲﻛﻨﺪ‪ .‬ﻗﻄﻌﺎت در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖ ﺷﺪه ﻣﻲﺗﻮاﻧﻨﺪ از ﻫﺮ ﻧﺸﺎﻧﻲ ﺷﺮوع ﺷﻮﻧﺪ و ﻧﻴﺎزي ﺑﻪ ﻣﻀﺮﺑﻲ از ‪ 16‬ﺑﻮدن ﻧﺪارﻧﺪ و ﻣﻲﺗﻮاﻧﻨﺪ از ﻳﻚ‬
‫ﺑﺎﻳﺖ ﺗﺎ ‪ 64KB‬ﺑﺎﺷﻨﺪ‪ .‬ﻳﻚ ﻧﻜﺘﻪي دﻳﮕﺮ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺮاي ﻫﺮ ﻗﻄﻌﻪ ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻧﻤﻮد ﻛﻪ ﻛﺪ)‪ (CS‬اﺳﺖ ﻳﺎ داده )‪ .(DS‬ﻓﻘﻂ ‪CS‬ﻫﺎ ﻗﺎﺑﻞ اﺟﺮا ﻫﺴﺘﻨﺪ و ﺧﻮد‬
‫ﭘﺮدازﻧﺪه ‪DS‬ﻫﺎ را اﺟﺮا ﻧﻤﻲﻛﻨﺪ‪ .‬ﺑﺮاي ‪ CS‬ﻣﻲﺗﻮان اﻟﻮﻳﺖ ﺗﻌﻴﻴﻦ ﻧﻤﻮد‪ ،‬و اﻳﻨﻜﻪ اﺻﻼً اﺟﺎزهي دﺳﺘﺮﺳﻲ داده ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ؟‬

‫ﻫﺮ ﺗﻮﺻﻴﻒﮔﺮ ﻗﻄﻌﻪ ﺷﺎﻣﻞ ‪ 8‬ﺑﺎﻳﺖ اﺳﺖ‪ .‬در ﻃﻲ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ ،87H‬ﻓﺮض ﻣﻲﺷﻮد ﻛﻪ ﺷﺶ ﺗﻮﺻﻴﻒﮔﺮ ﻗﻄﻌﻪ در ‪ GDT‬آﻣﺎده ﺷﺪهاﻧﺪ‪ .‬در ﺷﻜﻞ )‪(2-12‬‬
‫اﻳﻦ ﻣﺴﺄﻟﻪ ﺗﻮﺿﻴﺢ داده ﺷﺪه اﺳﺖ‪.‬‬
‫_________________________________________________________________________________‬
‫‪High Memory Area ١‬‬
‫‪Global Descriptor Table ٢‬‬
‫‪5-12‬‬ ‫ﻓﺼﻞ ‪ :12‬ﮔﺴﺘﺮش ﺣﺎﻓﻈﻪ‬

‫ﺷﻜﻞ ‪ :2-12‬ﺳﺎﺧﺘﺎر ﺗﻮﺻﻴﻒﮔﺮ ﻗﻄﻌﻪ از ﻧﻈﺮ وﻗﻔﻪي ‪87H‬‬

‫‪Addr.‬‬ ‫‪Segment Descriptor‬‬ ‫‪GDT‬‬ ‫‪Addr.‬‬ ‫‪0000:0000 RAM‬‬


‫‪+0H‬‬ ‫‪Segment length‬‬ ‫‪DUMMY‬‬ ‫‪+00H‬‬

‫‪+2H‬‬ ‫‪Bits 0-15 of segment address‬‬ ‫‪GDT‬‬ ‫‪+08H‬‬

‫‪+4H‬‬ ‫‪Bits 16-23 of segment address‬‬ ‫‪START‬‬ ‫‪+10H‬‬

‫‪+5H‬‬ ‫‪Access code‬‬ ‫‪DEST.‬‬ ‫‪+18H‬‬

‫‪+6H‬‬ ‫)‪Reserved (always 0‬‬ ‫‪BIOS CS‬‬ ‫‪+20H‬‬

‫‪STACK‬‬ ‫‪+28H‬‬

‫ﺗﺎﺑﻊ ‪ 87H‬ﻧﻴﺎز دارد ﻛﻪ ﻓﻘﻂ ﻓﻴﻠﺪﻫﺎي ‪ Start‬و ‪ Destination‬را ﻣﻘﺪاردﻫﻲ ﻛﻨﻴﻢ و ﺳﺎﻳﺮ ﻓﻴﻠﺪﻫﺎ را ﺧﻮد ﺗﺎﺑﻊ ﻣﻘﺪاردﻫﻲ ﻣﻲﻛﻨﺪ و اﻃﻼﻋﺎﺗﻲ را در آن ﻗﺮار‬
‫ﻣﻲدﻫﺪ ﻛﻪ ﺑﺮاي ﺑﺮﮔﺸﺖ ﺑﻪ ﺣﺎﻟﺖ واﻗﻌﻲ و ﺑﺮﻧﺎﻣﻪي ﻓﺮاﺧﻮاﻧﻨﺪه ﻣﻮرد ﻧﻴﺎز ﻫﺴﺘﻨﺪ‪ ،Start .‬ﻗﻄﻌﻪاي را ﺗﻮﺻﻴﻒ ﻣﻲﻛﻨﺪ ﻛﻪ دادهﻫﺎ در آن ﻗﺮار دارﻧﺪ و ﺑﺎﻳﺪ ﻣﻨﺘﻘﻞ ﺷﻮﻧﺪ و‬
‫‪ Destination‬ﻗﻄﻌﻪاي را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ ﻛﻪ دادهﻫﺎ ﺑﺎﻳﺪ در آن ﻛﭙﻲ ﺷﻮﻧﺪ‪ .‬ﻃﻮل ﻫﺮ دو ﻗﻄﻌﻪ ﻣﻲﺗﻮاﻧﺪ ‪ 0FFFFH‬ﻳﺎ ‪ 64KB‬ﺑﺎﺷﺪ و ﺣﺘﻲ ﻣﻲﺗﻮاﻧﺪ ﺗﻌﺪادي ﻛﻠﻤﻪ‬
‫)دوﺑﺎﻳﺘﻲ( ﻧﻴﺰ ﺑﺎﺷﺪ‪ .‬اﮔﺮ ﺗﻨﻬﺎ ﻳﻚ ﺑﺎﻳﺖ ﺑﺎﻳﺪ ﻛﭙﻲ ﺷﻮد‪ ،‬ﻻزم اﺳﺖ ﻛﻪ در دو ﺿﺮب ﺷﻮد و اﮔﺮ ﺗﻌﺪاد ﻛﻠﻤﺎت ﻛﻤﺘﺮ از دو ﻳﺎ ﺑﻴﺸﺘﺮ از ‪ 0FFFFH‬ﺑﺎﺷﺪ‪ ،‬ﺧﻄﺎ ﻣﻲﮔﻴﺮد‪.‬‬

‫ﻧﺸﺎﻧﻲﻫﺎي ﻓﻴﺰﻳﻜﻲ ﺣﺎﻓﻈﻪ در ‪ 20 ،8088‬ﺑﻴﺘﻲ ﻫﺴﺘﻨﺪ‪ ،‬اﻣﺎ در ‪ 24 ،80286‬ﺑﻴﺘﻲ ﻫﺴﺘﻨﺪ و ﺑﻪ اﻳﻦ دﻟﻴﻞ اﺳﺖ ﻛﻪ اوﻟﻲ ﺗﻨﻬﺎ ‪ 220 = 1MB‬و دوﻣﻲ ‪224‬‬
‫‪ = 16MB‬را ﻧﺸﺎﻧﻲدﻫﻲ ﻛﻨﺪ‪ .‬در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه‪ ،‬ﻧﺸﺎﻧﻲﻫﺎي ﺣﺎﻟﺖ واﻗﻌﻲ )ﻣﺒﺪأ‪ ،‬ﻗﻄﻌﻪ( ﺑﺎﻳﺪ ﺑﻪ ﻧﺸﺎﻧﻴﻬﺎي ﻓﻴﺰﻳﻜﻲ ‪24‬ﺑﻴﺘﻲ ﺗﺒﺪﻳﻞ ﺷﻮﻧﺪ‪ 16 .‬ﺑﻴﺖ ﻣﺒﺪأ وارد ﻓﻴﻠﺪ دوم‬
‫)‪ (+2H‬ﺷﺪه و ‪ 4‬ﺑﻴﺖ ﻗﻄﻌﻪ وارد ﻓﻴﻠﺪ ﺳﻮم )‪ (+4H‬ﻣﻲﺷﻮﻧﺪ و ﻧﺸﺎﻧﻲ ‪24‬ﺑﻴﺘﻲ ﺑﺪﺳﺖ ﻣﻲآﻳﺪ‪.‬‬

‫ﻓﻴﻠﺪ ﭼﻬﺎرم ﻛﺪ دﺳﺘﺮﺳﻲ ﻗﻄﻌﻪ اﺳﺖ و ﻫﻤﻴﺸﻪ ﻣﻘﺪار ‪ 92H‬در آن ﻗﺮار داده ﻣﻲﺷﻮد ﻛﻪ ﺑﻴﺎﻧﮕﺮ )‪ (1‬دادهاي ﺑﻮدن ﻗﻄﻌﻪ‪ (2) ،‬اﻟﻮﻳﺖ ﺑﺎﻻ‪ (3) ،1‬در ﺣﺎﻓﻈﻪ ﻗﺮار‬
‫داﺷﺘﻦ و )‪ (4‬ﻗﺎﺑﻞ ﻧﻮﺷﺘﻦ ﺑﻮدن آن اﺳﺖ‪.‬‬

‫ﻓﻴﻠﺪ ﭘﻨﺠﻢ ﺑﺮاي ﺳﺎزﮔﺎري ﺑﺎ ‪ 80386‬اﺳﺖ و ﻣﻘﺪار ‪ 0‬در آن ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬

‫ﭘﺲ از اﺟﺮاي ﺗﺎﺑﻊ‪ ،‬ﻛﺪ ﺧﻄﺎ در ‪ AH‬ﺑﺮﮔﺮداﻧﺪه ﻣﻲﺷﻮد‪:‬‬

‫‪00H:‬‬ ‫‪No error‬‬


‫‪01H:‬‬ ‫‪RAM parity error‬‬
‫‪02H:‬‬ ‫‪GDT defective at function call‬‬
‫‪03H:‬‬ ‫‪Protected mode could not be properly initialized‬‬
‫‪...‬‬

‫ﻣﻌﺎﻳﺐ دﺳﺘﺮﺳﻲ ﺑﻪ ‪ XM‬از ﻃﺮﻳﻖ ‪ :BIOS‬در ﺣﺎﻟﺘﻲ ﻛﻪ ﭘﺮدازﻧﺪه در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه اﺳﺖ‪ ،‬ﻫﻤﻪي وﻗﻔﻪﻫﺎ ﺑﺎﻳﺪ ﻧﺎﺗﻮان‪ 2‬ﻳﺎ ﻣﻨﻊ ﺷﻮﻧﺪ‪ .‬اﻣﺎ‪،‬‬
‫ﻣﻤﻜﻦ اﺳﺖ در ﺷﺮاﻳﻄﻲ ﻛﻪ در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه ﻫﺴﺘﻴﻢ‪ ،‬ﺗﺎﻳﻤﺮ ﻳﺎ ﺻﻔﺤﻪ ﻛﻠﻴﺪ وﻗﻔﻪ ﺑﺪﻫﻨﺪ‪ ،‬و از اﻳﻨﺮو درﺳﺖ ﻣﺪﻳﺮﻳﺖ ﻧﺨﻮاﻫﻨﺪ ﺷﺪ‪ ،‬زﻳﺮا رواﻟﻬﺎي ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪﻫﺎ ﺑﺮاي‬
‫ﺣﺎﻟﺖ واﻗﻌﻲ ﻫﺴﺘﻨﺪ‪ .‬ﺑﻪ ﺧﺼﻮص در ﻣﻮرد ﺗﺎﻳﻤﺮ‪ ،‬اﻳﻦ ﻣﺸﻜﻞ آﺷﻜﺎرا ﻣﻼﺣﻈﻪ ﻣﻲﺷﻮد و اﮔﺮ ﺑﺮﻧﺎﻣﻪاي ﻣﺮﺗﺒﺎً از ﻃﺮﻳﻖ ﺗﺎﺑﻊ ‪ 87H‬ﺑﻪ ‪ XM‬دﺳﺘﻴﺎﺑﻲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﺳﺮﻋﺖ‬
‫ﺳﺎﻋﺖ ﺳﻴﺴﺘﻢ ﻛﻢ ﻣﻲﺷﻮد‪ .‬ﭼﻮن‪ ،‬ﺷﻤﺎرﺷﮕﺮ ﺳﺎﻋﺖ ﺑﻮﺳﻴﻠﻪي روال ﺳﺮوﻳﺲ وﻗﻔﻪي ‪ ،08H‬ﺑﻬﻨﮕﺎم ﻧﻤﻲﺷﻮد‪.‬‬

‫ﻣﺸﻜﻞ دﻳﮕﺮ‪ ،‬ﺗﺪاﺧﻞ‪ 3‬در ‪ XM‬اﺳﺖ‪ .‬زﻳﺮا در ﺗﺌﻮري ‪ XM‬ﻣﻲﺗﻮاﻧﺪ ﺑﻴﻦ ﺗﻤﺎﻣﻲ ﺑﺮﻧﺎﻣﻪﻫﺎ ﻣﺸﺘﺮك ﺑﺎﺷﺪ‪ .‬اﻣﺎ ﺑﺮﺧﻲ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ ،cache‬ﻧﻈﻴﺮ‬
‫‪ ،SmartDrv‬ﻳﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﻤﻜﻲ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻨﺪ از ‪ XM‬اﺳﺘﻔﺎده ﻛﻨﻨﺪ‪ .‬اﻳﻦ ﻣﺴﺄﻟﻪ ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﺑﺮﻧﺎﻣﻪاي اﺻﻠﻲ و ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﻛﻪ ﺑﻪﺻﻮرت ﻣﻘﻴﻢ در‬
‫ﺣﺎﻓﻈﻪ ﻋﻤﻞ ﻣﻲﻛﻨﻨﺪ‪ ،‬ﺣﺎﻓﻈﻪي ﻫﻤﺪﻳﮕﺮ را ﺑﺎزﻧﻮﻳﺴﻲ ﻧﻤﻮده و در ﻛﺎر ﻳﻜﺪﻳﮕﺮ ﺗﺪاﺧﻞ ﻧﻤﺎﻳﻨﺪ‪ .‬اﻳﻦ ﻣﺸﻜﻞ ﻧﺘﻴﺠﻪي ﻧﺒﻮد ﻛﻨﺘﺮل ﻳﺎ ﻣﺪﻳﺮﻳﺖ اﺳﺖ‪ ،‬و از اﻳﻨﺮو ﻧﻴﺎزﻣﻨﺪ ﻳﻚ‬
‫ﺑﺮﻧﺎﻣﻪي ﻣﺪﻳﺮﻳﺖ ‪ XM‬در ﺳﻴﺴﺘﻢ ﻫﺴﺘﻴﻢ‪ .‬اﻳﻦ در ﺣﺎﻟﻲ اﺳﺖ ﻛﻪ ‪ 88H‬ﺑﻪ ﻫﻤﻪي ﺑﺮﻧﺎﻣﻪﻫﺎ‪ ،‬ﻛﻞ ‪ XM‬را ﺑﻪﻋﻨﻮان ﺣﺎﻓﻈﻪي آزاد ﺑﺮﻣﻲﮔﺮداﻧﺪ و ﻣﻴﺰان اﺷﻐﺎل ﺷﺪه ﺗﻮﺳﻂ‬
‫ﺳﺎﻳﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ را در ﻧﻈﺮ ﻧﻤﻲﮔﻴﺮد‪ .‬راهﺣﻞ اﻳﻦ ﻣﺸﻜﻞ‪ ،‬اﺳﺘﻔﺎده از ﮔﺮداﻧﻨﺪهﻫﺎي ‪ ،XM‬ﻧﻈﻴﺮ ‪ XMS‬اﺳﺖ‪ ،‬ﻛﻪ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪high priority ١‬‬
‫‪disable ٢‬‬
‫‪conflict ٣‬‬
‫‪6-12‬‬ ‫ﻓﺼﻞ ‪ :12‬ﮔﺴﺘﺮش ﺣﺎﻓﻈﻪ‬

‫‪ 5-12‬ﻧﺎﺣﻴﻪي ﺑﺎﻻي ﺣﺎﻓﻈﻪ )‪(HMA‬‬


‫‪ ،HMA‬ﻳﻚ ﻗﻄﻌﻪ از ‪ XM‬اﺳﺖ ﻛﻪ ﺑﺪون اﻧﺘﻘﺎل ﺑﻪ ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه و در ﺣﺎﻟﺖ واﻗﻌﻲ و ﺗﺤﺖ ‪ DOS‬ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ‪ .‬اﻳﻦ ﻛﺸﻒ ﻣﻬﻤﻲ ﺑﻮد ﻛﻪ‬
‫ﻫﻤﺰﻣﺎن ﺑﺎ اراﺋﻪي ‪ DOS 5.0‬ﻗﺎﺑﻞ ﺣﺼﻮل ﺷﺪ‪ .‬وﺟﻮد ‪،HMA‬از ﻧﺤﻮهي ﺗﺸﻜﻴﻞ ﻧﺸﺎﻧﻲ ﻓﻴﺰﻳﻜﻲ از ﻧﺸﺎﻧﻲﻫﺎي ﻣﺒﺪأ و ﻗﻄﻌﻪ در ﺣﺎﻟﺖ واﻗﻌﻲ ﻧﺸﺄت ﻣﻲﮔﻴﺮد‪:‬‬

‫‪Physical Address (20 bits) = Segment Address * 16 + Offset Address‬‬


‫‪example: 0040H:0020H ⇒ 0040H * 10H + 0020H = 00420H‬‬
‫‪and‬‬ ‫‪0000H:0420H ⇒ 0000H * 10H + 0420H = 00420H‬‬

‫ﭘﺲ روش ﺗﺒﺪﻳﻞ ﻧﺸﺎﻧﻲﻫﺎ ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﻧﺸﺎﻧﻲﻫﺎي ﻣﺘﻔﺎوت ﺑﺎ ﻫﻢ ﻫﻤﭙﻮﺷﺎﻧﻲ‪ 1‬داﺷﺘﻪ ﺑﺎﺷﻨﺪ‪ .‬ﻳﻌﻨﻲ ﺑﻴﺶ از ﻳﻚ ﻧﺸﺎﻧﻲ ﺑﺎ روش ‪ Seg:Ofs‬ﺑﻪ ﻳﻚ‬
‫ﻧﺸﺎﻧﻲ ﻓﻴﺰﻳﻜﻲ اﺷﺎره ﻣﻲﻛﻨﺪ‪.‬‬

‫ﻧﺸﺎﻧﻲ ﺷﺮوع آﺧﺮﻳﻦ ﻗﻄﻌﻪ در ﻓﻀﺎي ﻧﺸﺎﻧﻲﻫﺎي ‪ ،1MB‬ﻛﻪ ﻣﺮﺑﻮط ﺑﻪ ‪ ROM-BIOS‬اﺳﺖ‪ ،‬ﻋﺒﺎرت اﺳﺖ‪:‬‬

‫‪F0000H * 10H + 0000H = F0000H‬‬


‫و ﻧﺸﺎﻧﻲ ﺧﺎﺗﻤﻪ آن‪:‬‬
‫‪F0000H * 10H + FFFFH = FFFFFH‬‬
‫ﻛﻪ اﻳﻦ ﻣﻌﺎدل اﺳﺖ ﺑﺎ‪:‬‬
‫‪FFFFH * 10H + 000FH = FFFFFH‬‬
‫ﺣﺎل اﮔﺮ در اﻳﻦ ﻓﺮﻣﻮل ﺑﻪ ﺟﺎي ‪ ،0000FH‬ﻣﻘﺪاري ﺑﺰرﮔﺘﺮ از آن ﻗﺮار دﻫﻴﻢ‪ ،‬ﺑﻪ ﺷﺮط ﻋﺪم ﺳﺮرﻳﺰي ﻧﺸﺎﻧﻲ‪ ،2‬ﻳﻚ ﻧﺸﺎﻧﻲ ﻓﻴﺰﻳﻜﻲ ﺑﺪﺳﺖ ﺧﻮاﻫﺪ آﻣﺪ ﻛﻪ ﺑﻪ‬
‫ﻓﻀﺎي ﺑﺎﻻي ‪ 1MB‬اﺷﺎره ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل‪:‬‬
‫‪FFFFH * 10H + 0010H = 100000H‬‬
‫ﻳﻚ ﻧﺸﺎﻧﻲ ‪21‬ﺑﻴﺘﻲ اﺳﺖ ﻛﻪ ﺑﻪ اوﻟﻴﻦ ﺑﺎﻳﺖ ﺧﺎرج از ﻓﻀﺎي ‪ 1MB‬را ﻧﺸﺎن ﻣﻲدﻫﺪ‪ ،‬و اﻳﻦ ﻫﻤﺎن ﻧﺸﺎﻧﻲ ﺷﺮوع ‪ HMA‬اﺳﺖ ﻛﻪ ﺗﺎ ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ‪FFFFH‬‬
‫اداﻣﻪ ﻣﻲﻳﺎﺑﺪ‪ ،‬ﻛﻪ ﻧﺸﺎﻧﻲ ﻓﻴﺰﻳﻜﻲ آن ﻋﺒﺎرت اﺳﺖ از‪:‬‬
‫‪FFFFH * 10H + FFFFH = 1FFFEFH‬‬
‫ﺷﻜﻞ ‪ :3-12‬ﻧﺤﻮهي ﺷﻜﻞﮔﻴﺮي ‪HMA‬‬

‫‪Extended‬‬
‫‪FFFF:FFFF‬‬ ‫‪Memory‬‬
‫‪HMA‬‬ ‫‪FFFF:0010‬‬
‫‪FFFF:000F‬‬
‫‪or‬‬ ‫‪ROM-BIOS‬‬
‫‪F000:FFFF‬‬
‫‪Addressable‬‬
‫‪in real-mode‬‬
‫‪Conventional‬‬ ‫‪and under‬‬
‫‪Memory‬‬ ‫‪DOS‬‬

‫ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ ‪ FFFFH‬و ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ‪ 0010H‬ﻳﺎ ﺑﻴﺸﺘﺮ ﺑﺎﺷﺪ‪ ،‬ﻳﻚ ﻧﺸﺎﻧﻲ ﻓﻴﺰﻳﻜﻲ ‪21‬ﺑﻴﺘﻲ ﺑﺪﺳﺖ ﻣﻲآﻳﺪ و دﺳﺘﺮﺳﻲ ﺑﻪ ‪ XM‬ﻣﻤﻜﻦ‬
‫ﻣﻲﺷﻮد‪ .‬ﻣﺸﺮوط ﺑﻪ اﻳﻨﻜﻪ ﻧﺸﺎﻧﻲ ‪21‬ﺑﻴﺘﻲ ﻗﺎﺑﻞ ﺗﻮﻟﻴﺪ ﺑﺎﺷﺪ‪ .‬در ‪ PC/XT‬و داراي ﭘﺮدازﻧﺪهﻫﺎي ‪ 8086‬ﻳﺎ ‪ 8088‬اﻳﻦ اﻣﺮ ﻣﻴﺴﺮ ﻧﻴﺴﺖ‪ ،‬ﭼﻮن ﻧﺸﺎﻧﻴﻬﺎي ﻓﻴﺰﻳﻜﻲ ‪20‬ﺑﻴﺘﻲ‬
‫ﻫﺴﺘﻨﺪ‪ .‬اﻣﺎ‪ ،‬در ‪ AT‬ﺑﺎ ﭘﺮدازﻧﺪهي ‪ ،80286‬ﻧﺸﺎﻧﻴﻬﺎي ﻓﻴﺰﻳﻜﻲ ‪ 24‬ﺑﻴﺘﻲ ﻫﺴﺘﻨﺪ‪ .‬در ‪ 8086‬ﻳﺎ ‪ 8088‬و ﻧﻴﺰ در ﺣﺎﻟﺖ واﻗﻌﻲ ‪ ،80286‬اﮔﺮ ﻣﻘﺎدﻳﺮ ﻣﺒﺪأ و ﻗﻄﻌﻪ ﺑﻪﮔﻮﻧﻪاي ﺑﺎﺷﺪ‬
‫ﻛﻪ ﻧﺸﺎﻧﻲ ﻓﻴﺰﻳﻜﻲ ﺣﺎﺻﻠﻪ ﺑﻴﺶ از ‪ 20‬ﺑﻴﺖ ﺑﺎﺷﺪ‪ ،‬اﺻﻄﻼﺣﺎً ﻳﻚ ﺳﺮرﻳﺰي ﻧﺸﺎﻧﻲ اﺗﻔﺎق ﻣﻲاﻓﺘﺪ و ﺑﻴﺖ ‪21‬ام درﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻧﺸﺪه و ﻣﺜﻼً ‪ ،FFFFH:0010H‬ﻣﻌﺎدل‬
‫‪ 0000H:0000H‬درﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه و ﺑﻪ اﺑﺘﺪاي ‪ RAM‬اﺷﺎره ﺧﻮاﻫﺪ ﻧﻤﻮد‪.‬‬

‫_________________________________________________________________________________‬
‫‪overlap ١‬‬
‫‪address overflow ٢‬‬
‫‪7-12‬‬ ‫ﻓﺼﻞ ‪ :12‬ﮔﺴﺘﺮش ﺣﺎﻓﻈﻪ‬

‫در ‪ 8088/8086‬ﺧﻄﻮط ﻧﺸﺎﻧﻲ داراي اﺳﺎﻣﻲ ‪ A0-A19‬و در ‪ ،80286‬داراي اﺳﺎﻣﻲ ‪ A0-A23‬ﻫﺴﺘﻨﺪ‪ .‬ﺑﺮاي ﺟﻠﻮﮔﻴﺮي از ﺳﺮرﻳﺰي ﻧﺸﺎﻧﻲ‪ ،‬ﺑﺎﻳﺪ ﺧﻂ‬
‫‪21‬ام ﻧﺸﺎﻧﻲ ﻳﺎ ‪ A20‬ﻓﻌﺎل ﺷﻮد‪ .‬اﻳﻦ ﺧﻂ در اﺑﺘﺪاي روﺷﻦ ﺷﺪن ﺳﻴﺴﺘﻢ‪ ،‬ﻏﻴﺮﻓﻌﺎل اﺳﺖ‪ ،‬و ﺑﺎ ﻓﻌﺎل ﺷﺪن آن‪ ،‬ﻣﺸﻜﻞ ﻓﻮق ﭘﻴﺶ ﻧﻤﻲآﻳﺪ‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ‬
‫‪ ،HMA‬ﻣﺮاﺣﻞ زﻳﺮ ﺑﺎﻳﺪ ﻃﻲ ﺷﻮد‪:‬‬

‫ﻣﺮاﺣﻞ دﺳﺘﺮﺳﻲ ﺑﻪ ‪:HMA‬‬

‫ﺑﺮرﺳﻲ ﺷﻮد ﻛﻪ اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﺑﻪ ‪ HMA‬وﺟﻮد دارد ﻳﺎ ﻧﻪ؟ اﮔﺮ ﭘﺮدازﻧﺪه‪ 80286 ،‬ﺑﻪ ﺑﺎﻻ ﺑﺎﺷﺪ‪ ،‬اﻣﻜﺎنﭘﺬﻳﺮ اﺳﺖ‪ .‬ﭼﻮن ﺧﻂ ﻧﺸﺎﻧﻲ ‪ A20‬وﺟﻮد‬ ‫•‬
‫دارد‪.‬‬

‫ﺗﺎﺑﻊ ‪ 88H‬وﻗﻔﻪي ‪ 15H‬ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد ﺗﺎ ﻣﻘﺪار ‪ XM‬ﻣﺸﺨﺺ ﺷﻮد‪ .‬اﮔﺮ ﺑﻴﺶ از ‪ 64K‬ﺑﺎﺷﺪ‪ ،‬آﻧﮕﺎه اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﺑﻪ ‪ HMA‬وﺟﻮد دارد‪.‬‬ ‫•‬

‫ﺑﻴﺖ ‪ 1‬درﮔﺎه ﺧﺮوﺟﻲ ﻛﻨﺘﺮﻟﺮ ﺻﻔﺤﻪﻛﻠﻴﺪ ﺑﺎﻳﺪ ‪ 1‬ﺷﻮد‪ ،‬ﺗﺎ ﺧﻂ ‪ A20‬ﻧﺸﺎﻧﻲ ﻓﻌﺎل ﺷﻮد)!(‪ .‬در ‪ DOS 5.0‬ﺑﻪ ﺑﺎﻻ‪ ،‬دﺳﺘﻮر ‪DOS=HIGH,‬‬ ‫•‬
‫‪ UMB‬در ‪ CONFIG.SYS‬ﻫﻤﻴﻦ ﻛﺎر را ﻣﻲﻛﻨﺪ‪.‬‬

‫ﺑﺎﻳﺪ در ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﺮرﺳﻲ ﺷﻮد ﻛﻪ ‪ A20‬ﻓﻌﺎل اﺳﺖ ﻳﺎ ﻧﻪ؟ اﮔﺮ ﻓﻌﺎل اﺳﺖ‪ ،‬ﻳﻌﻨﻲ ‪ HMA‬وﺟﻮد دارد و از آن اﺳﺘﻔﺎده ﺷﻮد‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻣﻲﺗﻮان‬ ‫•‬
‫ﻣﻘﺪار ﺧﺎﻧﻪﻫﺎي ﺣﺎﻓﻈﻪ از ‪ FFFF:0000H‬را ﺑﺎ ‪ 0000:0000H‬ﻣﻘﺎﻳﺴﻪ ﻛﺮد‪ .‬ﻣﺜﻼً ‪ 256‬ﺑﺎﻳﺖ را ﻣﻘﺎﻳﺴﻪ ﻣﻲﻛﻨﻴﻢ‪ .‬اﮔﺮ ﻳﻜﺴﺎن ﺑﻮدﻧﺪ‪ ،‬ﺑﻪ ﻣﻌﻨﻲ‬
‫ﻋﺪم دﺳﺘﺮﺳﻲ ﺑﻪ ‪ HMA‬اﺳﺖ‪ .‬اﻟﺒﺘﻪ اﻳﻦ ﻳﻚ ﺣﻘﻪ‪ 1‬اﺳﺖ و ﺑﺎ اﺣﺘﻤﺎل ﺧﻴﻠﻲ ﻛﻤﻲ ﻣﻤﻜﻦ اﺳﺖ درﺳﺖ ﻛﺎر ﻧﻜﻨﺪ‪.‬‬

‫اﻧﺪازهي ‪ ،HMA‬اﻧﺪﻛﻲ ﻛﻤﺘﺮ از ‪ 64K‬اﺳﺖ)‪ (65520 bytes‬اﺳﺖ‪ ،‬وﻟﻲ اﻳﻦ ﻣﻴﺰان ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﻮﭼﻚ ‪ TSR‬ﻛﺎﻓﻲ اﺳﺖ‪.‬‬

‫‪ 6-12‬اﺳﺘﺎﻧﺪارد ‪ XMS‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‬


‫اﻳﻦ واﺳﻂ اﻣﻜﺎن دﺳﺘﺮﺳﻲ اﺷﺘﺮاﻛﻲ ﭼﻨﺪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ‪ XM‬را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ اﺳﺘﺎﻧﺪارد اﻧﻮاع دﺳﺘﺮﺳﻲ زﻳﺮ را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪:‬‬

‫دﺳﺘﺮﺳﻲ ﺑﻪ ‪(1024K-1088K) HMA‬‬ ‫•‬


‫ﭼﻬﺎر ‪ (Extended Memory Block) EMB‬ﻛﻪ ﭘﺲ از ‪ 1088K‬ﺷﺮوع ﻣﻲﺷﻮﻧﺪ‪.‬‬ ‫•‬
‫‪ ،(Upper Memory Block) UMB‬ﻣﺸﺎﺑﻪ ‪ EMS‬در ﻓﻀﺎي ﺑﻴﻦ ‪ 640K‬ﺗﺎ ‪ 1024K‬اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﺑﻪ ‪ XM‬ﻓﺮاﻫﻢ ﻣﻲﺷﻮد‪.‬‬ ‫•‬

‫‪ ،HIMEM.SYS‬ﻛﻪ ﺟﺰو ﮔﺮداﻧﻨﺪهﻫﺎي ‪ DOS‬اﺳﺖ‪ ،‬ﻣﻌﺮوﻓﺘﺮﻳﻦ ﮔﺮداﻧﻨﺪهي ‪ XMS‬اﺳﺖ و در ‪ CONFIG.SYS‬ﻧﺼﺐ ﻣﻲﺷﻮد‪ .‬ﺑﻪ ﻫﻤﺮاه‬
‫ﮔﺮداﻧﻨﺪه ‪ ،XMS‬ﺑﺮﻧﺎﻣﻪي ‪ EMM386.EXE‬ﻧﻴﺰ ﻧﺼﺐ ﻣﻲﺷﻮد ﻛﻪ اﺳﺘﺎﻧﺪارد ‪ LIM‬را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻮده و ‪ XM‬را در ﻗﺎﻟﺐ ‪ UMB‬ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻣﻲﻛﻨﺪ‪.‬‬

‫ﻗﺒﻞ از دﺳﺘﺮﺳﻲ ﺑﻪ ‪ XM‬از ﻃﺮﻳﻖ ‪ XMS‬ﺑﺎﻳﺪ ﺑﺮرﺳﻲ ﺷﻮد ﻛﻪ ﮔﺮداﻧﻨﺪهي ‪ XMS‬ﻧﺼﺐ اﺳﺖ ﻳﺎ ﻧﻪ؟ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر وﻗﻔﻪي ‪ 2FH‬ﺑﺎﻳﺪ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد‪:‬‬

‫‪AX = 4300H‬‬
‫‪INT 2FH‬‬
‫آﻧﮕﺎه اﮔﺮ ‪ AL = 80H‬ﺑﺎﺷﺪ‪ ،‬ﮔﺮداﻧﻨﺪه ﻧﺼﺐ ﺷﺪه اﺳﺖ و ﮔﺮﻧﻪ‪ ،‬ﻧﺼﺐ ﻧﺸﺪه اﺳﺖ‪.‬‬

‫ﺗﻮاﺑﻊ ‪:XMS‬‬
‫‪Function‬‬ ‫‪Task‬‬
‫‪00H‬‬ ‫‪Determine XMS driver version‬‬
‫‪01H‬‬ ‫)‪Allocate High Memory Area (HMA‬‬
‫‪02H‬‬ ‫)‪Free High Memory Area (HMA‬‬
‫‪03H‬‬ ‫‪Globally enable address line A20‬‬
‫‪04H‬‬ ‫‪Globally disable address line A20‬‬
‫‪05H‬‬ ‫‪Locally enable address line A20‬‬
‫‪06H‬‬ ‫‪Locally disable address line A20‬‬
‫‪07H‬‬ ‫‪Query status of address line A20‬‬
‫‪08H‬‬ ‫‪Query free extended memory‬‬
‫‪09H‬‬ ‫)‪Allocate Extended Memory Block (EMB‬‬
‫‪0AH‬‬ ‫)‪Free allocated Extended Memory Block (EMB‬‬
‫‪0BH‬‬ ‫)‪Move Extended Memory Block (EMB‬‬
‫‪0CH‬‬ ‫)‪Lock Extended Memory Block (EMB‬‬
‫‪0DH‬‬ ‫)‪Unlock Extended Memory Block (EMB‬‬
‫‪0EH‬‬ ‫‪Get EMB handle information‬‬
‫‪0FH‬‬ ‫)‪Resize Extended Memory Block (EMB‬‬
‫‪10H‬‬ ‫)‪Allocate Upper Memory Block (UMB‬‬
‫‪11H‬‬ ‫)‪Free allocated Upper Memory Block (UMB‬‬

‫_________________________________________________________________________________‬
‫‪trick ١‬‬
‫‪8-12‬‬ ‫ﻓﺼﻞ ‪ :12‬ﮔﺴﺘﺮش ﺣﺎﻓﻈﻪ‬

‫ﺗﻮاﺑﻊ ﺑﻪ ﭼﻨﺪ دﺳﺘﻪ ﺗﻘﺴﻴﻢ ﻣﻲﺷﻮﻧﺪ‪:‬‬

‫‪ (1‬ﺗﻮاﺑﻊ اوﻟﻴﻪ‪ :‬ﺑﺮاي ﺑﺮرﺳﻲ وﺿﻌﻴﺖ ﮔﺮداﻧﻨﺪه‪ ،‬ﺧﻂ ‪ A20‬و ﻣﻴﺰان ﺣﺎﻓﻈﻪي آزاد)ﺷﺎﻣﻞ ﺗﻮاﺑﻊ ‪ 00H‬و ‪(03H-08H‬‬
‫‪ (2‬ﺗﻮاﺑﻊ ‪ :HMA‬ﺷﺎﻣﻞ ﺗﻮاﺑﻊ ‪ 01H‬ﺑﺮاي ﺗﺨﺼﻴﺺ ‪ HMA‬و ‪ 02H‬ﺑﺮاي آزادﺳﺎزي آن اﺳﺖ‪.‬‬
‫‪ (3‬ﺗﻮاﺑﻊ ‪ :EMB‬ﺷﺎﻣﻞ ﺗﻮاﺑﻊ ‪ 09H-0FH‬اﺳﺖ و ﺑﺮاي ﺗﺨﺼﻴﺺ و آزادﺳﺎزي و ﻣﺪﻳﺮﻳﺖ ‪ EMB‬ﻫﺴﺘﻨﺪ‪.‬‬
‫‪ (4‬ﺗﻮاﺑﻊ ‪ :UMB‬ﺷﺎﻣﻞ ﺗﺎﺑﻊ ‪ 10H‬ﺑﺮاي ﺗﺨﺼﻴﺺ ‪ UMB‬و ‪ 11H‬ﺑﺮاي آزادﺳﺎزي آن اﺳﺖ‪.‬‬

‫اﻳﻦ ﺗﻮاﺑﻊ ﺑﺎ ‪ Far Call‬و ﻧﻪ ﻓﺮاﺧﻮاﻧﻲ وﻗﻔﻪ‪ ،‬ﻗﺎﺑﻞ ﻓﺮاﺧﻮاﻧﻲ ﻫﺴﺘﻨﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﻧﺸﺎﻧﻲ ‪ XMS Driver‬در دﺳﺖ ﺑﺎﺷﺪ‪ .‬ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪AX‬‬
‫‪ = 4310H‬وﻗﻔﻪي ‪ ،2FH‬ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ در ﺛﺒﺎﺗﻬﺎي ‪ ES:BX‬ﺑﺮﮔﺮداﻧﺪه ﻣﻲﺷﻮد‪ .‬ﺗﻮاﺑﻊ ‪18‬ﮔﺎﻧﻪي ﻓﻮق آﻧﮕﺎه ﺑﺎ ﻗﺮار دادن ﺷﻤﺎرهي آﻧﻬﺎ ﻛﻪ در ﺟﺪول ﻓﻮق ذﻛﺮ ﺷﺪه‪،‬‬
‫در ﺛﺒﺎت ‪ AH‬ﻗﺎﺑﻞ ﻓﺮاﺧﻮاﻧﻲ ﻫﺴﺘﻨﺪ‪.‬‬
‫ﻓﺼﻞ ‪ :16‬ﺳﺎﺧﺘﺎر داﺧﻠﻲ داس‬
‫)‪(Internal Structure of DOS‬‬

‫‪ 1-16‬اﺟﺰاء داس‬
‫داس داراي ﺳﻪ ﻣﺆﻟﻔﻪي اﺻﻠﻲ اﺳﺖ‪:‬‬
‫• ‪ :DOS-BIOS‬در ﻳﻚ ﻓﺎﻳﻞ ﺳﻴﺴﺘﻢ ذﺧﻴﺮه ﺷﺪه و داراي ﻳﻜﻲ از اﺳﺎﻣﻲ ‪) IBMBIO.COM‬در ‪ (PC-DOS‬ﻳﺎ ‪) IO.SYS‬در ‪MS-‬‬
‫‪ (DOS‬اﺳﺖ‪ .‬ﻣﺸﺨﺼﻪي‪ 1‬اﻳﻦ ﻓﺎﻳﻞ ‪ Hidden‬و ‪ Sys‬اﺳﺖ و ﺑﺎ ﻓﺮﻣﺎن ‪ Dir‬در ﻓﻬﺮﺳﺖ ﻓﺎﻳﻠﻬﺎ ﻇﺎﻫﺮ ﻧﻤﻲﺷﻮد‪ .‬اﻳﻦ ﻓﺎﻳﻞ ﺷﺎﻣﻞ ﮔﺮداﻧﻨﺪهﻫﺎي‬
‫وﺳﻴﻠﻪ‪ 2‬زﻳﺮ اﺳﺖ‪:‬‬
‫‪CON:‬‬ ‫‪Keyboard and display‬‬
‫‪PRN:‬‬ ‫‪Printer‬‬
‫‪AUX:‬‬ ‫‪Serial interface‬‬
‫‪CLOCK:‬‬ ‫‪Clock‬‬
‫‪Disk drives and/or hard disks which have the drive specifiers A:, B:, and C:‬‬
‫اﮔﺮ داس ﺑﺨﻮاﻫﺪ ﺑﺎ ﻳﻜﻲ از ﻣﻮارد ﻓﻮق ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ‪ ،‬ﺑﻪ ﻳﻚ ﮔﺮداﻧﻨﺪهي وﺳﻴﻠﻪ دﺳﺘﺮﺳﻲ ﻣﻲﻳﺎﺑﺪ‪ ،‬ﻛﻪ در اﻳﻦ ﻣﺎﺟﻮل از داس ﻗﺮار دارد‪ .‬ﺧﻮد اﻳﻦ‬
‫ﻣﺎﺟﻮل ﻫﻢ از رواﻟﻬﺎي ‪ ROM-BIOS‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ و ﺑﺨﺸﻲ از ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ اﺳﺖ ﻛﻪ ﺑﻴﺶ از ﻫﻤﻪ واﺑﺴﺘﻪ ﺑﻪ ﺳﺨﺖاﻓﺰار ‪ PC‬اﺳﺖ‪.‬‬
‫• ﻫﺴﺘﻪي داس‪:3‬ﻫﺴﺘﻪي داس در ﻓﺎﻳﻞ ‪ IBMDOS.COM‬ﻳﺎ ‪ MSDOS.SYS‬ﻗﺮار دارد و ﻋﻤﻮﻣﺎً داراي ﻣﺸﺨﺼﻪي ‪ Hidden‬و ‪Sys‬‬
‫اﺳﺖ‪ .‬اﻳﻦ ﻣﺎﺟﻮل‪ ،‬ﺷﺎﻣﻞ رواﻟﻬﺎي دﺳﺘﺮﺳﻲ ﺑﻪ ﻓﺎﻳﻞ )ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻞ(‪ ،‬ورودي‪-‬ﺧﺮوﺟﻲ ﻛﺎراﻛﺘﺮ‪ ،‬و ﻣﻮارد دﻳﮕﺮ ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﻣﺎﺟﻮل ﺷﺎﻣﻞ ﺗﻮاﺑﻊ ‪API‬‬
‫داس اﺳﺖ ﻛﻪ ﺑﺎ وﻗﻔﻪي ‪ 21H‬ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮﻧﺪ‪ .‬اﻳﻦ ﺗﻮاﺑﻊ ﻣﺴﺘﻘﻞ از ﺳﺨﺖاﻓﺰار ﺑﻮده و از ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪي ﻣﻮﺟﻮد در ‪ DOS-BIOS‬ﺑﺮاي‬
‫دﺳﺘﺮﺳﻲ ﺑﻪ ﺻﻔﺤﻪﻛﻠﻴﺪ‪ ،‬ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‪ ،‬و دﻳﺴﻚ اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪ .‬وﻗﻔﻪي ‪ 21H‬در ﻫﻨﮕﺎم ﺑﻮت ﺷﺪن داس‪ ،‬ﺗﻌﻮﻳﺾ ﺷﺪه و ﺗﻮاﺑﻊ آن ﻗﺎﺑﻞ‬
‫ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮﻧﺪ‪ .‬روش ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ ﺗﻮاﺑﻊ ﻣﺸﺎﺑﻪ ﺗﻮاﺑﻊ ‪ BIOS‬ﺑﻮده و ﺑﺎ وﻗﻔﻪي ﻧﺮماﻓﺰاري ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮﻧﺪ و اﻧﺘﻘﺎل ﭘﺎراﻣﺘﺮﻫﺎ ﺑﺎ اﺳﺘﻔﺎده از‬
‫ﺛﺒﺎﺗﻬﺎ ﺻﻮرت ﻣﻲﮔﻴﺮد‪.‬‬
‫• ﭘﺮدازﺷﮕﺮ ﻓﺮﻣﺎن‪ :4‬ﺑﺮﺧﻼف دو ﻣﺎﺟﻮل ﻗﺒﻠﻲ‪ ،‬اﻳﻦ ﺑﺨﺶ در ﻓﺎﻳﻞ ‪ COMMAND.COM‬وﺟﻮد دارد ﻛﻪ ‪ Hidden‬و ‪ Sys‬ﻧﺒﻮده و ﻋﻼﻣﺖ‬
‫داس‪ ،5‬ﻳﻌﻨﻲ >‪ A‬ﻳﺎ >‪ C‬را ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻧﺸﺎن داده و ﻓﺮاﻣﻴﻦ ﻛﺎرﺑﺮ را درﻳﺎﻓﺖ ﻧﻤﻮده و اﺟﺮا ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮﺧﻲ ﮔﻤﺎن ﻣﻲﻛﻨﻨﺪ ﻛﻪ‬
‫‪ ،COMMAND.COM‬ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ اﺳﺖ‪ ،‬در ﺣﺎﻟﻴﻜﻪ اﻳﻨﮕﻮﻧﻪ ﻧﻴﺴﺖ و اﻳﻦ ﻓﺎﻳﻞ ﻓﻘﻂ ﻳﻚ ﺑﺮﻧﺎﻣﻪي اﺟﺮاﻳﻲ ﺑﻮده و ﺗﺤﺖ ﻛﻨﺘﺮل داس اﺟﺮا‬
‫ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺷﺎﻣﻞ ﺳﻪ ﻗﺴﻤﺖ زﻳﺮ اﺳﺖ‪:‬‬
‫اﻟﻒ( ﺑﺨﺶ ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪ‪ :6‬ﻫﻨﮕﺎم ﺑﻮت ﺷﺪن داس ﺑﻪ ﻣﺘﻐﻴﺮﻫﺎي داس‪ ،‬ﻣﻘﺪار اوﻟﻴﻪ ﻣﻲدﻫﺪ‪.‬‬
‫ب( ﺑﺨﺶ ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ‪ :7‬ﺷﺎﻣﻞ رواﻟﻬﺎي ﻣﺪﻳﺮﻳﺖ ﺧﻄﺎﻫﺎي ﺑﺤﺮاﻧﻲ‪)8‬زدن ﻛﻠﻴﺪﻫﺎي ‪ Ctrl+C‬ﻳﺎ ‪ ،(Ctrl+Break‬ﻧﻤﺎﻳﺶ ﻋﻼﻣﺖ داس و درﻳﺎﻓﺖ‬
‫ﻓﺮاﻣﻴﻦ و ﭘﺮدازش آﻧﻬﺎ‪ ،‬ﻓﺮاﺧﻮاﻧﻲ ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﻛﻪ اﺳﺎﻣﻲ آﻧﻬﺎ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ وارد ﺷﺪه و ﺑﺎرﻛﺮدن آﻧﻬﺎ در ﺣﺎﻓﻈﻪ و اﺟﺮاي آﻧﻬﺎ‪ ،‬و ﺑﺎرﻛﺮدن ﻣﺠﺪد ﺑﺨﺶ‬
‫ﮔﺬرا‪ ،‬در ﺻﻮرﺗﻲ ﻛﻪ ﺣﺎﻓﻈﻪي ﻣﻮرد اﺳﺘﻔﺎدهي ﺑﺨﺶ ﮔﺬرا ﺗﻮﺳﻂ ﺳﺎﻳﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﺎزﻧﻮﻳﺴﻲ ﺷﺪه ﺑﺎﺷﺪ‪ .‬ﺑﺮاي ﺗﺸﺨﻴﺺ اﻳﻦ اﻣﺮ‪ ،‬از ﻣﺠﻤﻮع ﻣﻘﺎﺑﻠﻪاي‪9‬‬
‫اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬
‫‪12‬‬ ‫‪11‬‬
‫ج( ﺑﺨﺶ ﮔﺬرا ‪ :‬وﻇﻴﻔﻪي اﺟﺮاي ﻓﺮﻣﺎﻧﻬﺎي داﺧﻠﻲ داس )ﻧﻈﻴﺮ ‪ DIR ،COPY ،RENAME‬و ‪ ،(...‬ﻓﺮﻣﺎﻧﻬﺎي ﺧﺎرﺟﻲ )ﻧﻈﻴﺮ‬ ‫‪10‬‬

‫‪ XCOPY ،FORMAT‬و ‪ ...‬و ﺑﻪﻃﻮر ﻛﻠﻲ ﻫﺮ ﺑﺮﻧﺎﻣﻪي ‪ .COM‬ﻳﺎ ‪ ،(.EXE‬و ﻓﺎﻳﻠﻬﺎي دﺳﺘﻪاي‪) 13‬ﻳﻚ ﻓﺎﻳﻞ ﻣﺘﻨﻲ ﺑﺎ ﭘﺴﻮﻧﺪ ‪ .BAT‬ﻛﻪ‬
‫ﺷﺎﻣﻞ ﻳﻚ ﺳﺮي از ﻓﺮﻣﺎﻧﻬﺎي داس اﺳﺖ‪ ،‬ﻛﻪ ﻳﻚ ﻧﻤﻮﻧﻪ آن‪ AUTOEXEC.BAT ،‬اﺳﺖ(‪ .‬دﻟﻴﻞ اﻳﻨﻜﻪ ﺑﻪ اﻳﻦ ﺑﺨﺶ ﮔﺬرا ﮔﻔﺘﻪ ﻣﻲﺷﻮد اﻳﻦ‬
‫_________________________________________________________________________________‬
‫‪attribute ١‬‬
‫‪device drivers ٢‬‬
‫‪DOS kernel ٣‬‬
‫‪command processor ٤‬‬
‫‪DOS prompt ٥‬‬
‫‪initialization part ٦‬‬
‫‪resident part ٧‬‬
‫‪critical error handler ٨‬‬
‫‪checksum ٩‬‬
‫‪transient part ١٠‬‬
‫‪internal commands ١١‬‬
‫‪external commands ١٢‬‬
‫‪Batch files ١٣‬‬
‫‪2-16‬‬ ‫ﻓﺼﻞ ‪ :16‬ﺳﺎﺧﺘﺎر داﺧﻠﻲ داس‬

‫اﺳﺖ ﻛﻪ ﺣﺎﻓﻈﻪاي ﻛﻪ ﺑﺮﻧﺎﻣﻪي اﻳﻦ ﺑﺨﺶ در آن ﻗﺮار دارد‪ ،‬در ﺻﻮرت ﻧﻴﺎز ﺳﺎﻳﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺗﻮﺳﻂ داس ﺑﻪ آﻧﻬﺎ ﺗﺨﺼﻴﺺ داده ﺷﺪه و ﺑﺎ اﺻﻄﻼح رزرو‬
‫ﻧﻤﻲﺷﻮد‪ .‬از اﻳﻨﺮو ﭘﺲ از ﺧﺎﺗﻤﻪي اﺟﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎ و در زﻣﺎن ﺑﺮﮔﺸﺖ ﺑﻪ ﭘﺮدازﺷﮕﺮ ﻓﺮﻣﺎن‪ ،‬ﺑﺎ ﻣﺠﻤﻮع ﻣﻘﺎﺑﻠﻪاي ﺑﺮرﺳﻲ ﻣﻲﺷﻮد ﻛﻪ ﺣﺎﻓﻈﻪي اﻳﻦ ﺑﺨﺶ‬
‫ﺑﺎزﻧﻮﻳﺴﻲ ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ و در ﺻﻮرت ﻧﻴﺎز دوﺑﺎره از دﻳﺴﻚ ﺑﺎر ﻣﻲﺷﻮد‪ .‬ﻫﻤﺎﻧﻈﻮري ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ‪ ،‬اﻳﻦ ﺑﺮرﺳﻲ و ﺑﺎرﻛﺮدن ﻣﺠﺪد‪ ،‬ﺗﻮﺳﻂ ﺑﺨﺶ ﻣﻘﻴﻢ‬
‫درﺣﺎﻓﻈﻪ‪ ،‬اﻧﺠﺎم ﻣﻲﺷﻮد‪.‬‬

‫‪ 2-16‬راهاﻧﺪازي‪ 1‬داس‬
‫ﻓﺮآﻳﻨﺪ راهاﻧﺪازي ﺷﺎﻣﻞ ﻓﺮاﺧﻮاﻧﻲ ﺳﻪ ﻣﺎﺟﻮل ‪ DOS kernel ،DOS-BIOS‬و ‪ Command Processor‬اﺳﺖ‪ .‬وﻗﺘﻲ ‪ PC‬روﺷﻦ ﻣﻲﺷﻮد‪،‬‬
‫ﺑﺮﻧﺎﻣﻪي راهاﻧﺪازي ﻛﻪ در ‪ ROM-BIOS‬وﺟﻮد دارد‪ ،‬اﺟﺮا ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻛﺎرﻫﺎي ‪ 2POST‬را اﻧﺠﺎم ﻣﻲدﻫﺪ و ﺳﭙﺲ ﺷﺮوع ﺑﻪ ﺑﺎرﻛﺮدن ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻣﻲﻛﻨﺪ‪.‬‬
‫اﺑﺘﺪا ﺑﺮرﺳﻲ ﻣﻲﺷﻮد ﻛﻪ ﮔﺮداﻧﻨﺪهي دﻳﺴﻜﺖ وﺟﻮد دارد ﻳﺎ ﻧﻪ و آﻳﺎ در آن دﻳﺴﻜﺘﻲ ﻫﺴﺖ ﻳﺎ ﻧﻪ؟ اﮔﺮ ﺑﺎﺷﺪ‪ ،‬در ‪ Boot Sector‬آن ﺑﻪ دﻧﺒﺎل ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻣﻲﮔﺮدد‪ .‬اﮔﺮ‬
‫دﻳﺴﻜﺖ در ﮔﺮداﻧﻨﺪه ﻧﺒﺎﺷﺪ‪ ،‬ﺑﻪ دﻧﺒﺎل دﻳﺴﻚ ﺳﺨﺖ ﻣﻲﮔﺮدد و ﻗﺴﻤﺖ ﻓﻌﺎل‪ 3‬را ﻳﺎﻓﺘﻪ و ‪ Boot Sector‬آﻧﺮا ﺑﺎر ﻧﻤﻮده و اﺟﺮا ﻣﻲﻛﻨﺪ‪ .‬اﮔﺮ ‪ Boot Sector‬دﻳﺴﻜﺖ ﻳﺎ‬
‫ﻗﺴﻤﺖ ﻓﻌﺎل دﻳﺴﻚ ﺳﺨﺖ‪ ،‬اﺟﺮاﻳﻲ ﻧﺒﺎﺷﺪ‪ ،‬ﭘﻴﻐﺎم ﺗﻌﻮﻳﺾ دﻳﺴﻜﺖ ﻳﺎ ﻗﺮار دادن دﻳﺴﻜﺖ داده ﻣﻲﺷﻮد‪.‬‬

‫ﺑﺮﻧﺎﻣﻪي ﻣﻮﺟﻮد در ‪ Boot Sector‬ﭼﻚ ﻣﻲﻛﻨﺪ ﻛﻪ ﻓﺎﻳﻠﻬﺎي ‪ IO.SYS‬و ‪ MSDOS.SYS‬وﺟﻮد دارﻧﺪ ﻳﺎ ﻧﻪ‪ ،‬اﮔﺮ ﺑﺎﺷﻨﺪ در آﺧﺮﻳﻦ ﻣﻜﺎن ﺣﺎﻓﻈﻪ‬
‫ﺑﺎرﮔﺬاري ﺷﺪه و اﺟﺮا ﻣﻲﺷﻮﻧﺪ‪ ،MSDOS.SYS .‬وﻗﻔﻪي ‪ 21H‬را ﺗﻌﻮﻳﺾ ﻧﻤﻮده و ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪي ﻣﻮﺟﻮد در ‪ DOS-BIOS‬را ﻛﻪ ﺑﺎ ‪ IO.SYS‬ﺑﺎر‬
‫ﺷﺪهاﻧﺪ را ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﻣﻲﻛﻨﺪ‪ .‬ﺳﭙﺲ در ‪ ،Boot Disk‬ﺑﻪ دﻧﺒﺎل ﻓﺎﻳﻞ ‪ CONFIG.SYS‬ﻣﻲﮔﺮدد و در ﺻﻮرت وﺟﻮد‪ ،‬ﻓﺮﻣﺎﻧﻬﺎي ﻣﻮﺟﻮد در آن را اﺟﺮا ﻣﻲﻛﻨﺪ‪ ،‬ﺗﺎ‬
‫ﮔﺮداﻧﻨﺪهﻫﺎي ﻣﻌﺮﻓﻲ ﺷﺪه در آن را ﺑﻪ داس اﺿﺎﻓﻪ ﻧﻤﺎﻳﺪ و ﻧﻴﺰ ﺑﺎﻓﺮﻫﺎ و ﻟﻮازم ورودي‪-‬ﺧﺮوﺟﻲ را ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﻣﻲﻛﻨﺪ‪ .‬در ﺧﺎﺗﻤﻪ ‪ COMMAND.COM‬را ﺑﺎر‬
‫ﻧﻤﻮده و ﻛﻨﺘﺮل را ﺑﻪ آن ﻣﻨﺘﻘﻞ ﻣﻲﻛﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪booting ١‬‬
‫‪Power On Self Test ٢‬‬
‫‪active partition ٣‬‬
‫ﻓﺼﻞ ‪ :17‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬و ‪EXE‬‬
‫)‪(COM and EXE Programs‬‬

‫‪ 1-17‬ﻣﻘﺪﻣﻪ‬
‫دو ﻧﻮع ﻓﺎﻳﻞ اﺟﺮاﻳﻲ در داس وﺟﻮد دارد‪ COM :‬و ‪ .EXE‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬داراي اﻧﺪازهاي ﻛﻮﭼﻚ ﺑﻮده و ‪ DS ،CS‬و ‪ SS‬آﻧﻬﺎ در ﻣﺠﻤﻮع ﺣﺪاﻛﺜﺮ‬
‫‪ 64K‬اﺳﺖ‪ .‬اﻏﻠﺐ ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﭘﺎﺳﻜﺎل و ‪ ،C‬ﻓﻘﻂ ﻓﺎﻳﻞ ‪ EXE‬ﺗﻮﻟﻴﺪ ﻣﻲﻛﻨﻨﺪ‪ ،‬وﻟﻲ ﺑﺮﺧﻲ ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ‪ C‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎي داراي ﻣﺪل ‪ TINY‬ﻣﻲﺗﻮاﻧﻨﺪ ‪ COM‬ﻫﻢ‬
‫ﺗﻮﻟﻴﺪ ﻛﻨﻨﺪ‪ .‬ﺑﺮﻧﺎﻣﻪي ‪ EXE2BIN‬داس و ‪ TLINK‬ﺑﻮرﻟﻨﺪ ﻧﻴﺰ ﺗﻮاﻧﺎﻳﻲ ﺗﺒﺪﻳﻞ ﺑﺮﻧﺎﻣﻪي ‪ EXE‬ﺑﻪ ‪ COM‬ﻳﺎ ﺗﻮﻟﻴﺪ ﺑﺮﻧﺎﻣﻪي ‪ COM‬را دارﻧﺪ‪.‬‬

‫‪ 2-17‬ﺗﻔﺎوت ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬و ‪EXE‬‬


‫ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬از زﻣﺎن ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ CP/M‬ﻣﻄﺮح ﺷﺪﻧﺪ‪ ،‬ﻛﻪ ﺣﺎﻓﻈﻪ ‪ PC‬ﺑﺴﻴﺎر ﻛﻢ و ﺣﺪود ‪ 64K‬ﺑﻮد‪ .‬در ‪ DOS‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬ﻧﻤﻲﺗﻮاﻧﻨﺪ‬
‫ﺑﻴﺸﺘﺮ از ‪ 64K‬ﺑﺎﺷﻨﺪ‪ .‬اﻣﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ EXE‬ﻣﻲﺗﻮاﻧﻨﺪ ﻫﺮ اﻧﺪازهاي ﻛﻪ در ﺣﺎﻓﻈﻪي ﻣﺘﻌﺎرف )‪ (640K‬ﺟﺎ ﺷﻮد‪ ،‬داﺷﺘﻪ ﺑﺎﺷﻨﺪ‪ .‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬ﻓﻘﻂ ﻳﻚ ﻗﻄﻌﻪ‬
‫ﻫﺴﺘﻨﺪ‪ ،‬اﻣﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ EXE‬داراي ﻗﻄﻌﺎت ﻣﺠﺰاي ‪ DS ،CS‬و ‪ SS‬ﻫﺴﺘﻨﺪ‪.‬‬

‫‪ : (Program Segment Prefix) PSP‬داس ﺑﺮاي اﺟﺮاي ﺑﺮﻧﺎﻣﻪ‪ ،‬ﺑﺪون درﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻧﻮع آن‪ ،‬ﻳﻚ ﺳﺎﺧﺘﺎر در ﺣﺎﻓﻈﻪ اﻳﺠﺎد ﻣﻲﻛﻨﺪ ﻛﻪ ‪PSP‬‬
‫ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد و آﻧﺮا ﻗﺒﻞ از ﺷﺮوع ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﻣﻲﻛﻨﺪ و ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﺑﻼﻓﺎﺻﻠﻪ ﭘﺲ از آن در ﺣﺎﻓﻈﻪ ﺑﺎر ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﺳﺎﺧﺘﺎر ﻛﻪ ‪ PSP‬ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد‪ 256 ،‬ﺑﺎﻳﺖ اﺳﺖ و‬
‫ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ‪ ،‬ﻗﺒﻞ از ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬در اداﻣﻪي اﻳﻦ ﻓﺼﻞ در ﻣﻮرد ‪ PSP‬ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﻣﻲﺷﻮد‪.‬‬

‫‪SS:0000‬‬ ‫‪COM Program‬‬ ‫‪EXE Program‬‬


‫‪DS:0000‬‬ ‫‪DS:0000‬‬
‫‪ES:0000‬‬ ‫)‪PSP (256 bytes‬‬ ‫‪ES:0000‬‬ ‫)‪PSP (256 bytes‬‬
‫‪CS:0000 CS:IP‬‬

‫‪CS:IP‬‬
‫‪Code‬‬

‫‪Code,‬‬ ‫‪DS:0000‬‬
‫‪Data, and‬‬
‫‪Stack ≤ 64K‬‬
‫‪SS:SP‬‬ ‫‪Data‬‬
‫‪SS:0000‬‬
‫‪SS:FFFF‬‬
‫‪DS:FFFF‬‬ ‫‪SS:SP‬‬
‫‪ES:FFFF‬‬
‫‪CS:FFFF‬‬ ‫‪Stack‬‬
‫‪2-17‬‬ ‫ﻓﺼﻞ ‪ :17‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬و ‪EXE‬‬

‫‪ 3-17‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪COM‬‬
‫اﻳﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﻪﻋﻨﻮان ﻳﻚ ﺗﺼﻮﻳﺮ ﺣﺎﻓﻈﻪ‪ 1‬در دﻳﺴﻚ ذﺧﻴﺮه ﻣﻲﺷﻮﻧﺪ‪ .‬از اﻳﻨﺮو‪ ،‬ﻧﻴﺎز ﺑﻪ ﭘﻴﺶﭘﺮدازش ﻧﺪارﻧﺪ‪ ،‬ﺗﺎ ﻧﺸﺎﻧﻲﻫﺎي ﻧﺴﺒﻲ‪ 2‬ﺗﻮﻟﻴﺪ ﺷﺪه ﺑﻮﺳﻴﻠﻪي‬
‫ﻛﺎﻣﭙﺎﻳﻠﺮ ﻳﺎ اﺳﻤﺒﻠﺮ ﺑﺮاﺳﺎس ﻣﻜﺎن ﺑﺎرﺷﺪه در ﺣﺎﻓﻈﻪ‪ ،‬ﺑﻪ ﻧﺸﺎﻧﻲﻫﺎي واﻗﻌﻲ اﺻﻼح ﺷﻮﻧﺪ‪ .‬از اﻳﻨﺮو‪ ،‬ﺳﺮﻳﻊﺗﺮ در ﺣﺎﻓﻈﻪ ﺑﺎرﻣﻲﺷﻮﻧﺪ‪ .‬اﻣﺎ اﻣﺮوزه ﺑﻪدﻟﻴﻞ اﻓﺰاﻳﺶ ﺣﺎﻓﻈﻪ و ﺳﺮﻋﺖ‬
‫ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ‪ ،‬اﻳﻦ ﻣﺰاﻳﺎي ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬ﭼﻨﺪان اﻫﻤﻴﺖ ﻧﺪارد و ﻓﻘﻂ ﺑﺮاي ﻛﺎرﺑﺮدﻫﺎي ﺧﺎص‪ ،‬ﻣﺜﻼً ﻧﻮﺷﺘﻦ ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‪ ،‬از اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪﻫﺎ اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﺗﺎ‬
‫ﺣﺠﻢ ﻛﻤﻲ از ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻧﻤﻮده و ﺳﺮﻳﻊ ﺑﺎﺷﻨﺪ‪.‬‬

‫ﺑﺮﻧﺎﻣﻪاي ﺑﻪﻧﺎم ‪ EXE2BIN‬ﺟﺰو ﻓﺮاﻣﻴﻦ ﺧﺎرﺟﻲ داس اﺳﺖ ﻛﻪ از آن ﻣﻲﺗﻮان ﺑﺮاي ﺗﺒﺪﻳﻞ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ EXE‬ﺑﻪ ﺑﺮﻧﺎﻣﻪي ‪ COM‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬اﻳﻦ‬
‫ﺑﺮﻧﺎﻣﻪ ﭼﻚ ﻣﻲﻛﻨﺪ ﻛﻪ اﻳﻦ اﻣﺮ اﻣﻜﺎنﭘﺬﻳﺮ اﺳﺖ ﻳﺎ ﻧﻪ؟ ﻳﻌﻨﻲ ﻛﺪ ﺑﺮﻧﺎﻣﻪي ‪ EXE‬آﻧﻘﺪر ﻛﻮﭼﻚ ﺑﺎﺷﺪ ﻛﻪ در ‪ 64K‬ﻗﺮار ﮔﻴﺮد‪ .‬ﺑﺮﻧﺎﻣﻪﻫﺎي اﺳﻤﺒﻞ ﺷﺪه ﺑﺎ ‪ MASM‬و‬
‫ﻣﺘﺼﻞ ﺷﺪه ﺑﺎ ‪ EXE ،LINK‬ﺧﻮاﻫﻨﺪ ﺑﻮد‪ ،‬ﻛﻪ ﺑﺮاي ﺗﺒﺪﻳﻞ آﻧﻬﺎ ﺑﻪ ‪ COM‬ﻣﻲﺗﻮان از ‪ EXE2BIN‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬اﻣﺎ اﮔﺮ از اﺳﻤﺒﻠﺮ ‪ TASM‬اﺳﺘﻔﺎده ﺷﻮد‪ ،‬ﺑﺎ‬
‫‪ TLINK‬ﻣﻲﺗﻮان ﻣﺴﺘﻘﻴﻤﺎً ﺑﺮﻧﺎﻣﻪي ‪ COM‬ﺗﻮﻟﻴﺪ ﻛﺮد‪.‬‬

‫ﺑﺮاي اﺟﺮاي ﺑﺮﻧﺎﻣﻪي ‪ ،COM‬ﻣﺤﺘﻮاي ﻓﺎﻳﻞ ‪ COM‬ﺑﻼﻓﺎﺻﻠﻪ ﭘﺲ از ‪ PSP‬و ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ‪ ،100H‬در ﺣﺎﻓﻈﻪ ﺑﺎر ﻣﻲﺷﻮد‪ .‬ﭘﺲ اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﭘﺲ‬
‫از ‪ 100H‬اﺟﺮا ﻣﻲﺷﻮد‪ .‬از اﻳﻨﺮو‪ ،‬ﺑﺮﻧﺎﻣﻪي ‪ COM‬ﺣﺘﻤﺎًﺑﺎﻳﺪ ﺑﺎ ﻳﻚ دﺳﺘﻮراﻟﻌﻤﻞ اﺟﺮاﻳﻲ ﺷﺮوع ﺷﻮﻧﺪ‪ ،‬ﺣﺘﻲ اﮔﺮ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ‪ ،‬ﻳﻚ ‪ jmp‬ﺑﺎﺷﺪ‪.‬‬

‫‪ 4-17‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪EXE‬‬
‫ﻳﻚ ﻣﺰﻳﺖ ﻋﻤﺪه ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ EXE‬ﻧﺴﺒﺖ ﺑﻪ ‪ ،COM‬ﻣﺤﺪود ﻧﺒﻮدن اﻧﺪازهي اﻳﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ اﺳﺖ‪ .‬اﻣﺎ‪ ،‬ﻓﺎﻳﻠﻬﺎي ‪ EXE‬ﭘﻴﭽﻴﺪه ﻫﺴﺘﻨﺪ‪ ،‬زﻳﺮا ﻋﻼوه ﺑﺮ‬
‫ﻛﺪﻫﺎي اﺟﺮاﻳﻲ ﺑﺮﻧﺎﻣﻪ‪ ،‬اﻃﻼﻋﺎت دﻳﮕﺮي ﻫﻢ ﺑﺎﻳﺪ در ﻓﺎﻳﻠﻬﺎي ‪ EXE‬ﻧﮕﻬﺪاري ﺷﻮد‪ .‬اﻳﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ داراي ﻗﻄﻌﺎت ﻣﺠﺰاي ﻛﺪ‪ ،‬داده و ﭘﺸﺘﻪ ﻫﺴﺘﻨﺪ و ﭘﺲ از ﺑﺎرﺷﺪن از‬
‫دﻳﺴﻚ ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﺗﺎﺑﻊ ‪ EXEC‬ﭘﺮدازش ﺷﻮﻧﺪ ﺗﺎ ﺑﺮاي اﺟﺮا آﻣﺎده ﺷﻮﻧﺪ‪ .‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬ﻫﻤﺎﻧﻨﺪ ﻳﻚ ﺗﺼﻮﻳﺮ ﺣﺎﻓﻈﻪ ﻫﺴﺘﻨﺪ و ﻫﻤﻴﺸﻪ ﺑﺎﻳﺪ در ﻳﻚ ﻣﻜﺎن ﺛﺎﺑﺖ در‬
‫ﺣﺎﻓﻈﻪ ﻗﺮار ﮔﻴﺮﻧﺪ و اﺟﺮا ﺷﻮﻧﺪ‪ .‬اﻣﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ EXE‬در ﻫﺮ ﻣﻜﺎن ﺣﺎﻓﻈﻪ ﻛﻪ ﻣﻀﺮﺑﻲ از ‪ 16‬ﺑﺎﺷﺪ‪ ،‬ﻣﻲﺗﻮاﻧﻨﺪ ﻗﺮار ﮔﺮﻓﺘﻪ و اﺟﺮا ﺷﻮﻧﺪ‪ .‬ﺑﻪ اﻳﻦ دﻟﻴﻞ در ﻳﻚ ﺑﺮﻧﺎﻣﻪي‬
‫‪ EXE‬ﺑﺎﻳﺪ از دﺳﺘﻮرات ‪ FAR‬اﺳﺘﻔﺎده ﺷﻮد‪ .‬ﭼﻮن ﻣﻤﻜﻦ اﺳﺖ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ و رواﻟﻬﺎ در ﻗﻄﻌﺎت ﻣﺘﻔﺎوت ﻗﺮار ﮔﻴﺮﻧﺪ‪ .‬از آﻧﺠﺎﻳﻲﻛﻪ‪ ،‬ﺑﺮﻧﺎﻣﻪ ﻫﺮ ﺑﺎر در ﻣﻜﺎن ﻣﺘﻔﺎوﺗﻲ ﺑﺎر‬
‫ﻣﻲﺷﻮد‪ ،‬ﻧﺸﺎﻧﻲ ﻗﻄﻌﺎت در اﺟﺮاﻫﺎ ﻣﺨﺘﻠﻒ‪ ،‬ﻣﺘﻔﺎوت ﺧﻮاﻫﺪ ﺑﻮد‪ .‬ﺑﻨﺎﺑﺮ اﻳﻦ‪ ،‬ﺑﺎﻳﺪ در اﺑﺘﺪاي ﻓﺎﻳﻞ ‪ EXE‬اﻃﻼﻋﺎﺗﻲ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ ﻛﻪ از ﻃﺮﻳﻖ آن ﺑﺘﻮان ﻧﺸﺎﻧﻲ ﻗﻄﻌﺎت در‬
‫ﻓﺎﻳﻞ ‪ EXE‬را ﺗﺼﺤﻴﺢ ﻧﻤﻮد‪ .‬ﺑﻪ اﻳﻦ دﻟﻴﻞ در اﺑﺘﺪاي ﻓﺎﻳﻞ ‪ ،EXE‬ﺳﺮآﻳﻨﺪي‪ 3‬وﺟﻮد دارد ﻛﻪ اﻃﻼﻋﺎت ﻣﻬﻤﻲ ﺗﻮﺳﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻳﺎ اﺳﻤﺒﻠﺮ در آن ذﺧﻴﺮه ﻣﻲﺷﻮد و ﻣﻮرد‬
‫اﺳﺘﻔﺎدهي ﺑﺎرﻛﻨﻨﺪهي داس)ﻛﻪ ﻫﻤﺎن ﺗﺎﺑﻊ ‪ EXEC‬ﺑﺎ ﺷﻤﺎرهي ‪ (4BH‬ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬ﻗﺎﻟﺐ ﺳﺮآﻳﻨﺪ ﻓﺎﻳﻞ ‪ EXE‬ﻣﻄﺎﺑﻖ ﺟﺪول ﺻﻔﺤﻪي ﺑﻌﺪ اﺳﺖ‪.‬‬

‫‪Address‬‬ ‫‪Contents‬‬ ‫‪Type‬‬


‫‪00H‬‬ ‫)”‪EXE program identifier (5A4DH or “MZ‬‬ ‫‪1 word‬‬
‫‪02H‬‬ ‫‪File length MOD 512‬‬ ‫‪1 word‬‬
‫‪04H‬‬ ‫‪File length DIV 512‬‬ ‫‪1 word‬‬
‫‪06H‬‬ ‫‪Number of segment addresses for passing‬‬ ‫‪1 word‬‬
‫‪08H‬‬ ‫‪Header size in paragraph‬‬ ‫‪1 word‬‬
‫‪0AH‬‬ ‫‪Minimum number of paragraphs needed‬‬ ‫‪1 word‬‬
‫‪0CH‬‬ ‫‪Maximum number of paragraphs needed‬‬ ‫‪1 word‬‬
‫‪0EH‬‬ ‫‪Stack segment displacement‬‬ ‫‪1 word‬‬
‫‪10H‬‬ ‫‪SP register contents when program starts‬‬ ‫‪1 word‬‬
‫‪12H‬‬ ‫‪Checksum based on EXE file header‬‬ ‫‪1 word‬‬
‫‪14H‬‬ ‫‪IP register contents when program starts‬‬ ‫‪1 word‬‬
‫‪16H‬‬ ‫‪Start of code segment in EXE file‬‬ ‫‪1 word‬‬
‫‪18H‬‬ ‫‪Relocation table address in EXE file‬‬ ‫‪1 word‬‬
‫‪1AH‬‬ ‫‪Overlay number‬‬ ‫‪1 word‬‬
‫‪1CH‬‬ ‫‪Buffer memory‬‬ ‫??‬
‫‪??H‬‬ ‫)‪Address of passing segment addresses (relocation table‬‬ ‫??‬
‫‪??H‬‬ ‫‪Program code, data and stack segment‬‬ ‫??‬
‫ﺑﺎرﻛﻨﻨﺪهي داس‪ ،‬ﻳﺎ ﻫﻤﺎن ﺗﺎﺑﻊ ‪ EXEC‬ﻛﻪ در ﻓﺼﻠﻬﺎي ﺑﻌﺪي در ﺑﺎرهي آن ﺻﺤﺒﺖ ﻣﻲﺷﻮد‪ ،‬ﻣﻴﺰان ﺣﺎﻓﻈﻪي ﻣﻮرد ﻧﻴﺎز ﺑﺮﻧﺎﻣﻪ را از ﺳﺮآﻳﻨﺪ ﻓﺎﻳﻞ ‪EXE‬‬
‫ﺑﺪﺳﺖ ﻣﻲآورد‪ .‬اﻳﻦ ﻣﻴﺰان ﺑﺮاﺳﺎس ﭘﺎراﮔﺮاف)‪ 16‬ﺑﺎﻳﺖ( اﺳﺖ‪ “relocation table” .‬ﺟﺪول اﺳﺖ ﻛﻪ ﻧﺸﺎﻧﻴﻬﺎي ﻗﻄﻌﻪاي ﻛﻪ در ﻓﺎﻳﻞ ‪ EXE‬ﺑﺎﻳﺪ ﺗﺼﺤﻴﺢ ﺷﻮﻧﺪ‪ ،‬را‬
‫ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪memory image ١‬‬
‫‪relative addresses ٢‬‬
‫‪header ٣‬‬
‫‪3-17‬‬ ‫ﻓﺼﻞ ‪ :17‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬و ‪EXE‬‬

‫‪(Program Segment Prefix) PSP 5-17‬‬


‫‪ PSP‬از ﻳﺎدﮔﺎرﻫﺎي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ CP/M‬در داس اﺳﺖ و ﻳﻚ ﺳﺎﺧﺘﺎر ‪ 256‬ﺑﺎﻳﺘﻲ اﺳﺖ ﻛﻪ ﻗﺒﻞ از ﻛﺪ ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ ﻗﺮار ﻣﻲﮔﻴﺮد و ﺣﺎوي اﻃﻼﻋﺎت‬
‫ﻣﺪﻳﺮﻳﺖ ﺑﺮﻧﺎﻣﻪ ﺗﻮﺳﻂ داس اﺳﺖ‪ .‬ﻫﻤﭽﻨﻴﻦ ﺷﺎﻣﻞ اﻃﻼﻋﺎﺗﻲ‪ ،‬ﻧﻈﻴﺮ ﭘﺎراﻣﺘﺮﻫﺎي ﺑﺮﻧﺎﻣﻪ اﺳﺖ ﻛﻪ ﻣﻮرد اﺳﺘﻔﺎدهي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﺎن ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬اﻳﻦ ﭘﺎراﻣﺘﺮﻫﺎ در ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﻛﻪ‬
‫ﺑﺎ زﺑﺎﻧﻬﺎي ﺳﻄﺢ ﺑﺎﻻ ﻧﻮﺷﺘﻪ ﻣﻲﺷﻮﻧﺪ‪ ،‬ﺗﻮﺳﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺧﻮاﻧﺪه ﺷﺪه و در ﻣﺘﻐﻴﺮﻫﺎي ﺳﺮاﺳﺮي ﻗﺮار داده ﻣﻲﺷﻮﻧﺪ‪ ،‬اﻣﺎ در ﺑﺮﻧﺎﻣﻪﻫﺎي اﺳﻤﺒﻠﻲ ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ از ‪PSP‬‬
‫ﺧﻮاﻧﺪه ﺷﻮﻧﺪ‪ .‬ﺟﺪول زﻳﺮ ﺳﺎﺧﺘﺎر ‪ PSP‬را ﻧﺸﺎن ﻣﻲدﻫﺪ‪ ،‬ﻛﻪ اﻏﻠﺐ ﻓﻴﻠﺪﻫﺎي آن ﺑﻼاﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ و ﻣﻬﻤﺘﺮﻳﻦ ﻓﻴﻠﺪﻫﺎ‪ ،‬دو ﻓﻴﻠﺪ آﺧﺮ ﻫﺴﺘﻨﺪ ﻛﻪ اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﺧﻂ‬
‫ﻓﺮﻣﺎن ﺑﺮﻧﺎﻣﻪ ﻳﺎ ﻫﻤﺎن ﭘﺎراﻣﺘﺮﻫﺎ ﻫﺴﺘﻨﺪ‪.‬‬

‫‪Address‬‬ ‫‪Contents‬‬ ‫‪Type‬‬


‫‪00H‬‬ ‫‪Interrupt 20H call‬‬ ‫‪2 bytes‬‬
‫‪02H‬‬ ‫‪Segment address of memory allocated for program‬‬ ‫‪1 word‬‬
‫‪04H‬‬ ‫‪Reserved‬‬ ‫‪1 byte‬‬
‫‪05H‬‬ ‫‪Interrupt 21H call‬‬ ‫‪5 bytes‬‬
‫‪0AH‬‬ ‫‪Copy of interrupt vector 23H‬‬ ‫‪2 words‬‬
‫‪0EH‬‬ ‫‪Copy of interrupt vector 23H‬‬ ‫‪2 words‬‬
‫‪12H‬‬ ‫‪Copy of interrupt vector 23H‬‬ ‫‪2 words‬‬
‫‪16H‬‬ ‫‪Reserved‬‬ ‫‪22 bytes‬‬
‫‪2CH‬‬ ‫‪Segment address of environment block‬‬ ‫‪1 word‬‬
‫‪2EH‬‬ ‫‪Reserved‬‬ ‫‪46 bytes‬‬
‫‪5CH‬‬ ‫‪FCB 1‬‬ ‫‪16 bytes‬‬
‫‪6CH‬‬ ‫‪FCB 2‬‬ ‫‪16 bytes‬‬
‫‪80H‬‬ ‫‪Number of characters in command line‬‬ ‫‪1 byte‬‬
‫‪81H‬‬ ‫)‪Command line (CR-LF‬‬ ‫‪127 bytes‬‬
‫ﻓﺼﻞ ‪ :18‬ورودي‪-‬ﺧﺮوﺟﻲ ﻛﺎراﻛﺘﺮ از ﻃﺮﻳﻖ داس‬
‫)‪(Character Input and Output from DOS‬‬

‫‪ 1-18‬ﻣﻘﺪﻣﻪ‬
‫ﺗﻮاﺑﻊ ورودي ﺧﺮوﺟﻲ داس‪ ،‬اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﺑﻪ ﺻﻔﺤﻪ ﻛﻠﻴﺪ‪ ،‬ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‪ ،‬ﭼﺎﭘﮕﺮ و واﺳﻂ ﺳﺮﻳﺎل را ﻣﻴﺴﺮ ﻣﻲﺳﺎزﻧﺪ‪ .‬اﻳﻦ ﺗﻮاﺑﻊ ﺑﻪ دو دﺳﺘﻪ ﺗﻘﺴﻴﻢ‬
‫ﻣﻲﺷﻮﻧﺪ‪:‬‬
‫‪ (1‬ﺗﻮاﺑﻊ ﻣﺸﺎﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪CP/M‬‬
‫‪ (2‬ﺗﻮاﺑﻊ ﻣﺸﺎﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪Unix‬‬
‫ﺗﻮاﺑﻊ ﻳﻮﻧﻴﻜﺴﻲ‪ ،‬از ﻳﻚ دﺳﺘﻪ‪ 1‬ﻛﻪ ﻳﻚ ﺷﻤﺎرهي ﻋﺪدي اﺳﺖ‪ ،‬ﺑﻪ ﻋﻨﻮان ﻣﺸﺨﺼﻪي وﺳﻴﻠﻪ اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪.‬‬
‫در اداﻣﻪ در ﻣﻮرد ﻫﺮ دو ﮔﺮوه ﺗﻮاﺑﻊ ﺻﺤﺒﺖ ﻣﻲﻛﻨﻴﻢ‪.‬‬

‫دﺳﺘﻪ‪2‬‬ ‫‪ 2-18‬ﺗﻮاﺑﻊ‬
‫اﻳﻦ ﺗﻮاﺑﻊ ﻫﻢ ﺑﺎ ﻓﺎﻳﻞ و ﻫﻢ ﺑﺎ وﺳﺎﻳﻞ ﻛﺎراﻛﺘﺮي‪ 3‬ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪ .‬ﻧﻮع ﻳﺎ ﻧﺎم دﺳﺘﻪ‪ ،‬وﺳﻴﻠﻪ را ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﺪ‪ .‬اﮔﺮ ﻧﺎم دﺳﺘﻪ‪ ،‬ﻳﻜﻲ از ﻟﻮازم اﺳﺘﺎﻧﺪارد و‬
‫ﺷﻨﺎﺧﺘﻪ ﺷﺪهي زﻳﺮ ﺑﺎﺷﺪ‪ ،‬ورودي‪-‬ﺧﺮوﺟﻲ روي آن وﺳﻴﻠﻪ اﻧﺠﺎم ﻣﻲﺷﻮد‪ ،‬و در ﻏﻴﺮ اﻳﻦﺻﻮرت‪ ،‬ﺑﺎﻳﺪ دﺳﺘﻪ‪ ،‬ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ﻓﺎﻳﻞ ﺑﺎﺷﺪ ﻛﻪ ﺑﺎﻳﺪ ﻗﺒﻼً ﻣﻨﺴﻮب ﺑﻪ ﻳﻚ ﻓﺎﻳﻞ‬
‫ﻓﻴﺰﻳﻜﻲ ﺷﺪه و ﺑﺎز ﺷﺪه ﺑﺎﺷﺪ‪.‬‬

‫‪CON:‬‬ ‫‪Keyboard and display‬‬


‫‪PRN:‬‬ ‫‪Printer‬‬
‫‪AUX:‬‬ ‫‪Serial interface‬‬
‫‪NUL:‬‬ ‫)‪Imaginary device (nothing happens on access‬‬
‫وﻗﺘﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺷﺮوع ﻣﻲﺷﻮد‪ 5 ،‬دﺳﺘﻪ ﺑﺮاي ﻣﻮارد ﻓﻮق ﺑﺎ ﺷﻤﺎرهﻫﺎي ‪ 0‬ﺗﺎ ‪ 4‬از ﻗﺒﻞ وﺟﻮد دارﻧﺪ و ﺷﻨﺎﺧﺘﻪ ﺷﺪه ﻫﺴﺘﻨﺪ‪.‬‬

‫‪Handle‬‬ ‫‪Purpose‬‬
‫‪0‬‬ ‫)‪Standard input (CON/ keyboard‬‬
‫‪1‬‬ ‫)‪Standard output (CON/ display‬‬
‫‪2‬‬ ‫)‪Standard output for error messages (CON‬‬
‫‪3‬‬ ‫)‪Standard serial interface (AUX‬‬
‫‪4‬‬ ‫)‪Standard printer (PRN‬‬

‫_________________________________________________________________________________‬
‫‪handle ١‬‬
‫‪handle functions ٢‬‬
‫‪character devices ٣‬‬
‫‪2-18‬‬ ‫ﻓﺼﻞ ‪ :18‬ورودي‪-‬ﺧﺮوﺟﻲ ﻛﺎراﻛﺘﺮ از ﻃﺮﻳﻖ داس‬

‫ﺗﻮاﺑﻊ دﺳﺘﺮﺳﻲ ﺑﻪ وﺳﻴﻠﻪﻫﺎ‪:‬‬

‫ارﺳﺎل داده ﺑﻪ وﺳﻴﻠﻪ )‪1. Function 40H of INT 21H: (Send/write data‬‬

‫‪AH = 40H‬‬
‫‪BH = handle‬‬
‫‪CX = number of characters‬‬
‫‪DS:DX = offset and segment of data‬‬
‫درﻳﺎﻓﺖ داده از وﺳﻴﻠﻪ )‪2. Function 3FH of INT 21H: (Receive/read data‬‬

‫‪AH = 3FH‬‬
‫‪BH = handle‬‬
‫‪CX = number of characters‬‬
‫‪DS:DX = offset and segment of data‬‬
‫ﺑﺎزﻛﺮدن وﺳﻴﻠﻪ )‪3. Function 3DH of INT 21H: (Open‬‬

‫‪AH = 3DH‬‬
‫‪AL = 0: read 1: write‬‬ ‫‪2: read/write‬‬
‫‪DS:DX = address of device name (nul-terminated) string‬‬
‫ﺑﺴﺘﻦ وﺳﻴﻠﻪ )‪4. Function 3EH of INT 21H: (Close‬‬

‫‪AH = 3EH‬‬
‫‪BX = handle‬‬

‫‪ 3-18‬ﺗﻮاﺑﻊ ‪CP/M‬‬
‫ﺗﻮاﺑﻊ ﺳﻨﺘﻲ داس ﺑﻮده و ﻣﺸﺎﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ CP/M‬ﻫﺴﺘﻨﺪ و ﻧﻴﺎزي ﺑﻪ دﺳﺘﻪ ﻧﺪارﻧﺪ و ﺑﺮاي ﺻﻔﺤﻪﻧﻤﺎﻳﺶ‪ ،‬ﺻﻔﺤﻪ ﻛﻠﻴﺪ‪ ،‬ﭼﺎﭘﮕﺮ‪ ،‬و واﺳﻂ ﺳﺮﻳﺎل ﺗﻮاﺑﻊ‬
‫ﻣﺠﺰاﻳﻲ وﺟﻮد دارﻧﺪ‪:‬‬

‫ﺻﻔﺤﻪ ﻛﻠﻴﺪ‪ :‬ﺗﻮاﺑﻊ ‪ ،07H ،06H ،01H‬و ‪ 08H‬ﺑﺮاي ﺧﻮاﻧﺪن ﻛﺎراﻛﺘﺮ از ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﺑﻪﺻﻮرﺗﻬﺎي ﻣﺨﺘﻠﻒ ﺑﺎ اﻧﺘﻈﺎر‪ ،‬ﺑﺪون اﻧﺘﻈﺎر و ﻏﻴﺮه‪ ،‬ﻗﺎﺑﻞ‬ ‫•‬
‫اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪ .‬ﺗﺎﺑﻊ ‪ ،0BH‬ﺗﻌﺪاد ﻛﺎراﻛﺘﺮﻫﺎ در ﺑﺎﻓﺮ ﺻﻔﺤﻪ ﻛﻠﻴﺪ را ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ .‬ﺗﺎﺑﻊ ‪ ،0CH‬ﺑﺎﻓﺮ ﺻﻔﺤﻪ ﻛﻠﻴﺪ را ﺧﺎﻟﻲ ﻣﻲﻛﻨﺪ و ﺑﺎ ﺗﺎﺑﻊ ‪0AH‬‬
‫ﻣﻲﺗﻮان ﻳﻚ رﺷﺘﻪ را از ورودي ﺧﻮاﻧﺪ‪.‬‬

‫ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‪ :‬ﺗﺎﺑﻊ ‪ ،02H‬ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎراﻛﺘﺮ و ﺗﺎﺑﻊ ‪ 09H‬ﺑﺮاي ﻧﻤﺎﻳﺶ رﺷﺘﻪ در ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪.‬‬ ‫•‬

‫ﭼﺎﭘﮕﺮ‪ :‬ﺗﺎﺑﻊ ‪ 05H‬ﺑﺮاي ﭼﺎپ ﻳﻚ ﻛﺎراﻛﺘﺮ در ﭼﺎﭘﮕﺮ‪ ،‬ﻳﺎ ﻫﻤﺎن واﺳﻂ ﻣﻮازي ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ‪.‬‬ ‫•‬

‫واﺳﻂ ﺳﺮﻳﺎل‪ :‬ﺗﺎﺑﻊ ‪ 03H‬ﺑﺮاي درﻳﺎﻓﺖ داده و ﺗﺎﺑﻊ ‪ 04H‬ﺑﺮاي ارﺳﺎل داده ﺑﻪ واﺳﻂ ﺳﺮﻳﺎل ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪.‬‬ ‫•‬
‫ﻓﺼﻞ ‪ :19‬ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻞ در داس‬
‫)‪(File Management in DOS‬‬

‫‪ 1-19‬ﻣﻘﺪﻣﻪ‬
‫داس داراي ﺗﻮاﺑﻌﻲ ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻞ اﺳﺖ‪ .‬از ﻃﺮﻓﻲ‪ ،‬زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻄﺢ ﺑﺎﻻ‪ ،‬اﻏﻠﺐ ﺗﻮاﺑﻊ ﺧﺎﺻﻲ را ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻞ ﻓﺮاﻫﻢ ﻣﻲﻛﻨﻨﺪ و از اﻳﻨﺮو‪،‬‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﺎن از ﺗﻮاﺑﻊ داس ﺑﻲﻧﻴﺎز ﻣﻲﺷﻮﻧﺪ‪ .‬اﻣﺎ‪ ،‬ﻛﺴﺎﻧﻲ ﻛﻪ ﺑﺎ زﺑﺎن اﺳﻤﺒﻠﻲ ﺑﺮﻧﺎﻣﻪ ﻣﻲﻧﻮﻳﺴﻨﺪ‪ ،‬ﻛﻤﺎﻛﺎن ﺑﻪ ﺗﻮاﺑﻊ داس ﻧﻴﺎز ﺧﻮاﻫﻨﺪ داﺷﺖ‪.‬‬

‫ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻞ ﺑﺎﻳﺪ ﺗﻮاﺑﻌﻲ ﺑﺮاي اﻳﺠﺎد‪ ،‬ﺣﺬف‪ ،‬ﺑﺎزﻛﺮدن‪ ،‬ﺑﺴﺘﻦ‪ ،‬ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ در ﻓﺎﻳﻞ ﻓﺮاﻫﻢ ﺷﻮد‪ ،‬ﻛﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ داس‪ ،‬ﺟﺰو ﺗﻮاﺑﻊ وﻗﻔﻪي ‪،21H‬‬
‫اﻳﻦ ﺗﻮاﺑﻊ را ﻓﺮاﻫﻢ ﻧﻤﻮده اﺳﺖ‪ .‬ﻫﻤﺎﻧﻨﺪ ورودي‪-‬ﺧﺮوﺟﻲ ﻛﺎراﻛﺘﺮ‪ ،‬ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻠﻬﺎ ﻫﻢ دو دﺳﺘﻪ ﺗﻮاﺑﻊ ﺳﺎزﮔﺎر ﺑﺎ ‪) CP/M‬ﺗﻮاﺑﻊ ‪ (FCB‬و ﺳﺎزﮔﺎر ﺑﺎ ‪) Unix‬ﺗﻮاﺑﻊ‬
‫دﺳﺘﻪ‪ (1‬در داس وﺟﻮد دارد‪ ،‬ﻛﻪ در اداﻣﻪ ﺑﻪ آﻧﻬﺎ ﻣﻲﭘﺮدازﻳﻢ‪.‬‬

‫‪ 2-19‬ﺗﻮاﺑﻊ ‪FCB‬‬
‫اﻳﻦ ﺗﻮاﺑﻊ ﺳﺎزﮔﺎر ﺑﺎ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ CP/M‬ﻫﺴﺘﻨﺪ و ﻣﺒﺘﻨﻲ ﺑﺮ ﺳﺎﺧﺘﺎر ‪ 2FCB‬ﻫﺴﺘﻨﺪ‪ .‬اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز در ﻣﻮرد ﻓﺎﻳﻞ در زﻣﺎن ﭘﺮدازش آن در ﺳﺎﺧﺘﺎر‬
‫‪ FCB‬ﻗﺮار دارﻧﺪ ﻛﻪ داس از آﻧﻬﺎ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ و ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ ﺑﺎﻳﺪ ﺳﺎﺧﺘﻤﺎن دادهي ‪ FCB‬را در ﺑﺮﻧﺎﻣﻪ داﺷﺘﻪ ﺑﺎﺷﺪ‪ FCB .‬ﻳﻚ ﺳﺎﺧﺘﺎر ﺳﻠﺴﻠﻪﻣﺮاﺗﺒﻲ ﺑﺮاي ﻓﺎﻳﻠﻬﺎ‬
‫ﻧﻴﺴﺖ و ﻟﺬا ﺑﺎ اﻳﻦ روش ﻓﻘﻂ ﻣﻲﺗﻮان ﺑﻪ ﻓﺎﻳﻠﻬﺎي ﻓﻬﺮﺳﺖ ﺟﺎري دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد‪ .‬اﻣﺎ‪ ،‬وﺟﻮد ‪ FCB‬در ﺑﺮﻧﺎﻣﻪ‪ ،‬ﺑﺎﻋﺚ دﺳﺘﺮﺳﻲ آﺳﺎن و ﺳﺮﻳﻊ ﺑﻪ اﻃﻼﻋﺎت ﻓﺎﻳﻞ‪ ،‬ﻧﻈﻴﺮ‬
‫ﺗﺎرﻳﺦ‪ ،‬زﻣﺎن‪ ،‬و اﻧﺪازه و ﻏﻴﺮه ﻣﻲﺷﻮد‪ .‬ﺳﺎﺧﺘﻤﺎن داده ‪ 37 ،FCB‬ﺑﺎﻳﺖ ﺑﻮده و ﺣﺎوي اﻗﻼم اﻃﻼﻋﺎﺗﻲ زﻳﺮ اﺳﺖ‪:‬‬
‫‪Address‬‬ ‫‪Contents‬‬ ‫‪Size‬‬
‫‪+00H‬‬ ‫)‪Device name(0: A, 1:B ...‬‬ ‫‪1 byte‬‬
‫‪+01H‬‬ ‫‪File name‬‬ ‫‪8 bytes‬‬
‫‪+09H‬‬ ‫)‪File mode (extention‬‬ ‫‪3 bytes‬‬
‫‪+0CH‬‬ ‫‪Current block number‬‬ ‫‪1 word‬‬
‫‪+0EH‬‬ ‫‪Data record size‬‬ ‫‪1 word‬‬
‫‪+10H‬‬ ‫‪File size‬‬ ‫‪2 words‬‬
‫‪+14H‬‬ ‫‪Modification date‬‬ ‫‪1 word‬‬
‫‪+16H‬‬ ‫‪Modification time‬‬ ‫‪1 word‬‬
‫‪+18H‬‬ ‫‪Reserved‬‬ ‫‪1 word‬‬
‫‪+20H‬‬ ‫‪Current data record number‬‬ ‫‪1 byte‬‬
‫‪+21H‬‬ ‫‪Data record no. for random access 2 words‬‬

‫ﻧﺸﺎﻧﻲ ‪ FCB‬در زوج ﺛﺒﺎت ‪ ES:DI‬ﺑﻪ ﺗﺎﺑﻊ ‪ 29H‬ﻛﻪ در اداﻣﻪ ذﻛﺮ ﻣﻲﺷﻮد‪ ،‬ارﺳﺎل ﻣﻲﺷﻮد‪ ،‬ﺗﺎ ‪ FCB‬را ﺑﻪ ﻳﻚ ﻓﺎﻳﻞ ﻛﻪ ﻧﺎم آن در ‪ DS:SI‬ﻗﺮار داده‬
‫ﻣﻲﺷﻮد‪ ،‬ﻣﺮﺗﺒﻂ ﻣﻲﻛﻨﺪ‪.‬‬
‫اﻣﺎ ﺗﻮاﺑﻊ ‪ FCB‬ﻋﺒﺎرﺗﻨﺪ از‪:‬‬
‫‪Function‬‬ ‫‪Purpose‬‬
‫‪0FH:‬‬ ‫‪Open file‬‬
‫‪10H:‬‬ ‫‪Close file‬‬
‫‪13H:‬‬ ‫‪Delete file‬‬
‫‪14H:‬‬ ‫‪Sequential read‬‬
‫‪15H:‬‬ ‫‪Sequential write‬‬
‫‪16H:‬‬ ‫‪Create file‬‬
‫‪17H:‬‬ ‫‪Rename file‬‬
‫‪1AH:‬‬ ‫‪Set DTA* address‬‬
‫‪21H:‬‬ ‫)‪Random read (of record‬‬
‫‪22H:‬‬ ‫)‪Random write (of record‬‬
‫‪23H:‬‬ ‫‪Determine file size‬‬
‫‪24H:‬‬ ‫‪Set record number for random access‬‬

‫_________________________________________________________________________________‬
‫‪handle function ١‬‬
‫‪File Control Block ٢‬‬
‫‪2-19‬‬ ‫ﻓﺼﻞ ‪ :19‬ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻞ در داس‬

‫‪27H:‬‬ ‫‪Random read‬‬


‫‪28H:‬‬ ‫‪Random write‬‬
‫‪29H:‬‬ ‫‪Enter file name into FCB‬‬

‫* ﺑﺮاي ﻓﺎﻳﻠﻬﺎي داراي رﻛﻮرد ﺑﺰرﮔﺘﺮ از ‪ 128‬ﺑﺎﻳﺖ‪ ،‬ﺑﺎﻳﺪ ﻳﻚ ﺑﺎﻓﺮ ﺑﺮاي رﻛﻮرد ﺑﻪ ﻋﻨﻮان ‪ 1DTA‬ﻣﺸﺨﺺ ﺷﻮد‪ ،‬ﺗﺎ ﺑﻪ ﺟﺎي ‪ DTA‬ﭘﻴﺶﻓﺮض‪ ،‬اﺳﺘﻔﺎده‬
‫ﺷﻮد‪.‬‬

‫‪ 3-19‬ﺗﻮاﺑﻊ دﺳﺘﻪ‬
‫در داس ﻧﮕﺎرش ‪ 2.0‬ﺑﻪ ﺑﻌﺪ‪ ،‬اﻳﻦ ﻣﻔﻬﻮم ﻣﻌﺮﻓﻲ ﺷﺪ و ﻫﻤﺎن ﻣﻔﻬﻮﻣﻲ اﺳﺖ ﻛﻪ در ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ Unix‬ﻫﻢ وﺟﻮد دارد‪ .‬ﺑﻪ ازاي ﻫﺮ ﻓﺎﻳﻞ در ﻣﻮﻗﻊ ﺑﺎزﻛﺮدن‬
‫آن ﻳﻚ دﺳﺘﻪ)ﻳﻚ ﺷﻤﺎرهي ﻋﺪدي( ﺑﺮﮔﺮداﻧﺪه ﻣﻲﺷﻮد ﻛﻪ ﺑﺮاي ارﺟﺎﻋﺎت ﺑﻌﺪي ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد و ﻣﺸﻜﻞ ﺗﻮاﺑﻊ ‪ FCB‬را ﻧﺪارد‪ .‬ﻳﻌﻨﻲ ﻣﻲﺗﻮان ﺑﻪ ﻓﺎﻳﻠﻬﺎي‬
‫ﻣﻮﺟﻮد در ﻓﻬﺮﺳﺘﻬﺎ دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد و ﺳﺎﺧﺘﺎر ﺳﻠﺴﻠﻪﻣﺮاﺗﺒﻲ ﻓﺎﻳﻠﻬﺎ ﻧﻴﺰ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﺷﻮد‪.‬‬

‫اﻳﻦ روش ﻧﻴﺎزﻣﻨﺪ ﻧﮕﻬﺪاري ﺳﺎﺧﺘﻤﺎن دادهي ‪ FCB‬در ﺑﺮﻧﺎﻣﻪ ﻧﻴﺴﺖ‪ .‬ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ‪ ،‬اﻃﻼﻋﺎﺗﻲ را ﺑﻪازاي ﻫﺮ ﻓﺎﻳﻞ ﭘﺲ از ﺑﺎزﻛﺮدن آن در ﺑﺎﻓﺮﻫﺎي داﺧﻠﻲ‬
‫ﺧﻮد ﻧﮕﻬﺪاري ﻣﻲﻛﻨﺪ‪ .‬ﺑﻪ اﻳﻦ دﻟﻴﻞ در ﺑﺎزﻛﺮدن ﻓﺎﻳﻠﻬﺎ ﻣﺤﺪودﻳﺖ وﺟﻮد دارد‪ .‬ﺗﻌﺪاد ﻓﺎﻳﻠﻬﺎي ﺑﺎز را ﻣﻲﺗﻮان در ‪ CONFIG.SYS‬ﺑﺎ ﻣﺘﻐﻴﺮ ‪ FILES‬ﻣﺸﺨﺺ ﻧﻤﻮد‪ ،‬ﻛﻪ‬
‫ﺣﺪاﻛﺜﺮ ﻣﻲﺗﻮاﻧﺪ ‪ 255‬ﺑﺎﺷﺪ‪:‬‬

‫‪FILES=n‬‬
‫ﺗﻮاﺑﻊ دﺳﺘﻪاي ﻛﻪ در ﺑﺨﺶ ﻗﺒﻞ ﻣﻌﺮﻓﻲ ﺷﺪ‪ ،‬ﻫﻢ ﺑﺎ ﻟﻮازم ورودي‪-‬ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد و ﻫﻢ ﺑﺎ ﻓﺎﻳﻠﻬﺎ ﻛﺎر ﻣﻲﻛﻨﻨﺪ‪:‬‬

‫‪Function‬‬ ‫‪Purpose‬‬
‫‪3CH:‬‬ ‫‪Create file‬‬
‫‪3DH:‬‬ ‫‪Open file‬‬
‫‪3EH:‬‬ ‫‪Close file‬‬
‫‪42H:‬‬ ‫‪Move file pointer/determine file size‬‬
‫‪43H:‬‬ ‫‪Read/write file attribute‬‬
‫‪56H:‬‬ ‫‪Rename file‬‬
‫‪57H/00H:‬‬ ‫‪Read write modification and date/time of file‬‬
‫‪57H/01H:‬‬ ‫‪Read write modification and date/time of file‬‬
‫‪5AH:‬‬ ‫‪Create temporary file‬‬
‫‪5BH:‬‬ ‫‪Create new file‬‬
‫‪5CH/00H:‬‬ ‫‪Release protected file range‬‬
‫‪5CH:‬‬ ‫‪Extended open function‬‬

‫_________________________________________________________________________________‬
‫‪Disk Transfer Area ١‬‬
‫ﻓﺼﻞ ‪ :20‬دﺳﺘﺮﺳﻲ ﺑﻪ ﻓﻬﺮﺳﺖ داس‬
‫)‪(Accessing DOS Directory‬‬

‫‪ 1-20‬ﻣﻘﺪﻣﻪ‬
‫ﺗﻌﺪادي از ﺗﻮاﺑﻊ داس ﺑﺮاي ﻛﺎرﻛﺮدن ﺑﺎ ﻓﻬﺮﺳﺖ‪ 1‬و ﺟﺴﺘﺠﻮي ﻓﺎﻳﻠﻬﺎ‪ 2‬ﻫﺴﺘﻨﺪ‪ .‬ﺳﺎﺧﺘﺎر ﺳﻠﺴﻠﻪﻣﺮاﺗﺒﻲ ﻓﺎﻳﻠﻬﺎ و ﻓﻬﺮﺳﺖ‪ ،‬در ‪ DOS 2.0‬ﻣﻌﺮﻓﻲ ﺷﺪ و ﺑﻪ اﻳﻦ‬
‫وﺳﻴﻠﻪ ﻣﻲﺗﻮان دﻳﺴﻚ را ﺑﻪ ﻓﻬﺮﺳﺘﻬﺎﻳﻲ ﺑﻪﺻﻮرت ﻣﻨﻄﻘﻲ ﺗﻘﺴﻴﻢ ﻧﻤﻮد و ﺳﺎﺧﺘﺎر درﺧﺖ ﻓﻬﺮﺳﺖ‪ 3‬را اﻳﺠﺎد ﻛﺮد‪:‬‬

‫‪root directory‬‬
‫\‬

‫‪COMMAND.COM‬‬ ‫‪AUTOEXEC.BAT‬‬ ‫‪COMPILERS‬‬ ‫‪....‬‬

‫‪BorlandC‬‬ ‫‪BPascal‬‬

‫در درﺧﺖ ﻓﻬﺮﺳﺖ‪ ،‬ﺗﻌﺪاد زﻳﺮﻓﻬﺮﺳﺘﻬﺎ‪ 4‬ﺑﻪﺻﻮرت ﭘﻮﻳﺎ ﺗﻐﻴﻴﺮ ﻣﻲﻛﻨﺪ‪ .‬ﻟﺬا ﺗﻮاﺑﻊ زﻳﺮ ﻣﻮرد ﻧﻴﺎز اﺳﺖ‪:‬‬

‫‪ (1‬اﺿﺎﻓﻪ ﻛﺮدن ورودي‪ ،5‬ﻣﻌﺎدل ﻓﺮﻣﺎن ‪ MD‬در ﻣﺤﻴﻂ ﻓﺮﻣﺎن داس‪ :‬ﺗﺎﺑﻊ ‪ 39H‬وﻗﻔﻪي ‪21H‬‬
‫‪ (2‬ﺣﺬف ﻛﺮدن ورودي‪ ،‬ﻣﻌﺎدل ﻓﺮﻣﺎن ‪ RD‬در ﻣﺤﻴﻂ ﻓﺮﻣﺎن داس‪ :‬ﺗﺎﺑﻊ ‪ 3AH‬وﻗﻔﻪي ‪21H‬‬
‫‪ (3‬ﺗﻐﻴﻴﺮ ﻓﻬﺮﺳﺖ ﺟﺎري‪ ،‬ﻣﻌﺎدل ﻓﺮﻣﺎن ‪ CD‬در ﻣﺤﻴﻂ ﻓﺮﻣﺎن داس‪ :‬ﺗﺎﺑﻊ ‪ 3BH‬وﻗﻔﻪي ‪21H‬‬
‫‪ (4‬ﺗﻐﻴﻴﺮ دﻳﺴﻚ دراﻳﻮ ﭘﻴﺶﻓﺮض‪ ،‬ﻣﻌﺎدل ‪ A:‬ﻳﺎ ‪ C:‬در ﻣﺤﻴﻂ ﻓﺮﻣﺎن داس‪ :‬ﺗﺎﺑﻊ ‪ 0EH‬وﻗﻔﻪي ‪21H‬‬
‫در ﻣﻮﻗﻊ ﻓﺮﻣﺖ ﻛﺮدن ﻫﺮ دﻳﺴﻜﺖ‪ ،‬ﺑﺨﺸﻬﺎي ‪ 19‬ﺗﺎ ‪ 32‬ﺑﻪ ﻓﻬﺮﺳﺖ رﻳﺸﻪ ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮد و در ﻫﺮ ﺑﺨﺶ‪ ،‬اﻃﻼﻋﺎت ‪ 15‬ورودي ﻓﻬﺮﺳﺖ ﻧﮕﻬﺪاري‬
‫ﻣﻲﺷﻮد‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺮ روي ﻓﻬﺮﺳﺖ رﻳﺸﻪ ﻣﻲﺗﻮان ﺣﺪاﻛﺜﺮ ‪ 210‬ﻓﺎﻳﻞ ﻧﮕﻬﺪاري ﻧﻤﻮد‪ .‬در ﻣﻮرد دﻳﺴﻚ ﺳﺨﺖ ﻫﻢ ﺑﻪ ﺻﻮرﺗﻲ ﻣﺸﺎﺑﻪ اﺳﺖ و در ﻫﺮ ﺣﺎل در ﻣﻮرد ﺗﻌﺪاد‬
‫ﻓﺎﻳﻠﻬﺎ در ﻓﻬﺮﺳﺖ رﻳﺸﻪ ﻣﺤﺪودﻳﺖ وﺟﻮد دارد )از ﺑﺮﻧﺎﻣﻪي ‪ Norton DiskEdit‬ﻣﻲﺗﻮان ﺑﺮاي دﻳﺪن اﻃﻼﻋﺎت ﻓﻬﺮﺳﺘﻬﺎ اﺳﺘﻔﺎده ﻧﻤﻮد(‪ .‬در ﻫﺮ ورودي ﻓﻬﺮﺳﺖ‪،‬‬
‫اﻃﻼﻋﺎﺗﻲ ﻧﻈﻴﺮ ﻣﻮارد زﻳﺮ در ﻣﻮرد ﻓﺎﻳﻠﻬﺎ وﺟﻮد دارد‪:‬‬

‫‪Name(8 char) Ext(3 char) Attribute(1 byte) Date Time ... First Cluster of File in FAT‬‬
‫ﺑﻪ ازاي ﻫﺮ زﻳﺮﻓﻬﺮﺳﺖ‪ ،‬ﻳﻚ ﻓﺎﻳﻞ ﺑﺮ روي دﻳﺴﻚ ﻧﮕﻬﺪاري ﻣﻲﺷﻮد‪ ،‬و ﻫﻤﺎن ﺳﺎﺧﺘﺎر ﻓﻮق ﺑﺮاي ﻓﺎﻳﻠﻬﺎ در آن ﻧﻴﺰ رﻋﺎﻳﺖ ﻣﻲﺷﻮد‪ .‬وﻟﻲ در ﻣﻮرد زﻳﺮﻓﻬﺮﺳﺘﻬﺎ‪،‬‬
‫ﻣﺤﺪودﻳﺘﻲ در ﻣﻮرد ﺗﻌﺪاد ﻓﺎﻳﻠﻬﺎ در آن ﻧﺪارﻳﻢ‪.‬‬

‫ﺗﺎﺑﻊ ‪ 47H‬ﺑﺮاي ﻳﺎﻓﺘﻦ داﻳﺮﻛﺘﻮري ﺟﺎري اﺳﺖ و ﻣﺴﻴﺮ ﻛﺎﻣﻞ‪ 6‬ﻓﻬﺮﺳﺖ ﺟﺎري را ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ .‬دراﻳﻮ ﻣﻮردﻧﻈﺮ ﺑﺎﻳﺪ در ﺛﺒﺎت ‪ DL‬ﻣﺸﺨﺺ ﺷﻮد‪:‬‬

‫‪DL=0‬‬ ‫‪:‬‬ ‫‪Current directory‬‬


‫‪DL=1‬‬ ‫‪:‬‬ ‫‪A:‬‬
‫‪DL=2‬‬ ‫‪:‬‬ ‫‪B:‬‬
‫‪DL=3‬‬ ‫‪:‬‬ ‫‪C:‬‬
‫‪...‬‬

‫‪ 2-20‬ﺟﺴﺘﺠﻮي ﻓﺎﻳﻠﻬﺎ‬
‫دو دﺳﺘﻪ ﺗﺎﺑﻊ ﺑﺮاي ﺟﺴﺘﺠﻮي ﻓﺎﻳﻠﻬﺎ وﺟﻮد دارد‪:‬‬
‫_________________________________________________________________________________‬
‫‪directory ١‬‬
‫‪file search ٢‬‬
‫‪directory tree ٣‬‬
‫‪subdirectory ٤‬‬
‫‪entry ٥‬‬
‫‪full path ٦‬‬
‫‪2-19‬‬ ‫ﻓﺼﻞ ‪ :19‬ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻞ در داس‬

‫‪ (1‬ﺗﻮاﺑﻊ ‪ : FCB‬ﺗﺎﺑﻊ ‪ 11H‬ﺑﺮاي ﻳﺎﻓﺘﻦ ﻧﺨﺴﺘﻴﻦ ﻓﺎﻳﻞ)‪ (FindFirst‬و ﺗﺎﺑﻊ ‪ 12H‬ﺑﺮاي ﻳﺎﻓﺘﻦ ﺑﻌﺪي)‪(FindNext‬‬
‫‪ (2‬ﺗﻮاﺑﻊ دﺳﺘﻪ‪ :‬ﺗﺎﺑﻊ ‪ 4EH‬ﺑﺮاي ﻳﺎﻓﺘﻦ ﻧﺨﺴﺘﻴﻦ ﻓﺎﻳﻞ)‪ (FindFirst‬و ﺗﺎﺑﻊ ‪ 4FH‬ﺑﺮاي ﻳﺎﻓﺘﻦ ﺑﻌﺪي)‪(FindNext‬‬

‫ﺟﺴﺘﺠﻮ ﺑﺮاي ﻓﺎﻳﻠﻬﺎ ﺑﺮاﺳﺎس ﻣﺸﺨﺼﻪ‪ 1‬آن و ﻧﻴﺰ ﻳﻚ اﻟﮕﻮ‪ (*.TXT) 2‬اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬ﺑﻪ ازي ﻫﺮ ﻓﺎﻳﻞ در ورودي ﻓﻬﺮﺳﺖ‪ ،‬ﻳﻚ ﺑﺎﻳﺖ ﺑﻪﻋﻨﻮان ﻣﺸﺨﺼﻪ‬
‫وﺟﻮد دارد ﻛﻪ در ﺟﺴﺘﺠﻮ ﻣﻮرد ﻣﻘﺎﻳﺴﻪ ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬اﻧﻮاع ﻣﺸﺨﺼﻪي ﻓﺎﻳﻠﻬﺎ ﺑﻪﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬

‫‪Bit‬‬ ‫‪Attribute‬‬ ‫‪Meaning if set‬‬


‫‪0‬‬ ‫‪Read-Only‬‬ ‫‪File is Read-Only‬‬
‫‪1‬‬ ‫‪Hidden‬‬ ‫)‪File is hidden (invisible to DIR command‬‬
‫‪2‬‬ ‫‪System‬‬ ‫‪File is part of operating system‬‬
‫‪3‬‬ ‫‪Volume label‬‬ ‫‪Entry is volume label and not a file‬‬
‫‪4‬‬ ‫‪Subdirectory‬‬ ‫‪Entry is subdirectory and not a file‬‬
‫‪5‬‬ ‫‪Archive‬‬ ‫‪Entry is archive‬‬
‫‪6‬‬ ‫‪Reserved‬‬ ‫‪Reserved for later implementation‬‬
‫‪7‬‬ ‫‪Reserved‬‬ ‫‪Reserved for later implementation‬‬
‫در ﺟﺴﺘﺠﻮي ﻓﺎﻳﻠﻬﺎ ﺑﺎﻳﺪ ﻣﺸﺨﺼﻪي ﻓﺎﻳﻠﻬﺎي ﻣﻮرد ﻧﻈﺮ داده ﺷﻮد‪ .‬دﺳﺘﻮر ‪ DIR‬داس ﻧﻴﺰ در ﺣﻘﻴﻘﺖ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ FindFirst‬و ﺳﭙﺲ ﻓﺮاﺧﻮاﻧﻲ ﺗﻜﺮاري‬
‫‪ FindNext‬ﺗﺎ رﺳﻴﺪن ﺑﻪ ﺧﻄﺎ )‪ ،(CF=1‬اﺳﺖ‪ .‬در دﺳﺘﻮر ‪ DIR‬ﺑﺪون ﺳﻮﺋﻴﭻﻫﺎي اﺿﺎﻓﻲ)ﻣﺜﻞ ‪ /H‬و‪ (...‬ﻓﺎﻳﻠﻬﺎ و ﻓﻬﺮﺳﺘﻬﺎي ‪ Non-Hidden‬ﻧﺸﺎن داده ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫* روﺷﻲ ﻛﻪ در ‪ Win95‬ﺑﺮاي ﭘﻴﺎدهﺳﺎزي ﻧﺎم ﻃﻮﻻﻧﻲ ﻓﺎﻳﻠﻬﺎ‪ 3‬اﺳﺘﻔﺎده ﺷﺪه‪ ،‬اﺳﺘﻔﺎده از ﻫﻤﻴﻦ ﺑﺎﻳﺖ ﻣﺸﺨﺼﻪ ﻓﺎﻳﻠﻬﺎ در ﻓﻬﺮﺳﺘﻬﺎ اﺳﺖ‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻪ در‬
‫ﻧﺨﺴﺘﻴﻦ ورودي‪ ،‬ﺑﺨﺸﻲ از ﻧﺎم ﺑﺎ ﻣﺸﺨﺼﻪي ﻋﺎدي و اداﻣﻪي ﻧﺎم در ورودﻳﻬﺎي دﻳﮕﺮ ﺑﺎ ﻣﺸﺨﺼﻪي رزرو اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻧﺎم ﻓﺎﻳﻞ‬
‫‪ PCSystemProgramming.TXT‬ﺑﺎﺷﺪ‪ ،‬ﺗﻘﺮﻳﺒﺎً ﺑﻪﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد‪:‬‬
‫~‬
‫‪1st entry with normal attribute:‬‬ ‫‪PCSyst 1.TXT‬‬
‫‪2nd entry with reserved attribute:‬‬ ‫‪emProgra.---‬‬
‫‪3rd entry with reserved attribute:‬‬ ‫‪mming.---‬‬

‫_________________________________________________________________________________‬
‫‪attribute ١‬‬
‫‪wildcard ٢‬‬
‫‪long file name ٣‬‬
‫ﻓﺼﻞ ‪ :22‬ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ‬
‫)‪(RAM Management‬‬

‫‪ 1-22‬ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪي داس‬


‫ﻳﻜﻲ از وﻇﺎﻳﻒ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ‪ ،‬ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ اﺳﺖ‪ .‬در ﻫﺮ زﻣﺎن ﻣﻤﻜﻦ اﺳﺖ ﭼﻨﺪﻳﻦ ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﻨﺪ‪ ،‬ﻫﻤﺎﻧﻨﺪ‪ :‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‪،1‬‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬و ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﺎرﺑﺮدي‪ ،‬ﻛﻪ ﺑﺎ ﻫﻢ ﻛﺎر ﻣﻲﻛﻨﻨﺪ‪ .‬وﻟﻲ ﻧﺒﺎﻳﺪ در ﺣﺎﻓﻈﻪي ﻣﻮرد اﺳﺘﻔﺎدهي ﻫﻤﺪﻳﮕﺮ ﺗﺪاﺧﻞ داﺷﺘﻪ ﺑﺎﺷﻨﺪ‪ .‬ﻛﻞ ﺑﺤﺚ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در داس‪،‬‬
‫ﻣﺒﺘﻨﻲ اﺳﺖ ﺑﺮ اﺳﺘﻔﺎده از ﻳﻚ ﺗﺎﺑﻊ داس ﺑﺮاي ﺗﺨﺼﻴﺺ ﻳﻚ ﺑﻠﻮك ﺣﺎﻓﻈﻪ ﺑﺎ اﻧﺪازهي از ﻗﺒﻞ ﻣﺸﺨﺺ ﺷﺪه‪ .‬ﻳﻚ ﺑﻠﻮك از ﺣﺎﻓﻈﻪ ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮد و‬
‫ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺗﻮﺳﻂ ﺗﺎﺑﻊ دﻳﮕﺮي آزاد ﻧﺸﻮد‪ ،‬ﻗﺎﺑﻞ ﺗﺨﺼﻴﺺ ﺗﻮﺳﻂ ﻫﻤﺎن ﺑﺮﻧﺎﻣﻪ ﻳﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي دﻳﮕﺮ ﻧﺨﻮاﻫﺪ ﺑﻮد‪.‬‬
‫ﺗﻮاﺑﻊ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪Function‬‬ ‫‪Purpose‬‬
‫‪48H‬‬ ‫‪Allocate memory‬‬
‫‪49H‬‬ ‫‪Free memory‬‬
‫‪4AH‬‬ ‫‪Change size of a memory block‬‬
‫‪58H‬‬ ‫‪Read/set memory management model‬‬
‫ﺧﻮد داس ﻫﻢ ﺑﻮﺳﻴﻠﻪي ﺗﺎﺑﻊ ‪ ،Exec‬ﺑﺮاي ﺑﺎرﻛﺮدن ﺑﺮﻧﺎﻣﻪﻫﺎ در ﺣﺎﻓﻈﻪ‪ ،‬ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ 48H‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ و ﭘﺲ از ﭘﺎﻳﺎن اﺟﺮاي‬
‫ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ 49H‬آﻧﺮا آزاد ﻣﻲﻛﻨﺪ‪ .‬ﻣﻘﺪار ﺣﺎﻓﻈﻪي ﺗﺨﺼﻴﺺ داده ﺷﺪه ﺑﻪ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﺑﺴﺘﮕﻲ دارد‪ .‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ .COM‬ﻛﻞ ﺣﺎﻓﻈﻪ رزرو ﻣﻲﺷﻮد و‬
‫ﭼﻨﺎﻧﭽﻪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻛﻞ ﺣﺎﻓﻈﻪ ﻧﻴﺎز ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﺑﺎﻳﺪ اﺑﺘﺪا ﻣﺎﺑﻘﻲ ﺣﺎﻓﻈﻪ را آزاد ﻧﻤﺎﻳﺪ‪ ،‬وﮔﺮﻧﻪ ﺣﺎﻓﻈﻪاي آزاد ﻧﺨﻮاﻫﺪ ﻣﺎﻧﺪ‪ .‬اﻣﺎ‪ ،‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ .EXE‬ﻣﻴﺰان ﺣﺎﻓﻈﻪاي ﻛﻪ‬
‫ﺗﻮﺳﻂ ﺗﺎﺑﻊ ‪ Exec‬ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮد‪ ،‬ﻫﻤﺎن ﻣﻘﺪاري اﺳﺖ ﻛﻪ در ﺳﺮآﻳﻨﺪ ﻓﺎﻳﻞ ‪ .EXE‬ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ‪ .‬اﮔﺮ ‪ Exec‬ﻧﺘﻮاﻧﺪ ﺑﻪ اﻧﺪازهي ﻣﺸﺨﺺ ﺷﺪه در ﺳﺮآﻳﻨﺪ‬
‫ﻓﺎﻳﻞ ‪ .EXE‬ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ دﻫﺪ‪ ،‬ﭘﻴﻐﺎم "‪ "Insufficent memory‬ﻳﺎ "‪ "Program too big to fit in memory‬داده و ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻧﻤﻲﻛﻨﺪ‪ .‬ﻋﻼوه‬
‫ﺑﺮ ﺣﺎﻓﻈﻪاي ﻛﻪ ‪ Exec‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎ ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ‪ ،‬ﺧﻮد ﺑﺮﻧﺎﻣﻪﻫﺎ ﻫﻢ ﻣﻲﺗﻮاﻧﻨﺪ ﺑﻪﻃﻮر ﭘﻮﻳﺎ ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ دﻫﻨﺪ‪.‬‬

‫ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﺎ ﺗﺎﺑﻊ ‪ :48H‬اﮔﺮ از ﻳﻚ زﺑﺎن ﺳﻄﺢ ﺑﺎﻻ ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ اﺳﺘﻔﺎده ﻣﻲﻛﻨﻴﻢ‪ ،‬ﻣﺸﻜﻠﻲ ﺑﺮاي ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﻧﺪارﻳﻢ‪ .‬زﻳﺮا‪ ،‬زﺑﺎﻧﻬﺎي‬
‫ﺳﻄﺢ ﺑﺎﻻ از ﻳﻚ ﺳﺎﺧﺘﺎر ‪ heap‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ و در اﺑﺘﺪا ﺑﻪ ﻣﻴﺰان ﻣﻮرد ﻧﻴﺎز‪ ،‬ﻛﻪ در ﺳﺮآﻳﻨﺪ ﻓﺎﻳﻞ ‪ .EXE‬ﻣﺸﺨﺺ ﻣﻲﺷﻮد‪ ،‬ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ داده و در ﺑﺮﻧﺎﻣﻪ ﺑﺎ روش‬
‫ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪي ﻣﺴﺘﻘﻞ از ﺗﻮاﺑﻊ داس‪ ،‬آﻧﺮا ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺗﺨﺼﻴﺺ ﻣﻲدﻫﻨﺪ‪ ،‬و دﺳﺘﻮرات ﻣﺮﺑﻮط ﺑﻪ ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪي ﭘﻮﻳﺎ‪ ،‬از اﻳﻦ ﺣﺎﻓﻈﻪي ‪ heap‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪ .‬اﻣﺎ‪ ،‬در‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎي زﺑﺎن اﺳﻤﺒﻠﻲ‪ ،‬ﺑﺎﻳﺪ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ را ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ‪ 48H‬اﻧﺠﺎم دﻫﺪ‪ .‬ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ ﺗﺎﺑﻊ ﺑﺎﻳﺪ اﻧﺪازهي ﺑﻠﻮك ﺣﺎﻓﻈﻪ در ﺛﺒﺎت ‪BX‬‬
‫ﻣﺸﺨﺺ ﺷﻮد‪ ،‬ﻛﻪ ﺑﺮاﺳﺎس ﭘﺎراﮔﺮاف)‪ 16‬ﺑﺎﻳﺖ( اﺳﺖ و ﻣﻲﺗﻮاﻧﺪ ﺣﺪاﻗﻞ ‪ 16) 1H‬ﺑﺎﻳﺖ( و ﺣﺪاﻛﺜﺮ ‪) 1111H‬ﻳﻚ ﻗﻄﻌﻪي ‪ (64KB‬ﺑﺎﺷﺪ‪ .‬در ﺑﺎزﮔﺸﺖ‪ ،‬ﺛﺒﺎت ‪AX‬‬
‫ﺣﺎوي ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ ﺑﻠﻮك ﺣﺎﻓﻈﻪي ﺗﺨﺼﻴﺺ داده ﺷﺪه اﺳﺖ‪ .‬ﻣﺜﻼً اﮔﺮ ﻳﻚ ﭘﺎراﮔﺮاف ﺣﺎﻓﻈﻪ درﺧﻮاﺳﺖ ﺷﻮد‪ ،‬ﺑﻠﻮك ﺗﺨﺼﻴﺺ داده ﺷﺪه‪ ،‬در ﻣﺤﺪودهي ‪ AX:0000‬ﺗﺎ‬
‫‪ AX:000F‬ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬

‫ﺗﻌﻴﻴﻦ ﻣﻴﺰان ﺣﺎﻓﻈﻪي ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ‪ :‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻣﻲﺗﻮان از ﻫﻤﺎن ﺗﺎﺑﻊ ‪ 48H‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﻣﻘﺪار ‪ (16*64KB) 0FFFFH‬در ‪BX‬‬
‫ﻗﺮار داده ﺷﺪه و ﺳﭙﺲ ‪ 48H‬ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد‪ .‬در ﭘﺎﺳﺦ ﭼﻮن داس ﻧﻤﻲﺗﻮاﻧﺪ اﻳﻦ ﻣﻘﺪار ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ دﻫﺪ‪ ،‬در ‪ BX‬ﺗﻌﺪاد ﭘﺎراﮔﺮاﻓﻬﺎي آزاد را ﺑﺮﻣﻲﮔﺮداﻧﺪ‪.‬‬

‫ﺗﺎﺑﻊ ‪ :4AH‬اﻳﻦ ﺗﺎﺑﻊ اﻧﺪازهي ﻳﻚ ﺑﻠﻮك ازﻗﺒﻞ ﺗﺨﺼﻴﺺ داده ﺷﺪه را ﺗﻐﻴﻴﺮ ﻣﻲدﻫﺪ‪ .‬ﺑﺮاي ﻛﻢﻛﺮدن اﻧﺪازهي ﺑﻠﻮك‪ ،‬ﻣﺸﻜﻠﻲ ﭘﻴﺶ ﻧﻤﻲآﻳﺪ‪ .‬اﻣﺎ ﺑﺮاي‬
‫اﻓﺰاﻳﺶ آن‪ ،‬ﺑﻪ دﻟﻴﻞ آﻧﻜﻪ ﻣﻤﻜﻦ اﺳﺖ اداﻣﻪي ﺣﺎﻓﻈﻪ‪ ،‬ﺗﻮﺳﻂ ﺳﺎﻳﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺗﺨﺼﻴﺺ داده ﺷﺪه ﺑﺎﺷﺪ‪ ،‬ﻣﻤﻜﻦ اﺳﺖ اﻣﻜﺎن اﻓﺰاﻳﺶ وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬در اﻳﻦ ﺻﻮرت‬
‫‪ CF=1‬ﺷﺪه ﻛﻪ ﻧﺸﺎﻧﮕﺮ وﻗﻮع ﺧﻄﺎ اﺳﺖ و در ﺛﺒﺎت ‪ ،BX‬اﻧﺪازهي ﻗﺎﺑﻞ اﻓﺰاﻳﺶ ﺑﺮﮔﺮداﻧﺪه ﻣﻲﺷﻮد‪.‬‬

‫ﺗﺎﺑﻊ ‪ :58H‬اﺳﺘﺮاﺗﮋيﻫﺎي ﻣﺨﺘﻠﻒ ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ‪ 2‬را ﻣﻲﺗﻮان ﺑﺎ اﻳﻦ ﺗﺎﺑﻊ ﺗﻨﻈﻴﻢ ﻧﻤﻮد‪ .‬اﻧﻮاع اﺳﺘﺮاﺗﮋيﻫﺎ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬
‫‪First Fit: Use first memory block large enough‬‬
‫‪Best Fit: Use smallest memory block large enough‬‬
‫‪Last Fit: Use high part of last usable memory block‬‬

‫_________________________________________________________________________________‬
‫‪device drivers ١‬‬
‫‪allocation strategy ٢‬‬
‫‪2-22‬‬ ‫ﻓﺼﻞ ‪ :22‬ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ‬

‫‪ 2-22‬اﻧﻮاع ﺣﺎﻓﻈﻪي ﻗﺎﺑﻞ ﺗﺨﺼﻴﺺ‬


‫ﺗﺎ ﻧﮕﺎرش ‪ ،DOS 5.0‬ﻛﻞ ﺣﺎﻓﻈﻪاي ﻛﻪ ﺗﺎﺑﻊ ‪ 48H‬ﺑﻪ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺗﺨﺼﻴﺺ ﻣﻲداد‪ ،‬ﻣﺤﺪود ﺑﻪ ‪ 640K‬ﺣﺎﻓﻈﻪي ﻣﺘﻌﺎرف ﺑﻮد‪ .‬اﻣﺎ ‪ DOS 5.0‬ﺑﻪ ﺑﻌﺪ‪،‬‬
‫اﻣﻜﺎن ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪي ﺑﻴﻦ ‪ 640KB‬و ‪ 1MB‬را ﺗﺤﺖ ﻋﻨﻮان ‪ (Upper Memory Block) UMB‬ﻓﺮاﻫﻢ ﻧﻤﻮد‪ .‬اﻳﻦ ﻫﻤﺎن ﻣﺤﺪودهاي اﺳﺖ ﻛﻪ ﻣﻮرد‬
‫اﺳﺘﻔﺎدهي ‪ EMS‬ﻗﺮار ﻣﻲﮔﻴﺮد‪ ،‬ﻳﻌﻨﻲ ‪ ،EMS page frame‬ﻛﻪ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﺑﺮﻧﺎﻣﻪاي ﻣﺜﻞ ‪ EMM386.EXE‬ﻧﺼﺐ ﺷﺪه ﺑﺎﺷﺪ‪ ،‬ﺗﺎ اﻣﻜﺎن اﺳﺘﻔﺎده از‬
‫‪ XM‬را در اﻳﻦ ﻣﺤﺪوده ﻓﺮاﻫﻢ ﻧﻤﺎﻳﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ در ‪ CONFIG.SYS‬دﺳﺘﻮر ‪ DOS=HIGH, UMB‬ﻗﺮار ﮔﺮﻓﺘﻪ ﺑﺎﺷﺪ‪ .‬در ﺻﻮرت ﺑﻮدن اﻳﻦ ﻓﺮﻣﺎﻧﻬﺎ‬
‫در ‪ ،CONFIG.SYS‬داس ﭼﻚ ﻣﻲﻛﻨﺪ ﻛﻪ ﮔﺮداﻧﻨﺪهي ‪ ،XMS‬ﻳﻌﻨﻲ ‪ ،HIMEM.SYS‬ﻧﺼﺐ ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ؟ در ﺻﺮوت ﻧﺼﺐ ﺑﻮدن ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از‬
‫ﻓﺮﻣﺎن ‪ DEVICEHIGH‬ﻳﺎ ‪ LOADHIGH‬ﻣﻲﺗﻮان ﺑﺮﻧﺎﻣﻪﻫﺎ را در ‪ UMB‬ﺑﺎرﻧﻤﻮد‪ .‬اﻟﺒﺘﻪ اﻳﻦ ﺑﻪ آزاد ﺑﻮدن ‪ UMBs‬ﺑﺴﺘﮕﻲ ﺧﻮاﻫﺪ داﺷﺖ و ﭼﻨﺎﻧﭽﻪ ﺑﻪ ﻣﻘﺪار‬
‫ﻣﻮرد ﻧﻴﺎز در ‪ UMBs‬ﺣﺎﻓﻈﻪ آزاد ﻧﺒﺎﺷﺪ‪ ،‬ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪي ﻣﺘﻌﺎرف ﺑﺎر ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬

‫‪ 3-22‬اﺳﺘﻔﺎده از ‪UMB‬‬
‫ﺑﺮاي اﺳﺘﻔﺎده از ‪ UMBs‬در ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪي ﻣﻌﻤﻮﻟﻲ و در ﺻﻮرت ﻓﻌﺎل ﺷﺪن ‪ UMB‬در ‪ ،CONFIG.SYS‬ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ 48H‬ﻣﻤﻜﻦ اﺳﺖ‬
‫ﻳﻚ ﺑﻠﻮك ﺣﺎﻓﻈﻪ ﻛﻪ ﺟﺰو ‪ UMBs‬اﺳﺖ ﺑﺮﮔﺮداﻧﺪه ﺷﻮد‪ ،‬ﻳﺎ آﻧﻜﻪ ﺟﺰو ﺣﺎﻓﻈﻪي ﻣﺘﻌﺎرف ﺑﺎﺷﺪ‪ .‬ﺑﺮاي ﺗﺸﺨﻴﺺ اﻳﻨﻜﻪ ﺑﻠﻮك ﺑﺮﮔﺮداﻧﺪه ﺷﺪه‪ UMB ،‬اﺳﺖ ﻳﺎ ﻣﺘﻌﺎرف‪،‬‬
‫ﻛﺎﻓﻲ اﺳﺖ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪي ﺑﺮﮔﺮداﻧﺪه ﺷﺪه در ‪ AX‬ﭼﻚ ﺷﻮد‪ .‬اﮔﺮ ﺑﺎﻻﺗﺮ از ‪ A000H‬ﺑﺎﺷﺪ‪ UMB ،‬اﺳﺖ‪ .‬زﻳﺮﺗﻮاﺑﻊ ﺗﺎﺑﻊ ‪ ،58H‬ﻛﺎرﻫﺎي ﻣﻮرد ﻧﻴﺎز در اﻳﻦ زﻣﻴﻨﻪ را‬
‫اﻧﺠﺎم ﻣﻲدﻫﻨﺪ‪ .‬اﻣﺎ ﻛﺎر اﺻﻠﻲ ‪ ،58H‬ﺗﻨﻄﻴﻢ ﻳﺎ ﺑﺮرﺳﻲ ﻣﺪل ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ اﺳﺖ‪:‬‬
‫‪Subfunction‬‬ ‫‪Description‬‬
‫‪00H‬‬ ‫‪Read memory model‬‬
‫‪01H‬‬ ‫‪Set memory model‬‬
‫‪02H‬‬ ‫‪Query UMB status‬‬
‫‪03H‬‬ ‫‪Set UMB status‬‬
‫ﻓﺼﻞ ‪ :23‬ﺗﺎﺑﻊ ‪Exec‬‬
‫)‪(The Exec Function‬‬

‫‪ 1-23‬ﻣﻘﺪﻣﻪ‬
‫ﺗﺎﺑﻊ ﺷﻤﺎرهي ‪ 4BH‬داس‪ ،‬داراي ﻧﺎم ‪ Exec‬اﺳﺖ‪ .‬اﻳﻦ ﺗﺎﺑﻊ در ﺣﻘﻴﻘﺖ ﺑﺎرﻛﻨﻨﺪه‪ 1‬اﺳﺖ و ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ‪ 2‬اﺟﺎزه ﻣﻲدﻫﺪ ﻛﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻓﺮﻋﻲ‪ 3‬را‬
‫از دﻳﺴﻚ در ﺣﺎﻓﻈﻪ ﺑﺎر ﻧﻤﻮده و اﺟﺮا ﻛﻨﺪ‪ .‬در ﺻﻮرﺗﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪي ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ )‪ (TSR‬ﻧﺒﺎﺷﺪ‪ ،‬ﭘﺲ از ﭘﺎﻳﺎن اﺟﺮا‪ ،‬ﺣﺎﻓﻈﻪي اﺷﻐﺎل ﺷﺪه ﺑﻮﺳﻴﻠﻪي‬
‫آن‪ ،‬ﻛﻪ ﺑﻮﺳﻴﻠﻪي ‪ Exec‬ﺗﺨﺼﻴﺺ داده ﺷﺪه‪ ،‬آزاد ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ﻫﻢ ﻣﻲﺗﻮاﻧﺪ ﺑﺮﻧﺎﻣﻪي دﻳﮕﺮي را ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮده و اﺟﺮا ﻛﻨﺪ و در واﻗﻊ ﺧﻮدش ﻳﻚ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﺑﺎﺷﺪ‪ .‬اﻳﻦ روش ﺗﺎ ﺟﺎﻳﻲ ﻛﻪ ﺣﺎﻓﻈﻪ آزاد‬
‫ﺑﺎﺷﺪ‪ ،‬ﻣﻲﺗﻮاﻧﺪ اداﻣﻪ ﻳﺎﺑﺪ‪ .‬ﻳﻚ ﻣﺜﺎل اﺻﻠﻲ از اﺟﺮاي ‪ ،Exec‬ﺑﺮﻧﺎﻣﻪي ‪ COMMAN.COM‬اﺳﺖ‪ .‬وﻗﺘﻲ در ﺧﻂ ﻓﺮﻣﺎن‪ ،‬ﺗﺎﻳﭗ ﻣﻲﻛﻨﻴﻢ‪ BP ،BP‬درﺣﻘﻴﻘﺖ ﻳﻚ‬
‫ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ﻧﺴﺒﺖ ﺑﻪ ‪ COMMAND.COM‬ﺧﻮاﻫﺪ ﺑﻮد‪ .‬در داﺧﻞ ‪ BP‬ﻣﻲﺗﻮاﻧﻴﻢ ‪ DOS Shell‬ﻛﻨﻴﻢ‪ .‬در اﻳﻦ ﺻﻮرت‪ ،‬ﻳﻚ ﻧﺴﺨﻪي دﻳﮕﺮ از‬
‫‪ COMMAND.COM‬اﺟﺮا ﻣﻲﺷﻮد و اﻳﻦ ﻧﺴﺨﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ﻧﺴﺒﺖ ﺑﻪ ‪ BP‬ﻣﻲﺷﻮد‪ .‬در اﻳﻦ ﺷﺮاﻳﻂ در ﺧﻂ ﻓﺮﻣﺎن ﻣﻲﺗﻮاﻧﻴﻢ ﺑﺮﻧﺎﻣﻪﻫﺎي دﻳﮕﺮ را ﻓﺮاﺧﻮاﻧﻲ‬
‫ﻛﻨﻴﻢ‪ ،‬ﻛﻪ آﻧﻬﺎ ﻧﺴﺒﺖ ﺑﻪ ‪ ،COMMAND.COM‬ﻓﺮﻋﻲ ﺧﻮاﻫﻨﺪ ﺑﻮد‪...‬‬

‫‪COMMAND.COM‬‬ ‫‪Parent1‬‬
‫ﺑﺎزﮔﺸﺖ‬ ‫اﺟﺮاي ‪BP‬‬

‫‪BP‬‬
‫‪Child1 = Parent2‬‬
‫ﺑﺎزﮔﺸﺖ‬ ‫‪DOS Shell‬‬

‫‪COMMAND.COM‬‬
‫‪Child2 = Parent3‬‬
‫ﺑﺎزﮔﺸﺖ‬ ‫اﺟﺮاي ‪NC‬‬
‫‪NC‬‬
‫‪Child3‬‬

‫‪ 2-23‬ارﺗﺒﺎط ﺑﺮﻧﺎﻣﻪﻫﺎي اﺻﻠﻲ و ﻓﺮﻋﻲ‬


‫ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﻣﻲﺗﻮاﻧﺪ ﭘﺎراﻣﺘﺮﻫﺎﻳﻲ)ﻧﻈﻴﺮ ﺳﻮﺋﻴﭻﻫﺎي ﺧﻂ ﻓﺮﻣﺎن( را ﺑﻪ ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ارﺳﺎل ﻛﻨﺪ‪ ،‬ﻛﻪ در ‪ PSP‬ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ﻗﺮار ﮔﺮﻓﺘﻪ و ﻣﻮرد‬
‫اﺳﺘﻔﺎدهي آن ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪ .‬روش اﺟﺮا ﻫﻢ ﻣﺸﺎﺑﻪ اﺳﺖ‪ .‬ﻳﻌﻨﻲ ﻫﻢ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻓﺮﻋﻲ و ﻫﻢ اﺻﻠﻲ‪ ،‬در ﺣﺎﻓﻈﻪ ﭘﺲ از ‪PSP‬ﺷﺎن ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪ .‬ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ﭘﺲ از‬
‫ﻓﺮاﺧﻮاﻧﻲ ﺑﻪ ﻫﻤﻪي ﻟﻮازم ﺳﻴﺴﺘﻢ دﺳﺘﺮﺳﻲ ﺧﻮاﻫﺪ داﺷﺖ‪ .‬ﻫﻤﭽﻨﻴﻦ ﺑﺎ اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ دﺳﺘﻪ ﻣﻲﺗﻮاﻧﺪ ﺑﻪ ﻫﻤﻪي ﻟﻮازم و ﻓﺎﻳﻠﻬﺎي ﺑﺎزﺷﺪه ﺑﻮﺳﻴﻠﻪي ﺑﺮﻧﺎﻣﻪﻫﺎي اﺻﻠﻲ ﻗﺒﻠﻲ‪،‬‬
‫دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬ﻣﺜﻼً ﻓﺎﻳﻠﻲ را ﻛﻪ ﻗﺒﻼً ﺑﺎزﺷﺪه‪ ،‬ﺑﺨﻮاﻧﺪ ﻳﺎ در آن ﺑﻨﻮﻳﺴﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻛﺎﻓﻴﺴﺖ دﺳﺘﻪي ﻓﺎﻳﻞ را ﺑﻪﻋﻨﻮان ﭘﺎراﻣﺘﺮ درﻳﺎﻓﺖ ﻛﻨﺪ‪ ،‬و ﻧﻴﺎزي ﺑﻪ داﻧﺴﺘﻦ‬
‫ﻧﺎم ﻓﺎﻳﻞ و ﺑﺎزﻛﺮدن آن ﻧﺨﻮاﻫﺪ داﺷﺖ‪ .‬ﺑﺮاي ارﺳﺎل دﺳﺘﻪي ﻓﺎﻳﻞ از ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﺑﻪ ﻓﺮﻋﻲ‪ ،‬از ﻳﻜﻲ از روﺷﻬﺎﻳﻲ ﻛﻪ در اداﻣﻪ ﺗﺸﺮﻳﺢ ﺧﻮاﻫﻨﺪ ﺷﺪ‪ ،‬ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫ﺑﺎﻳﺪ ﺗﻮﺟﻪ ﻛﺮد ﻛﻪ دﺳﺘﺮﺳﻲ ﺑﻪ ﻓﺎﻳﻞ ﺑﺎ اﻳﻦ روش‪ ،‬اﺷﺎرهﮔﺮ ﻓﺎﻳﻞ‪ 4‬را ﺗﺤﺖ ﺗﺄﺛﻴﺮ ﻗﺮار ﺧﻮاﻫﺪ داد و ﺗﻐﻴﻴﺮات ﺑﺮاي ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﻗﺎﺑﻞ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬
‫ﭘﺲ از ﺑﺮﮔﺸﺖ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺻﻠﻲ‪ ،‬از ﻧﻘﻄﻪي ﻓﺮاﺧﻮاﻧﻲ و ﻣﺸﺎﺑﻪ ﻓﺮاﺧﻮاﻧﻲ رواﻟﻬﺎ‪ ،‬اداﻣﻪي ﺑﺮﻧﺎﻣﻪ اﺻﻠﻲ اﺟﺮا ﺧﻮاﻫﺪ ﺷﺪ‪ .‬ﺑﺮاي ﺑﺮﮔﺮداﻧﺪن وﺿﻌﻴﺖ اﺟﺮا‪ ،‬ﺑﺮﻧﺎﻣﻪي‬
‫ﻓﺮﻋﻲ ﻳﻚ ﻛﺪ ﻋﺪدي را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺻﻠﻲ ﺑﺮﻣﻲﮔﺮداﻧﺪ‪ ،‬ﻛﻪ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﺗﺎﺑﻊ ‪ 4CH‬وﻗﻔﻪي ‪ 21H‬را ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮد‪ ،‬ﻛﻪ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ را ﺧﺎﺗﻤﻪ داده و ﻳﻚ ﻛﺪ‬
‫ﺑﺮﻣﻲﮔﺮداﻧﺪ و ﺑﺎﻳﺪ ﻗﺮاردادي در زﻣﻴﻨﻪي ﺗﻔﺴﻴﺮ اﻳﻦ ﻛﺪ ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ و ﻓﺮﻋﻲ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﻫﻢ ﺑﺮاي ﭼﻚ ﻛﺮدن ﻛﺪ‪ ،‬ﺗﺎﺑﻊ ‪ 4DH‬را ﺑﺎﻳﺪ‬
‫ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﺎﻳﺪ‪ ،‬ﻛﻪ ﻣﻘﺪار ‪ AH‬ﻧﺸﺎﻧﺪﻫﻨﺪهي وﺿﻌﻴﺖ ﺧﺘﻢ ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ اﺳﺖ‪ .‬ﻋﻤﻮﻣﺎً ‪ AH=0‬ﺑﺮاي ﺧﺘﻢ ﻋﺎدي‪ 5‬اﺳﺖ و ﻣﻘﺪار ‪ AH=1‬ﻧﺸﺎندﻫﻨﺪهي ﺣﺎﻟﺘﻲ اﺳﺖ‬
‫ﻛﻪ ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ﺑﺎ زدن ﻛﻠﻴﺪﻫﺎي ‪ Ctrl+C‬ﻳﺎ ‪ Ctrl+Break‬ﻗﻄﻊ ﺷﺪه ﺑﺎﺷﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ ‪ AH=2‬ﺑﺮاي ﺣﺎﻟﺘﻲاﺳﺖ ﻛﻪ ﺧﻄﺎ در دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻚ اﺗﻔﺎق اﻓﺘﺎده‬
‫ﺑﺎﺷﺪ و ‪ AH=3‬ﻧﺸﺎندﻫﻨﺪهي اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﻳﻜﻲ از ﺗﻮاﺑﻊ ‪ 31H‬ﻳﺎ ‪ ،27H‬در ﺣﺎﻓﻈﻪ ﻣﻘﻴﻢ ﺷﺪه و ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﺑﻮده اﺳﺖ‪.‬‬

‫_________________________________________________________________________________‬
‫‪loader ١‬‬
‫‪parent program ٢‬‬
‫‪child program ٣‬‬
‫‪file pointer ٤‬‬
‫‪normal termination ٥‬‬
‫‪2-23‬‬ ‫ﻓﺼﻞ ‪ :23‬ﺗﺎﺑﻊ ‪Exec‬‬

‫اﮔﺮ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ از ﻧﻮع ‪ .EXE‬ﺑﺎﺷﺪ‪ ،‬در ﺻﻮرﺗﻴﻜﻪ ﺣﺎﻓﻈﻪ ﺑﻪ اﻧﺪازهي ﻛﺎﻓﻲ آزاد ﺑﺎﺷﺪ‪ ،‬ﻣﻲﺗﻮاﻧﺪ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻓﺮﻋﻲ را اﺟﺮا ﻛﻨﺪ‪ .‬اﻣﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪.COM‬‬
‫ﭼﻮن ﻛﻞ ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻣﻲﻛﻨﻨﺪ‪ ،‬ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺑﺮﻧﺎﻣﻪي دﻳﮕﺮي را اﺟﺮا ﻛﻨﻨﺪ‪ ،‬ﻣﮕﺮ آﻧﻜﻪ ﻗﺒﻼً ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ‪ 49H‬ﺣﺎﻓﻈﻪﻫﺎي ﻏﻴﺮﺿﺮور را آزاد ﻧﻤﺎﻳﻨﺪ‪.‬‬

‫‪ 3-23‬روﺷﻬﺎي ارﺳﺎل ﭘﺎراﻣﺘﺮ‬


‫ﺳﻪ روش ﺑﺮاي ارﺳﺎل ﭘﺎراﻣﺘﺮ از ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﺑﻪ ﻓﺮﻋﻲ وﺟﻮد دارد‪:‬‬

‫ﺧﻂ ﻓﺮﻣﺎن‪،1‬‬ ‫•‬


‫ﺑﻠﻮك ﻣﺤﻴﻂ‪،2‬‬ ‫•‬
‫‪،PSP‬‬ ‫•‬

‫ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ Exec‬ﻳﺎ ‪ ،4BH‬ﺑﺎﻳﺪ ﭘﺎراﻣﺘﺮﻫﺎي ﻻزم ﺑﻪ آن ارﺳﺎل ﺷﻮد‪:‬‬

‫‪AH = 4BH‬‬
‫‪AL = 0 or 3‬‬ ‫)‪(0: File is executable, 3: File is overlay‬‬
‫)‪DS:DX = Address of .EXE or .COM program name(null-terminalted string‬‬
‫‪ES:BX = Address of parameter block‬‬
‫ﻓﺎﻳﻞ ‪ BAT‬را ﻧﻤﻲﺗﻮان ﺑﺎ اﻳﻦ روش ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮد و ﺑﺎﻳﺪ ‪ COMMAND.COM‬را ﺑﺎ ﭘﺎراﻣﺘﺮ ”‪ “/C‬ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮد‪:‬‬

‫)”‪Exec(“COMMAND.COM”, “/C PROG.BAT‬‬

‫ﺑﻠﻮك ﭘﺎراﻣﺘﺮ‪ :3‬ﭘﺎراﻣﺘﺮﻫﺎ را ﻣﻲﺗﻮان از ﻃﺮﻳﻖ ﺑﻠﻮك ﭘﺎراﻣﺘﺮ ﺑﻪ ﺑﺮﻧﺎﻣﻪي ﻓﺮﻋﻲ ارﺳﺎل ﻧﻤﻮد‪ .‬ﻧﺸﺎﻧﻲ ﺑﻠﻮك ﭘﺎراﻣﺘﺮ در ‪ ES:BX‬ﺑﻪ ﺗﺎﺑﻊ ‪ Exec‬ارﺳﺎل‬
‫ﻣﻲﺷﻮد‪ .‬ﺳﺎﺧﺘﺎر ﺑﻠﻮك ﭘﺎراﻣﺘﺮ ﺑﻪﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬

‫‪Field‬‬ ‫‪Addr.‬‬ ‫‪Contents‬‬


‫‪1.‬‬ ‫‪0-1‬‬ ‫‪Segment address of Environment Block‬‬
‫‪2.‬‬ ‫‪2-3‬‬ ‫‪Offset address of command parameter‬‬
‫‪3.‬‬ ‫‪4-5‬‬ ‫‪Segment address of command parameter‬‬
‫‪4.‬‬ ‫‪6-7‬‬ ‫‪Offset address of first FCB‬‬
‫‪5.‬‬ ‫‪8-9‬‬ ‫‪Segment address of first FCB‬‬
‫‪6.‬‬ ‫‪10-11‬‬ ‫‪Offset address of second FCB‬‬
‫‪7.‬‬ ‫‪12-14‬‬ ‫‪Segment address of second FCB‬‬
‫* ﻓﻴﻠﺪ ‪ 1‬ﻧﻴﺎزي ﺑﻪ ﻧﺸﺎﻧﻲ ﻣﺒﺪأ ﻧﺪارد‪ ،‬ﭼﻮن ﻫﻤﻴﺸﻪ از ﻧﺸﺎﻧﻲ ﻣﻀﺮب ‪ 16‬ﺷﺮوع ﻣﻲﺷﻮد و ﻟﺬا ﻣﺒﺪأ آن ﺻﻔﺮ اﺳﺖ‪.‬‬

‫ﺑﻠﻮك ﻣﺤﻴﻂ‪ :‬ﭘﺮدازﺷﮕﺮ ﻓﺮﻣﺎن و ﺳﺎﻳﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ‪ ،‬اﻃﻼﻋﺎﺗﻲ را از ﺑﻠﻮك ﻣﺤﻴﻂ ﺑﺪﺳﺖ ﻣﻲآورﻧﺪ‪ ،‬ﻛﻪ ﻳﻚ ﺳﺮي رﺷﺘﻪ اﺳﺖ و داراي ﻧﺤﻮ زﻳﺮ اﺳﺖ و ﺑﺎ دﺳﺘﻮر‬
‫‪ DOSSET‬ﻣﻲﺗﻮان آﻧﺮا ﺗﻨﻈﻴﻢ ﻧﻤﻮد و ﺣﺪاﻛﺜﺮ ﻣﻲﺗﻮاﻧﺪ ‪ 32K‬ﺑﺎﺷﺪ‪:‬‬

‫‪Name = parameter‬‬
‫* ﻓﻴﻠﺪﻫﺎي ‪ 2‬و ‪ 3‬ﻧﺸﺎﻧﻲ ﭘﺎراﻣﺘﺮ ﻓﺮﻣﺎن را ﻣﺸﺨﺺ ﻣﻲﻛﻨﻨﺪ ﻛﻪ در ﻣﺒﺪأ ‪ PSP 80H‬ﺑﺮﻧﺎﻣﻪ ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬

‫* ﻓﻴﻠﺪﻫﺎي ﺑﻌﺪي ﻧﻴﺰ ﻧﺸﺎﻧﻲﻫﺎي ﻣﺒﺪأ و ﻗﻄﻌﻪي ‪ FCB‬ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻫﺴﺘﻨﺪ‪.‬‬

‫‪ 4-23‬وﻇﺎﻳﻒ ‪EXEC‬‬
‫ﻛﺎر ﻣﻬﻢ ‪ ،Exec‬ﺗﺼﺤﻴﺢ ﻧﺸﺎﻧﻲﻫﺎي ﺟﺎﺑﺠﺎﭘﺬﻳﺮ‪ 4‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ EXE‬اﺳﺖ‪ ،‬ﻛﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻃﻼﻋﺎﺗﻲ اﻧﺠﺎم ﻣﻲﺷﻮد ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻳﺎ اﺳﻤﺒﻠﺮ در ﺳﺮآﻳﻨﺪ ﻓﺎﻳﻞ‬
‫‪ EXE‬در ﻗﺴﻤﺖ ﺟﺪول ﺟﺎﺑﺠﺎﻳﻲ‪ 5‬ﻗﺮار داده اﺳﺖ‪ .‬ﻛﺎر دﻳﮕﺮ‪ ،‬ﻣﻘﺪاردﻫﻲ ‪ SS ،IP ،CS‬و ‪ SP‬اﺳﺖ‪ .‬آﻧﮕﺎه‪ ،‬ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻣﻲﻛﻨﺪ‪ ،‬ﻛﻪ اﻳﻦ ﻛﺎر ﺑﺎ ﻣﻘﺪاردﻫﻲ ‪ IP‬و ﭘﺮش‬
‫ﺑﻪ ﻧﺸﺎﻧﻲ اﺑﺘﺪاي ﻛﺪ اﺟﺮاﻳﻲ ﺑﺮﻧﺎﻣﻪ اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬ﭘﺲ از اﺟﺮاي ﺑﺮﻧﺎﻣﻪ‪ ،‬ﺑﺮاﺳﺎس ﻧﻮع ﺧﺎﺗﻤﻪي ﺑﺮﻧﺎﻣﻪ ﺑﻪ ‪ CF‬ﻣﻘﺪار ‪ 0‬ﻳﺎ ‪ 1‬ﻣﻲدﻫﺪ‪ .‬در ﻣﻮﻗﻊ ﻓﺮاﺧﻮاﻧﻲ ‪ ،Exec‬اﮔﺮ‬
‫‪ AL=3‬ﺑﺎﺷﺪ‪ ،‬ﺑﻪ ﻣﻌﻨﻲ ﻫﻤﭙﻮﺷﺎ‪ 6‬ﺑﻮدن ﻓﺎﻳﻞ ‪ EXE‬ﻳﺎ ‪ COM‬اﺳﺖ و ﺑﻨﺎﺑﺮ اﻳﻦ آﻧﺮا در ﺣﺎﻓﻈﻪ ﺑﺎرﻣﻲﻛﻨﺪ‪ ،‬وﻟﻲ آﻧﺮا اﺟﺮا ﻧﻤﻲﻛﻨﺪ‪ ،‬ﺑﻠﻜﻪ ﭘﺲ از ﺑﺎرﻛﺮدن‪ ،‬ﺑﻪ ﺑﺮﻧﺎﻣﻪي‬
‫_________________________________________________________________________________‬
‫‪command line ١‬‬
‫‪environment block ٢‬‬
‫‪paramter block ٣‬‬
‫‪relocatable ٤‬‬
‫‪relocation table ٥‬‬
‫‪overlay ٦‬‬
‫‪3-23‬‬ ‫ﻓﺼﻞ ‪ :23‬ﺗﺎﺑﻊ ‪Exec‬‬

‫ﻓﺮاﺧﻮاﻧﻨﺪه ﺑﺮﮔﺸﺖ ﻣﻲﺷﻮد‪ .‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﻫﻤﭙﻮﺷﺎ‪ ،‬در ﻫﺮﺟﺎي ﺣﺎﻓﻈﻪ ﻛﻪ ‪ Exec‬ﺑﺨﻮاﻫﺪ ﺑﺎرﻧﻤﻲﺷﻮﻧﺪ‪ ،‬ﺑﻠﻜﻪ در ﺟﺎﻳﻲ ﺑﺎر ﻣﻲﺷﻮﻧﺪ ﻛﻪ ﻓﺮاﺧﻮاﻧﻨﺪهي ‪ ،Exec‬ﻧﺸﺎﻧﻲ آﻧﺮا‬
‫ﺑﺪﻫﺪ‪ .‬در اﻳﻦ ﺣﺎﻟﺖ ﺑﻠﻮك ﭘﺎراﻣﺘﺮ ﺷﺎﻣﻞ اﻃﻼﻋﺎت زﻳﺮ اﺳﺖ‪:‬‬

‫‪1.‬‬ ‫‪0-1‬‬ ‫‪Segment address where overlay is located‬‬


‫‪2.‬‬ ‫‪2-3‬‬ ‫‪Relocation factor‬‬
‫اﮔﺮ ﺑﺮﻧﺎﻣﻪاي آﻧﻘﺪر ﺑﺰرگ ﺑﺎﺷﺪ ﻛﻪ در ﺣﺎﻓﻈﻪ ﻣﺘﻌﺎرف)‪ (640KB‬ﻗﺎﺑﻞ ﺑﺎرﺷﺪن ﻧﺒﺎﺷﺪ‪ ،‬ﻗﺴﻤﺘﻬﺎي ﻫﻤﭙﻮﺷﺎي ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪي ﻳﻜﺴﺎﻧﻲ ﺑﺎر ﻣﻲﺷﻮﻧﺪ‪ .‬ﻧﻈﻴﺮ‬
‫ﻓﺮﻣﻬﺎي ورودي ﻳﺎ ﮔﺰارﺷﻬﺎي ﻣﺨﺘﻠﻔﻲ ﻛﻪ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺠﺎري وﺟﻮد دارﻧﺪ و ﻧﻴﺎز ﻧﻴﺴﺖ ﻛﻪ ﺑﻪﻃﻮر ﻫﻤﺰﻣﺎن در ﺣﺎﻓﻈﻪ ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﻨﺪ‪ .‬ﺑﻨﺎﺑﺮاﻳﻦ‪ ،‬ﺑﺮﻧﺎﻣﻪ ﻗﺴﻤﺘﻲ از‬
‫ﺣﺎﻓﻈﻪ را از ‪ heap‬ﺗﺨﺼﻴﺺ داده و ﻗﺴﻤﺘﻬﺎي ﻫﻤﭙﻮﺷﺎي ﺑﺮﻧﺎﻣﻪ را در آن ﺑﺎرﻣﻲﻛﻨﺪ‪ .‬رواﻟﻬﺎي ﻣﻮﺟﻮد در ﻗﺴﻤﺘﻬﺎي ﻫﻤﭙﻮﺷﺎ درﺻﻮرﺗﻲ ﻗﺎﺑﻞ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮﻧﺪ ﻛﻪ در‬
‫ﺣﺎﻓﻈﻪ ﺑﺎرﺷﺪه ﺑﺎﺷﻨﺪ و ﻗﺒﻞ از آن‪ ،‬ﻧﺸﺎﻧﻲﻫﺎي ﻣﻌﺘﺒﺮي ﻧﻴﺴﺘﻨﺪ‪ .‬ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ‪ ،‬ﺑﺎﻳﺪ از ‪ FAR CALL‬اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬

‫* ‪ :reloaction factor‬ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪي ﺑﺮﻧﺎﻣﻪي ﻓﺮاﺧﻮاﻧﻲﺷﺪه)ﻳﻜﻲ از ﻗﺴﻤﺘﻬﺎي ﻫﻤﭙﻮﺷﺎي ﺑﺮﻧﺎﻣﻪ( را ﺗﻨﻈﻴﻢ ﻣﻲﻛﻨﺪ و ﻓﻘﻂ ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎي ‪EXE‬‬
‫ﻣﻌﻨﻲ دارد و ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬ﺻﻔﺮ اﺳﺖ‪.‬‬

‫ﺑﺮﻧﺎﻣﻪاي ﻛﻪ ﻫﻤﭙﻮﺷﺎ ﺑﺎﺷﺪ و ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺎرﺷﻮد‪ ،‬ﻗﺒﻞ از آن ‪ PSP‬ﻗﺮار ﻧﻤﻲﮔﻴﺮد‪ .‬اﻳﻦ ﻛﺎر درﻣﻮرد ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬ﻣﺸﻜﻞآﻓﺮﻳﻦ اﺳﺖ‪ .‬زﻳﺮا درﺣﺎﻟﺖ‬
‫ﻋﺎدي ﺑﺮﻧﺎﻣﻪ‪ COM‬از ﺑﺎﻳﺖ ‪ 100H‬اﺟﺮا ﻣﻲﺷﻮد‪ ،‬وﻟﻲ در اﻳﻦ ﺣﺎﻟﺖ ﭼﻮن ‪ PSP‬ﺑﺎرﻧﻤﻲﺷﻮد‪ ،‬ﻧﺸﺎﻧﻴﻬﺎي ‪ jump‬ﺑﺮﻧﺎﻣﻪي ‪ COM‬اﺷﺘﺒﺎه ﺧﻮاﻫﻨﺪ ﺑﻮد‪ .‬از آﻧﺠﺎﻳﻲ ﻛﻪ‬
‫ﻫﻤﻪي دﺳﺘﻮرات ‪ jump‬دﺳﺘﺮﺳﻲ ﺑﻪ دادهﻫﺎ در درون ﺑﺮﻧﺎﻣﻪي ‪ COM‬ﻧﺴﺒﺖ ﺑﻪ ﻧﺸﺎﻧﻲ ‪ 100H‬ﻫﺴﺘﻨﺪ و ﻧﻪ ﺻﻔﺮ‪ ،‬ﻧﻤﻲﺗﻮان دﺳﺘﻮر ‪ FAR CALL‬را ﺑﺎ ﻗﻄﻌﻪاي ﻛﻪ‬
‫ﺑﺮﻧﺎﻣﻪ در آن ﺑﺎرﺷﺪه ﺑﻪﻋﻨﻮان ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ و ﻣﻘﺪار ﺻﻔﺮ ﺑﻪﻋﻨﻮان ﻧﺸﺎﻧﻲ ﻣﺒﺪأ‪ ،‬ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮد‪ .‬ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪ ﺑﺮاي ‪ FAR CALL‬ﺑﺎﻳﺪ ﻧﺸﺎﻧﻲ ﻗﻄﻌﻪاي ﻛﻪ ﺑﺮﻧﺎﻣﻪ در آن‬
‫ﺑﺎرﺷﺪه ﻣﻨﻬﺎي ‪) 10H‬ﻃﻮل ﺳﺮآﻳﻨﺪ ﻓﺎﻳﻞ ‪ (COM‬و ‪ 100H‬ﺑﻪﻋﻨﻮان ﻣﺒﺪأ ﺑﺎﺷﺪ‪ .‬اﮔﺮ ﺑﺮﻧﺎﻣﻪي ‪ COM‬ﺑﻪﻋﻨﻮان ﻫﻤﭙﻮﺷﺎي ﻳﻚ ﺑﺮﻧﺎﻣﻪي دﻳﮕﺮ ﺑﺎﺷﺪ‪ ،‬ﺑﺎﻳﺪ داراي‬
‫ورودﻳﻬﺎي ﻧﺸﺎﻧﻲ‪ 1‬ﻏﻴﺮ از ‪ 100H‬در داﺧﻞ ﺧﻮد ﺑﺎﺷﺪ و ﻟﺬا ﻓﻘﻂ ﻛﺎﻓﻲ اﺳﺖ ﻧﺸﺎﻧﻲﻫﺎي ﻣﺒﺪأ دﺳﺘﻮرات ‪ FAR CALL‬ﺗﻐﻴﻴﺮ داده ﺷﻮﻧﺪ‪.‬‬

‫* در ﺑﺮﻧﺎﻣﻪﻫﺎي ﻫﻤﭙﻮﺷﺎﻳﻲ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ ﺗﺤﺖ داس اﻳﺠﺎد ﻣﻲﻛﻨﻨﺪ‪ ،‬ﻳﻚ ”‪ “Overlay Manager‬ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻣﺘﺼﻞ ﻣﻲﺷﻮد ﻛﻪ ﻛﺎرﻫﺎي‬
‫ﻣﺪﻳﺮﻳﺘﻲ ﻣﻮرد ﻧﻴﺎز را اﻧﺠﺎم ﻣﻲدﻫﺪ و ﻧﺸﺎﻧﻴﻬﺎ را ﭘﺲ از ﺑﺎرﻛﺮدن در ﺣﺎﻓﻈﻪ ﺗﺼﺤﻴﺢ ﻣﻲﻛﻨﺪ‪.‬‬

‫* ﺗﺎﺑﻊ ‪ Exec‬در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﭘﺎﺳﻜﺎل و ‪ C‬ﺑﻮرﻟﻨﺪ ﺗﺤﺖ داس وﺟﻮد دارد‪:‬‬


‫‪Borland Pascal:‬‬ ‫‪DOS Unit‬‬
‫;)‪procedure Exec(Path, CmdLine : String‬‬
‫‪Borland C:‬‬ ‫>‪<process.h‬‬
‫‪exec... functions:‬‬
‫)‪Enable your program to load and run other files (child processes‬‬
‫‪Declaration:‬‬
‫;)‪int execl (char *path, char *arg0, ..., NULL‬‬
‫;)‪int execle (char *path, char *arg0, ..., NULL, char **env‬‬
‫;)‪int execlp (char *path, char *arg0, ...‬‬
‫;)‪int execlpe(char *path, char *arg0, ..., NULL, char **env‬‬
‫‪spawn... functions:‬‬
‫‪Enable your programs to run other files (child processes). spawn...‬‬
‫‪functions return control to your program when the child processes finish.‬‬
‫‪Declaration:‬‬
‫;)‪int spawnl (int mode, char *path, char *arg0, ..., NULL‬‬
‫;)][‪int spawnle (int mode, char *path, char *arg0, ..., NULL, char *envp‬‬
‫;)‪int spawnlp (int mode, char *path, char *arg0, ..., NULL‬‬
‫;)][‪int spawnlpe(int mode, char *path, char *arg0, ..., NULL, char *envp‬‬
‫‪system:‬‬
‫‪Issues a DOS command‬‬
‫‪Declaration:‬‬
‫;)‪int system(const char *command‬‬

‫_________________________________________________________________________________‬
‫‪entry address ١‬‬
‫ﻓﺼﻞ ‪ :25‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‬
‫)‪(Device Drivers‬‬

‫‪ 1-25‬ﻣﻘﺪﻣﻪ‬
‫ﻳﻜﻲ از ﭘﻴﭽﻴﺪهﺗﺮﻳﻦ ﻛﺎرﻫﺎي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﺳﻴﺴﺘﻢ‪ ،‬ﻧﻮﺷﺘﻦ ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‪ (DD)1‬اﺳﺖ‪ .‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ در داس ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻟﻮازم ﺧﺎرﺟﻲ‬
‫ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ و ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﻮﭼﻜﻲ ﻫﺴﺘﻨﺪ ﻛﻪ وﺳﺎﻳﻞ ﻣﺨﺘﻠﻔﻲ‪ ،‬از ﺻﻔﺤﻪﻛﻠﻴﺪ ﮔﺮﻓﺘﻪ ﺗﺎ ‪ CD-ROM‬را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﻨﻨﺪ‪ .‬ﺑﻪ دﻟﻴﻞ ﺳﺎﺧﺘﺎر و‬
‫ﻣﺤﺪودﻳﺘﻬﺎي ﺧﺎص‪ ،‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ را در داس ﺗﻨﻬﺎ ﺑﺎ زﺑﺎن اﺳﻤﺒﻠﻲ ﻣﻲﺗﻮان ﻧﻮﺷﺖ‪ .‬در اﻳﻦ ﻓﺼﻞ‪ ،‬ﺳﺎﺧﺘﺎر ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ را ﻣﻮرد ﻣﻄﺎﻟﻌﻪ ﻗﺮار ﻣﻲدﻫﻴﻢ‪.‬‬

‫‪ 2-25‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ ﺗﺤﺖ داس‬


‫‪ DD‬ﺑﺨﺸﻲ از ﻫﻤﻪي ﺳﻴﺴﺘﻤﻬﺎي ﻋﺎﻣﻞ اﺳﺖ و ﻣﺴﺌﻮل ﻛﻨﺘﺮل و ﺑﺮﻗﺮاري ارﺗﺒﺎط ﺑﺎ ﺳﺨﺖاﻓﺰار ﺑﻮده و ﺳﻄﺢﭘﺎﻳﻴﻦﺗﺮﻳﻦ ﺑﺨﺶ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ اﺳﺖ و ﺑﻪ ﺳﺎﻳﺮ‬
‫ﺑﺨﺸﻬﺎ‪ ،‬ازﻗﺒﻴﻞ ﻫﺴﺘﻪ و ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﺎرﺑﺮدي اﺟﺎزه ﻣﻲدﻫﺪ ﻛﻪ ﻣﺴﺘﻘﻞ از ﺳﺨﺖاﻓﺰار ﺑﺎﺷﻨﺪ‪ .‬ﺑﺮاي آﻧﻜﻪ ﻳﻚ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻗﺎﺑﻞ ﺣﻤﻞ‪ 2‬ﺑﺮ روي ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﻣﺨﺘﻠﻒ ﺑﺎﺷﺪ‪،‬‬
‫ﺑﺎﻳﺪ ﻣﺒﺘﻨﻲ ﺑﺮ ‪ DD‬ﺑﺎﺷﺪ‪ .‬ﺑﺮاي ﺣﻤﻞ ﻳﻚ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ و ﻣﻌﻤﺎريﻫﺎي ﻣﺨﺘﻠﻒ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺑﺨﺶ ‪ DD‬ﺑﺎزﻧﻮﻳﺴﻲ ﺷﻮد‪ .‬در ﺳﻴﺴﺘﻤﻬﺎي ﻋﺎﻣﻞ ﻗﺪﻳﻤﻲ‪،‬‬
‫‪ DD‬ﺟﺰﻳﻲ از ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﻮد و از اﻳﻨﺮو ﺑﺎ ﺗﻐﻴﻴﺮ ﺳﺨﺖاﻓﺰار‪ ،‬ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﺎﻳﺪ ﻋﻮض ﻣﻲﺷﺪ‪ .‬اﻟﺒﺘﻪ داس‪ ،‬ﺑﺎ دﻳﺪ ﻗﺎﺑﻞ ﺣﻤﻞ ﺑﻮدن اﻳﺠﺎد ﻧﺸﺪه اﺳﺖ‪ ،‬زﻳﺮا ﺑﺴﻴﺎري از‬
‫ﺑﺨﺸﻬﺎي آن ﻣﺒﺘﻨﻲ ﺑﺮ ‪ BIOS‬ﻫﺴﺘﻨﺪ و از اﻳﻦ ﻧﻈﺮ ﺑﻪ ﻣﻌﻤﺎري ‪ PC‬ﻣﺤﺪود اﺳﺖ‪.‬‬

‫در ‪ ،DOS 2.0‬ﻣﻔﻬﻮم ‪ DD‬ﻣﻌﺮﻓﻲ ﺷﺪ و ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﻣﻜﺎن اﺳﺘﻔﺎده از ‪ EMS‬و ‪ HD‬ﻓﺮاﻫﻢ ﺷﺪ‪ .‬ﻳﻚ ‪ DD‬ﺷﺎﻣﻞ اﻃﻼﻋﺎت وﺿﻌﻴﺖ و رواﻟﻬﺎﻳﻲ‬
‫ﺑﻪﻋﻨﻮان ﺗﻮاﺑﻊ ﮔﺮداﻧﻨﺪه اﺳﺖ‪ .‬اﻳﻦ رواﻟﻬﺎ ﻣﺴﺌﻮل اﻧﺠﺎم وﻇﺎﻳﻒ ﻣﻮرد ﻧﻴﺎز ‪ DOS‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ وﺳﻴﻠﻪ ﻫﺴﺘﻨﺪ‪ .‬ﺑﺮاي ﻧﻤﻮﻧﻪ‪ ،‬ﮔﺮداﻧﻨﺪهي ﻳﻚ دﻳﺴﻚ ﺳﺨﺖ‪ ،‬داراي‬
‫ﺗﻮاﺑﻌﻲ ﺑﺮاي ﺧﻮاﻧﺪن‪ ،‬ﻧﻮﺷﺘﻦ‪ ،‬و وارﺳﻲ ﺑﺨﺸﻬﺎ ﺑﺮ روي دﻳﺴﻚ اﺳﺖ‪.‬‬

‫ﮔﺮداﻧﻨﺪهﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﻮﺳﻴﻠﻪي ﻛﺎرﺑﺮ‪ :‬ارﺗﺒﺎط داس ﺑﺎ ‪ DD‬ﻣﺒﺘﻨﻲ اﺳﺖ ﺑﺮ ﻳﻚ ﺳﺎﺧﺘﻤﺎن داده و ﺑﺮﺧﻲ ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ﺳﺎده‪ ،‬ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﺎن زﺑﺎن‬
‫اﺳﻤﺒﻠﻲ ﻣﻲﺗﻮاﻧﻨﺪ ﺑﺮاي ﻫﺮوﺳﻴﻠﻪاي ﻳﻚ ‪ DD‬ﺑﻨﻮﻳﺴﻨﺪ‪ .‬ﻣﺘﺄﺳﻔﺎﻧﻪ ﺗﺤﺖ داس ﻧﻤﻲﺗﻮان ‪ DD‬را ﺑﺎ زﺑﺎﻧﻬﺎي ﺳﻄﺢ ﺑﺎﻻ ﻧﻮﺷﺖ‪DD .‬ﻫﺎ از ﺑﺮﺧﻲ ﺟﻬﺎت ﻣﺸﺎﺑﻪ ﺑﺮﻧﺎﻣﻪﻫﺎي‬
‫‪ COM‬ﻫﺴﺘﻨﺪ)ﻧﺸﺎﻧﻲﻫﺎي ﺟﺎﺑﺠﺎﭘﺬﻳﺮ ﻧﺪارﻧﺪ(‪ ،‬اﻣﺎ از ﻧﺸﺎﻧﻲ ‪ 00H‬ﺷﺮوع ﻣﻲﺷﻮﻧﺪ ﻧﻪ ‪ ،100H‬ﻳﻌﻨﻲ ﻗﺒﻞ از آﻧﻬﺎ ‪ PSP‬ﻗﺮار ﻧﻤﻲﮔﻴﺮد‪.‬‬

‫‪DD‬ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﻮﺳﻴﻠﻪي ﻛﺎرﺑﺮ ﺗﻮﺳﻂ داس و در ﻫﻨﮕﺎم ﺑﻮتﺷﺪن آن‪ ،‬از ﻃﺮﻳﻖ اﻃﻼﻋﺎت ﻓﺎﻳﻞ ‪ CONFIG.SYS‬ﻧﺼﺐ ﻣﻲﺷﻮﻧﺪ و ﻫﻤﺎﻧﻨﺪ‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ COM‬و ‪ EXE‬از ﺧﻂ ﻓﺮﻣﺎن ﻗﺎﺑﻞ اﺟﺮا ﻧﻴﺴﺘﻨﺪ‪ .‬ﺑﺮﺧﻲ ‪DD‬ﻫﺎ ﻧﻴﺰ در ﻫﺴﺘﻪي داس وﺟﻮد دارﻧﺪ و ﺑﻪﻃﻮر ﺧﻮدﻛﺎر ﻧﺼﺐ ﻣﻲﺷﻮﻧﺪ‪ .‬اﻳﻨﻬﺎ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬
‫‪ .PRN ،AUX،CON ،$CLOCK‬ﺑﻪ ﻋﻼوه‪ ،‬ﮔﺮداﻧﻨﺪهﻫﺎي ‪ HD‬و ‪ FD‬ﻫﻢ ﺑﻪﻃﻮر ﺧﻮدﻛﺎر ﻧﺼﺐ ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫‪DD‬ﻫﺎ ﺑﻪﻃﻮر ﺗﺮﺗﻴﺒﻲ در ﺣﺎﻓﻈﻪ ﺑﺎرﺷﺪه و ﺑﻪ ﻫﻤﺪﻳﮕﺮ ﻣﺮﺗﺒﻂ ﻣﻲﺷﻮﻧﺪ و ﺗﺸﻜﻴﻞ ﻳﻚ زﻧﺠﻴﺮه را ﻣﻲدﻫﻨﺪ‪ .‬در ﺷﻜﻞ زﻳﺮ اﻳﻦ زﻧﺠﻴﺮه ﻧﺸﺎن داده ﺷﺪه اﺳﺖ‪:‬‬

‫‪NUL‬‬
‫‪NUL‬‬
‫اﻓﺰاﻳﺶ ﻧﺸﺎﻧﻲ ﺣﺎﻓﻈﻪ‬ ‫‪CON‬‬
‫‪CON‬‬
‫‪PRN‬‬ ‫ﭘﺲ از ﻧﺼﺐ ‪ANSI.SYS‬‬
‫‪PRN‬‬
‫‪AUX‬‬
‫‪AUX‬‬
‫‪CLOCK‬‬ ‫‪CLOCK‬‬
‫‪CON‬‬

‫اﮔﺮ ﺑﺨﻮاﻫﻴﻢ ﮔﺮداﻧﻨﺪهي ﺟﺪﻳﺪي ﻧﺼﺐ ﻛﻨﻴﻢ‪ ،‬ﺑﺎﻳﺪ دﺳﺘﻮري ﺑﻪﺷﻜﻞ زﻳﺮ در ‪ CONFIG.SYS‬ﻗﺮار دﻫﻴﻢ‪:‬‬

‫‪DEVICE=NEWDD.DRV‬‬
‫_________________________________________________________________________________‬
‫‪device drivers ١‬‬
‫‪portable ٢‬‬
‫‪2-25‬‬ ‫ﻓﺼﻞ ‪ :25‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‬

‫ﺑﺮاي ﻣﺜﺎل ‪ ANSI.SYS‬ﻛﻪ ﮔﺮداﻧﻨﺪهي ﺟﺪﻳﺪي را ﺑﺮاي ورودي‪-‬ﺧﺮوﺟﻲ ﻛﺎراﻛﺘﺮ‪ ،‬و در واﻗﻊ ﻳﻚ ‪ CON‬ﺟﺪﻳﺪ را ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪ ،‬ﺑﻪ ﺻﻮرت زﻳﺮ ﻧﺼﺐ‬
‫ﻣﻲﺷﻮد‪:‬‬

‫‪DEVICE=ANSI.SYS‬‬
‫ﺑﺎ ﻗﺮار ﮔﺮﻓﺘﻦ آن در زﻧﺠﻴﺮهي ‪DD‬ﻫﺎ‪ ،‬ﻫﺮﮔﺎه ﻛﻪ از ﻃﺮﻳﻖ داس ﺑﺨﻮاﻫﻴﻢ ﻛﺎراﻛﺘﺮي را ﺑﺮ روي ﺻﻔﺤﻪ ﺑﻨﻮﻳﺴﻴﻢ‪ ،‬داس ﭼﻮن زﻧﺠﻴﺮهي ‪DD‬ﻫﺎ را دﻧﺒﺎل‬
‫ﻣﻲﻛﻨﺪ‪ ،‬اﺑﺘﺪا ﺗﺎﺑﻊ ﺗﻌﺮﻳﻒ ﺷﺪه در ‪ CON‬ﺟﺪﻳﺪ را ﭘﻴﺪا ﻣﻲﻛﻨﺪ و آﻧﺮا اﺟﺮا ﻣﻲﻛﻨﺪ‪.‬‬

‫ﻫﻤﻪي ‪DD‬ﻫﺎ را ﻧﻤﻲﺗﻮان ﻫﻤﺎﻧﻨﺪ ‪ CON‬ﺗﻌﻮﻳﺾ ﻧﻤﻮد‪ .‬ﻣﺜﻼً ‪ NUL‬ﻫﻤﻴﺸﻪ ﻧﺨﺴﺘﻴﻦ ‪ DD‬ﺑﻮده و اﮔﺮ ‪ DD‬ﺟﺪﻳﺪي ﺑﺮاي آن اﻳﺠﺎد ﺷﻮد‪ ،‬داس از آن‬
‫ﺻﺮفﻧﻈﺮ ﺧﻮاﻫﺪ ﻧﻤﻮد‪ .‬ﻫﻤﻴﻦ ﻣﺴﺄﻟﻪ در ﻣﻮرد ﮔﺮداﻧﻨﺪهﻫﺎي ‪ HD‬و ‪ FD‬ﻫﻢ ﺻﺎدق اﺳﺖ‪ .‬ﻣﻲﺗﻮان ﮔﺮداﻧﻨﺪهي ﺟﺪﻳﺪي ﺑﺮاي ﻳﻚ وﺳﻴﻠﻪي ذﺧﻴﺮهﺳﺎزي اﻧﺒﻮه اﺿﺎﻓﻪ ﻧﻤﻮد‪،‬‬
‫وﻟﻲ ﻧﻤﻲﺗﻮان ﮔﺮداﻧﻨﺪهي ‪ C:‬ﻳﺎ ‪ A:‬را ﺗﻌﻮﻳﺾ ﻧﻤﻮد‪.‬‬

‫‪ 3-25‬اﻧﻮاع ﮔﺮداﻧﻨﺪهﻫﺎ‬
‫دو ﻧﻮع ‪ DD‬در داس وﺟﻮد دارد‪ :‬ﻛﺎراﻛﺘﺮي)‪ 1(CDD‬و ﺑﻠﻮﻛﻲ)‪2(BDD‬‬

‫اﻟﻒ(ﮔﺮداﻧﻨﺪهي وﺳﻴﻠﻪي ﻛﺎراﻛﺘﺮي‪:‬‬

‫اﻳﻦ ﻧﻮع ‪ DD‬داراي ﺳﺎﺧﺘﺎر ﺳﺎدهاي اﺳﺖ و ﺑﺎ ﻫﺮ ﺑﺎر ﻓﺮاﺧﻮاﻧﻲ ﻳﻚ ﻛﺎراﻛﺘﺮ را ﻣﻨﺘﻘﻞ ﻣﻲﻛﻨﻨﺪ و ﺑﺎ وﺳﺎﻳﻠﻲ ﻧﻈﻴﺮ ﺻﻔﺤﻪﻛﻠﻴﺪ‪ ،‬ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‪ ،‬ﭼﺎﭘﮕﺮ و ﻣﻮدم‬
‫ﻛﺎر ﻣﻲﻛﻨﻨﺪ‪ .‬ﻳﻚ ‪ CDD‬ﻓﻘﻂ ﻳﻚ وﺳﻴﻠﻪ را ﻣﻲﺗﻮاﻧﺪ ﻛﻨﺘﺮل ﻛﻨﺪ‪ .‬ﺑﻨﺎﺑﺮ اﻳﻦ ﺑﺮاي وﺳﺎﻳﻞ ﻣﺨﺘﻠﻒ ﺑﺎﻳﺪ ‪CDD‬ﻫﺎي ﻣﺘﻔﺎوت در داس ﻧﺼﺐ ﺷﻮد‪ .‬اﻳﻦ ﻧﻮع ‪ DD‬داراي دو‬
‫ﺣﺎﻟﺖ ﻋﻤﻠﻴﺎﺗﻲ اﺳﺖ‪:‬‬
‫• ﺣﺎﻟﺖ ‪ :Cooked‬ﻛﺎراﻛﺘﺮﻫﺎ ﻗﺒﻞ از اﻧﺘﻘﺎل ﭘﺮدازش ﻣﻲﺷﻮﻧﺪ و آﻧﮕﺎه ﺗﺤﻮﻳﻞ ﺑﺮﻧﺎﻣﻪﻫﺎ ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل ﻳﻚ ﮔﺮداﻧﻨﺪهي ﺻﻔﺤﻪﻛﻠﻴﺪ‪ ،‬ﻛﻠﻴﺪﻫﺎﻳﻲ‬
‫ﻧﻈﻴﺮ >‪ <ENTER‬ﻳﺎ >‪ <CTRL+P‬را ﭘﺮدازش و ﻛﻨﺘﺮل ﻣﻲﻛﻨﺪ و ﺑﺎ زدن اوﻟﻲ‪ ،‬از ﻛﻠﻴﺪﻫﺎي ﺑﻌﺪي زده ﺷﺪه‪ ،‬ﺻﺮفﻧﻈﺮ ﻣﻲﻛﻨﺪ و در ﻣﻮرد‬
‫دوﻣﻲ‪ ،‬ﻫﻤﻪي ﺣﺮﻓﻬﺎي زدن ﺷﺪه را ﻋﻼوه ﺑﺮ ﻧﻤﺎﻳﺶ‪ ،‬ﺑﺮ روي ﭼﺎﭘﮕﺮ ﻫﻢ ﭼﺎپ ﻣﻲﻛﻨﺪ‪.‬‬

‫ﺣﺎﻟﺖ ‪ :Raw‬در اﻳﻦ ﺣﺎﻟﺖ ﻛﺎراﻛﺘﺮﻫﺎي ﻛﻨﺘﺮﻟﻲ ﭘﺮدازش ﻧﻤﻲﺷﻮﻧﺪ و ﺗﻤﺎﻣﻲ ﻛﺎراﻛﺘﺮﻫﺎ از وﺳﻴﻠﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ و ﺑﺮﻋﻜﺲ ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮﻧﺪ‪ .‬اﮔﺮ ﺑﺮﻧﺎﻣﻪ‬ ‫•‬
‫ﺑﺨﻮاﻫﺪ ‪ 10‬ﻛﺎراﻛﺘﺮ ﺑﺨﻮاﻧﺪ‪ ،‬دﻗﻴﻘﺎً ﻫﻤﺎن ‪ 10‬ﻛﺎراﻛﺘﺮ ﺑﻪ او ﺗﺤﻮﻳﻞ داده ﻣﻲﺷﻮد و ﻫﻴﭻ ﭘﺮدازﺷﻲ ﺑﺮ روي ﻛﺎراﻛﺘﺮﻫﺎ اﻧﺠﺎم ﻧﻤﻲﺷﻮد‪.‬‬

‫ب( ﮔﺮداﻧﻨﺪهي وﺳﻴﻠﻪي ﺑﻠﻮﻛﻲ‪:‬‬


‫اﻳﻦ ﻧﻮع ﮔﺮداﻧﻨﺪهﻫﺎ ﻋﻤﻮﻣﺎً ﺑﺎ ﻟﻮازم ذﺧﻴﺮهﺳﺎزي اﻧﺒﻮه ارﺗﺒﺎط ﺑﺮﻗﺮار ﻣﻲﻛﻨﻨﺪ‪ ،‬ﻛﻪ ‪ FDD‬و ‪ HDD‬دو ﻧﻤﻮﻧﻪي ﻣﺸﺨﺺ از آن ﻫﺴﺘﻨﺪ‪ .‬اﻳﻦ ﻧﻮع ﮔﺮداﻧﻨﺪهﻫﺎ‬
‫ﻫﺮ ﺑﺎر ﻳﻚ ﻳﺎ ﭼﻨﺪ ﺑﻠﻮك از دادهﻫﺎ را ﻣﻨﺘﻘﻞ ﻣﻲﻛﻨﻨﺪ‪ .‬اﻧﺪازهي ﺑﻠﻮك در ﻣﻮرد وﺳﺎﻳﻞ ﻣﺨﺘﻠﻒ ﻣﺘﻔﺎوت اﺳﺖ‪ ،‬ﺑﺮاي ﻧﻤﻮﻧﻪ در ﻣﻮرد ‪ HD‬و ‪ FD‬ﻳﻚ ﺑﺨﺶ ﻳﺎ ‪ 512‬ﺑﺎﻳﺖ‬
‫اﺳﺖ‪ .‬ﮔﺮداﻧﻨﺪه وﺳﻴﻠﻪ در ﻣﻮرد وﺳﺎﻳﻞ ﺑﻠﻮﻛﻲ وﻇﻴﻔﻪي ﺗﺒﺪﻳﻞ ﺷﻤﺎره ﺑﻠﻮﻛﻬﺎي ﻣﻨﻄﻘﻲ ﺑﻪ ﺑﻠﻮﻛﻬﺎي ﻓﻴﺮﻳﻜﻲ را دارد‪ .‬ﺑﺮاي ﻣﺜﺎل در ﻣﻮرد ‪ HD‬ﺑﺎﻳﺪ ﺷﻤﺎرهي ﺑﺨﺶ ﻣﻨﻄﻘﻲ‪3‬‬
‫را ﺑﻪ ﺷﻤﺎرهي ﻫﺪ‪ ،‬ﺳﻴﻠﻨﺪر‪ ،‬و ﺑﺨﺶ ﻓﻴﺰﻳﻜﻲ ﺗﺒﺪﻳﻞ ﻛﻨﺪ‪ .‬ﺑﺮﺧﻼف ‪ ،CDD‬ﻳﻚ ‪ BDD‬ﻣﻲﺗﻮاﻧﺪ در ﻫﺮ زﻣﺎن ﺑﻪ ﭼﻨﺪ وﺳﻴﻠﻪي ﻫﻢ ﻧﻮع‪ ،‬ﺳﺮوﻳﺲ دﻫﺪ‪ .‬ﻣﺜﻼً وﻟﻮمﻫﺎ‪ 4‬ﻳﺎ‬
‫دراﻳﻮﻫﺎي ﻣﺨﺘﻠﻒ ﻳﻚ ‪ HD‬ﻳﻚ ﭼﻨﺪ ‪ HD‬را ﻣﻲﺗﻮان ﺑﺎ ﻳﻚ ﮔﺮداﻧﻨﺪهي ‪ HD‬ﻛﻨﺘﺮل ﻧﻤﻮد‪.‬‬

‫ﻧﺤﻮهي ﺗﺸﺨﻴﺺ وﺳﺎﻳﻞ ﻣﺪﻳﺮﻳﺖ ﺷﻮﻧﺪه ﺑﺎ ﻳﻚ ‪ BDD‬ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ از ﻧﺎم وﺳﻴﻠﻪ)ﻣﺜﻞ ‪ CON‬ﻳﺎ ‪ (PRN‬اﺳﺘﻔﺎده ﻧﻤﻲﺷﻮد‪ ،‬ﺑﻠﻜﻪ ﺑﺎ ﻳﻚ ﺣﺮف‪،‬‬
‫ﻧﻈﻴﺮ ‪ D ،C ،B ،A‬و ﻏﻴﺮه ﻣﺸﺨﺺ ﻣﻲﺷﻮﻧﺪ‪ ،‬ﻛﻪ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺗﻜﺮاري ﺑﺎﺷﻨﺪ‪ ،‬وﻟﻲ ﺑﺎﻳﺪ ﺑﻪﺻﻮرت ﭘﻲدرﭘﻲ ﺑﺎﺷﻨﺪ‪ .‬ﻫﺮ ‪ BDD‬ﺑﺎﻳﺪ ﻳﻚ ‪ FAT‬و ﻳﻚ داﻳﺮﻛﺘﻮري رﻳﺸﻪ‬
‫داﺷﺘﻪ ﺑﺎﺷﺪ و ﺑﺮ ﺧﻼف ‪ CDD‬ﺣﺎﻟﺘﻬﺎي ﻋﻤﻠﻴﺎﺗﻲ ‪ Cooked‬و ‪ Raw‬ﻧﺪارﻧﺪ‪.‬‬

‫دﺳﺘﺮﺳﻲ ﺑﻪ ﮔﺮداﻧﻨﺪهﻫﺎ‪:‬‬

‫راﻫﻬﺎي ﻣﺨﺘﻠﻔﻲ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﮔﺮداﻧﻨﺪهﻫﺎ وﺟﻮد دارﻧﺪ‪ .‬ﺑﻪ ‪ CDD‬ﻣﻲﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ ‪ FCB‬ﻳﺎ ‪ handle‬دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد‪ ،‬ﻛﻪ اﺳﻢ وﺳﻴﻠﻪ‬
‫ﺑﻪﺟﺎي اﺳﻢ ﻓﺎﻳﻞ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬اﻣﺎ ﺑﻪ ‪BDD‬ﻫﺎ ﻣﻲﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ داس ﺑﺮاي ﻓﻬﺮﺳﺖ‪ ،‬ﻓﺎﻳﻞ و ﻏﻴﺮه دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد‪ .‬روش دﻳﮕﺮ دﺳﺘﺮﺳﻲ‪،‬‬
‫ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ 44H‬داس اﺳﺖ ﻛﻪ ﺑﻪ ‪ 5IOCTL‬ﻣﻌﺮوف اﺳﺖ و داراي ﺗﻌﺪادي زﻳﺮ ﺗﺎﺑﻊ اﺳﺖ ﻛﻪ در ﻣﻮرد آن در اداﻣﻪي اﻳﻦ ﻓﺼﻞ ﺻﺤﺒﺖ ﻣﻲﺷﻮد‪.‬‬

‫‪ 4-25‬ﺳﺎﺧﺘﺎر ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‬


‫ﮔﺮﭼﻪ ‪ CDD‬و ‪ BDD‬ﺑﺎ ﻫﻢ ﻣﺘﻔﺎوﺗﻨﺪ‪ ،‬اﻣﺎ ﻫﺮ دو داراي ﺳﺎﺧﺘﺎر واﺣﺪي ﻫﺴﺘﻨﺪ‪ .‬ﻫﺮ ‪ DD‬داراي اﺟﺰاء زﻳﺮ اﺳﺖ‪:‬‬

‫_________________________________________________________________________________‬
‫‪Character Device Driver ١‬‬
‫‪Block Device Driver ٢‬‬
‫‪logical sector ٣‬‬
‫‪volume ٤‬‬
‫‪I/O Control ٥‬‬
‫‪3-25‬‬ ‫ﻓﺼﻞ ‪ :25‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‬

‫‪ :Device header‬در اﺑﺘﺪاي ﻫﺮ ‪ DD‬وﺟﻮد دارد و ﺷﺎﻣﻞ اﻃﻼﻋﺎت زﻳﺮ ﺑﺮاي ﻧﺼﺐ وﺳﻴﻠﻪ ﺗﻮﺳﻂ داس اﺳﺖ‪:‬‬ ‫•‬

‫‪Address‬‬ ‫‪Contents‬‬ ‫‪Type‬‬


‫‪00H‬‬ ‫‪Offset address of next driver‬‬ ‫‪1 word‬‬
‫‪02H‬‬ ‫‪Segment address of next driver‬‬ ‫‪1 word‬‬
‫‪04H‬‬ ‫‪Device attribute‬‬ ‫‪1 word‬‬
‫‪06H‬‬ ‫‪Offset address of strategy routine‬‬ ‫‪1 word‬‬
‫‪08H‬‬ ‫‪Offset address of interrupt routine‬‬ ‫‪1 word‬‬
‫‪0AH‬‬ ‫)‪Driver name(for CDD) or Number of device(for BDD‬‬ ‫‪8 bytes‬‬
‫* ﻓﻴﻠﺪ ﺳﻮم‪ ،‬ﻳﻚ ‪ word‬اﺳﺖ ﻛﻪ ﺑﻴﺖ ‪ 15‬آن‪ ،‬ﻧﻮع ‪ DD‬را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ و ﺑﺮاي ‪ CDD=1‬و ﺑﺮاي ‪ BDD=0‬اﺳﺖ‪.‬‬

‫‪ :Strategy routine‬ﺑﺮاي ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪي ‪ DD‬ﺗﻮﺳﻂ داس در ﻫﻨﮕﺎم ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ﮔﺮداﻧﻨﺪه و ﻗﺒﻞ از اﺟﺮاي روال وﻗﻔﻪ‪ ،‬ﻓﺮاﺧﻮاﻧﻲ‬ ‫•‬
‫ﻣﻲﺷﻮد‪.‬‬

‫‪ :Interrupt routine‬ﺑﺎ رواﻟﻬﺎي ﻣﻌﻤﻮﻟﻲ وﻗﻔﻪ ﻣﺘﻔﺎوت اﺳﺖ و در ﺣﻘﻴﻘﺖ ﺗﻮاﺑﻊ ﮔﺮداﻧﻨﺪه ﺗﻮﺳﻂ آن اﻧﺠﺎم ﻣﻲﺷﻮد و ﭘﺲ از روال اﺳﺘﺮاﺗﮋي‬ ‫•‬
‫ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮد‪.‬‬

‫‪ 5-25‬ﺗﻮاﺑﻊ ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‬


‫ﺗﺤﺖ ‪ ،DOS 2.0‬ﻫﺮ ‪ DD‬ﻗﺎﺑﻞ ﻧﺼﺐ ﻣﻲﺑﺎﻳﺴﺖ ‪ 13‬ﺗﺎﺑﻊ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻛﺮد‪ ،‬ﻛﻪ داراي ﺷﻤﺎرهﻫﺎي ‪ 00H‬ﺗﺎ ‪ 0CH‬ﺑﻮدﻧﺪ‪ ،‬ﺣﺘﻲ اﮔﺮ ﻣﺠﺒﻮر ﺑﻮدﻧﺪ ﻛﻪ‬
‫داراي ﺑﺪﻧﻪي ﺧﺎﻟﻲ ﺑﺎﺷﻨﺪ و ﻳﻚ ‪ DONE flag‬را ﻣﻘﺪاردﻫﻲ ﻛﻨﻨﺪ‪ .‬اﻣﺎ ﺗﺤﺖ ﻧﮕﺎرﺷﻬﺎي ﺑﻌﺪي داس‪ ،‬ﺗﻮاﺑﻊ دﻳﮕﺮي ﻧﻴﺰ ﻣﻲﺗﻮاﻧﻨﺪ ﺑﻪﻃﻮر اﺧﺘﻴﺎري وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﻨﺪ‪.‬‬
‫در اداﻣﻪ اﻧﻮاع ﺗﻮاﺑﻊ و ﻛﺎرﺑﺮد آﻧﻬﺎ ﺗﺸﺮﻳﺢ ﻣﻲﺷﻮد‪:‬‬

‫‪Function 00H: Driver initialization‬‬


‫در ﻫﻨﮕﺎم ﻧﺼﺐ ﮔﺮداﻧﻨﺪه ﺗﻮﺳﻂ داس ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه و ‪ DD‬را ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪ ﻣﻲﻛﻨﺪ و ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻛﺎرﻫﺎﻳﻲ ﭼﻮن )‪(1‬ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪي ﺳﺨﺖاﻓﺰار‬
‫)‪(2‬ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪي ﻣﺘﻐﻴﺮﻫﺎي داﺧﻠﻲ ‪(3) DD‬ﺗﻌﻮﻳﺾ وﻗﻔﻪﻫﺎ را اﻧﺠﺎم ﻣﻲدﻫﺪ‪.‬‬

‫از آﻧﺠﺎﻳﻲ ﻛﻪ در زﻣﺎن ﻧﺼﺐ ‪ ،DD‬داس ﺑﻪﻃﻮر ﻛﺎﻣﻞ ﺑﺎﻻ ﻧﻴﺎﻣﺪه اﺳﺖ‪ ،‬روال ﻣﻘﺪار دﻫﻲ ﻣﻲﺗﻮاﻧﺪ ﺗﻨﻬﺎ ﺗﻮاﺑﻊ ‪ 01H‬ﺗﺎ ‪ 1CH‬داس )ﺑﺮاي ورودي‪-‬ﺧﺮوﺟﻲ‬
‫ﻛﺎراﻛﺘﺮ(‪ ،‬ﺗﺎﺑﻊ ‪) 30H‬ﺗﻌﻴﻴﻦ ﻧﮕﺎرش داس(‪ ،‬و ﺗﻮاﺑﻊ ‪ 25H‬و ‪ (Get/Set Int. Vect) 35H‬را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﺪ‪ ،‬و اﻳﻦ دﻟﻴﻞ اﺻﻠﻲ ﻋﺪم اﻣﻜﺎن ﻧﻮﺷﺘﻦ ‪ DD‬ﺑﺎ زﺑﺎﻧﻬﺎي‬
‫ﺳﻄﺢ ﺑﺎﻻ اﺳﺖ‪.‬‬

‫‪Function 01H: Media check‬‬


‫ﻓﻘﻂ ﺑﺎ ‪ BDD‬ﻛﺎرﺑﺮد دارد و ﺑﺮاي ﻧﻤﻮﻧﻪ در ﻣﻮرد ‪ ،FD‬ﺗﻌﻮﻳﺾ دﻳﺴﻜﺖ را ﺑﺮرﺳﻲ ﻣﻲﻛﻨﺪ‪.‬‬

‫)‪Function 02H: Build BIOSParameter Block (BPB‬‬


‫ﻓﻘﻂ ﺑﺎ ‪ BDD‬ﻛﺎرﺑﺮد دارد و ﻳﻚ ﺟﺪول اﻳﺠﺎد ﻣﻲﻛﻨﺪ ﻛﻪ اﻃﻼﻋﺎت ﻣﻮردﻧﻴﺎز ‪ BIOS‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ وﺳﻴﻠﻪ در آن ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬اﻳﻦ اﻃﻼﻋﺎت ﺷﺎﻣﻞ‬
‫‪ Media Descriptor Byte‬و ﻧﺸﺎﻧﻲ ﺑﺎﻓﺮ ﺷﺎﻣﻞ ‪ FAT‬اﺳﺖ‪.‬‬

‫‪Function 03H: I/O control read‬‬


‫ارﺗﺒﺎط ﻣﺴﺘﻘﻴﻢ ﺑﻴﻦ ‪ DD‬و ﻛﺎرﺑﺮدﻫﺎ را اﻣﻜﺎنﭘﺬﻳﺮ ﻧﻤﻮده و اﻧﺘﻘﺎل اﻃﻼﻋﺎت از وﺳﻴﻠﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪي ﻛﺎرﺑﺮدي را ﻣﻴﺴﺮ ﻣﻲﻛﻨﺪ‪ .‬ﺑﻴﺖ ‪ 14‬در ‪attribute‬‬
‫‪ word‬ﺑﺎﻳﺪ ﺑﻪ ‪ 1‬ﻣﻘﺪاردﻫﻲ ﺷﻮد‪ ،‬ﺗﺎ وﺳﻴﻠﻪ ﻓﻘﻂ از ﻃﺮﻳﻖ ﺗﺎﺑﻊ ‪ 44H‬وﻗﻔﻪي ‪ (IOCTL) 21H‬ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺷﻮد‪.‬‬

‫‪Function 04H: Read‬‬


‫ﻓﻘﻂ ﺑﺎ ‪ BDD‬ﻛﺎرﺑﺮد دارد و دادهﻫﺎ را از وﺳﻴﻠﻪ ﺧﻮاﻧﺪه و در ﻳﻚ ﺑﺎﻓﺮ ﻛﻪ ﻧﺸﺎﻧﻲ آن داده ﻣﻲﺷﻮد‪ ،‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪Function 05H: Non-destructive read‬‬


‫ﻓﻘﻂ ﺑﺎ ‪ CDD‬ﻛﺎرﺑﺮد دارد و داده را از وﺳﻴﻠﻪ ﺧﻮاﻧﺪه‪ ،‬وﻟﻲ آﻧﺮا از ﺑﺎﻓﺮ وﺳﻴﻠﻪ ﺑﺮﻧﻤﻲدارد و ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﻣﺠﺪد اﻳﻦ ﺗﺎﺑﻊ ﻳﺎ ﺗﺎﺑﻊ ‪ 04H‬ﻗﺎﺑﻞ ﺧﻮاﻧﺪن اﺳﺖ‪.‬‬

‫‪Function 06H: Input status‬‬


‫ﺑﺮاي ﺗﻌﻴﻴﻦ آﻣﺎده ﺑﻮدن داده در ﺑﺎﻓﺮ ورودي ﻳﻚ ‪ CDD‬ﺑﻪﻛﺎر ﻣﻲرود‪.‬‬

‫‪Function 07H: Flush input buffers‬‬


‫ﺑﺎﻓﺮﻫﺎي ورودي ﻳﻚ ‪ CDD‬را ﺧﺎﻟﻲ ﻣﻲﻛﻨﺪ و دادهﻫﺎي ﻣﻮﺟﻮد در آﻧﺮا دور ﻣﻲرﻳﺰد)ﻣﺜﻞ ﻛﻠﻴﺪﻫﺎي ﺑﺎﻓﺮ ﺻﻔﺤﻪﻛﻠﻴﺪ(‪.‬‬

‫‪Function 08H: Write‬‬


‫‪4-25‬‬ ‫ﻓﺼﻞ ‪ :25‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‬

‫دادهﻫﺎ را از ﺑﺎﻓﺮ در وﺳﻴﻠﻪ ﻣﻲﻧﻮﻳﺴﺪ و ﺧﻄﺎي اﺣﺘﻤﺎﻟﻲ را در ‪ Status word‬ﻧﺸﺎن ﻣﻲدﻫﺪ‪.‬‬

‫‪Function 09H: Write with verify‬‬


‫ﺑﺎ ‪ BDD‬ﻛﺎرﺑﺮد و دارد دادهﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در وﺳﻴﻠﻪ را دوﺑﺎره ﺧﻮاﻧﺪه و وارﺳﻲ ﻣﻲﻛﻨﺪ‪.‬‬

‫‪Function 0AH: Output status‬‬


‫ﺑﺮرﺳﻲ ﻣﻲﻛﻨﺪ ﻛﻪ آﻳﺎ آﺧﺮﻳﻦ ﻛﺎراﻛﺘﺮ ﻧﻮﺷﺘﻪ ﺷﺪه در ‪ CDD‬ﺗﻜﻤﻴﻞ ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ؟‬

‫‪Function 0BH: Flush output buffers‬‬


‫ﻛﺎراﻛﺘﺮﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در ﺑﺎﻓﺮ ﺧﺮوﺟﻲ را ﻛﻪ ﻫﻨﻮز ﺑﻪ وﺳﻴﻠﻪ ﻣﻨﺘﻘﻞ ﻧﺸﺪهاﻧﺪ را ﭘﺎك ﻣﻲﻛﻨﺪ‪.‬‬

‫‪Function 0CH: I/O control write‬‬


‫اﻧﺘﻘﺎل اﻃﻼﻋﺎت از ﺑﺮﻧﺎﻣﻪي ﻛﺎرﺑﺮدي ﺑﻪ وﺳﻴﻠﻪ را ﺑﻪﻃﻮر ﻣﺴﺘﻘﻴﻢ و ﺑﺎ ﺗﺎﺑﻊ ‪ IOCTL‬اﺟﺎزه ﻣﻲدﻫﺪ‪.‬‬

‫‪Function 0DH: Open‬‬


‫در ﻣﻮرد ‪ CDD‬ﻫﺮﺑﺎر ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮد‪ ،‬وﻟﻲ درﻣﻮرد ‪ BDD‬در ﻣﻮﻗﻊ دﺳﺘﺮﺳﻲ اوﻟﻴﻪ‪ ،‬ﻣﺜﻼً ﺑﺎزﻛﺮدن ﻓﺎﻳﻞ ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه و وﺳﻴﻠﻪ را ﺑﺮاي ﻧﻘﻞ و اﻧﺘﻘﺎل‬
‫آﻣﺎده ﻣﻲﻛﻨﺪ‪.‬‬

‫‪Function 0EH: Device close‬‬


‫ﺑﺴﺘﻦ ﻳﻚ وﺳﻴﻠﻪي و اﻧﺘﻘﺎل ﻓﻴﺰﻳﻜﻲ دادهﻫﺎي ﻣﻮﺟﻮد در ﺑﺎﻓﺮﻫﺎي ﺧﺮوﺟﻲ ﺑﻪ وﺳﻴﻠﻪ‪.‬‬

‫‪Function 0FH: Removable media‬‬


‫در ﻣﻮرد ‪ BDD‬ﻛﺎرﺑﺮد دارد و ﻗﺎﺑﻞ ﺗﻌﻮﻳﺾ ﺑﻮدن آﻧﺮا ﻛﻨﺘﺮل ﻣﻲﻛﻨﺪ)ﻧﻈﻴﺮ ‪.(FD‬‬

‫‪Function 10H: Output until busy‬‬


‫اﻃﻼﻋﺎت را ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ وﺳﻴﻠﻪ ﻣﺸﻐﻮل ﻧﺸﺪه از ﺑﺎﻓﺮ ﺑﻪ وﺳﻴﻠﻪ ﻣﻨﺘﻘﻞ ﻣﻲﻛﻨﺪ‪.‬‬

‫‪Function 11H: Get logical device‬‬


‫ﺑﺎ ‪ BDD‬ﺑﻪﻛﺎر ﻣﻲرود و اﻃﻼﻋﺎت ﻣﻨﻄﻘﻲ در ﻣﻮرد وﺳﻴﻠﻪ را ﺑﺪﺳﺖ ﻣﻲدﻫﺪ‪ .‬ﻣﺜﻼً در ﻣﻮرد ‪ FD‬ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﺪ ﻛﻪ ﻓﺮﻣﺖ آن ‪ double-density‬اﺳﺖ ﻳﺎ‬
‫‪.high-density‬‬

‫‪Function 12H: Set logical device‬‬


‫ﺑﺎ ‪ BDD‬ﺑﻪﻛﺎر ﻣﻲرود و اﻃﻼﻋﺎت ﻣﻨﻄﻘﻲ در ﻣﻮرد وﺳﻴﻠﻪ را ﺗﻨﻈﻴﻢ ﻣﻲﻛﻨﺪ‪ .‬ﻣﺜﻼً در ﻣﻮرد ‪ ،FD‬ﻧﻮع ﻓﺮﻣﺖ آﻧﺮا ﺗﻨﻈﻴﻢ ﻣﻲﻛﻨﺪ‪.‬‬

‫‪ 6-25‬ﮔﺮداﻧﻨﺪهي ﺳﺎﻋﺖ‬
‫ﻳﻜﻲ از ﮔﺮداﻧﻨﺪهﻫﺎي اﺻﻠﻲ داس اﺳﺖ ﻛﻪ ﻧﺎم آن ‪ $CLOCK‬ﺑﻮده و ﺑﻪﻃﻮر ﺧﻮدﻛﺎر ﻧﺼﺐ ﻣﻲﺷﻮد و ﻳﻚ ‪ CDD‬اﺳﺖ‪ .‬ﻣﻲﺗﻮان از ﻧﺎم دﻳﮕﺮي ﻧﻴﺰ‬
‫ﺑﻪﺟﺎي ‪ $CLOCK‬ﺑﺮاي آن اﺳﺘﻔﺎده ﻧﻤﻮد‪ ،‬اﻣﺎ ﺑﺎﻳﺪ در ‪ ،device header‬ﺑﻴﺖ دوم ‪ attribute word‬ﺑﻪ ‪ 1‬ﻣﻘﺪاردﻫﻲ ﺷﻮد‪ .‬ﻫﻤﭽﻨﻴﻦ ﭼﻮن ‪ CDD‬اﺳﺖ‪ ،‬ﺑﻴﺖ‬
‫‪ 15‬آن ﻧﻴﺰ ‪ 1‬اﺳﺖ‪.‬‬

‫ﺗﻮاﺑﻊ ‪ 2AH‬ﺗﺎ ‪ 2DH‬داس‪ ،‬ﺑﺮاي ﺗﻨﻈﻴﻢ و ﻧﻤﺎﻳﺶ ﺗﺎرﻳﺦ و زﻣﺎن ﺗﻮاﺑﻊ اﻳﻦ ﮔﺮداﻧﻨﺪه را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﻨﺪ‪ .‬اﻳﻦ ‪ CDD‬ﻓﻘﻂ داراي ﺗﻮاﺑﻌﻲ ﺑﺮاي ﻧﻘﻞ و‬
‫اﻧﺘﻘﺎل ﺗﺎرﻳﺦ اﺳﺖ‪ ،‬و از اﻳﻨﺮو ﺗﻮاﺑﻊ ‪ (Write) 08H ،(Read) 04H‬و ‪ (Initialization) 00H‬ﺑﺎﻳﺪ ﻓﺮاﻫﻢ ﺷﻮﻧﺪ و ﻣﺎﺑﻘﻲ ﺑﺎﻳﺪ ﺧﺎﻟﻲ ﺑﺎﺷﻨﺪ‪ .‬ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ‬
‫‪ ،04H‬ﺗﺎرﻳﺦ و زﻣﺎن از ﮔﺮداﻧﻨﺪه ﺑﻪ داس ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد و داس ﻧﻴﺰ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ‪ ،08H‬ﺗﺎرﻳﺦ و زﻣﺎن ﺟﺪﻳﺪ را ﺗﻨﻈﻴﻢ ﻣﻲﻛﻨﺪ‪ .‬ﭘﺎراﻣﺘﺮﻫﺎي زﻣﺎن و ﺗﺎرﻳﺦ‪ ،‬در ﻳﻚ ﺑﺎﻓﺮ‬
‫ﻛﻪ ‪ 6‬ﺑﺎﻳﺖ اﺳﺖ‪ ،‬ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮﻧﺪ‪:‬‬

‫‪Address‬‬ ‫‪Contents‬‬ ‫‪Type‬‬


‫‪+00H‬‬ ‫‪Number of days since Jan. 1, 1980‬‬ ‫‪1 word‬‬
‫‪+02H‬‬ ‫‪Minutes‬‬ ‫‪1 byte‬‬
‫‪+03H‬‬ ‫‪Hours‬‬ ‫‪1 byte‬‬
‫‪+04H‬‬ ‫‪Hundredth of seconds‬‬ ‫‪1 byte‬‬
‫‪+05H‬‬ ‫‪Seconds‬‬ ‫‪1 byte‬‬
‫* ﺗﻮاﺑﻊ ‪ 04H‬و ‪ 08H‬ﮔﺮداﻧﻨﺪه ﻫﻢ از ﺗﻮاﺑﻊ ‪ 00H‬و ‪ 01H‬وﻗﻔﻪي ‪ 1AH‬ﺑﺮاي ﺗﻨﻈﻴﻢ زﻣﺎن اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪.‬‬

‫* ﻧﺤﻮهي ﻧﮕﻬﺪاري ﺗﺎرﻳﺦ )ﺑﺮ اﺳﺎس ﺗﻌﺪاد روزﻫﺎ از اول ژاﻧﻮﻳﻪ ‪ (1980‬ﻏﻴﺮ ﻣﻌﻤﻮل اﺳﺖ و داس ﺑﺎﻳﺪ روز‪/‬ﻣﺎه‪/‬ﺳﺎل را ﺑﺎ درﻧﻈﺮ ﮔﺮﻓﺘﻦ ﺗﻤﺎﻣﻲ ﺟﻮاﻧﺐ ﺗﺒﺪﻳﻞ‪،‬‬
‫از ﻗﺒﻴﻞ ﺳﺎﻟﻬﺎي ﻛﺒﻴﺴﻪ ﺑﻪ ﺗﻌﺪاد روز و ﺑﺮﻋﻜﺲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪5-25‬‬ ‫ﻓﺼﻞ ‪ :25‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‬

‫‪ 7-25‬اﻧﻮاع دﺳﺘﺮﺳﻲ ﺑﻪ ﮔﺮداﻧﻨﺪه‬


‫‪ (1‬دﺳﺘﺮﺳﻲ ﻏﻴﺮﻣﺴﺘﻘﻴﻢ از ﻃﺮﻳﻖ داس‬

‫وﻗﺘﻲ ﻳﻚ ﮔﺮداﻧﻨﺪه ﻧﺼﺐ ﻣﻲﺷﻮد‪ ،‬ﻳﻚ وﺳﻴﻠﻪي ﻓﻴﺰﻳﻜﻲ ﺑﺎ ﻳﻚ ﻧﺎم ﻣﻨﻄﻘﻲ ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺘﺼﻞ ﺷﺪه و ارﺗﺒﺎط ﺑﺎ آن ﻣﻴﺴ‪‬ﺮ ﻣﻲﺷﻮد‪ .‬ﻣﺜﻼً اﮔﺮ ‪CD-ROM‬‬
‫ﻧﺼﺐ ﻛﺮدهاﻳﻢ‪ ،‬دراﻳﻮ ‪ E:‬ﺑﻪ آن ﻣﻨﺴﻮب ﻣﻲﺷﻮد و دﺳﺘﺮﺳﻲ ﺑﻪ ‪ E:‬اﻧﺠﺎم ﻣﻲدﻫﻴﻢ‪ ،‬داس ﺑﺮ اﺳﺎس ﻧﻮع دﺳﺘﺮﺳﻲ‪ ،‬ﻳﻜﻲ از ﺗﻮاﺑﻊ ﺗﺸﺮﻳﺢ ﺷﺪه را ﻛﻪ در ﻛﺪ ‪ DD‬وﺟﻮد دارد‪،‬‬
‫ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮده و اﺟﺮا ﻣﻲﻛﻨﺪ‪ .‬ﻣﺜﻼً اﮔﺮ دﺳﺘﺮﺳﻲ‪ ،‬از ﻧﻮع ﺧﻮاﻧﺪن اﺳﺖ‪ ،‬ﺗﺎﺑﻊ ‪ read‬ﻣﺨﺼﻮص ﮔﺮداﻧﻨﺪه ﻛﻪ در ﻛﺪ ‪ DD‬وﺟﻮد دارد ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮد‪.‬‬

‫‪ (2‬دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ از ﻃﺮﻳﻖ ‪IOCTL‬‬


‫روش دﻳﮕﺮي ﺑﺮاي ارﺗﺒﺎط ﺑﺎ ‪ DD‬اﺳﺖ و درﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ‪ 14‬در ‪ attribute word‬ﺑﻪ ‪ 1‬ﻣﻘﺪاردﻫﻲ ﺷﺪه ﺑﺎﺷﺪ‪ ،‬اﻣﻜﺎنﭘﺬﻳﺮ ﻣﻲﺷﻮد و از ﻃﺮﻳﻖ ﺗﺎﺑﻊ‬
‫‪ 44H‬داس ﻛﻪ ﺑﻪ ‪ IOCTL‬ﻣﻌﺮوف اﺳﺖ‪ ،‬ﻣﻲﺗﻮان ﺑﻪ ‪ DD‬دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد و ﻛﺎرﻫﺎي زﻳﺮ را اﻧﺠﺎم داد‪:‬‬
‫• ﭘﻴﻜﺮهﺑﻨﺪي وﺳﻴﻠﻪ‪1‬‬
‫اﻧﺘﻘﺎل دادهﻫﺎ‪2‬‬ ‫•‬
‫وﺿﻌﻴﺖ ﮔﺮداﻧﻨﺪه‬ ‫•‬

‫‪ IOCTL‬داراي ﺗﻌﺪاد زﻳﺎدي زﻳﺮﺗﺎﺑﻊ اﺳﺖ ﻛﻪ ﺷﻤﺎرهي آن ﺑﺎﻳﺪ در ‪ AL‬ﭘﺎس ﺷﻮد و ﻫﻤﺎﻧﻨﺪ ﻫﻤﻪي ﺗﻮاﺑﻊ داس‪ ،‬ﭘﺲ از اﺟﺮا ‪ CF‬ﻧﺸﺎندﻫﻨﺪهي وﻗﻮع ﻳﺎ‬
‫ﻋﺪم وﻗﻮع ﺧﻄﺎ ﺧﻮاﻫﺪ ﺑﻮد‪ .‬در اداﻣﻪ ﻣﺨﺘﺼﺮي در ﻣﻮرد اﻳﻦ ﺗﻮاﺑﻊ ﺗﻮﺿﻴﺢ داده ﻣﻲﺷﻮد‪:‬‬

‫* زﻳﺮ ﺗﻮاﺑﻊ ‪ 06‬و ‪ 07‬وﺿﻌﻴﺖ ‪ CDD‬را ﻧﺸﺎن ﻣﻲدﻫﻨﺪ‪ .‬اوﻟﻲ ﻣﻲﮔﻮﻳﺪ ﻛﻪ آﻳﺎ وﺳﻴﻠﻪ ﻗﺎدر ﺑﻪ ارﺳﺎل داده اﺳﺖ ﻳﺎ ﻧﻪ؟ و دوﻣﻲ ﻣﻲﮔﻮﻳﺪ ﻛﻪ آﻳﺎ وﺳﻴﻠﻪ ﻗﺎدر‬
‫ﺑﻪ درﻳﺎﻓﺖ داده اﺳﺖ ﻳﺎ ﻧﻪ؟ ‪ handle‬وﺳﻴﻠﻪ ﺑﺎﻳﺪ در ‪ BX‬ارﺳﺎل ﺷﻮد و اﮔﺮ وﺳﻴﻠﻪ آﻣﺎده ﺑﺎﺷﺪ‪ ،‬ﻣﻘﺪار ‪ FFH‬در ‪ AL‬ﺑﺮﮔﺮداﻧﺪه ﻣﻲﺷﻮد‪.‬‬

‫* زﻳﺮﺗﺎﺑﻊ ‪ 01‬ﺑﺮاي اﻧﺘﺨﺎب ﺣﺎﻟﺘﻬﺎي ﻋﻤﻠﻴﺎﺗﻲ ‪ Cooked‬و ‪ Raw‬در ‪ CDD‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬

‫* زﻳﺮﺗﺎﺑﻊ ‪ 02‬دادهﻫﺎي ﻛﻨﺘﺮﻟﻲ را از ‪ CDD‬ﻣﻲﺧﻮاﻧﺪ‪.‬‬

‫* زﻳﺮﺗﺎﺑﻊ ‪ 03‬دادهﻫﺎي ﻛﻨﺘﺮﻟﻲ را ﺑﺮ روي ‪ CDD‬ﻣﻲﻧﻮﻳﺴﺪ‪.‬‬

‫* زﻳﺮﺗﺎﺑﻊ ‪ 04‬دادهﻫﺎي ﻛﻨﺘﺮﻟﻲ را از ‪ BDD‬ﻣﻲﺧﻮاﻧﺪ‪.‬‬

‫* زﻳﺮﺗﺎﺑﻊ ‪ 05‬دادهﻫﺎي ﻛﻨﺘﺮﻟﻲ را ﺑﺮ روي ‪ BDD‬ﻣﻲﻧﻮﻳﺴﺪ‪.‬‬

‫* زﻳﺮﺗﺎﺑﻊ ‪ 00‬ﺑﺮاي ﺑﺪﺳﺖ آوردن اﻃﻼﻋﺎت وﺳﻴﻠﻪ ﺑﺮاي ﻳﻚ ‪ handle‬در ‪ BDD‬اﺳﺖ‪ .‬ﭼﻮن ﻣﻤﻜﻦ اﺳﺖ ﭼﻨﺪ ‪ handle‬در وﺳﻴﻠﻪ ﻓﻌﺎل ﺑﺎﺷﺪ‪.‬‬

‫‪ 8-25‬ﻧﻜﺎﺗﻲ درﺑﺎرهي ﻧﻮﺷﺘﻦ ‪DD‬‬


‫ﻧﻮﺷﺘﻦ ‪ DD‬از ﻣﺸﻜﻞﺗﺮﻳﻦ ﺑﺨﺸﻬﺎي ﺑﺮﻧﺎﻣﻪﺳﺎزي ﺳﻴﺴﺘﻢ اﺳﺖ و ﻣﺸﻜﻼت زﻳﺮ ﻣﻤﻜﻦ اﺳﺖ در ﻣﻮﻗﻊ ﺗﺴﺖ آن ﭘﻴﺶ آﻳﺪ‪:‬‬

‫ﻧﺸﺎﻧﻲ ﺑﺎرﺷﺪن ‪ DD‬در ﺣﺎﻓﻈﻪ ﺗﻮﺳﻂ داس ﺗﻌﻴﻴﻦ ﻣﻲﺷﻮد و در زﻣﺎن ﺗﺴﺖ و اﺷﻜﺎﻟﺰداﻳﻲ ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ ﻧﺎﻣﺸﺨﺺ اﺳﺖ‪.‬‬ ‫•‬

‫ﮔﺮداﻧﻨﺪهي ﺟﺪﻳﺪ ﺑﺮاي ‪ CON‬را ﻧﻤﻲﺗﻮان ﺑﺎ ﺑﺮﻧﺎﻣﻪي ‪ debug‬داس‪ ،‬ﺗﺴﺖ ﻛﺮد‪ .‬ﭼﻮن ﺧﻮد ‪ debug‬از ‪ CON‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ‪.‬‬ ‫•‬

‫وﻗﺘﻲ ﻳﻚ ‪ DD‬ﻣﻲﻧﻮﻳﺴﻴﺪ‪ ،‬ﻳﻚ ﺑﺮﻧﺎﻣﻪي ﺗﺴﺖ ﺑﺮاي ﺗﻚ ﺗﻚ ﺗﻮاﺑﻊ ﺑﺎ روﺷﻲ ﻣﺸﺎﺑﻪ داس ﺑﻨﻮﻳﺴﻴﺪ و ﻗﺒﻞ از ﻧﺼﺐ ‪ DD‬ﻫﻤﻪي ﺗﻮاﺑﻊ آﻧﺮا ﺗﺤﺖ‬ ‫•‬
‫ﻛﻨﺘﺮل ﺧﻮد ﺗﺴﺖ ﻛﻨﻴﺪ‪.‬‬

‫‪BDD‬ﻫﺎ را ﺗﻨﻬﺎ ﭘﺲ از ﺗﺴﺖ ﻛﺎﻣﻞ در ﺳﻴﺴﺘﻢ ﻧﺼﺐ ﻛﻨﻴﺪ‪ .‬زﻳﺮا ﻣﻤﻜﻦ اﺳﺖ ﻣﺸﻜﻼﺗﻲ ﻣﺜﻞ ﺗﺪاﺧﻞ ﺑﺎ ﺳﺎﻳﺮ ﻟﻮازم و ﻣﺜﻼً ﺧﺮاب ﻛﺮدن ‪partition‬‬ ‫•‬
‫‪ table‬دﻳﺴﻚ ﺳﺨﺖ و ﻏﻴﺮه ﭘﻴﺶ آﻳﺪ‪.‬‬

‫‪ 9-25‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ EXE‬ﺑﻪ ﻋﻨﻮان ‪DD‬‬


‫ﻃﻲ ﺳﺎﻟﻬﺎي اﺧﻴﺮ‪ ،‬ﺑﺮﺧﻲ ﮔﺮداﻧﻨﺪهﻫﺎ ﺑﻪﺻﻮرت ﻓﺎﻳﻠﻬﺎي ‪ EXE‬اﻳﺠﺎد ﺷﺪهاﻧﺪ و ﺑﻪ وﺳﻴﻠﻪﻫﺎي ﻣﺮﺑﻮﻃﻪ ﻫﻢ ﻣﻲﺗﻮان از ﻃﺮﻳﻖ ﮔﺮداﻧﻨﺪهﻫﺎي ﻧﺼﺐ ﺷﺪه در‬
‫زﻣﺎن ﺑﻮت ﺷﺪن داس و ﻣﻌﺮﻓﻲ ﺷﺪه در ‪ ،CONFIG.SYS‬دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد و ﻫﻢ از ﻃﺮﻳﻖ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ EXE‬ﻛﻪ ﺗﺤﺖ ﺧﻂ ﻓﺮﻣﺎن داس و ﭘﺲ از ﺑﻮت ﺷﺪن‬
‫داس اﺟﺮا ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل ﮔﺮداﻧﻨﺪهﻫﺎي ﻣﺎوس ﻳﻚ ‪ EMS‬اﻳﻦﮔﻮﻧﻪ ﻫﺴﺘﻨﺪ‪ .‬اﻳﻦ ﮔﻮﻧﻪ ﮔﺮداﻧﻨﺪهﻫﺎ‪ ،‬ﮔﺮداﻧﻨﺪهﻫﺎي واﻗﻌﻲ ﻧﻴﺴﺘﻨﺪ و از ﺳﺎﺧﺘﺎر ﮔﻔﺘﻪ ﺷﺪه ﺑﺮاي ‪DD‬‬
‫ﺗﺒﻌﻴﺖ ﻧﻤﻲﻛﻨﻨﺪ‪ ،‬ﺑﻠﻜﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﻫﺴﺘﻨﺪ‪ .‬اﻏﻠﺐ اﻳﻦ ﮔﻮﻧﻪ ﮔﺮداﻧﻨﺪهﻫﺎ‪ CDD ،‬ﻫﺴﺘﻨﺪ و داس ﺣﺮف دراﻳﻮ ﺑﻪ آﻧﻬﺎ ﻣﻨﺴﻮب ﻧﻤﻲﻛﻨﺪ‪ .‬ﺑﺮاي آﻧﻜﻪ داس آﻧﻬﺎ را ﺑﻪ‬
‫ﻋﻨﻮان ﮔﺮداﻧﻨﺪه ﺑﺸﻨﺎﺳﺪ‪ ،‬ﺑﺎﻳﺪ داراي ﺗﺎﺑﻊ ‪ 00H‬ﺑﺎﺷﻨﺪ ﺗﺎ ﮔﺮداﻧﻨﺪه را ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪ ﻧﻤﺎﻳﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪device configurartion ١‬‬
‫‪data transmision ٢‬‬
‫‪6-25‬‬ ‫ﻓﺼﻞ ‪ :25‬ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ‬

‫‪ 10-25‬ﮔﺮداﻧﻨﺪهﻫﺎي ‪CD-ROM‬‬
‫از ﻧﻈﺮ داس‪ CD-ROM ،‬ﻛﻪ ﻳﻚ وﺳﻴﻠﻪي ذﺧﻴﺮهﺳﺎزي اﻧﺒﻮه اﺳﺖ‪ ،‬ﺑﺎﻳﺪ ﻳﻚ ﮔﺮداﻧﻨﺪهي وﺳﻴﻠﻪي ﺑﻠﻮﻛﻲ داﺷﺘﻪ و داراي ‪ FAT‬ﺑﺎﺷﺪ‪ .‬اﻳﻦ در ﺣﺎﻟﻲاﺳﺖ‬
‫ﻛﻪ ﻓﺮﻣﺖ ذﺧﻴﺮهﺳﺎزي دادهﻫﺎ در ‪ CD-ROM‬ﺑﻪ ﺻﻮرﺗﻬﺎي ﺧﺎﺻﻲ ﺑﻮده و ﺑﺮاي ﺧﻮاﻧﺪن وﻧﻮﺷﺘﻦ دادهﻫﺎ‪ ،‬ﺑﻠﻮﻛﻬﺎﻳﻲ ﺑﺎ اﻧﺪازهي ﻣﺘﻔﺎوت ﺑﺎ دﻳﺴﻚ ﺳﺨﺖ‪ ،‬و ﻣﺜ ً‬
‫ﻼ‬
‫ﺑﻠﻮﻛﻬﺎي ‪ 2KB‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬اﻃﻼﻋﺎت ﻓﺎﻳﻠﻬﺎ ﻫﻢ ﺑﻪ ﺻﻮرت ‪ FAT‬ﻧﮕﻬﺪاري ﻧﻤﻲﺷﻮد‪ ،‬ﺑﻠﻜﻪ از روﺷﻬﺎي ﺧﺎص‪ ،‬ﻧﻈﻴﺮ اﺳﺘﺎﻧﺪارﻫﺎي ‪ ISO‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬از اﻳﻨﺮو‪،‬‬
‫ﺑﺎﻳﺪ ﺑﻪﺟﺎي ‪ BDD‬از ‪ CDD‬ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ‪ CD-ROM‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ ،‬ﻛﻪ در اﻳﻦ ﺻﻮرت ﻳﻚ ﺣﺮف دراﻳﻮ ﺑﻪ آن ﻣﻨﺴﻮب ﻧﺨﻮاﻫﺪ ﺷﺪ‪ .‬اﻣﺎ‪ ،‬ﺑﺮاي آﻧﻜﻪ ﺑﺘﻮان از‬
‫اﻳﻦ وﺳﻴﻠﻪ ﺑﻪ ﻋﻨﻮان ﻳﻚ وﺳﻴﻠﻪي ذﺧﻴﺮهﺳﺎزي اﻧﺒﻮه و ﻫﻤﺎﻧﻨﺪ وﺳﺎﻳﻞ ﺑﻠﻮﻛﻲ ﻧﻈﻴﺮ ‪ HD‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ ،‬و ﻳﻚ ﺣﺮف دراﻳﻮ ﺑﻪ آن ﻣﻨﺴﻮب ﻛﺮد‪ ،‬ﺑﺎﻳﺪ واﺳﻄﻬﺎﻳﻲ وﺟﻮد داﺷﺘﻪ‬
‫ﺑﺎﺷﺪ‪.‬‬

‫ﺑﺮاي ﻧﺼﺐ ﮔﺮداﻧﻨﺪهي ‪ ،CD-ROM‬ﺑﺎﻳﺪ ﺧﻄﻲ ﻣﺸﺎﺑﻪ زﻳﺮ ﺑﻪ ‪ CONFIG.SYS‬اﺿﺎﻓﻪ ﺷﻮد‪:‬‬

‫‪DEVICE=HITACHI.SYS /D:CDR1‬‬
‫ﻛﻪ ﮔﺮداﻧﻨﺪه ﺑﺮاي ‪ CD-ROM‬ﺳﺎﺧﺖ ‪ HITACHI‬را ﻧﺼﺐ ﻣﻲﻛﻨﺪ و اﻳﻦ ‪ CDD‬ﺑﺎ ﻧﺎم ‪ CDR1‬ﺑﻪ ﺳﻴﺴﺘﻢ ﺷﻨﺎﺳﺎﻧﺪه ﻣﻲﺷﻮد‪ .‬اﻣﺎ ﻫﻤﺎﻧﮕﻮﻧﻪ ﻛﻪ‬
‫ﮔﻔﺘﻪ ﺷﺪ‪ ،‬ﺗﺮﺟﻴﺢ ﻣﻲدﻫﻴﻢ ﻛﻪ از ﻃﺮﻳﻖ داس و ﻫﻤﺎﻧﻨﺪ ﻳﻚ وﻟﻮم ‪ HD‬ﺑﻪ آن دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﻢ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر‪ ،‬ﺑﺎﻳﺪ ﺑﺮﻧﺎﻣﻪي ‪ 1MSCDEX‬را اﺟﺮا ﻛﻨﻴﻢ‪:‬‬

‫‪MSCDEX.EXE /D:CDR1 /V /M:8 /L:E‬‬


‫‪ /L:E‬ﺣﺮف دراﻳﻮ ‪ E:‬را ﺑﻪ ‪ CDR1‬ﻣﻨﺴﻮب ﻣﻲﻛﻨﺪ‪ .‬در اﻳﻦ ﺻﻮرت‪ ،‬ﺑﺮﻧﺎﻣﻪي ‪ ،MSCDEX‬دﺳﺘﺮﺳﻲ ‪ CDD‬را ﺑﻪ ﺻﻮرت ‪ BDD‬اﻣﻜﺎنﭘﺬﻳﺮ‬
‫ﻣﻲﻛﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪Microsoft CD Extension ١‬‬
‫ﻓﺼﻞ ‪ :26‬ﺳﻴﺴﺘﻢ ﻓﺎﻳﻞ داس‬
‫)‪(DOS File System‬‬

‫‪ 1-26‬ﺳﺎﺧﺘﺎر ﻣﺒﻨﺎﻳﻲ ﺳﻴﺴﺘﻢ ﻓﺎﻳﻞ‬


‫ﺳﻴﺴﺘﻢ ﻓﺎﻳﻞ داس ﻣﺒﺘﻨﻲ ﺑﺮ ﺳﺎﺧﺘﺎر وﻟﻮم‪ 1‬اﺳﺖ‪ .‬از دﻳﺪﮔﺎه ﻛﺎرﺑﺮ‪ ،‬داس ﺑﻪ ﻟﻮازم ذﺧﻴﺮهﺳﺎزي اﻧﺒﻮه‪ 2‬ﺗﺤﺖ ﻋﻨﻮان وﻟﻮم دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮده و ﺑﻪ ﻫﺮ وﻟﻮم‬
‫ﻣﺠﺰا ﻳﻚ ﺣﺮف دراﻳﻮ ﻣﻨﺴﻮب ﻣﻲﻛﻨﺪ‪ ،‬ﻛﻪ ﺑﺮاي دﻳﺴﻜﺘﻬﺎ‪ A: ،‬و ‪ B:‬و دﻳﺴﻜﻬﺎي ﺳﺨﺖ‪ C: ،‬و ‪ D:‬اﺳﺖ‪ .‬ﻗﺒﻞ از ‪ ،DOS 3.3‬ﻫﺮ وﻟﻮم ﻣﻲﺗﻮاﻧﺴﺖ داراي اﻧﺪازهاي‬
‫ﻣﻌﺎدل ﺣﺪاﻛﺜﺮ ‪ 32MB‬ﺑﺎﺷﺪ‪ .‬از اﻳﻨﺮو‪ ،‬دﻳﺴﻜﻬﺎي ﺳﺨﺖ ﺑﺎ ﻇﺮﻓﻴﺖ ﺑﺎﻻﺗﺮ‪ ،‬ﺑﻪ ﺗﻌﺪادي وﻟﻮم ﻣﻨﻄﻘﻲ ‪ 32MB‬ﺗﻘﺴﻴﻢﺑﻨﺪي‪ 3‬ﻣﻲﺷﺪﻧﺪ‪.‬‬

‫ﻫﺮ وﻟﻮم داراي ﺳﺎﺧﺘﺎر ﻣﻨﻄﻘﻲ ﺧﺎﺻﻲ ﺑﻮده‪ ،‬ﻛﻪ ﺑﻪ دﻳﺴﻜﺖ ﻳﺎ دﻳﺴﻚ ﺑﻮدن و ﻣﻴﺰان ﻇﺮﻓﻴﺖ آن ﺑﺴﺘﮕﻲ ﻧﺪارد و ﻓﻘﻂ اﻧﺪازهدادهﻫﺎي ﻣﺪﻳﺮﻳﺘﻲ ﺳﺎﺧﺘﺎر‪ ،‬ﺗﻔﺎوت‬
‫ﺧﻮاﻫﺪ داﺷﺖ‪ .‬ﺑﻪ ﻫﺮ وﻟﻮم ﻣﻲﺗﻮان ﻳﻚ ﻧﺎم ﺑﺮﭼﺴﺐ وﻟﻮم‪ 4‬ﻣﻨﺴﻮب ﻧﻤﻮد‪ .‬ﻫﺮ وﻟﻮم ﺣﺘﻤﺎً داراي ﻳﻚ ﻓﻬﺮﺳﺖ رﻳﺸﻪ و اﺣﺘﻤﺎﻻً ﺗﻌﺪادي زﻳﺮﻓﻬﺮﺳﺖ اﺳﺖ‪.‬‬

‫ﺑﺨﺸﻬﺎ‪ :5‬داس ﻫﺮ وﻟﻮم را ﻳﻚ ﺳﺮي ﺑﺨﺶ ﭘﺸﺖﺳﺮ ﻫﻢ ﻣﻲﺑﻴﻨﺪ‪ .‬ﻫﺮ ﺑﺨﺶ ‪ 512‬ﺑﺎﻳﺖ اﺳﺖ و داراي ﻳﻚ ﺷﻤﺎرهي ﺑﺨﺶ ﻣﻨﻄﻘﻲ اﺳﺖ ﻛﻪ ﺑﻪﺻﻮرت‬
‫ﭘﻲدرﭘﻲ و از ‪ 0‬ﺷﻤﺎرهﮔﺬاري ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﺮاي ﻧﻤﻮﻧﻪ‪ ،‬ﻳﻚ وﻟﻮم ‪ 10‬ﻣﮕﺎﺑﺎﻳﺘﻲ ‪ 20,480‬ﺑﺨﺶ دارد‪ ،‬ﻛﻪ ﺷﻤﺎرهﻫﺎﻳﺶ از ‪ 0‬ﺗﺎ ‪ 20,479‬ﻫﺴﺘﻨﺪ‪ .‬داس ﻛﻨﺘﺮﻟﻲ ﺑﺮ ﻣﺪﻳﺮﻳﺖ‬
‫ﻓﻴﺰﻳﻜﻲ ﺑﺨﺸﻬﺎ ﻧﺪارد و اﻳﻦ ﻛﺎر ﺗﻮﺳﻂ ﮔﺮداﻧﻨﺪهﻫﺎي وﺳﻴﻠﻪ دﻳﺴﻚ ﺳﺨﺖ‪ 6‬اﻧﺠﺎم ﻣﻲﺷﻮد و ﻛﺎر ﺗﺒﺪﻳﻞ ﺑﺨﺸﻬﺎي ﻣﻨﻄﻘﻲ ﺑﻪ ﻓﻴﺰﻳﻜﻲ ﺗﻮﺳﻂ ‪ HDDD‬اﻧﺠﺎم ﻣﻲﺷﻮد‪.‬‬

‫‪ :FAT‬ﺗﻮاﺑﻊ داس ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻠﻬﺎ‪ ،‬دﺳﺘﺮﺳﻲ ﺑﻪ ﻓﺎﻳﻞ را ﺗﺒﺪﻳﻞ ﺑﻪ دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺨﺸﻬﺎي ﻣﻨﻄﻘﻲ ﻣﻲﻛﻨﻨﺪ و ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر از ﺳﺎﺧﺘﺎر ﺟﺪول‬
‫ﺗﺨﺼﻴﺺ ﻓﺎﻳﻠﻬﺎ‪ 7‬ﻳﺎ ‪ FAT‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ ،‬ﻛﻪ در اداﻣﻪ در ﺑﺎرهي آن ﻣﻔﺼﻼً ﺻﺤﺒﺖ ﻣﻲﺷﻮد‪.‬‬

‫ﺳﺎﺧﺘﺎر ﻟﻮازم ذﺧﻴﺮهﺳﺎزي اﻧﺒﻮه‪ :‬ﺳﺎﺧﺘﺎر اﻏﻠﺐ ﻟﻮازم ذﺧﻴﺮهﺳﺎزي اﻧﺒﻮه ﺑﻪﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬

‫‪Sector 0:‬‬ ‫‪Manufacturer’s name, device drivers, boot routine‬‬


‫‪First FAT‬‬
‫‪One or more copies of FAT‬‬
‫‪Root directory with volume label names‬‬
‫‪Data for files directories‬‬
‫‪...‬‬
‫‪...‬‬

‫ﺳﺎﺧﺘﺎر ﻓﻮق ﺗﻮﺳﻂ ﻓﺮﻣﺎن ‪ Format‬اﻳﺠﺎد ﻣﻲﺷﻮد‪.‬‬

‫‪ :Boot Sector‬ﺑﺨﺶ ﺻﻔﺮ‪ ،‬ﺑﺨﺶ ﺑﻮتﻛﻨﻨﺪه اﺳﺖ و ﻫﺮ وﻟﻮم داراي ﻳﻚ ﺑﺨﺶ ﺻﻔﺮ اﺳﺖ و در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﺑﺨﺶ ﺣﺎوي رواﻟﻬﺎي ﺑﻮتﻛﻨﻨﺪهي‬
‫ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﺎﺷﺪ‪ ،‬ﺑﻪ آن ﺑﻮتﻛﻨﻨﺪه‪ 8‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬اﻳﻦ ﺑﺨﺶ ﺣﺎوي اﻃﻼﻋﺎت ﻣﻮردﻧﻴﺎز ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻧﺎﺣﻴﻪﻫﺎي ﻣﺨﺘﻠﻒ و ﺳﺎﺧﺘﺎرﻫﺎي دادهاي وﻟﻮم اﺳﺖ‪ ،‬و ﺑﻪ‬
‫ﺷﻜﻞ زﻳﺮ اﺳﺖ‪:‬‬

‫‪Address‬‬ ‫‪Contents‬‬ ‫‪Type‬‬


‫‪00H‬‬ ‫)‪Jump to boot routine (E9xx or EBxx90‬‬ ‫‪3 bytes‬‬
‫‪03H‬‬ ‫‪Manufacturer’s name and version no.‬‬ ‫‪8 bytes‬‬
‫‪0BH‬‬ ‫‪Bytes per sector‬‬ ‫‪1 word‬‬
‫_________________________________________________________________________________‬
‫‪volume ١‬‬
‫‪mass storage devices ٢‬‬
‫‪partitioning ٣‬‬
‫‪volume label name ٤‬‬
‫‪sectors ٥‬‬
‫‪HD device drivers ٦‬‬
‫‪File Allocation Table ٧‬‬
‫‪bootable ٨‬‬
‫‪2-26‬‬ ‫ﻓﺼﻞ ‪ :26‬ﺳﻴﺴﺘﻢ ﻓﺎﻳﻞ داس‬

‫‪0DH‬‬ ‫‪Sector per cluster‬‬ ‫‪1 byte‬‬


‫‪0EH‬‬ ‫‪Number of reserved sectors‬‬ ‫‪1 word‬‬
‫‪10H‬‬ ‫‪Number of FATs‬‬ ‫‪1 byte‬‬
‫‪11H‬‬ ‫‪Number of enteries in root directory‬‬ ‫‪1 word‬‬
‫‪13H‬‬ ‫‪Number of sectors in volume‬‬ ‫‪1 byte‬‬
‫‪15H‬‬ ‫‪Media descriptor‬‬ ‫‪1 byte‬‬
‫‪16H‬‬ ‫‪Number of sectors per FAT‬‬ ‫‪1 word‬‬
‫‪18H‬‬ ‫‪Sectors per track‬‬ ‫‪1 word‬‬
‫‪1AH‬‬ ‫‪Number of read/writes heads‬‬ ‫‪1 word‬‬
‫‪1CH‬‬ ‫‪Number of hidden sectors‬‬ ‫‪1 word‬‬
‫‪1EH-1FFH‬‬ ‫‪Boot routine‬‬ ‫‪483 bytes‬‬
‫اوﻟﻴﻦ ﻓﻴﻠﺪ ﺳﻪﺑﺎﻳﺖ ﺑﻮده و دﺳﺘﻮراﻟﻌﻤﻞ ﭘﺮش اﺳﺖ ﻛﻪ ﻛﺪ آن‪ (short jump) EBxx ،‬ﻳﺎ ‪ (normal jump) EBxx90‬اﺳﺖ ﻛﻪ اوﻟﻲ دو ﺑﺎﻳﺘﻲ‬
‫اﺳﺖ و دوﻣﻲ ﺳﻪﺑﺎﻳﺘﻲ اﺳﺖ و در ﺣﺎﻟﺖ اول ﭘﺲ از ‪ ،EBxx‬ﻛﺪ دﺳﺘﻮراﻟﻌﻤﻞ ﻳﻚ ﺑﺎﻳﺘﻲ ‪ NOP‬در ﺑﺎﻳﺖ ﺳﻮم ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬در ﻓﻴﻠﺪ دوم‪ ،‬ﻧﺎم ﺳﺎزﻧﺪهي ﺑﺮﻧﺎﻣﻪي ﻓﺮﻣﺖ‪،‬‬
‫ﻧﻈﻴﺮ ‪ MS‬ﻳﺎ ‪ PCTools‬و ﻏﻴﺮه ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬

‫‪FAT 2-26‬‬
‫ﺳﺎﺧﺘﺎري اﺳﺖ ﻛﻪ اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﺑﺨﺸﻬﺎي ﻳﻚ ﻓﺎﻳﻞ در آن ﻧﮕﻬﺪاري ﻣﻲﺷﻮﻧﺪ‪ .‬ﻫﺮ ورودي‪ 1‬در ‪ ،FAT‬ﻛﻪ ‪16‬ﺑﻴﺖ ﻳﺎ ﻳﻚ ‪ word‬اﺳﺖ‪ ،‬ﻣﺘﻨﺎﻇﺮ ﺑﺎ‬
‫ﻳﻚ ﻛﻼﺳﺘﺮ‪ 2‬ﻳﺎ واﺣﺪ ﺗﺨﺼﻴﺺ‪ 3‬اﺳﺖ ﻛﻪ ﺷﺎﻣﻞ ﺗﻌﺪادي ﺑﺨﺶ ﭘﺸﺖ ﺳﺮ ﻫﻢ اﺳﺖ‪ .‬ﻧﺸﺎﻧﻲ ‪ 0DH‬در ﺑﺨﺶ ﺻﻔﺮ‪ ،‬ﺗﻌﺪاد ﺑﺨﺸﻬﺎ در ﻫﺮ ﻛﻼﺳﺘﺮ را ﻣﻌﻴﻦ ﻣﻲﻛﻨﺪ و ﺑﺎﻳﺪ‬
‫ﺗﻮاﻧﻲ از ‪ ،2‬ﻧﻈﻴﺮ ‪ 4 ،2 ،1‬ﻳﺎ ‪ .8‬ﺑﺎﺷﺪ‪:‬‬

‫‪Device‬‬ ‫‪Sectors per cluster‬‬


‫‪Single sided FD‬‬ ‫‪1‬‬
‫‪Double sided FD‬‬ ‫‪2‬‬
‫‪AT HD‬‬ ‫‪4‬‬
‫‪XT HD‬‬ ‫‪8‬‬

‫وﻟﻲ ﻋﻠﻲرﻏﻢ ﺟﺪول ﻓﻮق‪ ،‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﻓﺮﻣﺖ ﺑﻪ ﻣﻘﺎدﻳﺮ ﻓﻮق ﻣﺤﺪود ﻧﻴﺴﺘﻨﺪ و در ﻣﻮرد وﻟﻮﻣﻬﺎي ﺑﺰرﮔﺘﺮ از ‪ 32MB‬ﺑﺎﻳﺪ ﻣﻘﺎدﻳﺮ ﺑﻴﺸﺘﺮي در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد‪.‬‬
‫زﻳﺮا ﺗﻌﺪاد ﻛﻼﺳﺘﺮﻫﺎ ﺑﻪ ‪ 65536‬ﻣﺤﺪود ﺑﻮده و ﺑﺎ آن ﻧﻤﻲﺗﻮان وﻟﻮﻣﻬﺎي ﺑﺰرگ را ﺑﺎ ‪16 FAT‬ﺑﻴﺘﻲ ﻣﺸﺨﺺ ﻧﻤﻮد‪ .‬ﺑﻪ اﻳﻦ دﻟﻴﻞ در ‪ DOS 4.0‬ﺑﻪ ﺑﻌﺪ‪ ،‬ﻣﻔﻬﻮم ﻓﻮق‬
‫ﮔﺴﺘﺮش داده ﺷﺪ‪ ،‬ﺑﺪون آﻧﻜﻪ ﻣﻨﻄﻖ ﻛﺎر ﻋﻮض ﺷﻮد‪ ،‬و ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ در ﻫﺮ ﻛﻼﺳﺘﺮ ﻣﻲﺗﻮان ﺗﻌﺪاد ﺑﺨﺸﻬﺎي ﺑﻴﺸﺘﺮي را ﻣﺸﺨﺺ ﻧﻤﻮد‪ ،‬ﻛﻪ ﺑﺮاي وﻟﻮﻣﻬﺎي ‪ 32MB‬ﺗﺎ‬
‫‪ 2GB‬ﺑﻪﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬

‫‪Volume cluster sizes of DOS 4.0‬‬


‫‪Volume size:‬‬ ‫‪128M‬‬ ‫‪256M‬‬ ‫‪520M‬‬ ‫‪1GB‬‬ ‫‪2G‬‬
‫‪Cluster size:‬‬ ‫‪2K‬‬ ‫‪4K‬‬ ‫‪8K‬‬ ‫‪16K‬‬ ‫‪32K‬‬
‫‪Sectors per cluster:‬‬ ‫‪4‬‬ ‫‪8‬‬ ‫‪16‬‬ ‫‪32‬‬ ‫‪64‬‬
‫زﻳﺎد ﺷﺪن ﺗﻌﺪاد ﺑﺨﺸﻬﺎ در ﻫﺮ ﻛﻼﺳﺘﺮ ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﺑﺮاي ﻓﺎﻳﻠﻬﺎي ﻛﻮﭼﻚ‪ ،‬ﺣﺠﻢ ﺣﺎﻓﻈﻪي زﻳﺎدي ﺗﻠﻒ ﺷﻮد و اﻳﻦ اﻣﺮ در ﺻﻮرﺗﻲ ﻛﻪ ﺗﻌﺪاد ﻓﺎﻳﻠﻬﺎي‬
‫ﻛﻮﭼﻚ زﻳﺎد ﺑﺎﺷﺪ‪ ،‬ﻗﺎﺑﻞ ﻣﻼﺣﻈﻪﺗﺮ ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬

‫ﺗﻜﻪﺗﻜﻪﺷﺪن ﻓﺎﻳﻞ‪ :4‬روش داس ﺑﺮاي ﻧﮕﻬﺪاري ﻓﺎﻳﻠﻬﺎ در ﻗﺎﻟﺐ ﺗﻌﺪادي ﺑﺨﺶ ﺑﺮ روي دﻳﺴﻚ‪ ،‬ﻣﺸﻜﻼﺗﻲ را در زﻣﻴﻨﻪي ﺳﺮﻋﺖ دﺳﺘﺮﺳﻲ ﺑﻪ ﻓﺎﻳﻠﻬﺎ‬
‫اﻳﺠﺎد ﻣﻲﻛﻨﺪ‪ .‬زﻳﺮا ﭘﺲ از ﻣﺪﺗﻲ و ﺑﺎ ﺑﻬﻨﮕﺎم ﺳﺎزي ﻓﺎﻳﻞ‪ ،‬ﻛﻼﺳﺘﺮﻫﺎي ﻳﻚ ﻓﺎﻳﻞ ﭘﺸﺖ ﺳﺮ ﻫﻢ ﻗﺮار ﻧﺨﻮاﻫﻨﺪ داﺷﺖ و ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻛﻼﺳﺘﺮﻫﺎي ﻣﺨﺘﻠﻒ‪ ،‬ﻧﻴﺎز ﺑﻪ‬
‫ﺣﺮﻛﺖ زﻳﺎد ﻫِﺪ ‪ HD‬ﺧﻮاﻫﺪ ﺑﻮد‪ .‬ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﻧﻈﻴﺮ ‪ Defrag‬ﻳﺎ ‪ Norton Speed Disk‬ﻛﺎري ﻛﻪ اﻧﺠﺎم ﻣﻲدﻫﻨﺪ‪ ،‬ﻗﺮار دادن اﻳﻦ ﻛﻼﺳﺘﺮﻫﺎ ﺑﻪ ﺻﻮرت ﭘﺸﺖ ﺳﺮ ﻫﻢ‬
‫اﺳﺖ‪.‬‬

‫ﺳﺎﺧﺘﺎر ‪ :FAT‬در ‪ ،DOS 2.0‬ﻫﺮ ورودي ‪12 ،FAT‬ﺑﻴﺘﻲ ﺑﻮد ﻛﻪ ‪ 4,096‬ﻛﻼﺳﺘﺮ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ و اﮔﺮ ﻫﺮ ﻛﻼﺳﺘﺮ ﺣﺎوي ‪ 4‬ﺑﺨﺶ ﺑﺎﺷﺪ‪ ،‬ﺑﺎ‬
‫اﺳﺘﻔﺎده از اﻳﻦ ﻧﻮع ‪ FAT‬ﻣﻲﺗﻮان ﺑﻪ وﻟﻮﻣﻲ ﺑﺎ ﻇﺮﻓﻴﺖ ‪ 4*512*4096= 32MB‬دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد‪ .‬از اﻳﻨﺮو‪ ،‬در ﻧﮕﺎرﺷﻬﺎي ﺑﻌﺪي داس‪ ،‬ﻣﻲﺗﻮان ﺑﺮاي وﻟﻮﻣﻬﺎي‬
‫ﺑﺰرﮔﺘﺮ‪ ،‬از ‪ FAT16‬ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﺮد‪ ،‬ﻛﻪ ﻫﺮ ورودي ‪ 16 ،FAT16‬ﺑﻴﺖ اﺳﺖ و ﺑﺎ آن ﻣﻲﺗﻮان ‪ 65,536‬ﻛﻼﺳﺘﺮ را ﻣﺸﺨﺺ ﻧﻤﻮد‪ .‬اﮔﺮ ﻫﺮ ﻛﻼﺳﺘﺮ ‪ 4‬ﺑﺨﺶ داﺷﺘﻪ‬

‫_________________________________________________________________________________‬
‫‪entry ١‬‬
‫‪cluster ٢‬‬
‫‪allocation unit ٣‬‬
‫‪file fragmentation ٤‬‬
‫‪3-26‬‬ ‫ﻓﺼﻞ ‪ :26‬ﺳﻴﺴﺘﻢ ﻓﺎﻳﻞ داس‬

‫ﺑﺎﺷﺪ‪ ،‬ﻇﺮﻓﻴﺖ وﻟﻮم ﻣﻲﺗﻮاﻧﺪ ﺗﺎ ‪ 4*512*65536= 132MB‬ﺑﺎﺷﺪ‪ ،‬و ﺑﺮ اﺳﺎس ﺳﺘﻮن آﺧﺮ ﺟﺪول ﻓﻮق‪ ،‬ﺑﺮاي ﻛﻼﺳﺘﺮﻫﺎي ‪ 64‬ﺑﺨﺸﻲ‪ ،‬ﻣﻲﺗﻮان ﺑﻪ وﻟﻮﻣﻲ ﺑﺎ ﻇﺮﻓﻴﺖ‬
‫‪ 64*512*65536=2GB‬دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد‪ ،‬ﻛﻪ در اﻳﻦ ﺣﺎﻟﺖ ﻣﺸﻜﻞ ﺑﺰرگ ﺑﻮدن ﻛﻼﺳﺘﺮﻫﺎ و اﺗﻼف ﻓﻀﺎي ‪ HD‬ﭘﻴﺶ ﻣﻲآﻳﺪ‪ .‬ﺑﻪ اﻳﻦ دﻟﻴﻞ در ‪،Win98‬‬
‫‪ FAT32‬ﻣﻌﺮﻓﻲ ﺷﺪه اﺳﺖ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از آن ﻣﻲﺗﻮان ﻛﻼﺳﺘﺮﻫﺎي ﻛﻮﭼﻜﺘﺮ داﺷﺖ و درﻧﺘﻴﺠﻪ ﻣﺸﻜﻞ اﺗﻼف ﻓﻀﺎي ‪ HD‬ﺑﺮﻃﺮف ﻣﻲﺷﻮد‪.‬‬

‫اﻣﺎ ﺳﺎﺧﺘﺎر ‪ FAT‬ﺑﻪ ﺷﻜﻞ زﻳﺮ اﺳﺖ‪:‬‬

‫‪Entry Content‬‬
‫‪0H‬‬ ‫‪FDFH‬‬
‫‪1H‬‬ ‫‪FFFH‬‬
‫‪...‬‬ ‫‪...‬‬
‫‪100H‬‬ ‫‪120H‬‬
‫‪...‬‬ ‫‪....‬‬
‫‪120H‬‬ ‫‪130H‬‬
‫‪...‬‬ ‫‪....‬‬
‫‪130H‬‬ ‫‪FF8H‬‬
‫‪...‬‬ ‫‪....‬‬

‫دو ورودي اول ‪ ،FAT‬رزرو ﻫﺴﺘﻨﺪ و ﻧﺸﺎندﻫﻨﺪهي ﺗﻮﺻﻴﻒﮔﺮ وﺳﻴﻠﻪ‪ 1‬ﻫﺴﺘﻨﺪ‪ ،‬ﻛﻪ ﺑﺮاي ‪ FD‬ﻣﻘﺪار ‪ F8H‬و ﺑﺮاي ‪ FFH ،HD‬اﺳﺖ‪ .‬ﻣﺎﺑﻘﻲ ﻓﻀﺎي دو‬
‫ورودي اول ﺑﺎ ‪ FFH‬ﭘﺮ ﻣﻲﺷﻮد‪.‬‬

‫در ﻓﻬﺮﺳﺖ ﻓﺎﻳﻠﻬﺎ‪ ،‬ﺑﺮاي ﻫﺮ ﻓﺎﻳﻞ‪ ،‬ﺷﻤﺎرهي ﻧﺨﺴﺘﻴﻦ ﻛﻼﺳﺘﺮ در ‪ FAT‬ﻧﮕﻬﺪاري ﻣﻲﺷﻮد‪ .‬ﻣﺜﻼً ﺑﺮاي ﻳﻚ ﻓﺎﻳﻞ ﺧﺎص ﻛﻪ داراي ﺳﻪ ﻛﻼﺳﺘﺮ اﺳﺖ‪ ،‬در ﺷﻜﻞ‬
‫ﻓﻮق‪ ،‬ﺷﻤﺎرهي اوﻟﻴﻦ ﻛﻼﺳﺘﺮ‪ ،‬ﻛﻪ در ﻓﻬﺮﺳﺖ ﻓﺎﻳﻠﻬﺎ ﻧﮕﻬﺪاري ﻣﻲﺷﻮد‪ 100H ،‬اﺳﺖ و ﺷﻤﺎرهي دوﻣﻴﻦ ﻛﻼﺳﺘﺮ ‪ 120H‬و ﺷﻤﺎرهي ﺳﻮﻣﻴﻦ ﻛﻼﺳﺘﺮ‪ 130H ،‬اﺳﺖ‪ .‬در‬
‫ورودي ﺷﻤﺎرهي ‪ ،100H‬ﻋﺪد ‪ 120H‬ﻧﻮﺷﺘﻪ ﺷﺪه و در ورودي ‪ ،120H‬ﻋﺪد ‪ 130H‬ﻧﻮﺷﺘﻪ ﺷﺪه و در ورودي ‪ ،120H‬ﻛﺪ ‪ FFF8H‬ﻧﻮﺷﺘﻪ ﺷﺪه ﻛﻪ ﻣﺸﺨﺺ‬
‫ﻛﻨﻨﺪهي ﭘﺎﻳﺎن ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي ﻛﻼﺳﺘﺮﻫﺎ اﺳﺖ‪.‬‬

‫ﻣﺤﺘﻮي ﻫﺮ ورودي ‪ FAT‬ﻳﻚ ﻛﺪ ‪ 12‬ﻳﺎ ‪ 16‬ﺑﻴﺘﻲ اﺳﺖ‪ ،‬ﻛﻪ اﻧﻮاع آن ﻃﺒﻖ ﺟﺪول زﻳﺮ اﺳﺖ‪:‬‬

‫‪FAT12‬‬ ‫‪FAT16‬‬ ‫‪Meaning‬‬


‫‪000H‬‬ ‫‪0000H‬‬ ‫‪Cluster is available‬‬
‫‪FF0H-FF6H‬‬ ‫‪FFF0H-FFF6H‬‬ ‫‪Reserved cluster‬‬
‫‪FF7H‬‬ ‫‪FFF7H‬‬ ‫‪Cluster damaged, not used‬‬
‫‪FF8H-FFFH‬‬ ‫‪FFF8H-FFFFH‬‬ ‫‪Last file cluster‬‬
‫‪xxxH‬‬ ‫‪xxxxH‬‬ ‫‪Next file cluster‬‬
‫ﭘﺲ ﻋﻤﻼً ورودﻳﻬﺎ در ‪ FAT12‬ﺑﻴﻦ ‪ 002H-FEFH‬و اﻧﺪﻛﻲ ﻛﻤﺘﺮ از ‪ 4096‬و در ‪ FAT16‬ﺑﻴﻦ ‪ 0002H-FFEFH‬و اﻧﺪﻛﻲ ﻛﻤﺘﺮ از ‪65536‬‬
‫ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬

‫ﻣﺸﻜﻠﻲ ﻛﻪ در ﻣﻮرد ‪ FAT‬در اﻏﻠﺐ اوﻗﺎت اﺗﻔﺎق ﻣﻲاﻓﺘﺪ‪ ،‬ﺧﺮاب ﺷﺪن ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي ورودﻳﻬﺎ ﻳﺎ ﻛﻼﺳﺘﺮﻫﺎي ﮔﻢﺷﺪه‪ 2‬اﺳﺖ‪ ،‬ﺑﻪ ﻧﺤﻮي ﻛﻪ ﺑﺮﺧﻲ ورودﻳﻬﺎ‬
‫ﺣﺎوي ﻛﺪﻫﺎي ﺧﺎص ﻧﺒﻮده و ﻛﺪ ﻣﻮﺟﻮد در آن‪ ،‬ﻣﺮﺑﻮط ﺑﻪ ﻫﻴﭽﻜﺪام از ﻓﺎﻳﻠﻬﺎي ﺳﻴﺴﺘﻢ ﻧﻴﺴﺖ‪ .‬ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﻣﺜﻞ ‪ ChkDsk‬ﺳﺎ ‪ ScanDisk‬اﻳﻨﮕﻮﻧﻪ ﻛﻼﺳﺘﺮﻫﺎ را‬
‫ﻳﺎﻓﺘﻪ و ﺗﺤﺖ ﻋﻨﻮان ‪ available‬ﻋﻼﻣﺖ ﻣﻲزﻧﻨﺪ‪.‬‬

‫‪ 3-26‬ﻓﻬﺮﺳﺖ رﻳﺸﻪ‬
‫ﻓﻬﺮﺳﺖ رﻳﺸﻪ‪ ،3‬ﺑﻼﻓﺎﺻﻠﻪ ﭘﺲ از اوﻟﻴﻦ ﻧﺴﺨﻪي ‪ FAT‬در وﻟﻮم ذﺧﻴﺮه ﻣﻲﺷﻮد‪ .‬ﻓﻬﺮﺳﺖ رﻳﺸﻪ ﻫﻤﺎﻧﻨﺪ زﻳﺮﻓﻬﺮﺳﺖ‪ ،‬ﻳﻚ ﺳﺎﺧﺘﺎر ‪32‬ﺑﻴﺘﻲ اﺳﺖ ﻛﻪ ﺣﺎوي‬
‫اﻃﻼﻋﺎت ﻓﺎﻳﻠﻬﺎ ﻳﺎ زﻳﺮﻓﻬﺮﺳﺘﻬﺎ ﻳﺎ ﺑﺮﭼﺴﺐ وﻟﻮم اﺳﺖ‪ .‬اﻳﻦ اﻃﻼﻋﺎت ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫_________________________________________________________________________________‬
‫‪media descriptor ١‬‬
‫‪lost clusters ٢‬‬
‫‪root directory ٣‬‬
‫‪4-26‬‬ ‫ﻓﺼﻞ ‪ :26‬ﺳﻴﺴﺘﻢ ﻓﺎﻳﻞ داس‬

‫‪Addr.‬‬ ‫‪Contents‬‬ ‫‪Type‬‬


‫‪00H‬‬ ‫‪File name‬‬ ‫‪8 bytes‬‬
‫‪08H‬‬ ‫‪File extention‬‬ ‫‪3 bytes‬‬
‫‪0BH‬‬ ‫‪File attribute‬‬ ‫‪1 byte‬‬
‫‪0CH‬‬ ‫‪Reserved‬‬ ‫‪10 bytes‬‬
‫‪16H‬‬ ‫‪Time of loast update‬‬ ‫‪1 word‬‬
‫‪18H‬‬ ‫‪Date of loast update‬‬ ‫‪1 word‬‬
‫‪1AH‬‬ ‫‪First cluster of file‬‬ ‫‪1 word‬‬
‫‪1CH‬‬ ‫‪File size‬‬ ‫‪2 words‬‬
‫اﮔﺮ اﻃﻼﻋﺎت ورودي ﻣﺮﺑﻮط ﺑﻪ ﻓﺎﻳﻞ ﻧﺒﺎﺷﺪ‪ ،‬اوﻟﻴﻦ ﺑﺎﻳﺖ ﻓﻴﻠﺪ ﻧﺎم ﻓﺎﻳﻞ ﻳﺎ ﻫﻤﺎن اوﻟﻴﻦ ﺑﺎﻳﺖ ورودي‪ ،‬ﺣﺎوي ﻳﻚ ﻛﺪ ﺧﺎص اﺳﺖ‪:‬‬

‫‪Code‬‬ ‫‪Meaning‬‬
‫‪00H‬‬ ‫‪Last directory entry‬‬
‫‪05H‬‬ ‫‪First character of file name has ASCII code E5H‬‬
‫‪2EH‬‬ ‫)!?( ‪File applies to current directory‬‬
‫‪E5H‬‬ ‫‪File is deleted‬‬
‫ﺑﻴﺘﻬﺎي ﻣﺨﺘﻠﻒ ﻓﻴﻠﺪ ‪ file attribute‬در اﻃﻼﻋﺎت ورودي ﻓﻬﺮﺳﺖ‪ ،‬ﻣﺸﺨﺺﻛﻨﻨﺪهي اﻃﻼﻋﺎت زﻳﺮ اﺳﺖ‪:‬‬

‫‪Bit‬‬ ‫‪Meaning‬‬
‫‪0‬‬ ‫)‪1=Write-Protected (or Read-Only‬‬
‫‪1‬‬ ‫‪1=Hidden‬‬
‫‪2‬‬ ‫‪1=System file‬‬
‫‪3‬‬ ‫‪1=Volume name‬‬
‫‪4‬‬ ‫‪1=Subdirectory‬‬
‫‪5‬‬ ‫‪1=Archive‬‬
‫‪6‬‬ ‫‪Reserved‬‬
‫‪7‬‬ ‫‪Reserved‬‬
‫* ﺑﻴﺖ ﭘﻨﺠﻢ ﻣﺸﺨﺺﻛﻨﻨﺪه ‪ Archive‬ﺑﻮدن ﻳﺎ ﻧﺒﻮدن ﻓﺎﻳﻞ اﺳﺖ‪ .‬اﻳﻦ ﺑﻴﺖ ﺗﻮﺳﻂ دﺳﺘﻮر ‪ Backup‬و ﭘﺲ از ﻛﭙﻲﻛﺮدن ﻓﺎﻳﻞ در رﺳﺎﻧﻪي ‪،Backup‬‬
‫ﺑﻪ ﺻﻔﺮ ﻣﻘﺪاردﻫﻲ ﻣﻲﺷﻮد و ﺑﺎ اوﻟﻴﻦ دﺳﺘﻴﺎﺑﻲ ﺗﻮﺳﻂ ﺗﻮاﺑﻊ داس‪ ،‬ﺑﻪ ‪ 1‬ﻣﻘﺪاردﻫﻲ ﻣﻲﺷﻮد‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ در اﺟﺮاي ﺑﻌﺪي دﺳﺘﻮر ‪ ،Backup‬ﺗﻨﻬﺎ از‬
‫ﻓﺎﻳﻠﻬﺎﻳﻲ ‪ Backup‬ﺗﻬﻴﻪ ﻣﻲﺷﻮد ﻛﻪ در اﻳﻦ ﻓﺎﺻﻠﻪ ﺑﻬﻨﮕﺎم ﺷﺪهاﻧﺪ‪.‬‬

‫* ﻓﻴﻠﺪ ‪ File Size‬ﺣﺎوي اﻧﺪازهي ﻓﺎﻳﻞ اﺳﺖ ﻛﻪ ﺑﻪﺻﻮرت زﻳﺮ در دو ‪ Word‬ﻣﺠﺰا ﻧﮕﻬﺪاري ﻣﻲﺷﻮد‪:‬‬

‫‪File Size = Word1 + Word2 * 65535‬‬


‫* ‪ Volume label name‬را ﺗﻨﻬﺎ ﺑﺮاي ﻓﻬﺮﺳﺖ رﻳﺸﻪي ﻫﺮ وﻟﻮم ﻣﻲﺗﻮان ﻣﻌﺮﻓﻲ ﻧﻤﻮد‪.‬‬

‫* ﺑﺮاي زﻳﺮﻓﻬﺮﺳﺘﻬﺎ‪ ،‬ﺳﺎﺧﺘﺎر ﻓﻮق در ﻗﺎﻟﺐ ﻳﻚ ﻓﺎﻳﻞ در ﺳﻴﺴﺘﻢ ﻧﮕﻬﺪاري ﻣﻲﺷﻮد و ﺑﺮﺧﻼف ﻓﻬﺮﺳﺖ رﻳﺸﻪ‪ ،‬ﻣﺤﺪودﻳﺖ ﺗﻌﺪاد ﻓﺎﻳﻞ را ﻧﺪارد‪.‬‬
‫ﻓﺼﻞ ‪ :32‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ‬
‫)‪(Terminate and Stay Resident Programs‬‬

‫‪ 1-32‬ﻣﻘﺪﻣﻪ‬
‫داس ﻳﻚ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﭼﻨﺪﻛﺎره‪ 1‬ﻧﻴﺴﺖ و ﻧﻤﻲﺗﻮاﻧﺪ ﺑﻴﺶ از ﻳﻚ ﺑﺮﻧﺎﻣﻪ را در ﻫﺮ زﻣﺎن اﺟﺮا ﻛﻨﺪ‪ .‬اﻣﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ)‪ (TSR‬ﻣﻲﺗﻮاﻧﻨﺪ ﺑﺮﺧﻲ از‬
‫ﻣﺰاﻳﺎي ﭼﻨﺪﻛﺎرهﺑﻮدن را ﺑﺮاي داس ﺑﻪﻫﻤﺮاه ﺑﻴﺎورﻧﺪ‪ .‬اﻏﻠﺐ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬ﺑﻪ اﻳﻦ ﺻﻮرت ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺎ زدن ﻳﻚ ﻛﻠﻴﺪ‪ ،‬ﻓﻌﺎل ﺷﺪه و ﻛﺎري را اﻧﺠﺎم ﻣﻲدﻫﻨﺪ و دوﺑﺎره ﺑﻪ‬
‫زﻣﻴﻨﻪ‪ 2‬ﻣﻲروﻧﺪ‪ .‬ﻣﺜﺎﻟﻲ از ﻛﺎرﺑﺮد اﻳﻦ ﮔﻮﻧﻪ ﺑﺮﻧﺎﻣﻪﻫﺎ‪ ،‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﺗﻘﻮﻳﻢ‪ ،‬ﻣﺎﺷﻴﻦ ﺣﺴﺎب و ﻏﻴﺮه اﺳﺖ‪ .‬در ﺣﻘﻴﻘﺖ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ ،TSR‬ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﭼﻨﺪﻛﺎره ﻧﻴﺴﺘﻨﺪ‪ ،‬ﺑﻠﻜﻪ ﻳﻚ‬
‫روش ﭼﻨﺪﺑﺮﻧﺎﻣﻪاي‪ 3‬ﻫﺴﺘﻨﺪ‪ .‬زﻳﺮا ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﻪﻃﻮر ﻫﻤﺰﻣﺎن اﺟﺮا ﻧﻤﻲﺷﻮﻧﺪ‪ .‬ﮔﺮﭼﻪ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬ﻣﻤﻜﻦ اﺳﺖ ﻛﺎرﻫﺎي ﻣﺘﻔﺎوﺗﻲ اﻧﺠﺎم دﻫﻨﺪ‪ ،‬وﻟﻲ ﻣﻔﺎﻫﻴﻢ و ﺳﺎﺧﺘﺎر‬
‫ﻳﻜﺴﺎﻧﻲ دارﻧﺪ‪ .‬در اداﻣﻪ ﺑﺎ اﻳﻦ ﻣﻔﺎﻫﻴﻢ و ﺳﺎﺧﺘﺎر آﺷﻨﺎ ﻣﻲﺷﻮﻳﺪ‪.‬‬

‫‪ 2-32‬ﻓﻌﺎلﺳﺎزي ﺑﺮﻧﺎﻣﻪﻫﺎي ‪TSR‬‬


‫ﻋﻤﻮﻣﺎً‪ ،‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬ﺑﺎ زدن ﻳﻚ ﻛﻠﻴﺪ ﻛﻪ ‪ Hotkey‬ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد‪ ،‬ﻓﻌﺎل ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﺮﺧﻲ دﻳﮕﺮ از ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ ،TSR‬از ﺟﻤﻠﻪ ﺑﺮﺧﻲ از ﺑﺮﻧﺎﻣﻪﻫﺎي‬
‫داس‪ ،‬ﺑﺎ اﺳﺘﻔﺎده از وﻗﻔﻪي ‪ 2FH‬ﻛﻪ ﺑﻪ ﺗﺴﻬﻴﻢﻛﻨﻨﺪه‪ 4‬ﻣﻌﺮوف اﺳﺖ‪ ،‬ﻓﻌﺎل ﻣﻲﺷﻮﻧﺪ‪ ،‬ﻛﻪ در اداﻣﻪي اﻳﻦ ﻓﺼﻞ در ﻣﻮرد آن ﺻﺤﺒﺖ ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ﻓﺮاﻫﻢﺳﺎزي ﻗﺎﺑﻠﻴﺖ‬
‫ﻓﻌﺎلﺷﺪه ﺑﺎ ‪ ،Hotkey‬ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﺑﺎﻳﺪ روال ﺳﺮوﻳﺲ وﻗﻔﻪي ﺻﻔﺤﻪﻛﻠﻴﺪ)‪ (09H‬را ﺗﻌﻮﻳﺾ ﻛﻨﺪ‪ ،‬و در اﻳﻦ روال ‪ Hotkey‬ﻣﻮرد ﻧﻈﺮش را ﻛﻨﺘﺮل ﻧﻤﺎﻳﺪ‪ .‬در‬
‫ﻧﻤﻮدار زﻳﺮ اﻳﻦ روش ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ‪:‬‬
‫‪Keyboard‬‬

‫‪return to main program‬‬


‫‪INT 09H‬‬ ‫‪2nd installed TSR program‬‬
‫‪No‬‬

‫‪Call Old Handler‬‬ ‫‪activete‬‬ ‫‪Yes‬‬ ‫?‪Hotkey‬‬

‫‪1st installed TSR program‬‬ ‫‪No‬‬

‫‪Call Old Handler‬‬ ‫‪activete‬‬ ‫‪Yes‬‬ ‫?‪Hotkey‬‬

‫‪Original handler for Int 09H in ROM-BIOS‬‬

‫‪Read char from keyboard and convert to ASCII code‬‬

‫_________________________________________________________________________________‬
‫‪multitask ١‬‬
‫‪background ٢‬‬
‫‪multiprogramming ٣‬‬
‫‪multiplexer ٤‬‬
‫‪2-32‬‬ ‫ﻓﺼﻞ ‪ :32‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ‬

‫ﺑﺮ اﺳﺎس ﺷﻜﻞ ﻓﻮق ﻛﻪ ﺑﺮاي دو ﺑﺮﻧﺎﻣﻪي ‪ TSR‬رﺳﻢ ﺷﺪه اﺳﺖ‪ ،‬ﻫﺮ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬داراي ﻳﻚ روال ﺳﺮوﻳﺲ وﻗﻔﻪي ‪ 09H‬اﺳﺖ ﻛﻪ در آن اﺑﺘﺪا روال ﻗﺒﻠﻲ را‬
‫ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮده و ﺳﭙﺲ ﺑﺮرﺳﻲ ﻣﻲﻛﻨﺪ ﻛﻪ ‪ Hotkey‬ﻣﻮردﻧﻈﺮش زده ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ؟ در ﺻﻮرﺗﻲ ﻛﻪ زده ﺷﺪه ﺑﺎﺷﺪ‪ ،‬ﺗﻮاﺑﻊ ﻣﺮﺑﻮط ﺑﻪ ﺧﻮد را اﻧﺠﺎم ﻣﻲدﻫﺪ‪ .‬ﺑﺎ اﻳﻦ روش‬
‫ﻫﺮ ﺑﺮﻧﺎﻣﻪاي ﻛﻪ اﺑﺘﺪا ﻧﺼﺐ ﺷﻮد اﻟﻮﻳﺖ درﻳﺎﻓﺖ و ﭘﺮدازش ﻛﻠﻴﺪ ﺑﺎ او ﺧﻮاﻫﺪ ﺑﻮد‪ .‬ﺑﺎ اﻳﻦ روش‪ ،‬ﻧﻤﻲﺗﻮان ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﻧﻮﺷﺖ ﻛﻪ زدن ﻛﻠﻴﺪﻫﺎي‬
‫‪ Alt+Ctrl+Del‬را ﻛﻨﺘﺮل ﻧﻤﺎﻳﺪ‪ ،‬زﻳﺮا اﻳﻦ ﻛﺎر در روال اﺻﻠﻲ ﺳﺮوﻳﺲ وﻗﻔﻪي ‪ 09H‬ﻛﻪ در ‪ ROM-BIOS‬ﻗﺮار دارد ﻛﻨﺘﺮل ﻣﻲﺷﻮد و ﺳﻴﺴﺘﻢ ‪ restart‬ﻣﻲﺷﻮد‪.‬‬
‫اﮔﺮ ﺑﺨﻮاﻫﻴﻢ اﻳﻦ ﻛﺎر را اﻧﺠﺎم دﻫﻴﻢ‪ ،‬ﺑﺎﻳﺪ اﺑﺘﺪا و ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ روال ﻗﺒﻠﻲ‪ ،‬ﺻﻔﺤﻪ ﻛﻠﻴﺪ را ﺑﺎ روش دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﺨﻮاﻧﻴﻢ)ﺧﻮاﻧﺪن درﮔﺎه ‪ 60H‬و ﻛﻨﺘﺮل ﺑﺎﻳﺖ‬
‫وﺿﻌﻴﺖ ﺻﻔﺤﻪ ﻛﻠﻴﺪ از ﺛﺒﺎﺗﻬﺎي آن(‪.‬‬

‫ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ داس‪ :‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬ﻣﻤﻜﻦ اﺳﺖ ﺗﻮاﺑﻊ داس را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻨﺪ‪ .‬اﻳﻦ ﻣﺴﺄﻟﻪ ﻋﻠﻲاﻟﺨﺼﻮص در ﺑﺮﻧﺎﻣﻪﻫﺎي ﺳﻄﺢ ﺑﺎﻻ‪ ،‬ﻗﺎﺑﻞ ﻛﻨﺘﺮل‬
‫ﺑﻮﺳﻴﻠﻪي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ ﻧﻴﺴﺖ‪ .‬ﻣﺸﻜﻠﻲ ﻛﻪ وﺟﻮد دارد‪ ،‬ﻋﺪم ﻗﺎﺑﻠﻴﺖ اﺟﺮاي ﻣﺠﺪد‪ 1‬ﻛﺪﻫﺎي داس اﺳﺖ‪ .‬ﭼﻮن داس ﺑﺮاي ﺣﺎﻟﺖ ﺗﻚﻛﺎره ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ وﻟﻲ وﻗﺘﻲ در‬
‫داﺧﻞ ﻳﻚ ﺑﺮﻧﺎﻣﻪ‪ ،‬ﺑﺎ زدن ﻳﻚ ‪ Hotkey‬ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬را ﻓﻌﺎل ﻣﻲﻛﻨﻴﻢ‪ ،‬اﻳﻦ ﻣﺸﻜﻞ ﭘﻴﺶ ﻣﻲآﻳﺪ ﻛﻪ ﺛﺒﺎﺗﻬﺎي ﻣﻮرد اﺳﺘﻔﺎدهي ﺑﺮﻧﺎﻣﻪي در ﺣﺎل اﺟﺮا‪ ،‬ﺗﻮﺳﻂ‬
‫ﺑﺮﻧﺎﻣﻪي ‪ TSR‬دﺳﺘﻜﺎري ﻣﻲﺷﻮﻧﺪ و ﻟﺬا ﭘﺲ از ﺑﺮﮔﺸﺖ‪ ،‬ﺑﺮﻧﺎﻣﻪي درﺣﺎل اﺟﺮا دﭼﺎر اﺧﺘﻼل ﻣﻲﺷﻮد‪ .‬ﺑﻪ اﻳﻦ دﻟﻴﻞ در ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬ﺑﻬﺘﺮ اﺳﺖ از ﺗﻮاﺑﻊ داس اﺳﺘﻔﺎده‬
‫ﻧﺸﻮد و ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ رواﻟﻬﺎي ﺳﺮوﻳﺲ وﻗﻔﻪاي ﻛﻪ در ﻛﺎﻣﭙﺎﻳﻠﺮﻫﺎي ﺑﻮرﻟﻨﺪ ﺗﻮﻟﻴﺪ ﻣﻲﺷﻮد‪ ،‬اﺑﺘﺪاي ‪ ISR‬ﻫﻤﻪي ﺛﺒﺎﺗﻬﺎ در ﭘﺸﺘﻪ ‪ push‬و در اﻧﺘﻬﺎي ﻛﺎر ﻫﻤﻪي ﺛﺒﺎﺗﻬﺎ ‪pop‬‬
‫ﺷﻮﻧﺪ‪.‬‬

‫‪ 3-32‬ﻋﻤﻠﻴﺎت ﺑﺤﺮاﻧﻲ ﻧﺴﺒﺖ ﺑﻪ زﻣﺎن‬


‫ﺑﺮﺧﻲ اﻋﻤﺎل ﺑﺎﻳﺪ در زﻣﺎن ﻛﻮﺗﺎﻫﻲ ﺗﻜﻤﻴﻞ ﺷﻮﻧﺪ و ﻗﺎﺑﻞ وﻗﻔﻪ ﻧﻴﺴﺘﻨﺪ‪ ،‬ﻧﻈﻴﺮ دﺳﺘﺮﺳﻲ ﺑﻪ ‪ FD‬ﻳﺎ ‪ ،HD‬ﻛﻪ در ﺳﻄﺢ ﭘﺎﻳﻴﻦ ﺑﻮﺳﻴﻠﻪي ‪BIOS INT 13H‬‬
‫ﻣﺪﻳﺮﻳﺖ ﻣﻲﺷﻮﻧﺪ‪ .‬اﮔﺮ اﻳﻦﮔﻮﻧﻪ اﻋﻤﺎل در زﻣﺎن ﻛﻮﺗﺎﻫﻲ ﺗﻜﻤﻴﻞ ﻧﺸﻮﻧﺪ‪ ،‬ﺑﺎ ﻣﺸﻜﻞ ﻣﻮاﺟﻪ ﻣﻲﺷﻮﻧﺪ‪ .‬ﻳﻚ ﻣﺜﺎل ﺧﻮب ﺣﺎﻟﺘﻲ اﺳﺖ ﻛﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪ ،TSR‬در ﺧﻼل ﻋﻤﻞ‬
‫دﺳﺘﺮﺳﻲ ﺑﻪ دﻳﺴﻚ ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ‪ ،‬ﺑﺨﻮاﻫﺪ ﺑﻪ دﻳﺴﻚ دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﺎﻳﺪ‪ .‬در ﭼﻨﻴﻦ ﻣﻮاﻗﻌﻲ اﻏﻠﺐ ﺳﻴﺴﺘﻢ دﭼﺎر اﺧﺘﻼل ﺷﺪه و ‪ crash‬ﻣﻲﻛﻨﺪ‪ ،‬و اﮔﺮ ﻫﻢ اﻳﻦﻃﻮر ﻧﺸﻮد‪،‬‬
‫دادهﻫﺎ ﺧﺮاب ﻣﻲﺷﻮﻧﺪ‪ .‬ﻳﻚ راه اﺟﺘﻨﺎب از اﻳﻦ اﻣﺮ‪ ،‬ﺗﻌﻮﻳﺾ وﻗﻔﻪي ‪ 13H‬اﺳﺖ‪ .‬وﻗﺘﻲ ﻛﻪ ‪ ISR‬آن ﻓﻌﺎل ﻣﻲﺷﻮد‪ ،‬ﻳﻚ ‪ Flag‬را ﻣﻘﺪاردﻫﻲ ﻣﻲﻛﻨﺪ ﺗﺎ ﻧﺸﺎندﻫﻨﺪهي ﻓﻌﺎل‬
‫ﺑﻮدن آن ﺑﺎﺷﺪ و ﺑﻪ اﻳﻦ وﺳﻴﻠﻪ ﻛﻨﺘﺮل ﻣﻲﺷﻮد ﺗﺎ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﺑﻪ اﻳﻦ ‪ ISR‬دﺳﺘﺮﺳﻲ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ و آﻧﺮا اﺟﺮا ﻧﻜﻨﺪ‪ .‬در اﻳﻦ ﺻﻮرت اﻳﻦ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬در ﺻﻮرت‬
‫ﻓﻌﺎل ﺷﺪن‪ ،‬ﻧﻤﻲﺗﻮاﻧﺪ ﻛﺎرﻫﺎﻳﺶ را درﺳﺖ اﻧﺠﺎم دﻫﺪ‪ ،‬اﻣﺎ ﺣﺪاﻗﻞ ﺑﺎ اﻳﻦ روش ﺳﻴﺴﺘﻢ دﭼﺎر اﺧﺘﻼل ﻧﺨﻮاﻫﺪ ﺷﺪ‪ .‬در ﺣﻘﻴﻘﺖ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ‪ ،INT 13H‬ﻳﻚ ﻛﺪ ﺑﺤﺮاﻧﻲ‬
‫اﺳﺖ و ﺑﺎﻳﺪ ﺑﻪﻃﺮﻳﻘﻲ ﻣﺤﺎﻓﻈﺖ ﺷﻮد‪.‬‬

‫ﻓﻌﺎلﺳﺎزي ﺑﺎ ﺗﺄﺧﻴﺮ‪ :‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﺸﻜﻞ ﻓﻮق‪ ،‬ﺑﺎﻳﺪ ﻗﺒﻞ از ﻓﻌﺎلﺳﺎزي ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﻛﻨﺘﺮل ﺷﻮد ﻛﻪ آﻳﺎ در ﺻﻮرت ﻓﻌﺎلﺳﺎزي ﻗﺎدر ﺑﻪ اﻧﺠﺎم‬
‫وﻇﺎﻳﻔﺶ اﺳﺖ ﻳﺎ ﻧﻪ؟ ﺑﻪ اﻳﻦ دﻟﻴﻞ اﻏﻠﺐ ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬روال ﺳﺮوﻳﺲ ﺟﺪﻳﺪي ﺑﺮاي ‪) INT 08H‬ﺗﺎﻳﻤﺮ( ﻧﻴﺰ ﻧﺼﺐ ﻣﻲﻛﻨﻨﺪ‪ .‬در ﺻﻮرت ﻓﺮاﻫﻢ ﻧﺒﻮدن ﺷﺮاﻳﻂ اﺟﺮاي‬
‫ﺑﺮﻧﺎﻣﻪي ‪ ،TSR‬ﻳﻚ ‪ Flag‬را در ‪ ISR‬وﻗﻔﻪي ‪ ،09H‬ﻣﻘﺪاردﻫﻲ ﻣﻲﻛﻨﺪ و در ‪ ISR‬وﻗﻔﻪي ﺗﺎﻳﻤﺮ‪ flag ،‬را ﻛﻨﺘﺮل ﻣﻲﻛﻨﻨﺪ و در ﺻﻮرت ‪ 1‬ﺑﻮدن ﺑﺮرﺳﻲ ﻣﻲﻛﻨﻨﺪ ﻛﻪ‬
‫آﻳﺎ ﺷﺮاﻳﻂ آﻣﺎده اﺳﺖ ﻳﺎ ﻧﻪ؟ در ﺻﻮرت آﻣﺎده ﺑﻮدن ﺷﺮاﻳﻂ‪ ،‬ﺑﺮﻧﺎﻣﻪي ‪ TSR‬را ﻓﻌﺎل ﻣﻲﻛﻨﺪ‪ .‬در اﻳﻦﺻﻮرت‪ ،‬ﻓﻌﺎلﺳﺎزي ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﺑﺎ ﺗﺄﺧﻴﺮ اﻧﺠﺎم ﻣﻲﺷﻮد‪.‬‬

‫* ﺑﺎﻳﺪ از اﺟﺮاي ﻣﺠﺪد ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬ﺟﻠﻮ ﮔﻴﺮي ﺷﻮد‪ .‬اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ در ﻗﺴﻤﺖ اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬اﻧﺠﺎم ﺷﻮد‪.‬‬

‫زﻣﻴﻨﻪ‪2‬‬ ‫‪ 4-32‬ﺗﻌﻮﻳﺾ‬
‫ﺑﻪ ﻓﺮآﻳﻨﺪ ﻓﻌﺎلﺳﺎزي ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪ ،TSR‬ﺗﻌﻮﻳﺾ زﻣﻴﻨﻪ ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬زﻣﻴﻨﻪ ﻳﺎ ﻣﺤﻴﻂ ﻳﻚ ﺑﺮﻧﺎﻣﻪ‪ ،‬اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎزش ﺑﺮاي ﻋﻤﻠﻴﺎت و ﺷﺎﻣﻞ ﻣﻮارد زﻳﺮ‬
‫اﺳﺖ‪:‬‬

‫ﻣﺤﺘﻮي ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه‪ :‬اﻃﻼﻋﺎت ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه و از ﺟﻤﻠﻪ ﺛﺒﺎﺗﻬﺎي ﻗﻄﻌﻪ ﺑﺎﻳﺪ در ﻣﺘﻐﻴﺮﻫﺎي داﺧﻠﻲ ‪ TSR‬ﻳﺎ در ﭘﺸﺘﻪ ذﺧﻴﺮه ﺷﻮﻧﺪ و ﻗﺒﻞ‬ ‫•‬
‫از ﺗﻌﻮﻳﺾ زﻣﻴﻨﻪ‪،‬ﺛﺒﺎﺗﻬﺎي ﭘﺮدازﻧﺪه ﺑﺎ ﺛﺒﺎﺗﻬﺎي ذﺧﻴﺮه ﺷﺪه‪ ،‬ﺑﺎر ﺷﻮﻧﺪ‪.‬‬

‫اﻃﻼﻋﺎت ﻣﻬﻢ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ‪ :‬ﺷﺎﻣﻞ ‪ PSP‬و ‪ 3DTA‬اﺳﺖ‪ .‬ﺑﺎ ‪ PSP‬آﺷﻨﺎ ﻫﺴﺘﻴﺪ‪ ،‬اﻣﺎ ‪ DTA‬ﺑﺎﻓﺮي اﺳﺖ ﻛﻪ ﺑﺮاي ﺧﻮاﻧﺪن ﺑﻠﻮﻛﻬﺎي ﺑﺰرگ‬ ‫•‬
‫داده از دﻳﺴﻚ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬ﺑﺎﻳﺪ ﻧﺸﺎﻧﻲ آﻧﻬﺎ ﻫﻢ ذﺧﻴﺮه ﺷﻮد و در ﺗﻌﻮﻳﺾ زﻣﻴﻨﻪ‪ ،‬آﻧﻬﺎ ﻧﻴﺰ ﺗﻌﻮﻳﺾ ﺷﻮﻧﺪ‪ .‬ﺑﺮاي ﺧﻮاﻧﺪن و ﺗﻨﻈﻴﻢ ﻧﺸﺎﻧﻲ‬
‫‪ DTA‬ﺗﻮاﺑﻊ ‪ 1AH‬و ‪ 2FH‬داس ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ و ﺑﺮاي ‪ PSP‬ﻧﻴﺰ ﺗﺎﺑﻊ ‪ 50H‬ﺑﺮاي ﺗﻨﻈﻴﻢ و ﺗﻮاﺑﻊ ‪ 62H‬و ‪ 51H‬ﺑﺮاي ﺧﻮاﻧﺪن ﻧﺸﺎﻧﻲ‬
‫ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻫﺴﺘﻨﺪ‪.‬‬

‫ﺣﺎﻓﻈﻪي اﺷﻐﺎلﺷﺪه ﺑﻮﺳﻴﻠﻪي ﺑﺮﻧﺎﻣﻪ‪ :‬ﻛﻪ ﺑﻪ دﻟﻴﻞ ﻣﻘﻴﻢ ﺑﻮدن ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ‪ ،‬ﻣﺸﻜﻠﻲ از اﻳﻦ ﻧﻈﺮ ﻧﺪارﻳﻢ‪.‬‬ ‫•‬

‫‪ 5-32‬اﺟﺰاي ﺑﺮﻧﺎﻣﻪﻫﺎي ‪TSR‬‬


‫در زﺑﺎن اﺳﻤﺒﻠﻲ‪ :‬ﺑﺎﻳﺪ ﻣﺎﺟﻮﻟﻬﺎي زﻳﺮ ﻧﻮﺷﺘﻪ ﺷﻮﻧﺪ‪:‬‬

‫_________________________________________________________________________________‬
‫‪re-enterant ١‬‬
‫‪context switch ٢‬‬
‫‪Disk Transfer Area ٣‬‬
‫‪3-32‬‬ ‫ﻓﺼﻞ ‪ :32‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ‬

‫‪ :TsrInit‬ﺑﺮﻧﺎﻣﻪ را ﺗﺒﺪﻳﻞ ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﻧﻤﻮده‪ ،‬ﻣﺪﻳﺮ وﻗﻔﻪ را ﻧﺼﺐ ﻣﻲﻛﻨﺪ‪ ،‬ﺑﺮﻧﺎﻣﻪ را درﺣﺎﻓﻈﻪ ﺑﺎرﻣﻲﻛﻨﺪ و آﻧﺮا ﺧﺎﺗﻤﻪ ﻣﻲدﻫﺪ‪.‬‬ ‫•‬

‫‪ :TsrIsInst‬ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﺪ ﻛﻪ آﻳﺎ ﺑﺨﺶ ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪي ﺑﺮﻧﺎﻣﻪ‪ ،‬ﻗﺒﻼً در ﺣﺎﻓﻈﻪ ﻣﻘﻴﻢ ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ؟‬ ‫•‬

‫‪ :TsrCanUnInst‬ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﺪ ﻛﻪ آﻳﺎ ﺑﺨﺶ ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ ﻗﺎﺑﻞ ﺧﺎرج ﺷﺪن اﺳﺖ ﻳﺎ ﻧﻪ؟‬ ‫•‬

‫‪ :TsrUnInst‬ﺑﺮﻧﺎﻣﻪي ‪ TSR‬را از ﺣﺎﻓﻈﻪ ﺧﺎرج ﻣﻲﻛﻨﺪ‪.‬‬ ‫•‬

‫‪ :TsrSetPtr‬ﻳﻚ اﺷﺎرهﮔﺮ ﺑﻪ ﻧﺸﺎﻧﻲ رواﻟﻲ ﻛﻪ ﻗﺮار اﺳﺖ در داﺧﻞ ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﻮد‪ ،‬اﻳﺠﺎد ﻣﻲﻛﻨﺪ‪.‬‬ ‫•‬

‫‪ :TsrCall‬روال ﻋﻼﻣﺖزدهﺷﺪه را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ‪.‬‬ ‫•‬

‫‪ :TsrSetHotKey‬ﻛﻠﻴﺪ ﻓﻌﺎلﺳﺎزي ﺑﺮﻧﺎﻣﻪ را ﺗﻨﻈﻴﻢ ﻣﻲﻛﻨﺪ‪.‬‬ ‫•‬

‫در زﺑﺎن ﺑﻮرﻟﻨﺪ ﭘﺎﺳﻜﺎل‪ :‬ﺑﺎﻳﺪ اﻋﻤﺎل زﻳﺮ اﻧﺠﺎم ﺷﻮﻧﺪ‪:‬‬

‫روال ﺟﺪﻳﺪي ﺑﺮاي ‪ ISR‬ﻫﺎي ﺗﻌﻮﻳﻀﻲ‪ ،‬ﺗﻌﺮﻳﻒ ﺷﻮد‪:‬‬ ‫•‬

‫;‪procedure NewISRn(...); Interrupt‬‬


‫ﻣﺘﻐﻴﺮي ﺑﺮاي ﻧﮕﻬﺪاري ﻧﺸﺎﻧﻲ روال ﻗﺒﻠﻲ ﺗﻌﺮﻳﻒ ﺷﻮد‪:‬‬ ‫•‬

‫;‪var OldISRn : procedure‬‬


‫در ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﻧﺸﺎﻧﻲ روال ﻗﺒﻠﻲ در ‪ OldISRn‬ذﺧﻴﺮه ﺷﻮد‪:‬‬ ‫•‬

‫;)‪OldISRn := GetIntVec (n‬‬


‫‪ ISR‬ﺟﺪﻳﺪ ﻧﺼﺐ ﺷﻮد‪:‬‬ ‫•‬

‫;)‪SetIntVec(NewISRn, n‬‬
‫ﻣﻘﻴﻢﺳﺎزي ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ‪:‬‬ ‫•‬

‫;)‪Keep(0‬‬
‫* ﻣﻘﺪار ﭘﺎراﻣﺘﺮ ‪ ،Keep‬ﻫﻤﻴﺸﻪ ﻣﻘﺪار ‪ 0‬اﺳﺖ ﻛﻪ ﻛﺪ ﺑﺮﮔﺸﺘﻲ ﺑﻪ داس اﺳﺖ‪.‬‬

‫در زﺑﺎن ﺑﻮرﻟﻨﺪ ‪ :C‬ﺑﺎﻳﺪ اﻋﻤﺎل زﻳﺮ اﻧﺠﺎم ﺷﻮﻧﺪ‪:‬‬

‫روال ﺟﺪﻳﺪي ﺑﺮاي ‪ ISR‬ﻫﺎي ﺗﻌﻮﻳﻀﻲ‪ ،‬ﺗﻌﺮﻳﻒ ﺷﻮد‪:‬‬ ‫•‬

‫;)(‪void interrupt NewISRn‬‬


‫ﻣﺘﻐﻴﺮي ﺑﺮاي ﻧﮕﻬﺪاري ﻧﺸﺎﻧﻲ روال ﻗﺒﻠﻲ ﺗﻌﺮﻳﻒ ﺷﻮد‪:‬‬ ‫•‬

‫;)()‪void interrupt (*OldISRn‬‬


‫در ﺑﺮﻧﺎﻣﻪي اﺻﻠﻲ ﻧﺸﺎﻧﻲ روال ﻗﺒﻠﻲ در ‪ OldISRn‬ذﺧﻴﺮه ﺷﻮد‪:‬‬ ‫•‬

‫;)‪OldISRn = getvect(n‬‬
‫‪ ISR‬ﺟﺪﻳﺪ ﻧﺼﺐ ﺷﻮد‪:‬‬ ‫•‬

‫;)‪setvect(NewISRn, n‬‬
‫ﻣﻘﻴﻢﺳﺎزي ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ‪:‬‬ ‫•‬

‫;)‪keep(0, ProgSize‬‬
‫* ﻣﻘﺪار ﭘﺎراﻣﺘﺮ اول ‪ ،keep‬ﻫﻤﻴﺸﻪ ﻣﻘﺪار ‪ 0‬اﺳﺖ ﻛﻪ ﻛﺪ ﺑﺮﮔﺸﺘﻲ ﺑﻪ داس اﺳﺖ‪.‬‬

‫* ﭘﺎراﻣﺘﺮ دوم ‪ ،keep‬اﻧﺪازهي ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ اﺳﺖ ﻛﻪ واﺑﺴﻪ ﺑﻪ ﻣﺪل ﺑﺮﻧﺎﻣﻪ ﺑﻮده و ﺑﺮاي ﻣﺪل ‪ ،small‬ﻃﺒﻖ ﻓﺮﻣﻮل زﻳﺮ ﺑﺪﺳﺖ ﻣﻲآﻳﺪ‪:‬‬

‫‪ProgSize = (_SS + _SP / 16) - _PSP)+1‬‬


‫‪4-32‬‬ ‫ﻓﺼﻞ ‪ :32‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﻘﻴﻢ در ﺣﺎﻓﻈﻪ‬

‫‪ 6-32‬ﺗﺴﻬﻴﻢﻛﻨﻨﺪه‬
‫ﺑﺮﺧﻲ ﺑﺮﻧﺎﻣﻪﻫﺎي داس‪ ،‬ﻧﻈﻴﺮ ‪ Append ،Assign ،Share ،Print‬و ‪ Doskey‬ﺑﻪﺻﻮرت ‪ TSR‬ﻫﺴﺘﻨﺪ و در ﺻﻮر ﻧﻴﺎز‪ ،‬ﻓﻌﺎل ﺷﺪه و ﻋﻤﻠﻲ را اﻧﺠﺎم‬
‫ﻣﻲدﻫﻨﺪ و ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر‪ ،‬از وﻗﻔﻪي ‪ 2FH‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪه ﻛﻪ ﺑﻪ ﺗﺴﻬﻴﻢﻛﻨﻨﺪه‪ (Mux) 1‬ﻣﻌﺮوف اﺳﺖ‪ Mux .‬در ﺣﻘﻴﻘﺖ ﻳﻚ واﺳﻂ ارﺗﺒﺎﻃﻲ ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪﻫﺎي‬
‫‪ TSR‬و ﺳﺎﻳﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ اﺳﺖ و ﻫﺮ ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﻣﻲﺗﻮاﻧﺪ از ﻃﺮﻳﻖ ‪ Hotkey‬ﻳﺎ اﻣﻜﺎﻧﺎت اﻳﻦ وﻗﻔﻪ ﻓﻌﺎل ﺷﻮد‪ .‬ﺑﺮﻧﺎﻣﻪﻫﺎي ‪ TSR‬اﺳﺘﻔﺎده ﻛﻨﻨﺪه از ‪ Mux‬ﺑﺎﻳﺪ اﻳﻦ‬
‫ﻧﻜﺘﻪ را رﻋﺎﻳﺖ ﻛﻨﻨﺪ ﻛﻪ در ﻫﺮ زﻣﺎن ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﺘﻌﺪدي از ‪ Mux‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﻪ اﻳﻦ روش ﻋﻤﻞ ﺷﻮد ﻛﻪ ﻗﺒﻞ از آﻧﻜﻪ ﺑﺮﻧﺎﻣﻪ از ‪ Mux‬اﺳﺘﻔﺎده‬
‫ﻛﻨﺪ‪ ،‬ﻳﻚ ‪ id‬ﻫﺸﺖ ﺑﻴﺘﻲ ﻛﻪ ﺑﻪ آن ‪ Mux Code‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد ﺑﻪ ﺧﻮد ﻣﻨﺴﻮب ﻛﻨﺪ‪Mux Code .‬ﻫﺎي ‪ 00H‬ﺗﺎ ‪ BFH‬ﺑﻪ ﺑﺮﻧﺎﻣﻪﻫﺎي داس ﺗﺨﺼﻴﺺ داده ﺷﺪهاﻧﺪ‬
‫و از ﻛﺪﻫﺎي ‪ BFH‬ﺗﺎ ‪ FFH‬ﺳﺎﻳﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ ﻣﻲﺗﻮاﻧﻨﺪ اﺳﺘﻔﺎده ﻛﻨﻨﺪ‪ .‬وﻗﺘﻲ اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪي ‪ TSR‬ﻧﺼﺐ ﻣﻲﺷﻮد‪ ،‬ﺑﺎﻳﺪ ﻳﻚ روال ﺳﺮوﻳﺲ وﻗﻔﻪ ﺑﺮاي ‪،Mux‬ﻋﻼوه ﺑﺮ‬
‫ﺳﺎﻳﺮ ‪ISR‬ﻫﺎي ﻣﻮرد ﻧﻴﺎزش ﻧﺼﺐ ﻛﻨﺪ‪ .‬ﻳﻌﻨﻲ ﺑﺎﻳﺪ ‪ INT 2FH‬را ﻧﻴﺰ ﺗﻌﻮﻳﺾ ﻧﻤﺎﻳﺪ و در ‪ ،ISR‬ﭼﻚ ﻛﻨﺪ ﻛﻪ اﮔﺮ ‪ Mux Code‬ﻗﺮار داده ﺷﺪه در ‪ ،AH‬ﻗﺒﻞ از‬
‫ﻓﺮاﺧﻮاﻧﻲ ‪ id ،INT 2FH‬آن اﺳﺖ‪ ،‬ﺗﻮاﺑﻊ ﺧﻮد را اﺟﺮا ﻛﻨﺪ‪ ،‬وﮔﺮﻧﻪ روال ﻗﺒﻠﻲ را ﻛﻪ ﻧﺸﺎﻧﻲ آﻧﺮا ﺣﻔﻆ ﻧﻤﻮده‪ ،‬ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﺪ‪:‬‬

‫‪Application Program Calls‬‬


‫‪INT 02H‬‬

‫‪1. Mux-handler‬‬
‫‪AH=xx‬‬
‫‪Own‬‬
‫?‪function‬‬ ‫‪yes‬‬ ‫‪execute function‬‬
‫‪no‬‬

‫‪2. Mux-handler‬‬
‫‪AH=yy‬‬
‫‪Own‬‬
‫?‪function‬‬ ‫‪yes‬‬ ‫‪execute function‬‬
‫‪no‬‬

‫‪Original Mux-handler‬‬

‫در اﺑﺘﺪا ﺑﺎﻳﺪ ﺗﻌﻴﻴﻦ ﺷﻮد ﻛﻪ آﻳﺎ ﺑﺮﻧﺎﻣﻪي ﻓﺮاﺧﻮاﻧﻨﺪه ﻣﻲﺧﻮاﻫﺪ آن ‪ Handler‬را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﺪ ﻳﺎ ﻧﻪ؟ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ‪ Mux Code‬ﺑﺎﻳﺪ در ﺛﺒﺎت ‪AH‬‬
‫ﻗﺮار داده ﺷﻮد‪ .‬در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺪ ﻣﺨﺼﻮص ﺑﺮﻧﺎﻣﻪ در ‪ AH‬ﺑﺎﺷﺪ‪ ،‬ﺗﻮاﺑﻊ ﻣﺮﺑﻮط ﺑﻪ آن ﺑﺮﻧﺎﻣﻪ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮﻧﺪ‪ ،‬ﻛﻪ ﺑﺎﻳﺪ ﺷﻤﺎره ﺗﺎﺑﻊ در ﺛﺒﺎت دﻳﮕﺮي‪ ،‬ﻏﻴﺮ از ‪ AH‬ﻗﺮار‬
‫داده ﺷﺪه و ﺳﺎﻳﺮ ﭘﺎراﻣﺘﺮﻫﺎ ﻧﻴﺰ در ﺛﺒﺎﺗﻬﺎي دﻳﮕﺮ ﻗﺮار داده ﺷﺪه ﺑﺎﺷﻨﺪ‪ .‬ﺑﺮﺧﻲ از ‪Mux Code‬ﻫﺎي ﺑﺮﻧﺎﻣﻪﻫﺎي داس ﺑﻪﺻﻮرت ﻫﺴﺘﻨﺪ‪:‬‬
‫‪DOS Program‬‬ ‫‪Mux Code‬‬
‫‪Print‬‬ ‫‪01H‬‬
‫‪Assign‬‬ ‫‪06H‬‬
‫‪Share‬‬ ‫‪10H‬‬
‫‪ANSI.SYS‬‬ ‫‪1AH‬‬
‫‪GRAFTABL‬‬ ‫‪B0H‬‬
‫‪HIMEM.SYS‬‬ ‫‪43H‬‬
‫‪DOSKEY‬‬ ‫‪48H‬‬
‫‪DBLSPACE.BIN‬‬ ‫‪4AH‬‬
‫‪KeyB‬‬ ‫‪ADH‬‬
‫‪Append‬‬ ‫‪B7H‬‬

‫_________________________________________________________________________________‬
‫‪Multiplexer ١‬‬
‫ﻓﺼﻞ ‪ :33‬ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه و داس‬
‫)‪(Protected Mode and DOS‬‬

‫‪ 1-33‬ﻣﻘﺪﻣﻪ‬
‫ﭘﺮدازﻧﺪهي ‪ 80286‬اﻣﻜﺎن اﺳﺘﻔﺎده از ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه‪ (PM)1‬را ﻓﺮاﻫﻢ ﻧﻤﻮد‪ .‬اﻣﺎ داس ﺳﻴﺴﺘﻢ ﻋﺎﻣﻠﻲ ﺑﺮاي ﺣﺎﻟﺖ واﻗﻌﻲ‪ (RM)2‬اﺳﺖ و ﻧﻤﻲﺗﻮاﻧﺪ از‬
‫ﻣﺰاﻳﺎي ‪ PM‬اﺳﺘﻔﺎده ﻛﻨﺪ‪ .‬ﻣﺸﻜﻞ اﺻﻠﻲ اﻳﻦ اﺳﺖ ﻛﻪ داس ﺑﺮ اﺳﺎس ‪ BIOS‬اﺳﺖ و ‪ BIOS‬ﻫﻢ ﺑﺮاي ‪ RM‬اﺳﺖ و در ‪ PM‬ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻧﻴﺴﺖ‪ .‬ﭼﺮا؟‬

‫زﻳﺮا رواﻟﻬﺎي وﻗﻔﻪي ‪ BIOS‬ﺑﺮاﺳﺎس ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪي ﻣﻨﻄﻘﻲ )ﻣﺒﺪأ‪ ،‬ﻗﻄﻌﻪ(‪ 3‬ﻋﻤﻞ ﻣﻲﻛﻨﻨﺪ ﻛﻪ ﺗﻨﻬﺎ در ‪ RM‬ﻣﻌﺘﺒﺮ اﺳﺖ‪ ،‬ﻧﻪ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪي ﻓﻴﺰﻳﻜﻲ‬
‫و ﺑﺮاﺳﺎس ﺗﻮﺻﻴﻒﮔﺮ ﻗﻄﻌﻪ‪ 4‬ﻛﻪ در ‪ PM‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬ﺑﻪ اﻳﻦ دﻟﻴﻞ ﺑﻪ ﻣﺤﺾ ﺳﻮﺋﻴﭻﻛﺮدن ﺑﻪ ‪ PM‬رواﻟﻬﺎي ‪ BIOS‬دﻳﮕﺮ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻧﺨﻮاﻫﻨﺪ ﺑﻮد‪.‬‬

‫ﮔﺮﭼﻪ ‪ PM ،80286‬را ﻓﺮاﻫﻢ ﻧﻤﻮد‪ ،‬وﻟﻲ داراي ﻳﻚ ﻧﻘﻄﻪ ﺿﻌﻒ ﻋﻤﺪه ﺑﻮد و آن ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ ﺑﻪﺻﻮرت ﻗﻄﻌﻪﺑﻨﺪيﺷﺪه‪ 5‬ﺑﻮد‪ ،‬ﻧﻪ ﺻﻔﺤﻪ ﺑﻨﺪي‪ 6‬و از‬
‫اﻳﻦ ﻧﻈﺮ ﺑﺮ روي آن ﺳﻴﺴﺘﻤﻬﺎي ﻋﻤﻞ ‪ privilidged‬ﻧﻈﻴﺮ ‪ Unix‬ﻗﺎﺑﻞ ﭘﻴﺎدهﺳﺎزي ﻧﺒﻮدﻧﺪ‪ .‬اﻣﺎ ‪ 80386‬و ‪ i486‬ﺗﻤﺎﻣﻲ ﻗﺪرت ‪ PM‬را در اﺧﺘﻴﺎر ﻗﺮار ﻣﻲدﻫﻨﺪ و ﭘﺲ‬
‫از آﻣﺪن آﻧﻬﺎ اﻓﺮاد و ﺷﺮﻛﺘﻬﺎي زﻳﺎدي ﺷﺮوع ﺑﻪ دورزدن ﻣﺸﻜﻼت داس و اﺳﺘﻔﺎده از ﻣﺰاﻳﺎي ‪ PM‬ﺗﺤﺖ داس ﻧﻤﻮدﻧﺪ و ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﻛﺎرﺑﺮدﻫﺎي زﻳﺮ ﭘﻴﺸﻨﻬﺎد ﺷﺪ‪:‬‬

‫‪ :EMS Emulator‬ﻧﻈﻴﺮ ‪ UMB‬در ‪ XMS‬ﻳﺎ ‪QEMM386‬‬ ‫•‬


‫ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ‪ :‬ﻧﻈﻴﺮ ‪ EMB‬در ‪XMS‬‬ ‫•‬
‫ﺑﺴﻂﻫﺎي داس‪ :7‬ﻣﺜﻞ ‪ DPMI‬و ‪VCPI‬‬ ‫•‬
‫‪ :Multitaskers‬ﻣﺜﻞ ‪DesqView‬‬ ‫•‬

‫‪ 2-33‬ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه‬
‫‪ PM‬در ﺳﺎل ‪ 82‬و ﻫﻤﺰﻣﺎن ﺑﺎ ‪ 80286‬و ﺑﺮاي اﺳﺘﻔﺎده در ﺳﻴﺴﺘﻤﻬﺎي ﻋﻤﻞ ﭼﻨﺪﻛﺎره‪ (MTOS) 8‬ﻣﻌﺮﻓﻲ ﺷﺪ‪ .‬اﻣﺎ داس در ﺣﺎﻟﺖ واﻗﻌﻲ ﻛﺎر ﻣﻲﻛﻨﺪ و‬
‫ﺗﻚﻛﺎره‪ 9‬اﺳﺖ و اﮔﺮ ﻣﻲﺧﻮاﺳﺖ ﻳﻚ ‪ MTOS‬ﺑﺸﻮد‪ ،‬ﺑﺎﻳﺪ ﺑﺎزﻧﻮﻳﺴﻲ ﻣﻲﺷﺪ‪ ،‬ﻛﻪ اﻳﻦ ﻣﺸﻜﻼت ﻋﺪم ﺳﺎزﮔﺎري ﺑﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﻮﺟﻮد را داﺷﺖ‪ .‬ﺑﻪ اﻳﻦ دﻟﻴﻞ ﻣﻴﻜﺮوﺳﺎﻓﺖ و‬
‫‪ IBM‬ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺟﺪﻳﺪي را ﺑﻪ ﻧﺎم ‪ OS/2‬ﻣﻌﺮﻓﻲ ﻛﺮدﻧﺪ‪ ،‬ﻛﻪ ﺑﻪدﻟﻴﻞ ﻧﻴﺎز ﺑﻪ ﺳﺨﺖاﻓﺰار ﻗﺪرﺗﻤﻨﺪ و ﺣﺎﻓﻈﻪي زﻳﺎد‪ ،‬ﭼﻨﺪان ﻣﺮﺳﻮم ﻧﺸﺪ‪ .‬اﻣﺎ ﻣﻴﻜﺮوﺳﺎﻓﺖ ﺑﻌﺪاً‪ ،‬اﺑﺘﺪا اﻗﺪام‬
‫ﺑﻪ ﻋﺮﺿﻪي ﮔﻮﻧﻪاي از ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ Unix‬ﺑﺮاي ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ‪ ،PC‬ﺑﺎ ﻧﺎم ‪ XENIX‬ﻧﻤﻮد‪ ،‬وﻟﻲ ﺑﻌﺪاً ﺑﺎ ﻓﺮوش آن ﺑﻪ ﺷﺮﻛﺖ ‪ ،SCO‬ﻛﺎر ﺑﺮ روي آن را ﻣﺘﻮﻗﻒ ﻧﻤﻮده‬
‫و اﻗﺪام ﺑﻪ ﻋﺮﺿﻪي ‪ Windows 3.1‬و ﺳﭙﺲ ‪ Windows NT‬و آﻧﮕﺎه ﺳﺎﻳﺮ وﻳﻨﺪوزﻫﺎي ‪ 32‬ﺑﻴﺘﻲ ﻧﻤﻮد‪ .‬ﺗﻤﺎﻣﻲ اﻳﻦ ﺳﻴﺴﺘﻤﻬﺎي ﻋﺎﻣﻞ ﻧﺎم ﺑﺮده ﺷﺪه‪MTOS ،‬‬
‫ﺑﻮده و در ‪ PM‬ﻛﺎر ﻣﻲﻛﻨﻨﺪ‪.‬‬

‫ﻣﺸﺨﺼﺎت ﻳﻚ ‪ :MTOS‬ﻧﻴﺎزﻫﺎي ﭘﺮدازﻧﺪهاي در ﻣﺤﻴﻂ ‪ MT‬ﺑﻪﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬


‫ﻣﺤﺎﻓﻈﺖ‪ :‬ﭘﺮدازﻧﺪه ﺑﺎﻳﺪ اﻣﻜﺎﻧﺎت ﻛﺎﻣﻠﻲ را ﺑﺮاي ﻓﺮاﻫﻢﺳﺎزي ﻣﺤﺎﻓﻈﺖ ﺑﻪﻣﻨﻈﻮر ﺟﻠﻮﮔﻴﺮي از ﺗﺪاﺧﻞ ﻛﺎرﻫﺎ در ﻣﺤﻴﻂ و ﺣﺎﻓﻈﻪي ﻫﻤﺪﻳﮕﺮ ﻓﺮاﻫﻢ‬ ‫•‬
‫ﻧﻤﺎﻳﺪ‪.‬‬
‫اﻣﻜﺎﻧﺎت ﻣﺮﺑﻮط ﺑﻪ ﺗﻌﻮﻳﺾ ﻛﺎرﻫﺎ‪ :10‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﭼﻨﺪﻛﺎرهﺑﻮدن ﻏﻴﺮاﻧﺤﺼﺎري‪ 11‬و ﺑﺮش زﻣﺎن‪ 12‬ﻓﺮاﻫﻢ ﺷﻮﻧﺪ‪.‬‬ ‫•‬
‫اﻣﺘﻴﺎزات ﺳﻴﺴﺘﻢ ﻋﺎﻣﻠﻲ‪ :13‬اﻳﻨﻜﻪ ﻫﺴﺘﻪي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ در ﻳﻚ ﺣﺎﻟﺖ داراي اﻣﺘﻴﺎز ﻛﺎر ﻛﻨﺪ و ﭘﺮدازهﻫﺎي ﻛﺎرﺑﺮ‪ 1‬داراي اﻣﺘﻴﺎز ﻛﻤﺘﺮي ﺑﻮده و‬ ‫•‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎي داراي اﻣﺘﻴﺎز ﻛﻤﺘﺮ ﻧﺘﻮاﻧﻨﺪ ﺣﺎﻓﻈﻪي ﺳﺎﻳﺮﻳﻦ ﻳﺎ ﻫﺴﺘﻪي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ را ﺑﺎزﻧﻮﻳﺴﻲ ﻛﻨﻨﺪ‪.‬‬

‫_________________________________________________________________________________‬
‫‪Protcted Mode ١‬‬
‫‪Real Mode ٢‬‬
‫‪Segment:Offset ٣‬‬
‫‪Segment Descriptor ٤‬‬
‫‪segmented ٥‬‬
‫‪paging ٦‬‬
‫‪DOS extentions ٧‬‬
‫‪multitasking OSs ٨‬‬
‫‪single-task ٩‬‬
‫‪task switching ١٠‬‬
‫‪preemptive multutasking ١١‬‬
‫‪time slicing ١٢‬‬
‫‪OS privilidges ١٣‬‬
‫‪2-33‬‬ ‫ﻓﺼﻞ ‪ :33‬ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه و داس‬

‫ﺣﺎﻓﻈﻪي ﻣﺠﺎزي‪ :(VM) 2‬ﻧﻴﺎزﻫﺎي ﺣﺎﻓﻈﻪاي در ﻣﺤﻴﻄﻬﺎي ﭼﻨﺪﻛﺎرهاي زﻳﺎد اﺳﺖ و ﺑﻨﺎﺑﺮ اﻳﻦ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﺎﻳﺪ ﺑﺘﻮاﻧﺪ از ﺣﺎﻓﻄﻪي اﺻﻠﻲ و‬ ‫•‬
‫دﻳﺴﻚ ﺑﻪﻋﻨﻮان ‪ swap‬اﺳﺘﻔﺎده ﻛﻨﺪ و ﻣﺴﺎﺋﻞ ﻣﺪﻳﺮﻳﺘﻲ را ﭘﺮدازﻧﺪه ﺗﺴﻬﻴﻞ ﻛﻨﺪ‪.‬‬

‫‪ 3-33‬ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه در ‪80286‬‬


‫اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه ﻋﻼوه ﺑﺮ ﺛﺒﺎﺗﻬﺎي ‪ 8‬و ‪ 16‬ﺑﻴﺘﻲ ‪ ،8086‬ﺛﺒﺎﺗﻬﺎي زﻳﺮ را دارد‪:‬‬

‫•‬ ‫‪MSW: Machine Status Word‬‬


‫•‬ ‫‪TR: Task Register‬‬
‫•‬ ‫‪GDTR, LDTR, IDTR: Pointers to Descriptor Tables‬‬
‫ﻫﻤﭽﻨﻴﻦ دو ‪ flag‬دﻳﮕﺮ ﺑﻪ ﺛﺒﺎت ‪ FALGS‬اﺿﺎﻓﻪ ﺷﺪه اﺳﺖ‪ NT :‬و ‪IOPL‬‬

‫ﺛﺒﺎت ‪ :MSW‬اﻳﻦ ﺛﺒﺎت ﺑﺮاي ﺳﻮﺋﻴﭻ ﻛﺮدن ﺑﻪ ‪ PM‬ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ و داراي ﺑﻴﺘﻬﺎي زﻳﺮ اﺳﺖ‪:‬‬

‫‪Bit‬‬ ‫‪Name‬‬ ‫‪Description‬‬


‫‪0‬‬ ‫‪PE‬‬ ‫‪Operating mode selection‬‬
‫‪1‬‬ ‫‪MB‬‬ ‫‪Co-processor available‬‬
‫‪2‬‬ ‫‪EM‬‬ ‫‪Emulate co-processor‬‬
‫‪3‬‬ ‫‪TS‬‬ ‫‪Task Switch command‬‬
‫وﻗﺘﻲ ‪ PC‬روﺷﻦ ﺷﺪه و داس ﺑﻮت ﻣﻲﺷﻮد‪ ،‬رﻳﺰﭘﺮدازﻧﺪه در ‪ RM‬اﺳﺖ و ﺑﺮاي ﺳﻮﺋﻴﭻﻛﺮدن ﺑﻪ ‪ PM‬ﺑﺎﻳﺪ ﺑﻴﺖ ‪ PE‬ﺑﻪ ‪ 0‬ﻣﻘﺪاردﻫﻲ ﺷﻮد‪ ،‬ﻳﻌﻨﻲ‬
‫‪ PE(RM)=1‬و ‪ PE(PM)=0‬اﺳﺖ‪ .‬اﻣﺎ ﺑﺮاي ﺑﺮﮔﺸﺖ ﺑﻪ ‪ RM‬در ‪ 80286‬ﻳﻚ ﻣﺸﻜﻞ وﺟﻮد داﺷﺖ و آن اﻳﻦ ﺑﻮد ﻛﻪ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺸﺨﺼﻲ ﺑﺮاي اﻳﻦ ﻛﺎر و ‪1‬‬
‫ﻛﺮدن ‪ PE‬ﻧﺪاﺷﺖ‪ .‬اﮔﺮ ﻫﻢ ﺑﺎ ﻳﻚ ‪ trick‬ﺑﺘﻮان اﻳﻦ ﻛﺎر را ﻧﻤﻮد‪ ،‬ﻣﻨﺠﺮ ﺑﻪ ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪي ‪ ROM-BIOS‬ﺷﺪه و ﻫﻤﺎﻧﻨﺪ ‪ reset‬ﺷﺪن ﺳﻴﺴﺘﻢ اﺳﺖ و ﻟﺬا ﺑﺮﮔﺸﺖ‬
‫ﺑﻪ ﺑﺮﻧﺎﻣﻪي ﻓﺮاﺧﻮاﻧﻨﺪه ﻛﻪ در داس و ‪ RM‬ﻋﻤﻞ ﻣﻲﻛﻨﺪ‪ ،‬ﻣﻴﺴﺮ ﻧﺨﻮاﻫﺪ ﺷﺪ‪ ،‬و اﻳﻦ ﻣﺸﻜﻞ اﺳﺎﺳﻲ در اﺳﺘﻔﺎده از ‪ PM‬ﺗﺤﺖ داس در ‪ 80286‬ﺑﻮد‪ .‬اﻣﺎ ﭘﺮدازﻧﺪهﻫﺎي‬
‫ﺑﻌﺪي‪ ،‬اﻳﻦ ﻣﺸﻜﻼت را ﻣﺮﺗﻔﻊ ﻧﻤﻮده و اﻳﺠﺎد ﻛﺎرﺑﺮدﻫﺎي ذﻛﺮ ﺷﺪه در ﻣﻘﺪﻣﻪ‪ ،‬اﻣﻜﺎنﭘﺬﻳﺮ ﮔﺮدﻳﺪ‪.‬‬

‫‪ 3-33‬ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در ‪80286‬‬


‫ﻣﺒﺘﻨﻲ ﺑﺮ ﺟﺪول ﺗﻮﺻﻴﻒﮔﺮ ﻗﻄﻌﻪي ﺳﺮاﺳﺮي‪ (GDT)3‬و ﺟﺪول ﺗﻮﺻﻴﻒﮔﺮ ﻣﺤﻠﻲ‪ (LDT) 4‬اﺳﺖ‪ GDT .‬در زﻣﺎن ﺳﻮﺋﻴﭻﻛﺮدن ﻛﺎرﻫﺎ ﻣﻮرد اﺳﺘﻔﺎده‬
‫ﻗﺮار ﻣﻲﮔﻴﺮد و اﻃﻼﻋﺎت ﻛﻠﻲ در ﻣﻮرد ﻗﻄﻌﺎت ﺳﺮاﺳﺮي در آن ﺗﻮﺻﻴﻒ ﻣﻲﺷﻮد‪ .‬اﻣﺎ ‪ LDT‬ﭘﺲ از آﻧﻜﻪ ﺑﻪ ﻳﻚ ﻛﺎر ﺳﻮﺋﻴﭻ ﺷﺪ‪ ،‬ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد و اﻃﻼﻋﺎت‬
‫ﻗﻄﻌﺎت ﻣﻮرد اﺳﺘﻔﺎدهي ﺑﺮﻧﺎﻣﻪ در آن ﺗﻮﺻﻴﻒ ﻣﻲﺷﻮﻧﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ‪ 5LGDT‬و ‪ 6LLDT‬ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬

‫ﺣﺎﻓﻈﻪي ﻣﺠﺎزي‪ :‬ﻫﺮ ﺗﻮﺻﻴﻒﮔﺮ در ‪ GDT‬ﻣﻲﺗﻮاﻧﺪ ﺗﻮﺻﻴﻒﮔﺮ ﻳﻚ ‪ LDT‬ﺑﺎﺷﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ ﻫﺮ ﻛﺪام از اﻳﻦ دو ﺟﺪول ﻣﻲﺗﻮاﻧﺪ ‪ 8192‬ﺗﻮﺻﻴﻒﮔﺮ داﺷﺘﻪ‬
‫ﺑﺎﺷﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ ﻫﺮ ﺗﻮﺻﻴﻒﮔﺮ ‪ LDT‬ﻣﻲﺗﻮاﻧﺪ ﻳﻚ ﻗﻄﻌﻪي ‪ 64K‬را ﺗﻮﺻﻴﻒ ﻛﻨﺪ‪ .‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ‪ ،‬ﭘﺮدازﻧﺪه ﻣﻲﺗﻮاﻧﺪ ﺑﻪ ﻓﻀﺎي ﺣﺎﻓﻈﻪي ﻣﺠﺎزي‬
‫‪ 8192*8192*64KB = 1GB‬دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﻛﻪ ﻣﻲﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﺣﺎﻓﻈﻪي اﺻﻠﻲ و دﻳﺴﻚ)ﺑﻪﻋﻨﻮان ‪ (swap‬ﺑﺎﺷﺪ‪.‬‬

‫‪ 4-33‬ﺣﺎﻟﺖ ﻣﺠﺎزي‪86‬‬
‫ﺣﺎﻟﺖ ﻣﺠﺎزي ‪ 86‬ﻳﺎ ‪ 7V86‬ﺑﺮاي اﻳﺠﺎد ﺳﺎزش ﺑﻴﻦ ‪ PM‬و ‪ RM‬اﻳﺠﺎد ﺷﺪ‪ .‬ﺑﺴﻴﺎري از ﺗﺴﻬﻴﻼت ﻣﺮﺑﻮط ﺑﻪ ‪ ،EMS‬ﻧﻈﻴﺮ ‪ EMM386.SYS‬و‬
‫ﻣﺤﻴﻄﻬﺎي ﭼﻨﺪﻛﺎره‪ ،‬ﻧﻈﻴﺮ ‪ DescView386‬از ‪ V86‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻨﺪ‪ .‬وﻗﺘﻲ ﻳﻚ ﺳﻴﺴﺘﻢ در اﻳﻦ ﺣﺎﻟﺖ ﻛﺎر ﻣﻲﻛﻨﺪ‪،‬ﻛﺎﻣﭙﻴﻮﺗﺮ در ﺣﺎﻟﺖ اﺟﺮا در ‪ RM‬اﺳﺖ‪ ،‬در ﺣﺎﻟﻴﻜﻪ‬
‫ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ‪ ،‬ﻣﺪﻳﺮﻳﺖ ﻛﺎرﻫﺎ‪ ،‬و ﻗﻮاﻋﺪ ﻣﺮﺑﻮط ﺑﻪ اﻣﺘﻴﺎزات‪ ،‬در ‪ PM‬ﻋﻤﻞ ﻣﻲﻛﻨﻨﺪ‪ .‬وﻗﺘﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را در ‪ V86‬اﺟﺮا ﻣﻲﻛﻨﻴﺪ‪ ،‬آن ﺑﺮﻧﺎﻣﻪ ﻧﻈﻴﺮ ﻳﻚ ﻛﺎر ﻣﺴﺘﻘﻞ در‬
‫‪ RM‬ﻋﻤﻞ ﻣﻲﻛﻨﺪ و ‪ PM‬در ﺣﻘﻴﻘﺖ از دﻳﺪ آن ﭘﻨﻬﺎن اﺳﺖ‪ .‬ﺑﺮﻧﺎﻣﻪ ﻓﻜﺮ ﻣﻲﻛﻨﺪ ﻛﻪ ﻳﻚ ﻣﮕﺎﺑﺎت ﻓﻀﺎي ﻧﺸﺎﻧﻲ دارد و ﻧﺸﺎﻧﻲدﻫﻲ در آن ﻃﺒﻖ ﻫﻤﺎن ﻓﺮﻣﻮل ﺗﺒﺪﻳﻞ‬
‫ﻧﺸﺎﻧﻲ ﻣﻨﻄﻘﻲ ﺑﻪ ﻓﻴﺰﻳﻜﻲ ‪ SegmentAddress * 16 + OffsetAddress‬اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل در وﻳﻨﺪوز‪ ،‬ﭘﻨﺠﺮهﻫﺎي داﺳﻲ ﻛﻪ در ‪ DOS-prompt‬در اﺧﺘﻴﺎر‬
‫ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪ ،‬ﻛﺎرﺑﺮدي از اﻳﻦ ﺣﺎﻟﺖ اﺳﺖ‪.‬‬

‫_________________________________________________________________________________‬
‫‪user processes ١‬‬
‫‪vitual memory ٢‬‬
‫‪Global Descriptor Table ٣‬‬
‫‪Local Descriptor Table ٤‬‬
‫‪Load GDT ٥‬‬
‫‪Load LDT ٦‬‬
‫‪Virtual-86 mode ٧‬‬
‫‪3-33‬‬ ‫ﻓﺼﻞ ‪ :33‬ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه و داس‬

‫‪ 5-33‬واﺳﻄﻬﺎي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه‬


‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ در ﺣﺎﻟﺖ ﻣﺤﺎﻓﻈﺖﺷﺪه ﺑﺴﻴﺎر ﻣﺸﻜﻞ اﺳﺖ و ﻛﺎرﻫﺎي اوﻟﻴﻪي ﺳﻮﺋﻴﭻ ﻛﺮدن ﺑﻪ ‪ PM‬ﺑﺎﻳﺪ ﺣﺘﻤﺎً ﺑﺎ زﺑﺎن اﺳﻤﺒﻠﻲ اﻧﺠﺎم ﺷﻮد‪ .‬اﻣﺎ واﺳﻄﻬﺎﻳﻲ ﻧﻈﻴﺮ‬
‫‪1DPMI‬و ‪ 2VCPI‬ﻣﻌﺮﻓﻲ ﺷﺪهاﻧﺪ ﻛﻪ اﻳﻦ ﻛﺎر را ﺗﺴﻬﻴﻞ ﻣﻲﻛﻨﻨﺪ‪ .‬اﻳﻦ واﺳﻄﻬﺎ‪ ،‬اﺳﺘﻔﺎده از ‪ PM‬را ﺗﺤﺖ داس آﺳﺎن ﻣﻲﻛﻨﻨﺪ‪ .‬از ﻧﻈﺮ ﻣﻘﺎﻳﺴﻪ‪ DPMI ،‬از ‪VCPI‬‬
‫ﺑﻬﺘﺮ اﺳﺖ و ﺑﻴﺸﺘﺮ از آن اﺳﺘﻔﺎده ﺷﺪه و ﭘﻴﺸﺮﻓﺘﻪﺗﺮ از آن اﺳﺖ‪.‬‬
‫در اداﻣﻪ ﺷﺮح ﻣﺨﺘﺼﺮي از اﻳﻦ دو ﻧﻮع واﺳﻂ اراﺋﻪ ﻣﻲﺷﻮد‪.‬‬

‫‪ :VCPI‬در ﺳﺎل ‪ 1989‬ﺑﻮﺳﻴﻠﻪي ﮔﺮوﻫﻲ از ﺷﺮﻛﺘﻬﺎي ﻛﺎﻣﭙﻴﻮﺗﺮي ﺗﺤﺖ رﻫﺒﺮي ‪ Phar Lap‬و ‪ Quadrateck‬ﻣﻌﺮﻓﻲ ﺷﺪ‪ .‬اﻳﻦ واﺳﻂ ﻫﺪف ﺑﺮﻃﺮف‬
‫ﻧﻤﻮدن ﻣﺸﻜﻼت ﻧﺎﺷﻲ از وﺟﻮد ﻫﻤﺰﻣﺎن ﺑﺴﻄﻬﺎي ‪ ،multitaskers ،DOS‬و ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در ﻣﺎﺷﻴﻨﻬﺎي ‪ 80386‬و ‪ i486‬را دﻧﺒﺎل ﻣﻲﻧﻤﻮد‪.‬‬

‫‪ VCPI‬ﺑﻪ ﺗﻮاﺑﻊ ﺧﻮدش‪ ،‬ﺗﺤﺖ ﻧﺎم ‪ Server‬و ﺑﻪ ﺑﺮﻧﺎﻣﻪﻫﺎي اﺳﺘﻔﺎده ﻛﻨﻨﺪه از اﻳﻦ ﺗﻮاﺑﻊ‪ ،‬ﺗﺤﺖ ﻧﺎم ‪ Client‬ارﺟﺎع ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ واﺳﻂ ﺳﺮوﻳﺴﻬﺎي زﻳﺮ را‬
‫ﻓﺮاﻫﻢ ﻣﻲﻛﻨﺪ‪:‬‬

‫ﺳﻪ ﺗﺎﺑﻊ ﻣﺨﺼﻮص ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪ ‪VCPI‬‬ ‫•‬

‫ﭼﻬﺎر ﺗﺎﺑﻊ اﺑﺘﺪاﻳﻲ ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‬ ‫•‬

‫ﺳﻪ ﺗﺎﺑﻊ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ‪) CR0‬اوﻟﻴﻦ ﺛﺒﺎت ﻛﻨﺘﺮل( و ﺛﺒﺎﺗﻬﺎي اﺷﻜﺎﻟﺰداﻳﻲ ﭘﺮدازﻧﺪه‬ ‫•‬

‫دو ﺗﺎﺑﻊ ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﻛﻨﺘﺮﻟﺮ وﻗﻔﻪ‬ ‫•‬

‫ﻳﻚ ﺗﺎﺑﻊ ﺑﺮاي ﺳﻮﺋﻴﭻﻛﺮدن ﺑﻴﻦ ﺣﺎﻟﺖ ‪ V86‬و ‪PM‬‬ ‫•‬

‫‪ :DPMI‬اﻳﻦ واﺳﻂ اﺑﺘﺪاً ﺑﻪﻋﻨﻮان اﺳﺘﺎﻧﺪاردي ﺑﺮاي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ‪ PM‬ﻣﻌﺮﻓﻲ ﻧﺸﺪه ﺑﻮد‪ ،‬ﺑﻠﻜﻪ در ﻃﺮاﺣﻲ ‪ Win 3.0‬اﻳﺠﺎد ﺷﺪ و ﺑﻪ دﻻﻳﻞ ﻧﺎﻣﻌﻠﻮم‪،‬‬ ‫•‬
‫ﻣﻴﻜﺮوﺳﺎﻓﺖ آﻧﺮا ﻣﻨﺘﺸﺮ ﻧﻤﻮد‪ .‬اﻣﺎ ﺑﻌﺪاً در ﺳﺎل ‪ ،1990‬ﺷﺮﻛﺘﻬﺎي ﻣﻌﺮوﻓﻲ ﭼﻮن ﻣﻴﻜﺮوﺳﺎﻓﺖ‪ ،‬اﻳﻨﺘﻞ‪ ،‬ﺑﻮرﻟﻨﺪ‪ IBM ،‬و ﻏﻴﺮه ﺗﺸﻜﻴﻞ ﮔﺮوﻫﻲ را ﺑﺮاي اﺳﺘﺎﻧﺪارد‬
‫ﻧﻤﻮدن آن دادﻧﺪ‪ DPMI .‬ﭘﻮﺷﺶ ﻛﺎﻣﻠﺘﺮي را از اﻣﻜﺎﻧﺎت ‪ PM‬در اﺧﺘﻴﺎر ﻗﺮار ﻣﻲدﻫﺪ‪ ،‬ﻛﻪ ﺷﺎﻣﻞ ﻣﻮارد زﻳﺮ اﺳﺖ‪:‬‬

‫ﻣﺪﻳﺮﻳﺖ ﺟﺪوﻟﻬﺎي ﺗﻮﺻﻴﻒﮔﺮ ﻳﻚ ﺑﺮﻧﺎﻣﻪي ‪PM‬‬ ‫•‬

‫ﻣﺪﻳﺮﻳﺖ و ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪي ﺑﺴﻂﻳﺎﻓﺘﻪ‬ ‫•‬


‫ﻣﺪﻳﺮﻳﺖ وﻗﻔﻪﻫﺎ و اﺳﺘﺜﻨﺎﺋﺎت‪3‬‬ ‫•‬

‫ارﺗﺒﺎط ﺑﺎ ﺑﺮﻧﺎﻣﻪﻫﺎ و ﻣﺪﻳﺮﻳﺖﻛﻨﻨﺪهﻫﺎي وﻗﻔﻪي ‪RM‬‬ ‫•‬

‫دﺳﺘﺮﺳﻲ ﺑﻪ ﺛﺒﺎﺗﻬﺎي ﮔﻮﻧﺎﮔﻮن ﭘﺮدازﻧﺪه‬ ‫•‬


‫ﻣﺠﺎزيﺳﺎزي ‪4DMA‬‬ ‫•‬

‫_________________________________________________________________________________‬
‫‪DOS Protected Mode Interface ١‬‬
‫‪Virtual Control Programming Interface ٢‬‬
‫‪exceptions ٣‬‬
‫‪DMA Virtualization ٤‬‬

You might also like