ZX- स्पेक्ट्रम के लिए 1k परिचय अराजकता बनाना


प्रारंभ में, मैंने कैओस कंस्ट्रक्शंस 2018 में एक डेमो बनाने की योजना नहीं बनाई थी, हालांकि, सीसी से 2-3 सप्ताह पहले मुझे एहसास हुआ कि मैं एक डेमो पार्टी को खाली हाथ नहीं जा सकता था, और 386 / ईजीए / डॉस के लिए एक लघु डेमो लिखने का फैसला किया।

डॉस के तहत टर्बो-सी में संकलित होने के बाद मेरा काम एक और गॉर्गीफिक्सलिफ्ट , जो आदर्श रूप से ईजीए मोड के बीट प्लान संरचना में फिट होता है, मैं ब्रेक से निराश था, खासकर ईजीए ब्रेक। जिस रूप में मैं उसे देखना चाहूंगा, इस बहुत सीमित अवधि के लिए, डेमो करना असंभव था।

हालांकि, मैं हार नहीं मान सकता था और कुछ भी नहीं कर सकता था। और फिर मुझे याद आया कि मैं लंबे समय से ज़ेडएक्स-स्पेक्ट्रम डेमो प्रतियोगिता में भाग लेना चाहता था। और चूंकि मुझे पिछले वर्ष में दो 48k रियल मिले, इसलिए मुझे डेमो बनाने से कुछ खुशी मिल सकती है। वैसे - मेरे लिए, डेमो लिखने में सबसे महत्वपूर्ण बात वास्तविक जीवन में परीक्षण है, पायसीकारी प्रक्रिया से ऐसा आनंद नहीं देते हैं, यह एक बहुत ही अद्भुत भावना है, जब कोड में अगले परिवर्तन के बाद, आप वास्तविक जीवन में डेमो अपलोड करते हैं, और आप देखते हैं कि वास्तविक हार्डवेयर बाइट्स को कैसे फेरबदल करता है। मेमोरी ड्राइंग प्रभाव।

चूँकि मेरे पास केवल ४k k रियल हैं, इसलिए मैंने ४। K के लिए एक डेमो बनाने का निर्णय लिया। और सीमित समय और किसी भी घटनाक्रम की कमी के कारण, चुनाव 1k इंट्रो (केवल 1 किलोबाइट का डेमो, या 1024 बाइट्स) के निर्माण पर गिर गया।

पिछली बार मैंने एमुजिन में z80 asm पोक किया था - बिल्ट-इन असेंबलर के साथ एक महान एमुलेटर। लेकिन दुर्भाग्य से EmuZWin विंडोज एक्सपी से अधिक कुछ भी काम नहीं करता है, या यह छोटी गाड़ी है।
विभिन्न विकल्पों पर विचार करने के बाद, मैं अवास्तविक + sjAsm + नोटपैड ++ कार्यक्रमों के एक समूह में रुक गया, जो, मेरी राय में, सुविधा में एमुज्विन की तुलना में खोना बहुत आसान है , लेकिन वे इसके विपरीत जीवित हैं।

इस परिचय को लिखते समय, मैंने स्रोत में, एक विकास लॉग, जिस पर निम्न पाठ लिखा था, का संचालन किया:

नमस्ते विश्व!

Z80 asm में लगभग शून्य अनुभव होने पर, मुझे पहले क्या लिखना चाहिए? यह सही है, 5x5 स्प्राइट का उत्पादन परिचित है या 40x40 पिक्सल, प्रभाव में से एक के लिए (विडंबना यह है कि भविष्य में, 1k में फिट होने के लिए इस अधूरे हिस्से को इंट्रो से बाहर निकाल दिया गया था)।

आश्चर्यजनक रूप से, डाउन एचएल का उपयोग करके पूर्व-निर्मित लाइन एड्रेस लेबल का उपयोग करके स्क्रैच से ऐसा करना बहुत आसान था।

