NES Elite - NES के लिए Elite का दस्तावेज़ीकृत source code
(github.com/markmoxon)- Ian Bell और David Braben के NES के लिए Elite source code में हर लाइन के साथ documentation है, अधिकतर में explanations भी दिए गए हैं, और इसे original game binary की disassembly से हाथ से reconstruct किया गया है
- आधुनिक कंप्यूटर पर source से पूरी तरह चलने वाला game build करके iNES ROM image बनाया जा सकता है, जिसे असली NES या emulator में load किया जा सकता है
- समर्थित variants Imagineer PAL variant और Ian Bell की निजी वेबसाइट का NTSC variant हैं; default build PAL variant है
- source explore करने के तरीके: elite.bbcelite.com पर human-readable रूप में देखना, या IDE में annotated source खोलना; वेबसाइट और source files की सामग्री समान है
- build requirements हैं BeebAsm, Python, और Mac/Linux पर
make; Python build केवल 3.x पर test किया गया है और Windows मेंmake.exeशामिल है- Windows पर
make.bat, Mac/Linux परmakeसे build होता है, और default output5-compiled-rom-imagesfolder मेंelite-pal.NESहै variant=ntscसेelite-ntsc.NESबनाया जा सकता है
- Windows पर
- build options variant selection, maximum के करीब test commander का उपयोग, original binary matching छोड़ना, crc32 verification disable करना आदि control करते हैं
- प्रतिनिधि example है
make variant=ntsc commander=max match=no verify=no crc32.pygenerated file और original source से निकाली गई reference file के checksum और file size को साथ-साथ compare करता है
- प्रतिनिधि example है
- PAL और NTSC variants में NMI handler cycle count, Start screen का Imagineer/Nintendo heading, combat demo auto-play wait time, save slot checksum algorithm, internal version number, hidden copyright message, scroll text, y-coordinate constants आदि में फर्क है
- NTSC variant असली NTSC hardware पर काम नहीं करता; यह कुछ emulators के NTSC mode के लिए NMI timing बदला हुआ NTSC emulation है
- कोई license file नहीं है; default copyright law लागू होता है, जिससे केवल पढ़ना और fork करना allowed है, जबकि reproduction, distribution और derivative works बनाना allowed नहीं है
1 टिप्पणियां
Hacker News की राय
बहुत पहले Frontier में काम करते समय David Braben से NES Elite के बारे में एक मज़ेदार किस्सा सुना था। मुझे याद था कि शुरू में NES के हार्डवेयर timer से वास्तविक समय track किया जाता था, ताकि frame rate अलग होने पर भी physics समान रूप से चले
Nintendo के pre-release inspection में कहा गया कि शुरुआती NES की कुछ units में वह timer ठीक से काम नहीं करता, इसलिए उसे इस्तेमाल नहीं किया जा सकता। मैंने सुना था कि इस वजह से Bell/Braben ने हर function ने उस frame में कितने clock cycles खर्च किए, इसका अपना अनुमान बनाए रखा और frame के अंत में उन्हें जोड़कर बीता हुआ समय estimate किया
लेकिन GitHub source देखने पर लगता है कि या तो मेरी याद गलत थी या मैंने Braben की बात सही से नहीं समझी थी।
elite-source-bank-7.asmमें comment है: “NES द्वारा support न किए जाने वाले hardware timer के बजाय इस्तेमाल किए जा सकने वाले NMI timer को update करता है”, और ऐसा लगता है कि non-maskable interrupts गिनकर pseudo real-time clock implement की गई थीशुरुआती NES CPU die में एक buggy और disabled programmable interval timer के अवशेष थे: https://www.nesdev.org/wiki/RP2A03_Programmable_Interval_Tim...
बाद के revisions में इसे पूरी तरह हटा दिया गया, और संभव है कि यह केवल development kit जैसी चीज़ों में enabled रहा हो। अगर consumer devices पर काम न करने वाले feature पर depend किया गया था, तो Nintendo testing में reject होना स्वाभाविक था
मान भी लें कि released console में programmable interval timer था, तब भी वह precise raster effects जैसे sub-frame measurements के लिए ही उपयोगी होता। वास्तविक समय मापने के लिए NMI count कहीं ज़्यादा उचित है। NMI हर video frame की शुरुआत में fire होता है और 60.0988Hz पर बहुत stable रहता है; game engine धीमा होकर frame rate बदल भी दे, तो CPU-side processing video signal timing को प्रभावित नहीं कर सकती
संदर्भ के लिए, audio hardware भी timer interrupts बना सकता है, और कई expansion chips में rendering sync के लिए scanline counters होते हैं। NES पर समय मापने के तरीकों की कमी नहीं है
जब वे किसी game को Nintendo से approve कराने की कोशिश कर रहे थे, तो सुना कि वह US version NES के किसी specific version पर काम नहीं करता था या system overheating कर देता था। release schedule tight था, इसलिए उन्हें समस्या solve करने Nintendo headquarters तक उड़कर जाना पड़ा, और मुझे याद है कि उस specific version की circulation 100 units से कम थी
बाद में एक unpublished book के notes मिले, और असल में बात थोड़ी अलग थी। game testing केवल gameplay तक सीमित नहीं थी; उसे हर उस NES console variant पर test करना होता था जिस पर वह चल सकता था। Beam Software के Andrew Davie ने याद किया कि “The Three Stooges” ने Washington के Nintendo office में testing वाले NES पर problem पैदा की थी, इसलिए वे खुद वहाँ गए थे
उन्होंने कहा कि game pass कराने के लिए अलग-अलग chip manufacturer combinations सहित “लगभग 23 तरह की machine variants” थीं, और official documentation की कमी के कारण उन्होंने sprite data को official recommendation की तरह RAM में लिखने के बजाय हर 2 सेकंड में सीधे लिखवाया, जिससे NES बहुत गर्म हो जाता था और पूरे game में sprites flicker करते थे। fix के बाद release approval मिल गया, और उन्हें बताया गया कि problematic NES combination पूरे US में करीब 5 units ही था, इसलिए उसे Nintendo testing lineup से हटा दिया गया
हाल ही में sequel Elite: Dangerous शुरू किया, और कुछ problems होने के बावजूद अनुभव काफ़ी शानदार है
1984 वाले version से चले आ रहे game elements देखना अजीब तरह से भावुक कर देने वाला था। उस समय की cutting-edge 16K memory-mapped screen की vector graphics में दिखने वाले ships, और खासकर Coriolis station, जब 4K/60fps में पूरी 3D rendering में बदले दिखे, तो यह उम्मीद से ज़्यादा emotional लगा
billboards, plants और docking equipment तक के साथ detailed Coriolis interior आखिरकार देखना सच कहूँ तो आंखें थोड़ी नम कर देने वाला था। अभी मुश्किलें हों तब भी यह game एक precious legacy है, और उम्मीद है कि किसी न किसी रूप में बना रहेगा
Blue Danube सुनते हुए spaceship को manually dock करना हमेशा सुकून देने वाला अनुभव था
सोचता हूँ कि space simulators और space games में हमेशा इतनी समस्याएँ क्यों आ जाती हैं। Elite Dangerous कहीं आगे बढ़ता नहीं दिखता, Star Citizen हमेशा का beta लगता है, और KSP2 भी निराशाजनक था
9 साल पहले लिखे विचार: https://hypertexthero.com/elite-dangerous-education/
Odyssey expansion भी मज़ेदार है, और उम्मीद है कि कभी EVA spacewalks और zero-gravity missions भी जोड़े जाएँगे
मूल के लगभग वफादार C संस्करण Elite - The New Kind भी मौजूद है: https://github.com/fesh0r/newkind
इसे Christian Pinder ने बनाया था: https://www.christianpinder.com/games/
Ian Bell का Elite homepage भी देखने लायक है, जहाँ कई मूल versions मौजूद हैं: http://www.ianbellelite.com/
1991 के NES version का core, यानी 128K ROM का लगभग 30%, मूलतः 1986 का BBC Master version है, जो खुद 1984 के original BBC Micro version का विकसित रूप है। Commodore 64 और Apple II versions भी इसी वंश से हैं, और development भी BBC Micro पर ही हुआ था
banks 0, 1, 2 का ज़्यादातर code सीधे original BBC version से लिया गया था, और bank 7 में भी कुछ और हिस्सा है। ऊपर से नए graphics, sound और controller routines जोड़े गए, लेकिन धड़कता दिल अब भी Beeb version ही है
Elite के लेखक Ian Bell ने NES version को अपना पसंदीदा 8-bit Elite version कहा था
कुल मिलाकर, उन्होंने कहा था कि उन्हें 32-bit Archimedes port सबसे ज़्यादा पसंद था
पूरा interview http://www.elitehomepage.org/archive/b5081501.htm पर है
मैं इसका मतलब यह समझता हूँ कि उनका पसंदीदा version BBC Micro cassette version है, और पसंदीदा conversion NES version है। हालाँकि हो सकता है कि BBC fanboy होने के नाते मैं आशावादी interpretation कर रहा हूँ
हर bank की शुरुआत में ऐसा bank-switching shim होना मुझे पसंद है
SEI/INC $C006/JMP BEGINspace बचाने के लिए ऐसा करने की वजह विस्तार से बताई गई है, लेकिन मेरी नज़र में
JMPकी ज़रूरत का इकलौता कारण instruction pipeline है, और लगता है कि सिर्फ़NOPसे भी flush किया जा सकता हैइसलिए मेरा 2-byte optimization यह है:
SEI/INC $FFFD ; command vector में C0 का इस्तेमाल करें/NOPJMPकी ज़रूरत का इकलौता कारण instruction pipeline है” यह बात सही है, लेकिन इंसानों के लिए भी इसका मतलब बनता है। execution bank 7 में शुरू होता है, इसलिए bank 7 पर jump किया जाता हैअलग बात के तौर पर, Game Boy में entry point fixed bank ROM0 में होता है, इसलिए कम से कम आम MBCs में शुरुआत से ही ऐसी समस्या नहीं होती
तुलना के लिए Objective-C में लिखा गया open-source Elite clone Oolite का source code है: https://github.com/OoliteProject/oolite
https://oolite.space
https://news.ycombinator.com/item?id=7894145
8 साल की उम्र में मैंने इसे C64 पर खेला था। 30 साल बाद भी यह code मेरी समझ में नहीं आता
सिर्फ़ बैंक 0 में ही assembly की 18,305 lines हैं—समझ नहीं आता कि उन्होंने यह सब दिमाग़ में कैसे रखा होगा
सबसे अच्छे tools होने पर भी code track करने के लिए ज़बरदस्त संगठन और अनुशासन चाहिए रहा होगा। मैंने 80s की शुरुआत के Hitachi 6303[0]/Motorola 6800[1] के assemblers पर research की थी, और ऐसे tool constraints के बीच लोगों ने जो किया वह हैरान करने वाला है
उदाहरण के लिए, नीचे दिए गए दोनों assemblers में labels सिर्फ़ 6 characters तक हो सकते थे, और subroutine के अंदर इस्तेमाल होने वाले local labels भी नहीं थे। अपने काम में मैंने readability के लिए labels को 40 characters तक सीमित किया था, फिर भी ऐसा लगा
हालांकि इन architectures की relative simplicity, modern systems embedded काम की तुलना में वाक़ई refreshing है। पूरे system state को मोटे तौर पर दिमाग़ में रख पाना निश्चित रूप से एक फायदा है
0: http://www.bitsavers.org/components/hitachi/_dataBooks/U24_H...
1: http://www.bitsavers.org/components/motorola/6800/exorciser/...
कुल मिलाकर assembly programming भी high-level languages से बहुत अलग नहीं है। आप code को functions और blocks वगैरह में organize करते हैं। jumps से उलझी हुई बेहद लंबी code wall लिखना अपने लिए गंभीर समस्याएँ खड़ी करने जैसा है
अफ़सोस है कि यह free software नहीं है। अगर मैं Elite का creator होता, तो सभी game ports को free license के तहत release करता
वैसे भी आजकल सस्ते netbook पर Oolite खेल सकते हैं, और addons की विशाल list की वजह से उतना ही या उससे भी ज़्यादा मज़ा मिल सकता है
शायद Braben की तरफ़ से वे Elite 4/Elite: Dangerous बना रहे थे, इसलिए वे copyright को कमजोर नहीं करना चाहते थे
सभी source code को इसी स्तर पर documented होना चाहिए