बैश पर एम्यूलेटर i8080

आज वे xonix लिखते हैं, और कल वे टॉवर पर एक अलग ऑपरेटिंग सिस्टम एक फ्रेमवर्क और एक DBMS के साथ लिखेंगे।

अंत में, कल आ गया है। बैश में (कुछ डोपिलिवानिया के बाद) आप एक गंभीर ओएस चला सकते हैं, उदाहरण के लिए, सीपी / एम। और CP / M के लिए निश्चित रूप से DBMS, कंपाइलर और बहुत कुछ हैं।



क्यों यह आवश्यक नहीं है और क्यों बैश पर एमुलेटर बनाना आवश्यक है, बैश पर एक काम करने वाला एम्यूलेटर i8080 और बैश स्क्रिप्ट के काम को गति देने के कुछ टिप्स -

आपको बैश में एमुलेटर बनाने की आवश्यकता क्यों नहीं है


बैश धीरे-धीरे काम करता है। यहां तक ​​कि i8080 के रूप में इस तरह के एक साधारण प्रोसेसर के लिए, यह संभावना नहीं है कि अनुकरण की गति वास्तविक एक का कम से कम 1% होगी। 2.2 गीगाहर्ट्ज़ की आवृत्ति के साथ मेरे सेलेरॉन पर, एमुलेटर लगभग 100 संचालन प्रति सेकंड की गति से चलता है, जबकि 2.5 मेगाहर्ट्ज पर वास्तविक i8080 प्रोसेसर 600 हजार संचालन प्रति सेकंड की प्रक्रिया करता है।

एक और महत्वपूर्ण मुद्दा: बैश में बाइनरी डेटा के साथ काम करना संभव नहीं है। यदि आप पोर्ट पर आउटपुट करना चाहते हैं या फ़ाइल से एक वर्ण को कोड 0x01 के साथ पढ़ना चाहते हैं, तो स्पष्ट रूप से आपको आवश्यक भाषा नहीं है।

तीसरी समस्या। एमुलेटर विकास एक या दो घंटे का काम नहीं है। आपको सिंटैक्स हाइलाइटिंग और डीबगर के बिना संपादक के बिना एक एमुलेटर नहीं लिखना चाहिए। जब मैंने अपने एमुलेटर को "बनाना" शुरू किया, तो मैंने सोचा: "आह, आपको केवल 84 टीमों को करने की ज़रूरत है! क्या बकवास है! ” जब मैं 51 वें ऑपरेशन कोड पर पहुंच गया, तो मुझे अंततः एहसास हुआ कि कमांड! = ऑपरेशन कोड, और यह कि 200 अन्य कोड लागू करने थे। अगर मैंने तुरंत ध्यान दिया कि ऑपरेशन कोड दो सौ थे, तो मैं एक एमुलेटर नहीं लिखूंगा। और जब से मैंने लिखना शुरू किया, मुझे इसे खत्म करना पड़ा।

एमुलेटर क्यों काटते हैं


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

बैश कोड को तेज करने के लिए टिप्स


एमुलेटर के लिए कोड निष्पादन की गति महत्वपूर्ण है। यदि आप चाहते हैं कि आपकी बैश स्क्रिप्ट जितनी तेज़ी से चले, तो:

एक पाश में expr या bc कॉल करना आपके प्रोग्राम को कई बार धीमा कर सकता है।
$ time ( for ((i = 0; i < 100000; ++i)); do echo `expr 1 + 2` ; done ) real 0m17.000s user 0m13.261s sys 0m8.061s $ time ( for ((i = 0; i < 100000; ++i)); do echo "$(( 1 + 2 ))" ; done ) real 0m3.980s user 0m2.371s sys 0m0.237s 


रीडायरे कमांड के साथ एक सरणी में फाइल पढ़ना कभी-कभी लूप में रीड कमांड (फाइल की लंबाई के आधार पर) की तुलना में बहुत बड़ा लाभ देता है, और निश्चित रूप से बहुत प्रेटियर दिखता है।
 $ time ( for ((i = 0; i < 10; ++i)); do while read line ; do rom[${tmpcnt}]=$line ; (( ++tmpcnt )) ; done < bas.e80 ; done ) real 0m6.888s user 0m5.516s sys 0m0.336s $ time ( for ((i = 0; i < 10; ++i)); do readarray -t rom < bas.e80 ; done ) real 0m0.146s user 0m0.048s sys 0m0.004s 