ओह, इंडेक्स रजिस्टर, वे कितने सुविधाजनक हैं, लेकिन जो धीमी हैं, शाब्दिक रूप से सलाखों का उपभोग करते हैं। मुझे उनका उपयोग स्थानों के एक समूह से बाहर फेंकना पड़ा।

अभी भी यहाँ, बहुत शुरुआत में, मैं अविश्वसनीय sjAsm glitches, या इसके नवीनतम संस्करण के पार आया था। अवास्तविकता में अव्यवस्था ने आदेशों का एक बिल्कुल पागल क्रम दिखाया। मैंने पारंगत संस्करण डाउनलोड किया - यह किसी भी तरह इसके साथ रहना पहले से ही संभव था।



यह स्पष्ट है कि आप पहले से तैयार किए गए स्प्राइट की पर्याप्त संख्या 1k में नहीं डाल सकते हैं, इसलिए मैंने उन्हें गतिशील रूप से उत्पन्न करने का निर्णय लिया। और किसी भी तरह से नहीं, लेकिन बहुभुज का उपयोग करना।

इसलिए, मैंने जो दूसरी प्रक्रिया लिखी, वह त्रिकोण बनाने की प्रक्रिया थी। अधिकांश भाग के लिए, यह सी में लिखे गए अपने स्वयं के कोड का एक पोर्टिंग था सी संस्करण से एकमात्र वैश्विक अंतर के साथ , बहुभुज स्कैनलाइन पहले उत्पन्न होती हैं, और उसके बाद ही वे इन स्कैनलाइनों पर खींची जाती हैं।

उच्च-स्तरीय भाषाओं के बाद, आपको jr उर्फ ​​गोटो से कुछ खुशी मिलती है:

.sort_me_please: ld de,(tr_x2) ld bc,(tr_x0) ld a,d cp b jr nc,.skip1 ld (tr_x2),bc ld (tr_x0),de .skip1: ld de,(tr_x1) ld bc,(tr_x0) ld a,d cp b jr nc,.skip2 ld (tr_x0),de ld (tr_x1),bc jr .sort_me_please .skip2: ld de,(tr_x2) ld bc,(tr_x1) ld a,d cp b jr nc,.skip3 ld (tr_x2),bc ld (tr_x1),de jr .sort_me_please .skip3: 

मैं इस तथ्य से थोड़ा चौंक गया था कि यह एक उचित समय पर z80 asm पर एक कार्य ड्रा_ट्रींगल लिखने के लिए निकला , जो पिक्सेल द्वारा एक बहुभुज पिक्सेल खींचता है और पॉलीगोन को जोड़ने पर छेद के बिना।


हैलो त्रिकोण!

कणों



एक स्क्रीन लाइन लेबल जनरेटर की उपस्थिति के कारण, मैंने इस लेबल का उपयोग करते हुए एक घुमावदार और धीमी बिंदु आउटपुट प्रक्रिया लिखी। प्रक्रिया के दो प्रवेश बिंदु हैं - बस पिक्सेल का उलटा, और पिक्सेल का व्युत्क्रम इसे INK + BRIGHT + के साथ भरने और एक रजिस्टरों में निर्दिष्ट रंग के साथ।

कणों के साथ एक प्रभाव बनाने के चरण में, मैंने पाया कि विकी sjAsm में उदाहरणों से संरचनाओं के साथ उदाहरण सिर्फ काम नहीं करता है। Googling ने साइट zx-pk.ru से एक विषय लाया, जहां इस समस्या का वर्णन किया गया है, और इसका कोई हल नहीं है - हा, ठीक है - एक और गड़बड़।

मैंने सब कुछ स्पष्ट रूप से करने का फैसला किया - निर्देशांक को अद्यतन करने की परवाह किए बिना, बिना रुकावट के। हाँ ... एक बाधा तालिका उत्पन्न करने के लिए प्लस बाइट्स।

