एनईएस (और एसएनईएस भी ज्यादातर) के लिए, यहां एक मूल अवलोकन है। मैंने कोई एनईएस खेल नहीं लिखा, लेकिन एनईएस एमुलेटर (ग्रेबॉक्स) लिखा और पुरानी गाड़ियों की एक उचित मात्रा में रेव-इंजीनियरिंग की।
प्रोग्रामिंग लैंग्वेज के लिए: हाँ, यह सब असेंबली था। NES का मतलब है हार्डवेयर इंटरप्ट, DMA पोर्ट, बैंक स्विचिंग आदि के साथ सीधे काम करना। सौभाग्य से, 6502 (या यों कहें, 2A03) की प्रोग्रामिंग काफी आसान है [1]:
- कुछ रजिस्टर हैं: ए, एक्स और वाई मुख्य रूप से, बाद के दो केवल अनुक्रमण और पुनरावृत्ति के लिए उपयोग करने योग्य हैं
- निर्देश सेट छोटा है और ज्यादातर सीधा है
- बहुत सारी मेमोरी नहीं: मुख्य रैम 2KB है, जिसमें वैकल्पिक बैटरी समर्थित 8KB एक्सटेंशन है। उस 2KB में से 256 बाइट्स स्टैक और पेज 0 (पहले 256 बाइट्स) के लिए आरक्षित हैं, जहाँ आप कुछ विशेष एड्रेसिंग मोड्स के कारण अपने सबसे अधिक इस्तेमाल किए जाने वाले पॉइंटर्स और वैल्यूज़ को स्टोर करना चाहते हैं।
ये 3 चीजें एक साथ एक ऐसे वातावरण के लिए बनाती हैं जो इसके साथ काम करते समय याद रखना आसान है। हां, आप स्वयं सभी मेमोरी का प्रबंधन करते हैं लेकिन इसका मतलब यह है कि आप इसका पूरा नक्शा बनाते हैं जहां सब कुछ आगे बढ़ जाता है और यह नक्शा बहुत बड़ा नहीं होता है क्योंकि आपको केवल 2K के बारे में चिंता करनी होती है, इसलिए आप इसे एक टुकड़े पर प्लॉट कर सकते हैं ग्राफ पेपर। आपको चीजों को थोड़ा और अधिक योजनाबद्ध करना होगा और रैम और रोम (कारतूस पर) चर और स्थिरांक को असाइन करना होगा।
आपके कार्ट्रिज डेटा सीपीयू की पता योग्य सीमाओं से परे जाते ही यह थोड़ा चकरा जाता है। यह 64KB है, जिसका निचला 32KB पत्थर में सेट है और सभी प्रकार के हार्डवेयर पोर्ट और RAM में मैप किया गया है। यह वह जगह है जहाँ बैंक-स्विचिंग खेल में आती है, जिसका अर्थ है कि ROM के एक हिस्से को मैप करना (उच्चतर) 32KB पता स्थान।
यह प्रोग्रामर चाहता है, लेकिन इसका इस्तेमाल किया जा सकता है, लेकिन एक उदाहरण का उपयोग 3 स्तरों के साथ एक खेल हो सकता है, सभी स्तर के डेटा, मेटा डेटा और प्रत्येक स्तर के लिए कोड कारतूस पर अलग-अलग 8KB स्मृति क्षेत्रों में crammed। स्तर के लिए कॉलबैक हो सकता है जैसे कि इनिशियल इनिशियलाइज़ेशन, प्रति फ्रेम अपडेट इत्यादि। "लोड हो रहा है" का अर्थ होगा कि 8xB चंक मेमोरी का उदाहरण जैसे 0xC000। आप तब निर्दिष्ट कर सकते हैं कि init दिनचर्या हमेशा 0xC000 पर होती है, फ्रेम अपडेट दिनचर्या 0xC200 पर होती है और स्तर का डेटा 0xC800 से शुरू होता है। गेम का मुख्य कोड एक अन्य मेमोरी चंक में रखा गया है, तो सही चंक में स्वैप करके और उचित समय पर 0xC000 और 0xC200 पर जाकर पते में स्तर परिवर्तन को नियंत्रित करता है।
राइट ग्राफिकल डेटा: NES के टाइल डेटा 2-बिट 8x8 पिक्सेल नक्शे हैं। पृष्ठभूमि के लिए उन्हें 1/4 रिज़ॉल्यूशन 2-बिट परत के साथ जोड़ा जाता है। इन 4-बिट मूल्यों को तब 16-प्रविष्टि पैलेट में अनुक्रमित किया गया था, मेरा मानना है कि 53 प्रभावी अद्वितीय रंग उपलब्ध हैं। स्प्राइट्स ने 2-बिट पिक्सेल डेटा का भी उपयोग किया और प्रत्येक स्प्राइट ने अपने 2-बिट समूह इंडेक्स को फिर से 4-बिट पाल इंडेक्स बनाते हुए निर्दिष्ट किया। स्क्रीन पर बीजी की छवि 32x30 सरणी की टाइल सूचकांक संख्या है।
अनिवार्य रूप से, एक टन के पुनरावृत्ति और अनुक्रमित अनुक्रमित करके आप डेटा को बहुत छोटा रख सकते हैं। स्तरीय डेटा को अक्सर टाइल अनुक्रमित की ऊर्ध्वाधर सलाखों के रूप में संग्रहीत किया जाता था और क्योंकि उन ऊर्ध्वाधर सलाखों को फिर से उपयोग किया जाता था, उन्हें भी अनुक्रमित किया गया था और केवल एक बार कारतूस पर संग्रहीत किया गया था। साधारण डेटा कंप्रेशन तकनीक इसी तरह काम करती हैं। इसने मारियो 1 को 32KB डेटा (कमरे में रहने के साथ) और 8KB बिटमैप डेटा की अनुमति दी।
देव वातावरण के रूप में, मैंने कुछ तस्वीरें देखीं, जहाँ लोगों ने काम के लिए EEPROM बर्नर तक जाने के लिए कुछ प्रमाणित प्राचीन कंप्यूटरों पर काम किया। SNES उम्र [2] के बाद तक टूल-असिस्टेड डिबगिंग वास्तव में एक संभावना नहीं थी। यह मुख्य कारण है कि इतने सारे पुराने खेलों में "स्पष्ट" कीड़े हैं और गेमशार्क जैसी चीजें वे क्यों कर सकते हैं; खिलाड़ी का स्वास्थ्य हमेशा मेम-लोकेशन X पर रहेगा, इसलिए आप इसे हर समय 100 पर रहने के लिए बाध्य कर सकते हैं।
अगर आपको ये बातें दिलचस्प लगती हैं तो मैं आपको उदाहरण के लिए देखने के लिए प्रोत्साहित करता हूँ जैसे कि http://wiki.nesdev.com/w/index.php/Nesdev_Wiki
NES के लिए कुछ प्रोग्रामिंग कोर्स ऑनलाइन भी हैं।
मुझे उम्मीद है कि इस सरलीकृत अवलोकन ने 80 के दशक के खेल के विकास में कुछ अंतर्दृष्टि दी।
[१] अपेक्षाकृत बोलना। साथ ही मैं पक्षपाती हूं क्योंकि मैंने लगभग 85% पावरपीसी असेंबली में ग्रेबॉक्स लिखा था। [२] FF6 लेख बनाना देखें: http://www.edge-online.com/features/the-making-of-final-fantasy-vi/