इंक्रीमेंट कमांड अतिरिक्त कमांड से तेज है।
 $ time ( for ((i = 0; i < 100000; ++i)); do a=$(( a + 1 )) ; done ) real 0m4.489s user 0m3.692s sys 0m0.108s $ time ( for ((i = 0; i < 100000; ++i)); do (( ++a )) ; done ) real 0m4.053s user 0m3.296s sys 0m0.140s 


हेक्साडेसिमल संख्या प्रणाली से दशमलव में संख्याओं का अनुवाद करने के लिए, मैंने अपने फ़ंक्शन का उपयोग किया:
 hex2dec () { uw=`expr index "0123456789ABCDEF" "${1:0:1}"` lw=`expr index "0123456789ABCDEF" "${1:1:1}"` res=$(( ( ${uw} - 1 ) * 16 + ${lw} - 1 )) } 

यह देखते हुए कि मैंने expr के बारे में क्या कहा, आप अनुमान लगा सकते हैं: यह फ़ंक्शन बहुत जल्दी काम नहीं करता था। अच्छे mkot ने मुझे संख्याओं को एक संख्या प्रणाली से दूसरे में बदलने के लिए एक सरल तरीका सुझाया:
 hex2dec () { define -i res res="16#$1" } 

यह सिर्फ एक प्रतिस्थापन के लिए धन्यवाद, अनुकरण की गति तीन गुना हो गई है। इसलिए, उन्नत बैश-स्क्रिप्टिंग गाइड को ध्यान से पढ़ें, और ब्रेक बाइक का आविष्कार न करें।

अंतिम टिप। जहां संभव हो, $ संकेतों का उपयोग न करने का प्रयास करें, क्योंकि अमेरिकी डॉलर नि: शुल्क शेल को नकारात्मक रूप से प्रभावित करते हैं:
 $ time ( for ((i = 0; i < 100000; ++i)); do a=$(( $a + 1 )) ; done ) real 0m5.155s user 0m4.828s sys 0m0.088s $ time ( for ((i = 0; i < 100000; ++i)); do a=$(( a + 1 )) ; done ) real 0m4.489s user 0m3.692s sys 0m0.108s 


एम्यूलेटर i8080


एमुलेटर को विकसित करने में लगभग 8 घंटे का समय लगा। यह शायद बग के बिना नहीं था (मैं विशेष रूप से तार्किक कार्यों के बारे में चिंतित हूं), लेकिन कुल मिलाकर यह काम करता है, और काफी सफलतापूर्वक। मैंने एमुलेटर में कुछ अनुकूलन युक्तियां लागू कीं, और कुछ ने इस उम्मीद के साथ नहीं किया कि अतिरिक्त संपादन एमुलेटर में कार्यक्रमों के निष्पादन को थोड़ा गति देंगे। दुर्भाग्य से, एमुलेटर पोर्ट और इंटरप्ट के साथ काम करने का समर्थन नहीं करता है, लेकिन इसमें रेडियो 86 के लिए मॉनिटर प्रोग्राम से फ़ंक्शन "स्क्रीन पर एक चरित्र प्रदर्शित करें" है।

दुर्भाग्य से, आज (1 जून, 2017) के लिए एमुलेटर का स्रोत कोड खो गया है।

निम्नानुसार चलाएं:
 $ ./emu.sh program.e80 


रजिस्टर और झंडे की सामग्री प्रदर्शित की जाएगी।

कार्यक्रम हेक्साडेसिमल, प्रति पंक्ति एक बाइट में लिखे जाने चाहिए।
एक प्रोग्राम का एक उदाहरण जो खाली लूप को 256 बार निष्पादित करता है:
 3D C2 00 00 76 


मशीन कोड में प्रोग्रामिंग के प्रशंसकों को निश्चित रूप से आभासी कंप्यूटर संग्रहालय से एक संक्षिप्त गाइड द्वारा मदद मिलेगी।

अरे हाँ, CP / M के बारे में। इसे चलाएं, ज़ाहिर है, आप कर सकते हैं। लेकिन OS को लोड करना और स्क्रीन पर निमंत्रण प्रिंट करना कई मिनट लग सकते हैं।

आज के लिए बस इतना ही। सभी को हैकिंग की शुभकामनाएं।

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


All Articles