इस स्तर पर कुछ कण थे, और वे फ्रेम में मुश्किल से फिट होते हैं - यह% बिंदु के आउटपुट के लिए मेरी प्रक्रिया की सुस्ती के बारे में है)) लेकिन स्प्राइट के साथ एक सामान्य तालिका का उपयोग करने से मुझे इसे फेंकने और तैयार होने में मदद नहीं मिली, क्योंकि यह केवल एक टेबल जनरेटर की आवश्यकता पर बहुत बचाया स्थान। और साइकिल के लिए मेरा प्यार भी :)

बहुत कम कण ... उनकी संख्या में वृद्धि हुई है, लेकिन अब प्रतिपादन दो फ्रेमों के लिए फीका हो गया है।


पीटर्स WS64 पर परीक्षण, जो मुझे पिछले cc पर मिला और इस सर्दी की मरम्मत की :)

वैसे, पहले से ही इस स्तर पर अंक कमोडोर 64 पर बोल्ड क्षैतिज बिंदु 2: 1 में बदल गए। यह शुरू में कणों की कम संख्या, और इस तथ्य से मेरे असंतोष के कारण हुआ कि वे वास्तविक जीवन में चलने के दौरान काफी अदृश्य थे। प्लेट को बदलकर समस्या का समाधान किया

 db 128,64,32,16,8,4,2,1; 

पर

 db 192,192,96,24,12,6,3,3; 

जिसने स्थिति की सटीकता को खराब कर दिया और उड़ान को थोड़ा झटका दिया, लेकिन दृश्यता में वृद्धि हुई। यहाँ, यह भी हाथ में खेला जाता है कि कण ऊपर से नीचे गिरते हैं - उनकी दृष्टि खड़ी रूप से धँसी।

पार्टिकल्स गलती से प्रत्येक को अपनी यादृच्छिक गति से गिरते हैं, और वाई निर्देशांक को स्टोर करने के लिए दो बाइट्स का उपयोग किया जाता है।

स्प्राइट

मैंने स्प्राइट भाग के अधूरे टुकड़े को बाहर फेंक दिया, यह महसूस करते हुए कि मैं इसके साथ 1k में फिट नहीं हो सकता।

इसके अलावा, पहले से ही जगह की कमी थी, इसलिए मुझे पैकर्स के बारे में इंट्रोस्पेक के अद्भुत लेख के बारे में याद आया, मैंने zx7 को एक पैकर के रूप में चुना, जिसने लगभग 110 बाइट्स बचाए। वैसे, शायद कोई 1k परिचय के लिए अधिक उपयुक्त पैकर जानता है?

अराजकता का निर्माण



चूँकि मेरे पास पहले से ही एक बहुभुज के उत्पादन की एक प्रक्रिया थी, इसलिए ऐसा प्रतीत होता था कि सीसी लोगो को बहुभुज में विभाजित करके उन्हें एक-एक करके प्रदर्शित किया जाना चाहिए।

मैंने कुछ परीक्षण कोड लिखे जो कई बहुभुजों को प्रदर्शित करता है - जैसा मैंने इरादा किया था - सब कुछ काम किया।

यह जांचने के लिए कि मेरा विचार 1k में फिट बैठता है या नहीं, एक निश्चित संख्या में यादृच्छिक बहुभुज उत्पन्न करता है, अनुमान के अनुसार, लोगो के लिए एक पर्याप्त संख्या है, और इसे स्रोत पर भेज दिया है। संकलित, और सुनिश्चित किया कि - उत्कृष्ट - परिचय, इस रूप में, 1024 बाइट्स की सीमा में फिट बैठता है।


जीवन फोटो, क्या आप टेबल पर डिवाइस को पहचानते हैं? :)))

मैंने एक बार फिर से अर्ध-समाप्त इंट्रो का परीक्षण करने का फैसला किया, पहले से ही पॉलीगन्स के साथ, और एक पैकर, वास्तविक पर अपलोड किया गया और ... रीसेट हो गया। सबसे पहले, मैंने पाप करना शुरू कर दिया कि मैं कहीं न कहीं स्मृति को इनिशियलाइज़ करना भूल गया, जहाँ से, सब कुछ 0x00 एमुलेटर पर ठीक काम करता है, वास्तविक जीवन में एक रीसेट पैदा करने वाला कचरा है।

