भाग 1
वर्ष वीजीए मोड के लिए, वहाँ एक निश्चित प्रदर्शन स्मृति क्षेत्र (विरासत) में लिखने के लिए पता है । टेक्स्ट मोड के लिए यह क्षेत्र 0x000B8000 से शुरू होता है। ग्राफिक्स मोड के लिए यह 0x000A0000 से शुरू होता है।
उच्च संकल्प वीडियो मोड के लिए
(जैसे VESA/VBE इंटरफ़ेस द्वारा निर्धारित होता है) इस वजह क्षेत्र 64 KiB और सबसे उच्च संकल्प वीडियो मोड के लिए सीमित है विरासत प्रदर्शन स्मृति के आकार एक की जरूरत है काम नहीं करता है बहुत अधिक जगह (जैसे 1024 * 768 * 32-बीपीपी = 2.25 एमआईबी)। प्राप्त करने के लिए कि VBE द्वारा समर्थित 2 अलग-अलग विधियां हैं।
पहली विधि "बैंक स्विचिंग" कहा जाता है, जहां वीडियो कार्ड के प्रदर्शन स्मृति का ही हिस्सा किसी भी समय पर विरासत क्षेत्र में मैप किया गया है (और आप बदल सकते हैं जो हिस्सा मैप किया गया है)। यह काफी गन्दा हो सकता है - उदाहरण के लिए, एक पिक्सेल खींचने के लिए आपको गणना करने की आवश्यकता हो सकती है कि किस बैंक पिक्सेल में है, फिर उस बैंक पर स्विच करें, फिर गणना करें कि बैंक में ऑफसेट करें। इसे और भी खराब बनाने के लिए, कुछ वीडियो मोड (उदाहरण के लिए 24-बीपीपी वीडियो मोड जहां 3 बाइट प्रति पिक्सेल है) केवल पिक्सेल का डेटा का पहला भाग एक बैंक में हो सकता है और उसी पिक्सेल का डेटा दूसरा भाग है एक अलग बैंक इसका मुख्य लाभ यह है कि यह वास्तविक मोड एड्रेसिंग के साथ काम करता है, क्योंकि विरासत डिस्प्ले मेमोरी एरिया 0x00100000
से नीचे है।
दूसरी विधि "रैखिक फ्रेमबफर" (या बस "LFB"), जहां वीडियो कार्ड के पूरे प्रदर्शन स्मृति क्षेत्र किसी भी गन्दा बैंक स्विचिंग बिना पहुँचा जा सकता है कहा जाता है। आपको वीईएसए/वीबीई इंटरफेस से पूछना है जहां यह क्षेत्र है (और यह आमतौर पर 0xC0000000
और 0xFFF00000
के बीच "पीसीआई छेद" में है)। इसका मतलब है कि आप वास्तविक मोड में इसका उपयोग नहीं कर सकते हैं, और संरक्षित मोड या लंबे मोड या "अवास्तविक मोड" का उपयोग करने की आवश्यकता है।
जब आप एलएफबी मोड का उपयोग कर रहे हों तो पिक्सेल का पता ढूंढने के लिए, आप "pixel_address = display_memory_address + y * bytes_per_line + x * bytes_per_pixel
" जैसे कुछ करेंगे। "bytes_per_line
" वीईएसए/वीबीई इंटरफ़ेस से आता है (और "horizontal_resolution * bytes_per_line
" जैसा नहीं हो सकता है क्योंकि क्षैतिज रेखाओं के बीच पैडिंग हो सकता है)।
के लिए "बैंक बंद" VBE/VESA मोड, यह हो जाता है कुछ अधिक की तरह:
pixel_offset = y * bytes_per_line + x * bytes_per_pixel;
bank_number = pixel_offset/bank_size;
pixel_starting_address_within_bank = pixel_offset % bank_size;
कुछ पुराने वीजीए मोड के लिए (उदाहरण के लिए 256 रंग "मोड 0x13") यह बहुत LFB के समान है, सिवाय इसके कि लाइनों के बीच कोई पैडिंग नहीं है और आप कर सकते हैं "pixel_address = display_memory_address + (y * horizontal_resolution + x) * bytes_per_pixel
"। टेक्स्ट मोड के लिए यह मूल रूप से वही बात है, सिवाय इसके कि 2 बाइट प्रत्येक वर्ण को निर्धारित करते हैं और इसकी विशेषता - उदा। "char_address = display_memory_address + (y * horizontal_resolution + x) * 2
"। अन्य पुराने वीजीए मोड (मोनोक्रोम/2-रंग, 4-रंग और 16-रंग मोड) के लिए वीडियो कार्ड की मेमोरी पूरी तरह से व्यवस्थित होती है। यह "विमान" में विभाजित है जहां प्रत्येक विमान में पिक्सेल का एक बिट होता है, और (उदाहरण के लिए) 16-रंग मोड में एक पिक्सेल अपडेट करें, आपको 4 अलग विमानों को लिखने की आवश्यकता है। प्रदर्शन कारणों से वीजीए हार्डवेयर अलग-अलग लिखने के तरीके और विभिन्न पठन मोड का समर्थन करता है, और यह जटिल हो सकता है (यहां तक कि पर्याप्त रूप से वर्णन करने के लिए जटिल)।
भाग 2
मैं/हे बंदरगाहों के लिए (80x86 पर, "पीसी compatibles"), वहाँ 3 सामान्य श्रेणियों। पहला "वास्तविक तथ्य" विरासत डिवाइस है जो निश्चित I/O बंदरगाहों का उपयोग करता है। इसमें पीआईसी चिप्स, आईएसए डीएमए कंट्रोलर, पीएस/2 कंट्रोलर, पीआईटी चिप, सीरियल/समांतर बंदरगाह इत्यादि जैसी चीजें शामिल हैं। लगभग कुछ भी जो इन उपकरणों में से प्रत्येक को प्रोग्राम करने का वर्णन करता है आपको बताएगा कि कौन से I/O बंदरगाह डिवाइस का उपयोग करता है।
अगली श्रेणी विरासत/ईसा उपकरणों, जहां मैं/हे बंदरगाहों उपकरणों उपयोग कार्ड पर ही जम्परों द्वारा निर्धारित किया जाता है, और निर्धारित करने के लिए जो मैं/हे बंदरगाहों वे सॉफ्टवेयर से उपयोग नहीं समझदार रास्ता नहीं है। के आसपास इस अंत उपयोगकर्ता को ओएस को बताना है जो I/O बंदरगाह प्रत्येक डिवाइस का उपयोग करता है। शुक्र है कि यह क्रिस्टी सामान अप्रचलित हो गया है (हालांकि इसका मतलब यह नहीं है कि कोई भी इसका उपयोग नहीं कर रहा है)।
तीसरी श्रेणी "& खेलने प्लग", जहाँ उपकरण है जो मैं/हे बंदरगाहों का उपयोग करता है (और ज्यादातर मामलों में, मैं/हे बंदरगाहों डिवाइस का उपयोग करता बदलते) पूछ करने के कुछ तरीके वहाँ है। इसका एक उदाहरण पीसीआई है, जहां एक "पीसीआई कॉन्फ़िगरेशन स्पेस" है जो आपको प्रत्येक पीसीआई डिवाइस के बारे में बहुत सारी जानकारी बताती है। इस श्रेणी के लिए, कोई भी तरीका नहीं है कि कौन से डिवाइस रनिंग समय पर किए बिना I/O बंदरगाहों का उपयोग कर रहे हैं, और कुछ BIOS सेटिंग्स को बदलकर 0/इन डिवाइसों को I/O बदलने के लिए कोई भी कारण हो सकता है बंदरगाहों।
यह भी ध्यान दें कि एक इंटेल सीपीयू केवल एक सीपीयू है। "CPU संगत" कंप्यूटर से मूल रूप से भिन्न कुछ ऐसी चीजों में उपयोग होने से उन CPUs को कुछ भी नहीं रोकता है।इंटेल के सीपीयू मैनुअल आपको कभी भी हार्डवेयर के बारे में कुछ भी नहीं बताएंगे जो CPU के बाहर मौजूद है ( चिपसेट या डिवाइस सहित)।
भाग 3
अधिक जानकारी के लिए जाने के लिए शायद सबसे अच्छी जगह (कि ओएस डेवलपर्स/शौक रखने वालों के लिए इरादा है) http://osdev.org/ (उनके विकि और उनके मंचों) है।
यह निर्दिष्ट ग्राफिक्स निर्देशांक में स्क्रीन पर एक रंग डॉट बनाता है।
इनपुट:
AH = 0Ch
AL = Color of the dot
CX = Screen column (x coordinate)
DX = Screen row (y coordinate)
उत्पादन: स्क्रीन पर पिक्सेल को छोड़कर
कुछ भी नहीं।
नोट: यह फ़ंक्शन नए रंग मान के साथ अनन्य OR (XOR) निष्पादित करता है और AL के बिट 7 के पिक्सेल के वर्तमान संदर्भ को सेट किया गया है।
यह प्रोग्राम दर्शाता है कि पिक्सल को कैसे प्लॉट करना है। इसे स्क्रीन के बीच में चार लाल पिक्सेल प्लॉट करना चाहिए।
.model tiny
.code
org 100h
start:
mov ax,13 ; mode = 13h
int 10h ; call bios service
mov ah,0Ch ; function 0Ch
mov al,4 ; color 4 - red
mov cx,160 ; x position = 160
mov dx,100 ; y position = 100
int 10h ; call BIOS service
inc dx ; plot pixel downwards
int 10h ; call BIOS service
inc cx ; plot pixel to right
int 10h ; call BIOS service
dec dx ; plot pixel up
int 10h ; call BIOS service
xor ax,ax ; function 00h - get a key
int 16h ; call BIOS service
mov ax,3 ; mode = 3
int 10h ; call BIOS service
mov ax,4C00h ; exit to DOS
int 21h
end start
कुछ अनुकूलन इस विधि बहुत तेजी से नहीं है और हम इसे एक बहुत तेजी से बना सकते हैं। कैसे? वीडियो मेमोरी को सीधे लिखकर। यह काफी आसानी से किया जाता है।
वीजीए सेगमेंट 0 ए000h है। काम करने के लिए जहां प्रत्येक पिक्सेल जाता है आप ऑफसेट प्राप्त करने के लिए इस सरल सूत्र का उपयोग करते हैं।
Offset = X + (Y * 320)
हमें बस इस स्थान पर एक नंबर डाल करने के लिए है और वहाँ अब स्क्रीन पर एक पिक्सेल है। संख्या यह है कि यह रंग क्या है। दो निर्देश हैं जिनका उपयोग हम स्क्रीन पर पिक्सेल डालने के लिए कर सकते हैं, सबसे पहले हम मूल्य को AL से ES में रखने के लिए stosb का उपयोग कर सकते हैं: DI या हम एमओवी निर्देश के नए रूप का उपयोग कर सकते हैं:
mov es:[di], color
हमें किस का उपयोग करना चाहिए? जब हम स्क्रीन पर पिक्सल लिखने जा रहे हैं, तो हमें जितना तेज़ हो सके उतना तेज़ करने की आवश्यकता है।
Instruction Pentium 486 386 286 86
STOSB 3 5 4 3 11
MOV AL to SEG:OFF 1 1 4 3 10
आप MOV विधि का उपयोग करें यदि आप डि (जो STOSB करता है) को बढ़ाने के लिए आवश्यकता हो सकती है।
यदि हमारे पास एक प्रोग्राम था जो स्प्राइट्स का उपयोग करता था जिसे लगातार ड्रॉ करने की आवश्यकता होती है, मिटा दी जाती है और फिर आपको फिर से फेंकने में समस्या होती है। से बचें इससे बचें आप 'डबल बफर' का उपयोग कर सकते हैं। यह मेमोरी का एक और हिस्सा है जिसे आप लिखते हैं और फिर सभी जानकारी को स्क्रीन पर कॉपी करें।
आपको अपने पर्यावरण (यूनिक्स टर्मिनल/विंडोज कंसोल ऐप/...) को निर्दिष्ट करने की आवश्यकता है क्योंकि यह आईएसओ सी – ninjalj