टेबलेट और स्मार्टफ़ोन के व्यापक प्रभुत्व के समय में, यह विश्वास करना मुश्किल है कि अभी हाल ही में, आप कैलकुलेटर के साथ खेलने में बहुत मज़ा ले सकते हैं। बेशक, मेरा मतलब एक साधारण (या यहां तक कि इंजीनियरिंग) कैलकुलेटर नहीं है, लेकिन एक
प्रोग्राम योग्य है । मैं एक ऐसे उपकरण के बारे में बात करना चाहता हूं जिसने सचमुच मेरा जीवन बदल दिया और वास्तव में मुझे एक प्रोग्रामर बनने के लिए प्रेरित किया।
पिछली शताब्दी के उत्तरार्ध में, यूएसएसआर में कंप्यूटर तकनीक तंग थी। मेरे पिता एक प्रोग्रामर के रूप में काम करते थे। मैं हमेशा सेंट्रल डिपार्टमेंट स्टोर में उनके काम की यात्राओं को याद करूंगा, जहां मैंने
निम्स में एक
मिन्स्क कंप्यूटर के साथ खेला था और उस समय सेरबैंक द्वारा इस्तेमाल की जाने वाली स्पार्क गोलियों पर पीतल के छल्ले के साथ स्टफिंग कार्यक्रम जारी रखा था। मेरे व्यक्तिगत निपटान में, कार्यक्रमों को निष्पादित करने में सक्षम कुछ, निश्चित रूप से, मैं सपने भी नहीं देख सकता था।
प्रोग्रामेबल माइक्रोकल्केटर्स (पीएमके) के आगमन के साथ सब कुछ बदल गया है। अब मैं सपना देख सकता था। यह वही है जो मैंने
टेक्नीक ऑफ यूथ में लेख पढ़ा, क्योंकि कज़ान में इस प्रोग्राम योग्य चमत्कार को हासिल करना संभव नहीं था। लेकिन, एक दिन, मैं और मेरे माता-पिता मॉस्को गए।
काफी प्रयास करने के बाद, मैंने अपने माता-पिता को
एमके -61 खरीदने के लिए मना लिया, जो उस समय सस्ता नहीं था, और, किराए के लिए, पुरानी
क्वांट पत्रिकाओं को बांधने के लिए, जिसके बाद, अपने रिश्तेदारों के अपार्टमेंट में खुद को बैरिकेड करने के बाद, मैंने प्रस्थान करने के लिए बाहरी बाहरी लोगों को जवाब देना बंद कर दिया।
मैंने उस समय जो सब कुछ छपा था, उसे प्रोग्रामेबल कैलकुलेटर्स पर फिर से पढ़ा, एक सामान्य नोटबुक तैयार की और उसे विशेष रूप से पसंद किए गए कार्यक्रमों की नकल की। धीरे-धीरे, मैं इस बिंदु पर आया कि मैं अपने सुधार और उन्हें सुधारने में सक्षम था (प्रोग्रामिंग स्पार्क्स पर सतर्कता में प्राप्त अनुभव व्यर्थ नहीं था)। थोड़ी देर बाद, मैं खुद प्रोग्राम लिखने में सक्षम हो गया।
जब मैं एमके -61 के साथ पहले से ही बहुत सहज था, मेरे एक दोस्त को एक बेहतर संस्करण मिला -
एमके -52 । कमांड सिस्टम के अनुसार, यह व्यावहारिक रूप से एमके -61 से भिन्न नहीं था, लेकिन ईईपीआरओएम में कार्यक्रमों को बचाने की क्षमता थी और कई कारतूसों के साथ तैयार कार्यक्रमों के साथ आपूर्ति की गई थी। बेशक, मैं तुरंत उसके लिए विशेष रूप से कुछ लिखना चाहता था।
गीतात्मक विषयांतरमुझे कहना होगा कि उस समय, PMK के लिए कार्यक्रमों के भंडारण के मुद्दे ने दिलचस्पी को बढ़ा दिया था। प्रत्येक बार एक बड़े कार्यक्रम को फिर से भरने के लिए यह वास्तव में असुविधाजनक था। इसके अलावा, शुरू किए गए कार्यक्रम को विभिन्न प्रकार की त्रुटियों के लिए सावधानीपूर्वक जांचना था।
उत्साही लोगों ने इस समस्या के लिए कई सर्किट समाधान प्रस्तावित किए हैं। एक बार मैंने एक लेख भी देखा जिसमें चुंबकीय टेप पर कैलकुलेटर कार्यक्रमों को संग्रहीत करने के लिए एक उपकरण का वर्णन किया गया था। एमके -52 के मुद्दे ने इस मुश्किल सवाल का अंत कर दिया।
चुनाव "सागर युद्ध" पर गिर गया। मैं लंबे समय से इसे करना चाहता था, लेकिन मैं कैलकुलेटर के पते स्थान में सभी आवश्यक कार्यक्षमता को निचोड़ नहीं सका। EEPROM से कार्यक्रमों को लोड करने की क्षमता कार्यक्रम को दो भागों में विभाजित करने की अनुमति देती है। पहले ब्लॉक - जहाजों की व्यवस्था की, दूसरे (वास्तव में खेल) ने उपयोगकर्ता के साथ एक संवाद प्रदान किया। दोनों ब्लॉकों में से कुछ दिनचर्या का उपयोग किया गया था।
यहाँ इस चमत्कार को कैसे देखा गया (चित्र दिल के बेहोश के लिए नहीं है) चूँकि इस रूप में यह गुफा चित्रण करना असंभव है, इसलिए मैं इस कोड को और अधिक पठनीय रूप में दूंगा:
शिप प्लेसमेंट यूनिट00|46 01.07 02.12 03.08 04.11 05.34 06.15 07.45 08|53 09:75 10.06 11.53 12:67 13.5E 14:08 15.62 16.53 17:37 18.6E 19.01 20.11 21.4E 22|53 23:34 24.6E 25.02 26.10 27.4E 28.53 29:34 30.5D 31:08 32.63 33.50 34|62 35.02 36.10 37|65 38.12 39.01 40.10 41.DE 42.38 43.BE 44.52 45.11 46.4E 47.53 48:58 49.6E 50.02 51.10 52.4E 53.53 54:58 55.5D 56:22 57.27 58|61 59|65 60.12 61.01 62.10 63.DE 64.38 65.BE 66.52 67|65 68.12 69.01 70.10 71.DE 72.37 73.35 74.52 75|66 76.01 77.01 78.12 79.20 80.10 81.35 82.46 83.07 84.12 85.07 86.10 87.4E 88.65 89.04 90.15 91.12 92.45 93.01 94.11 95.59 96:A2 97.65 98.07 99.15 A0.13 A1.45 A2|52
डाउनलोड करने योग्य गेम ब्लॉक 00.40 01.50 02.57 03:41 04.0B 05.15 06.45 07.14 08.06 09.10 10.4E 11.02 12.53 13:67 14.57 15:22 16.0F 17.DE 18.39 19.BE 20.64 21.52 22|53 23:75 24.01 25.53 26:67 27.5E 28.22 29.15 30.53 31:59 32.6E 33.06 34.11 35.62 36.12 37.65 38.17 39.11 40.52 41|53 42:58 43.6E 44.01 45.11 46.4E 47.53 48:58
यहां मैं कमांड कोड का उपयोग करता हूं, क्योंकि पीएमके निर्माता द्वारा प्रस्तावित उनके पदनाम लिस्टिंग के लिए बहुत सुविधाजनक नहीं हैं। आदेशों को कोड के पत्राचार को टैबलेट पर देखा जा सकता है (कृपया मेरे द्वारा उन्हीं वर्षों में तैयार किए गए):
कमांड सिस्टम में एक संक्षिप्त भ्रमणकुछ अभ्यास के साथ, कमांड कोड को याद रखना आसान था (जो कि आवश्यक था, क्योंकि प्रवेश किए गए कार्यक्रमों की जाँच करनी थी)। सबसे अधिक इस्तेमाल किया गया:
- अंकगणितीय कमांड (10-13) जो ऑपरेशनल स्टैक (X, Y) के दो निचले रजिस्टरों के साथ संबंधित क्रिया करते हैं और परिणाम को X में डालते हैं
- स्मृति रजिस्टरों से लिखने और पढ़ने के लिए कमांड (क्रमशः 40-4E और 60-6E)
- कमांड्स जो प्रोग्राम के निष्पादन (50-5E) को नियंत्रित करते हैं, जिसके बीच स्टॉप कमांड (50), साथ ही सबप्रोग्राम (53) को कॉल करने और इसे (52) से लौटने की आज्ञा दी जानी चाहिए।
- अप्रत्यक्ष संबोधन कमांड (B0-BE, D0-DE) बहुत उपयोगी थे, जिससे आप मेमोरी रजिस्टर एक्सेस कर सकते हैं, जिसकी संख्या दूसरे रजिस्टर पर लिखी गई थी
हालाँकि हेक्साडेसिमल अंकों का उपयोग कमांड कोड में किया जाता था, लेकिन स्क्रीन पर उनके प्रदर्शन से फिल्म "प्रीडेटर" मेमोरी में से छवियों को हटा दिया गया:

सुविधा के लिए, मैंने कोड में ट्रांज़िशन कमांड्स का पता (कमांड के पते के बाद एक कोलन), साथ ही प्रवेश बिंदु (ऊर्ध्वाधर बार) पर प्रकाश डाला। यह आपको अधिक स्पष्ट रूप से सबप्रोग्राम्स (22 के पते पर स्थित सबप्रोग्राम कॉल कमांड) और "बहुरूपता" का एक प्रकार प्रदान करने के संबंध को देखने की अनुमति देता है, विशेष रूप से दिलचस्प है। इस उपप्रोग्राम को एक्सेस करते समय, नियंत्रण को विभिन्न स्थानों पर स्थानांतरित किया गया था, जिसके आधार पर ब्लॉक लोड किया गया था)।
आप देख सकते हैं कि उपप्रोग्राम के मध्य (और शुरुआत तक नहीं) के संक्रमण कुछ असाधारण नहीं थे। संबोधित स्मृति के बेहद सीमित आकार के कारण, हर चीज पर शाब्दिक रूप से सहेजना आवश्यक था। एक और संक्रमण के पते पर संक्रमण (इस मामले में एक कमांड कोड के रूप में इलाज) को विशेष रूप से ठाठ माना जाता था।
चूंकि काम करने वाला कैलकुलेटर अब हाथ में नहीं है, मैंने
एमुलेटर का उपयोग किया:

सभी तैयार छवियों को
GitHub में अपलोड किया गया
था ।
पहली
छवि का उपयोग "जहाजों" को व्यवस्थित करने के लिए किया जा सकता है:

छद्म यादृच्छिक संख्या जनरेटर (0.1234567) के लिए प्रारंभिक मूल्य को बदला जा सकता है। निष्पादन के लिए शुरू करने के बाद (I / O s / p), कार्यक्रम लंबे समय तक चलता है, अंततः ROM से गेम मॉड्यूल को लोड करने के लिए पता प्रदर्शित करता है (प्रोग्राम से स्वचालित रूप से ROM तक पहुंचने की कोई संभावना नहीं थी):

चूंकि एमुलेटर (कम से कम संस्करण जो मैंने उपयोग किया था) ने EPROM तक पहुंचने के मेरे प्रयासों को पूरी तरह से नजरअंदाज कर दिया, मैंने अपने हाथों से संचालित गेम मॉड्यूल और जहाजों की व्यवस्था के साथ एक
छवि तैयार की।
यह व्यवस्था 7 वीं से डी। तक स्मृति रजिस्टर में संग्रहीत है। दूसरी पंक्ति (8 वें रजिस्टर) का एक उदाहरण है:

Deuces "जहाजों" की स्थिति सांकेतिक शब्दों में बदलना। उपरोक्त प्रारंभिक मूल्य के आधार पर, निम्नलिखित व्यवस्था उत्पन्न की गई थी:
0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
आप देख सकते हैं कि कार्यक्रम ने 7x7 वर्ग क्षेत्र पर नौ गैर-सन्निहित "एकल-डेक जहाजों" को रखा।
खेल शुरू करने के लिए, आपको जहाजों की संख्या (9 इन / एस / एन) दर्ज करने की आवश्यकता है, फिर "शॉट्स" के निर्देशांक दर्ज करें (उदाहरण के लिए 2 वी ^ 2 एस / एन)। चूंकि हमने "जहाजों" के स्थान की जासूसी की थी, इसलिए हमारे लिए "एक डेक" को डूबाना मुश्किल नहीं था।