हाफ़ डिवीज़न विधि और डि-हाल्ट की तुलना में समस्या की जगह पाने के लिए कुछ भी बेहतर नहीं है।

दो घंटे के लिए वास्तविक पर रीसेट के साथ किया गया, वहाँ कोई रास्ता नहीं था गड़बड़ को स्थानीय बनाने के लिए ...
जैसा कि यह निकला, यह मेरे कोड में नहीं था, यह उस फोन पर शामिल ध्वनि बढ़ाने वाला था जिसमें से मैंने WAV लोड किया था। WAV फ़ाइल में एक बिट स्ट्रीम से एक इम्प्रूवर ने प्रलाप की एक धारा उत्पन्न की।

जैसे ही मैंने इसे बंद किया सब कुछ जादुई तरीके से काम किया।

उन्होंने त्रुटियों वाले ग्रीनपीक्सल ग्राफिक्स संपादक में लोगो को रेखांकित किया, इसे त्रिकोण के एक समूह में तोड़ दिया, और मैन्युअल रूप से निर्देशांक को स्रोत तक पहुंचा दिया। पूरी तरह से कैओस कंस्ट्रक्शंस लोगो को भरकर और वास्तविक जीवन में इसे चलाने के बाद - मुझे खुशी हुई - यह बहुत अच्छा लग रहा था।


वास्तविक पर पहला लोगो डिस्प्ले

हालांकि, मैंने यादृच्छिक बहुभुजों को बहुत कम भर दिया था, और वास्तविक लोगो पर, प्रति 150 बाइट्स में 1k की सीमा थी। और यह इस तथ्य के बावजूद कि कण प्रभाव अभी भी पूरा नहीं हुआ था, और भागों के बीच संक्रमण तेज था।

उस दिन बिस्तर पर जाने के लिए, ग्लिट्स के साथ उपद्रव के कारण, यह सुबह 8 बजे से 8 बजे तक निकला।

और हां, मैंने निर्देशांक और शीर्ष सूचकांक को अलग-अलग संग्रहीत करके आकार को अनुकूलित करने का प्रयास किया, लेकिन पैकर को यह अधिक पसंद नहीं आया, जिससे आकार में केवल वृद्धि हुई।

अन्त



मैं लोगो के उत्पादन में विविधता लाने के लिए आया, इसके लिए इसने दो और पिक्सेल लेबल के अलावा कुछ नहीं लिया:

 fake_points1: db 1,2,4,8,16,32,64,128; 1 ch fake_points2: db 32,8,128,2,16,1,64,4; 2 ch normal_points: db 128,64,32,16,8,4,2,1; 3 ch 

इसने लोगो को विस्तार देने के विस्तार, या विस्तार की प्रारंभिक कमी और तेज में धीरे-धीरे वृद्धि का एक शांत प्रभाव दिया।

और अंत में, मैंने सभी बदलावों के साथ अंतिम संस्करण बनाया, सब कुछ का एक गुच्छा बाहर फेंक दिया। इस प्रक्रिया में, मुझे एक त्रिकोण खींचने की प्रक्रिया में एक गड़बड़ दिखाई दी - यदि दो कोने में एक ही वाई निर्देशांक है, तो त्रिकोण कुटिल रूप से खींचा गया है (यह डीएक्स की गणना करते समय 0 से विभाजित होने जैसा दिखता है), एक अस्थायी हैक के साथ बायपास किया गया।


लेनिनग्राद 48 पर अंतिम संस्करण का परीक्षण

आकार अनुकूलन


दोहरे अंक "अतिरिक्त बाइट" हैं

94 अतिरिक्त बाइट्स ...

