आप इसे सामान्य रूप से नहीं कर सकते हैं, लेकिन कुछ इंद्रियों में, आप बहुत कुछ कर सकते हैं, और कुछ ऐतिहासिक मामले हैं जिनमें आपको वास्तव में होना था ।
अटारी 2600 (या अटारी वीडियो कंप्यूटर सिस्टम) जल्द से जल्द घर वीडियो गेम प्रणालियों में से एक था और प्रथम युग के बाद के प्रणालियों के विपरीत 1978 में जारी किया गया था, अटारी डिवाइस एक फ्रेम बफर देने के लिए खर्च नहीं उठा सकते, जिसका अर्थ है कि था सीपीयू प्रत्येक स्कैनलाइन पर कोड को चलाने के लिए यह निर्धारित करने के लिए कि क्या उत्पादन किया जाए - यदि इस कोड को चलाने के लिए (HBlank अंतराल) 17.08 microseconds लिया गया है, तो स्कैनलाइन शुरू करने से पहले ग्राफिक्स ठीक से सेट नहीं होंगे। इससे भी बदतर, अगर प्रोग्रामर अटारी को सामान्य रूप से अनुमति देने की तुलना में अधिक जटिल सामग्री खींचना चाहता था, तो उन्हें निर्देश के लिए सटीक समय को मापना था और ग्राफिक्स रजिस्टरों को बदलना होगा क्योंकि बीम को खींचा जा रहा था, जिसमें पूरी अवधि के लिए 57.29 माइक्रोसेकंड की अवधि थी।
हालांकि, अटारी 2600, 6502 पर आधारित कई अन्य प्रणालियों की तरह, एक बहुत ही महत्वपूर्ण विशेषता थी जो इस परिदृश्य के लिए आवश्यक सावधानीपूर्वक समय प्रबंधन को सक्षम करती थी: सीपीयू, रैम और टीवी सिग्नल सभी एक ही मास्टर के आधार पर घड़ियों को बंद कर देते थे। घड़ी। टीवी सिग्नल 3.98 मेगाहर्ट्ज की घड़ी से ऊपर चला गया, ऊपर के समय को "रंगीन घड़ियों" के एक पूर्णांक संख्या में विभाजित किया गया, जो टीवी सिग्नल को प्रबंधित करता था, और सीपीयू और रैम घड़ियों का एक चक्र बिल्कुल तीन रंग घड़ियों था, जो सीपीयू की घड़ी होने की अनुमति देता था। वर्तमान प्रगति टीवी सिग्नल के सापेक्ष समय का एक सटीक माप। (इस पर अधिक जानकारी के लिए, स्टेला अटारी 2600 एमुलेटर के लिए लिखे गए स्टेला प्रोग्रामर गाइड देखें )।
इसके अलावा, इस ऑपरेटिंग वातावरण का मतलब था कि प्रत्येक सीपीयू निर्देश में चक्रों की एक निर्धारित मात्रा होती थी, जो हर मामले में होती थी, और कई 6502 डेवलपर्स ने इस जानकारी को संदर्भ तालिकाओं में प्रकाशित किया था। उदाहरण के लिए, इस तालिकाCMP
से ली गई (संचयकर्ता के साथ मेमोरी की तुलना करें) निर्देश के लिए इस प्रविष्टि पर विचार करें :
CMP Compare Memory with Accumulator
A - M N Z C I D V
+ + + - - -
addressing assembler opc bytes cycles
--------------------------------------------
immediate CMP #oper C9 2 2
zeropage CMP oper C5 2 3
zeropage,X CMP oper,X D5 2 4
absolute CMP oper CD 3 4
absolute,X CMP oper,X DD 3 4*
absolute,Y CMP oper,Y D9 3 4*
(indirect,X) CMP (oper,X) C1 2 6
(indirect),Y CMP (oper),Y D1 2 5*
* add 1 to cycles if page boundary is crossed
इस सारी जानकारी का उपयोग करते हुए, अटारी 2600 (और अन्य 6502 डेवलपर्स) यह निर्धारित करने में सक्षम थे कि उनके कोड को निष्पादित करने में कितना समय लग रहा था, और रूटीन का निर्माण करने के लिए जो उन्हें चाहिए था और अभी भी अटारी के टीवी सिग्नल समय की आवश्यकताओं के अनुरूप है। और क्योंकि यह समय बहुत सटीक था (विशेषकर एनओपी जैसे समय बर्बाद करने वाले निर्देशों के लिए), वे ग्राफिक्स को संशोधित करने के लिए इसका उपयोग करने में सक्षम थे क्योंकि वे खींचे जा रहे थे।
बेशक, अटारी का 6502 एक बहुत ही विशिष्ट मामला है, और यह सब केवल इसलिए संभव है क्योंकि सिस्टम में निम्नलिखित सभी थे:
- एक मास्टर घड़ी जिसमें रैम सहित सब कुछ चलता था। आधुनिक प्रणालियों में सीपीयू और रैम के लिए स्वतंत्र घड़ियां होती हैं, जिसमें रैम घड़ी अक्सर धीमी होती है और दो जरूरी नहीं कि सिंक में हों।
- किसी भी प्रकार का कोई कैशिंग नहीं - 6502 ने हमेशा DRAM को सीधे एक्सेस किया। आधुनिक प्रणालियों में SRAM कैश होता है जो राज्य की भविष्यवाणी करना अधिक कठिन बनाता है - जबकि कैश के साथ सिस्टम के व्यवहार की भविष्यवाणी करना अभी भी संभव है, यह निश्चित रूप से अधिक कठिन है।
- एक साथ चलने वाले कोई अन्य कार्यक्रम - कारतूस पर कार्यक्रम का सिस्टम पर पूर्ण नियंत्रण नहीं था। आधुनिक सिस्टम एक बार गैर-नियतात्मक समय-निर्धारण एल्गोरिदम का उपयोग करके कई कार्यक्रम चलाते हैं।
- एक घड़ी की गति इतनी धीमी है कि सिग्नल समय पर सिस्टम में यात्रा कर सकते हैं। 4 गीगाहर्ट्ज की घड़ी की गति (उदाहरण के लिए) के साथ एक आधुनिक प्रणाली में, आधे मीटर की मदरबोर्ड की लंबाई की यात्रा करने के लिए यह 6.67 प्रकाश चक्र का एक फोटॉन लेता है - आप बोर्ड पर किसी और चीज के साथ बातचीत करने के लिए एक आधुनिक प्रोसेसर की उम्मीद नहीं कर सकते। केवल एक चक्र में, चूंकि यह उपकरण तक पहुंचने के लिए बोर्ड पर एक संकेत के लिए एक से अधिक चक्र लेता है।
- एक अच्छी तरह से परिभाषित घड़ी की गति जो शायद ही कभी बदलती है (अटारी के मामले में 1.19 मेगाहर्ट्ज) - आधुनिक प्रणालियों के सीपीयू की गति हर समय बदलती है, जबकि एक अटारी टीवी सिग्नल को प्रभावित किए बिना ऐसा नहीं कर सकता था।
- प्रकाशित चक्र समय - x86 यह निर्धारित नहीं करता है कि इसके किसी भी निर्देश को कितना समय लगता है।
ये सभी चीजें एक ऐसी प्रणाली बनाने के लिए एक साथ आईं, जहां निर्देशों का सेट तैयार करना संभव था, जिसमें सटीक समय लगता था - और इस एप्लिकेशन के लिए, ठीक यही मांग की गई थी। अधिकांश प्रणालियों में केवल इस डिग्री की सटीकता नहीं होती है क्योंकि इसके लिए कोई आवश्यकता नहीं होती है - गणना या तो तब की जाती है जब वे काम करते हैं, या यदि समय की एक सटीक राशि की आवश्यकता होती है, तो एक स्वतंत्र घड़ी की देखभाल की जा सकती है। लेकिन अगर ज़रूरत सही है (जैसे कि कुछ एम्बेडेड सिस्टम पर), यह अभी भी दिखाई दे सकता है, और आप इन वातावरण में चलाने के लिए आपका कोड कितनी देर तक सही ढंग से निर्धारित कर पाएंगे।
और मुझे बड़े पैमाने पर डिस्क्लेमर भी जोड़ना चाहिए कि यह सब केवल विधानसभा निर्देशों के एक सेट के निर्माण पर लागू होता है जो सटीक मात्रा में समय लेगा। यदि आप क्या करना चाहते हैं, तो इन वातावरणों में भी, विधानसभा के कुछ मनमाने टुकड़े ले सकते हैं, और पूछ सकते हैं कि "इसे निष्पादित करने में कितना समय लगता है?", आप स्पष्ट रूप से ऐसा नहीं कर सकते हैं - यही हाल्टिंग समस्या है , जो अयोग्य साबित हुई है।
EDIT 1: इस उत्तर के पिछले संस्करण में, मैंने कहा कि अटारी 2600 में प्रोसेसर के बारे में सूचित करने का कोई तरीका नहीं था, जहां यह टीवी सिग्नल में था, जिसने इसे शुरू से ही पूरे कार्यक्रम को गिनने और सिंक्रनाइज़ रखने के लिए मजबूर किया। जैसा कि टिप्पणियों में मुझे बताया गया है, यह ZX स्पेक्ट्रम जैसी कुछ प्रणालियों का सच है, लेकिन अटारी 2600 का सच नहीं है, क्योंकि इसमें एक हार्डवेयर रजिस्टर होता है जो सीपीयू को तब तक रोकता है जब तक कि अगले क्षैतिज ब्लैंकिंग अंतराल नहीं होता है, साथ ही साथ एक समारोह में शुरू होने पर ऊर्ध्वाधर कंबल अंतराल शुरू करने के लिए। इसलिए, चक्र की गणना की समस्या प्रत्येक स्कैनलाइन तक सीमित है, और केवल तभी सटीक हो जाती है जब डेवलपर सामग्री को बदलना चाहता है क्योंकि स्कैनलाइन को खींचा जा रहा है।