हालाँकि, दूसरी बार आप वहाँ नहीं पहुँच सकते:

चलो कोशिश करते हैं (2 बी ^ 2 एस / एन)। जैसी कि उम्मीद थी, कैलकुलेटर वापस आ गया:

यहां पहला अंक ऊर्ध्वाधर समन्वय है (नीचे से ऊपर की ओर शुरू होता है), दूसरा क्षैतिज (बाएं से दाएं) है।
थोड़ी देर बाद, मैंने देखा कि सिर्फ कुछ कमांड्स को बदलना (प्रोग्राम टेक्स्ट के साथ पहले फोटो में, उन्हें लाल रंग में चिह्नित किया गया है), यह सुनिश्चित करना संभव है कि जो जहाज रखे जा रहे हैं वे संपर्क में हो सकते हैं, लेकिन कोनों के साथ नहीं बल्कि पक्षों के साथ (चित्र 3 और
0004 )। परिणाम "मल्टी-डेकर्स" की निम्न व्यवस्था थी:
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0
भगवान जानता है कि क्या बुरा है, लेकिन यह देखते हुए कि केवल दो टीमों को बदलना पड़ा।
अलग-अलग, यह बग के बारे में कहा जाना चाहिए (कीड़े के बारे में और भी अधिक संभावना), हालांकि यह एक अलग लेख के लिए एक विषय है, यदि उनका चक्र नहीं। तथ्य यह है कि वर्णित श्रृंखला के कैलकुलेटर वास्तव में त्रुटियों और अनिर्दिष्ट व्यवहार के विभिन्न उदाहरणों के साथ crammed थे। शौकीनों के बीच, इसने इन
अनिर्दिष्ट अवसरों की खोज की संस्कृति का विकास किया, जिसे सामूहिक रूप से
YSGOG-ology के रूप में जाना जाता है।
ऐसे कीड़े के कुछ उदाहरण मजाकिया हैं, अन्य खतरनाक हैं, और उनमें से कुछ आश्चर्यजनक रूप से उपयोगी हैं। इस संभावित उपयोगी व्यवहार का एक अच्छा उदाहरण मेमोरी रजिस्टर में लिखने के बाद "ऑर्डर एंट्री" (VI) कमांड का निष्पादन है। कार्यक्रम निष्पादन मोड में, इसने एक्स रजिस्टर (सूचक पर प्रदर्शित) में संख्या के पहले अंक के "कटिंग" को प्रेरित किया, और चरण-दर-चरण निष्पादन के साथ (हाँ, हाँ, यह ऐसा था), टीम ने सामान्य रूप से काम किया। किसी अन्य समझदार तरीके से इस तरह के परिणाम को प्राप्त करना असंभव था।
वीपी कमांड के इस तरह के गैर-मानक व्यवहार से भयभीत होकर, मैंने कमांड के अनुक्रम को बदलकर कार्यक्रम में सुधार किया। 35. वीपी 36.1 से 35. आईपी 2 36.x (मुझे 2 रजिस्टर में लगातार 10 स्टोर करना पड़ा)। चूंकि कोई लाइव कैलकुलेटर नहीं है, इसलिए मैं अब यह जांच नहीं कर सकता कि क्या VI आदेश इस संदर्भ में त्रुटि का कारण बना। एमुलेटर के तहत, दोनों विकल्प सामान्य रूप से काम करते हैं।
दुर्भाग्य से, मुझे पता नहीं है कि एमुलेटर के क्रियान्वयन से अनजाने व्यवहार के सभी उदाहरण हैं।
इस सब के बाद, मिक्रोशी, बीके-शकी और स्पेक्ट्रम थे। एक
EU-1046 था जिसका मैंने संस्थान में सामना किया। पीडीपी-शकी और वैक्स-एस थे। आईबीएम पीसी के आगमन से पहले, इंतजार कम था।