समय आ गया है कि इनपुट / आउटपुट प्रक्रियाओं के रजिस्टरों के "सांस्कृतिक" संरक्षण / बहाली को दूर किया जाए, जहां तक ​​यह आवश्यक है, लेकिन स्मृति खा रही है।

86 बाइट्स ...

वास्तविक जीवन में परीक्षण किया गया - यह काम करता है! उन्होंने थोड़ी और मेमोरी को हरा दिया, साथ ही 0 - 63 बाइट्स से विभाजित बग को ठीक किया!

57 बाइट्स ...

जोड़ा गया पाशन।

 random_store: start: 

जिस तरह से अनपैकिंग स्तर पर किया जाता है उसी तरह से लूपिंग किया जाता है आरएनजी के लिए एन्ट्रापी के स्रोत के रूप में, आरंभीकरण कोड से कई बाइट्स (अंतरिक्ष को बचाने के लिए) का उपयोग किया गया था, जिसे आरएनजी पहले भाग के दौरान खराब कर दिया था। इसलिए, लूपिंग के लिए, इंट्रो के अंत के बाद, रिट , वेल, और फिर अनपैकिंग कोड में एक और अनपैकिंग और संक्रमण होता है ...

पिछले 48 बाइट्स से छुटकारा पाना संभव नहीं था, मुझे बाधा हैंडलर को काटना पड़ा, लेकिन हुर्रे! भरवां! यहां तक ​​कि 1 अतिरिक्त बाइट भी बनी रही।

और चूंकि कोई रुकावट नहीं है, इसलिए इसे फ्रेम के लिए स्कोर किया जा सकता है, और पहले प्रभाव में एक पिक्सेल पर बीम क्रॉस सेक्शन को देखना मुश्किल है, इसलिए मैंने गति और मनोरंजन के बीच समझौता के साथ, प्रति आंख के कणों की संख्या में वृद्धि की।

बहुत कठिन, मूर्खतापूर्ण मूविंग कोड और डेटा को एक स्थान से दूसरे स्थान तक पहुंचाने के लिए, पैकर की मदद करता है। जिसमें कुछ समय लगा :)

इसने लगभग 10 बाइट्स को मुक्त कर दिया, जिसमें मैंने ध्वनि की एक पैरोडी को अटका दिया। खाक, खे, ध्वनि - यह कुछ स्थानों पर है, कान द्वारा डाला गया है:

  ifdef UseSound ld a,d and #10 out (#FE),a endif 

मैंने ध्वनि को "नेल" नहीं किया, लेकिन एक निश्चित रूप से बनाया, जिससे ध्वनि के साथ और बिना परिचय के दो संस्करण प्राप्त हुए। ध्वनि के बिना, "अतिरिक्त" बाइट्स में crammed

 db 'e','r','r','o','r' 

मैंने trd और tap एकत्र किया, और इसे सभी cc वेबसाइट पर अपलोड कर दिया।

हुर्रे - मैं डेमोपाति में भाग ले रहा हूं!

अंतभाषण

यह ध्वनि के साथ मजाकिया निकला, किसी ने गश्त पर "स्पष्ट ध्वनि" कहा, किसी ने मुझे अजीब तरह से देखा, और पॉयट पर मैंने निम्नलिखित पाया:



और यह:



सामान्य तौर पर, मुझे समझ नहीं आया कि किसी को 10-बाइट की आवाज़ पसंद है या नहीं :)

और आखिरी - यह शर्म की बात है कि इस वर्ष 1k प्रतियोगिता नहीं हुई, यह काम मेरे विचार से सभ्य निकला , लेकिन 640k के साथ प्रतिस्पर्धा करना मुश्किल है, लेकिन मैं वास्तव में प्रतिस्पर्धा करना चाहता था।

डेमो लिखें, 1k लिखें!

और यहाँ समाप्त हो गया है (पीएस, अपने कानों की देखभाल करें):



मौन संस्करण:

Source: https://habr.com/ru/post/hi421837/


All Articles