हम उपसर्ग P2 के एमुलेटर, या CHIP16 के बारे में थोड़ा लिखते हैं

अपने पिछले छोटे लेख में, मैंने 70 के दशक से पुराने CHIP-8 गेमिंग प्लेटफॉर्म के एमुलेटर के सिद्धांत का वर्णन किया। यहां हम एक तरह के उत्तराधिकार के बारे में बात करेंगे - CHIP16। तो क्या वास्तव में CHIP16 है?

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


प्रागितिहास


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

उपसर्ग में 16-बिट प्रोसेसर, मेमोरी, दो इनपुट डिवाइस (जॉयस्टिक जैसे डेंडी), एक ध्वनि और वीडियो सबसिस्टम है। इस पूरे गुच्छा पर अधिक विस्तार से विचार करें।

प्रोसेसर

प्रोसेसर में शामिल हैं:

प्रत्येक ओपकोड (प्रोसेसर कमांड) का निष्पादन ठीक एक चक्र लेता है, प्रोसेसर 1 मेगाहर्ट्ज की आवृत्ति पर चलता है। यहां मैं एक आरक्षण करूंगा कि वास्तव में, जब तक कि आवृत्ति अंत तक स्पष्ट नहीं होती है, और प्रत्येक एमुलेटर पर 1 मेगाहर्ट्ज से अधिक तेजी से कमांड निष्पादित करता है। कभी-कभी अधिकतम उत्सर्जन गति के साथ। सामान्य तौर पर, जबकि आप इस बारे में परेशान नहीं कर सकते।

स्मृति

केवल 64Kb (65536 बाइट्स)। स्मृति निम्नानुसार आवंटित की गई है:
0x0000 - बाइनरी डेटा की शुरुआत
0xFDF0 - स्टैक की शुरुआत (512 बाइट्स)।
0xFFF0 - I / O पोर्ट (I / O, जॉयस्टिक की स्थिति पर नज़र रखने के लिए)।

वीडियो

स्क्रीन रेजल्यूशन 320x240 पिक्सल है। एक ही समय में प्रदर्शित रंगों की संख्या मानक पैलेट से 16 है।
पैलेट में सूचकांकहेक्स। अर्थरंग
0x00x000000एक पृष्ठभूमि परत पर काले पारदर्शी
0x10x000000काला
0x20x888888धूसर
0x30xBF3932लाल
0x40xDE7AAEगुलाबी
0x50x4C3D21गहरा भूरा
0x60x905F25भूरा
0x70xE49452नारंगी
0x80xEAD979पीला
0x90x537A3Bग्रीन
0xA0xABD54Aहल्का हरा
0xB0x252E38नीली नीली
0xC0x00467Fनीला
0xD0x68ABCCहल्का नीला
0xE0xBCDEE4आसमानी नीला
0xF0xFFFFFFसफेद

अपना खुद का रंग पैलेट सेट करना संभव है। स्क्रीन रिफ्रेश रेट 60 फ्रेम प्रति सेकेंड है, जिसमें प्रत्येक फ्रेम में वल्बैंक आंतरिक ध्वज (हर ~ 16ms) सेट है। प्रोसेसर में वीबीएलएनके निर्देश का उपयोग करके फ्रेम रेंडरिंग के पूरा होने की प्रतीक्षा करने की क्षमता है। छवि स्प्राइट्स से बनाई गई है, वीडियो मेमोरी तक कोई सीधी पहुंच नहीं है। मुख्य परत के अलावा, जहां स्प्राइट्स खींचे जाते हैं, एक पृष्ठभूमि परत होती है जो 16 रंगों में से एक के साथ पूरे स्क्रीन को भरती है।

स्क्रीन को मिरर नहीं किया गया है, इसलिए भौतिक निर्देशांक में फिट नहीं होने वाली सब कुछ स्क्रीन के पीछे रहता है और प्रदर्शित नहीं होता है। यह निम्नानुसार है कि स्प्राइट में नकारात्मक निर्देशांक हो सकते हैं (या 320x200 से अधिक)। यदि आप 4x4 पिक्सेल स्प्राइट लेते हैं और, उदाहरण के लिए, इसे निर्देशांक (-2, -2) में खींचने के लिए एक कमांड देते हैं, तो स्क्रीन के ऊपरी बाएं कोने में 2x2 पिक्सेल स्प्राइट का एक भाग प्रदर्शित किया जाएगा।

इसलिए, जैसे कि पैलेट में 16 संभावित रंग हैं, स्क्रीन पर एक बिंदु को एन्कोड करने के लिए 4 बिट्स की आवश्यकता होती है। एक बाइट दो बिंदुओं का एक ब्लॉक है। न्यूनतम स्प्राइट में एक बाइट होता है - यह एक 2x1 स्प्राइट (दो अंक) होता है। आइए एक उदाहरण देखें कि 8x5 पिक्सेल स्प्राइट को कैसे एनकोड किया जाए, यह देखते हुए कि मानक पैलेट में सफेद रंग 0xFh सूचकांक के साथ रंग है, और सूचकांक 0x1h के साथ काला है

कुल 20 बाइट्स। वह (8 x 5) / 2 = 20 है

यदि नया स्प्राइट स्क्रीन पर किसी भी मौजूदा पिक्सेल को ओवरलैप करता है (शून्य रंग के साथ पिक्सेल के अपवाद के साथ - वे पारदर्शी हैं), तो कैरी फ़्लैग सेट किया गया है। इस प्रकार, गेम में स्क्रीन पर वस्तुओं के टकराव और टकराव को ट्रैक करना संभव है।
मानक एक के बजाय अपने स्वयं के रंग पैलेट को असाइन करने के लिए, एक विशेष PAL प्रोसेसर कमांड है। पैलेट के प्रत्येक रंग में आरजीबी प्रारूप में 3 बाइट्स होते हैं। चूंकि केवल 16 रंगों का उपयोग किया जाता है, PAL कमांड मेमोरी से 48 बाइट्स की एक सरणी को पढ़ता है और आरजीबी घटकों को 0x0, 0x1, .., 0xF के साथ रंगों को असाइन करता है। प्रोसेसर VBLNK कमांड प्राप्त करने के बाद पैलेट बदलता है।

ध्वनि

शुरुआती संस्करणों में, एक निश्चित संख्या में मिलीसेकंड के लिए केवल तीन निश्चित टोन (500 हर्ट्ज, 1000 हर्ट्ज, 1500 हर्ट्ज) खेलने की क्षमता थी, लेकिन तब एडीएसआर टाइप साउंड जनरेटर का उपयोग करने की क्षमता जोड़ी गई थी

इनपुट डिवाइस (जॉयस्टिक)

जॉयस्टिक से जानकारी तक पहुंच मेमोरी I / O पोर्ट के माध्यम से है। पहला जॉयस्टिक 0xFFF0 पर है, दूसरा 0xFFF2 पर है।
बिट [को ०] - ऊपर
बिट [1] - डाउन
बिट [२] - वाम
बिट [3] - सही
बिट [4] - चुनें
बिट [5] - प्रारंभ
बिट [6] - ए
बिट [7] - बी
बिट [8 - 15] - उपयोग नहीं किया गया, हमेशा शून्य।

इस प्रकार, 0xFFF0 पर मेमोरी से मूल्य को रजिस्टर में पढ़कर और संबंधित सेट बिट्स की जांच करके, आप ट्रैक कर सकते हैं कि कौन से बटन वर्तमान में पहले जॉयस्टिक पर दबाए गए हैं।

छवि फ़ाइल स्वरूप (ROM फ़ाइलें)

ROM फ़ाइल (मानक एक्सटेंशन .c16) में हेडर के तुरंत बाद हेडर और बाइनरी डेटा होता है। विनिर्देशन के संस्करण को निर्धारित करने के लिए हेडर से जानकारी का उपयोग किया जा सकता है, आदि हेडर में 16 बाइट्स का एक निरंतर आकार होता है। इसका प्रारूप:
विस्थापननियुक्ति
0x00जादू नंबर 'CH16'
0x04सुरक्षित
0x05विशिष्टता संस्करण (पहले 4 बिट्स = प्रमुख संस्करण, दूसरा 4 बिट्स = तोड़फोड़, यानी 0.7 = 0x07 और 1.0 = 0x10)
0x06ROM फ़ाइल का आकार (बाइट्स में शामिल नहीं, बाइट्स में)
0x0Aप्रारंभ पता (पीसी कमांड काउंटर वैल्यू)
0x0CCRC32 चेकसम (हेडर, बहुपद = 0x04c11db7 सहित) नहीं

बाइनरी डेटा तुरंत इसका अनुसरण करता है, जिसे हमेशा 0x0000 पते पर शुरू होने वाली मेमोरी में पढ़ा जाना चाहिए। कमांड काउंटर को हेडर में मूल्य के अनुसार सेट किया जाना चाहिए। आमतौर पर, यह 0x0000 है।

ROM फ़ाइलों में हेडर बिल्कुल नहीं हो सकता है, क्योंकि इसे हाल ही में विनिर्देशन में पेश किया गया था।

ध्वज पंजी

बिट [0]आरक्षित
बिट [1]c - कैरी फ्लैग (अहस्ताक्षरित ओवरफ्लो)
बिट [२]z - शून्य ध्वज
बिट [3]आरक्षित
बिट [४]आरक्षित
बिट [५]आरक्षित
बिट [6]ओ - अतिप्रवाह (हस्ताक्षरित संख्या का अतिप्रवाह)
बिट [7]एन - नकारात्मक (नकारात्मक संकेत ध्वज)


सशर्त कूद कमांड के लिए हालत प्रकार

शर्तों का उपयोग सशर्त कूद (कूद) निर्देशों या सशर्त कॉल सबरूटीन निर्देशों के लिए किया जाता है। उदाहरण के लिए: "jle लेबल" या "cno some_label2"। वर्ग कोष्ठक झंडे की स्थिति को इंगित करते हैं जब स्थिति को ट्रिगर किया जाता है।
जेड0x0[z == 1]समान (शून्य)
न्यूजीलैंड0x1[z == ०]बराबरी नहीं (गैर शून्य)
एन0x2[n == 1]नकारात्मक
एनएन0x3[n == 0]नकारात्मक नहीं (सकारात्मक या शून्य)
पी0x4[n == 0 && z == 0]सकारात्मक
हे0x5[ओ == १]बाढ़
नहीं0x6[ओ == ०]कोई अतिप्रवाह नहीं
एक0x7[c == 0 && z == 0]ऊपर (बिना लिखा हुआ ग्रेटर थान)
एई0x8[c == 0]समतुल्य से अधिक
बी0x9[c == 1]नीचे (बिना थके कम)
BE0xA[c == 1 || z == 1]बराबरी से नीचे (बिना थके कम या बराबर)
जी0xB[o == n && z == 0]ग्रेटर थान पर हस्ताक्षर किए
जीई0xC[ओ == एन]ग्रेटर थान या समान पर हस्ताक्षर किए
एल0xD[ओ! = एन]से कम पर हस्ताक्षर किए
LE0xE[ओ! = एन || z == 1]कम थान या समान पर हस्ताक्षर किए


वैकल्पिक mnemonics भी इस्तेमाल किया जा सकता है:
एनसी0x8[c == 0]कैरी नहीं (एई के समान)
सी0x9[c == 1]कैरी (बी के समान)


CPU Commands

कोई भी CHIP16 ओपकोड बिल्कुल 4 बाइट्स (32 बिट्स) लेता है।
एचएच सबसे महत्वपूर्ण बाइट है।
LL एक मामूली लड़ाई है।
एन - कुतरना (4-बिट मूल्य)।
X, Y, Z - 4-बिट रजिस्टर पहचानकर्ता।

opcodeस्मृती-विज्ञानके उपयोग
00 00 00 00एनओपीकोई ऑपरेशन नहीं, सिर्फ एक प्रोसेसर चक्र
०१ ०० ०० ००सीएलएसस्क्रीन की सफाई (मुख्य परत साफ हो गई है, पृष्ठभूमि का रंग सूचकांक 0 के साथ रंग पर सेट है)
02 00 00 00VBLNKऊर्ध्वाधर सिंक की अपेक्षा करें। यदि फ़्रेम को खींचने का प्रबंधन नहीं किया गया है, तो पीसी- = 4
03 00 0 एन 00बीजीसी एनइंडेक्स एन के साथ पृष्ठभूमि का रंग सेट करें। यदि इंडेक्स 0 है, तो पृष्ठभूमि का रंग काला है
04 00 एलएल एचएचएसपीआर एचएचएलएलस्प्राइट का आकार सेट करें: चौड़ाई (LL) और ऊँचाई (HH)
05 वाईएक्स एलएल एचएचDRW RX, RY, HHLLएक्स और वाई रजिस्टरों में निर्दिष्ट निर्देशांक पर एचएचएलएल मेमोरी में पते से एक स्प्राइट ड्रा करें। परिणाम ध्वज को ठीक करता है।
06 YX 0Z 00DRW RX, RY, RZरजिस्टर में दिए गए निर्देशांक X और Y में दिए गए रजिस्टर Z द्वारा बताई गई याद में पते से एक स्प्राइट ड्रा करें। परिणाम ध्वज को ले जाता है।
07 0X एलएल एचएचआरएनडी आरएक्स, एचएचएलएलरजिस्टर X में एक यादृच्छिक संख्या रखो। HHLL द्वारा अधिकतम मूल्य निर्धारित किया गया है
08 00 00 00पलटें ०, ०स्प्राइट डिस्प्ले का ओरिएंटेशन सेट करें। क्षैतिज फ्लिप = सं, ऊर्ध्वाधर फ्लिप = सं
० 01 ०० ०० ०१फ्लिप 0, 1स्प्राइट डिस्प्ले का ओरिएंटेशन सेट करें। क्षैतिज फ्लिप = सं, ऊर्ध्वाधर फ्लिप = हाँ
०। ०० ०० ०२फ्लिप 1, 0स्प्राइट डिस्प्ले का ओरिएंटेशन सेट करें। क्षैतिज फ्लिप = हाँ, ऊर्ध्वाधर फ्लिप = सं
०। ०० ०० ०३फ्लिप 1, 1स्प्राइट डिस्प्ले का ओरिएंटेशन सेट करें। क्षैतिज फ्लिप = हाँ, ऊर्ध्वाधर फ्लिप = हाँ
09 00 00 00SND0आवाज बंद करो
0 ए 00 एलएल एचएचएसएनडी 1 एचएचएलएल500Hz टोन HHLL मिलीसेकेंड चलाएं
0 बी 00 एलएल एचएचएसएनडी 2 एचएचएलएल1000 हर्ट्ज टोन HHLL मिलीसेकंड खेलें
0 सी 00 एलएल एचएचएसएनडी 3 एचएचएलएल1500Hz HHLL टोन मिलिसेकंड खेलें
0D 0X एलएल एचएचएसएनपी आरएक्स, एचएचएलएलHHLL पर निर्दिष्ट वर्तमान ध्वनि जनरेटर के अनुसार, HHLL मिलीसेकंड के लिए एक ध्वनि टोन चलाएं
0 ई। एसआर वीटीSNG AD, VTSRध्वनि जनरेटर ADSR
ए = हमला (0..15)
डी = क्षय (0..15)
एस = बनाए रखने (0..15, मात्रा)
आर = रिलीज (0..15)
वी = मात्रा (0..15)
टी = ध्वनि का प्रकार:
  • 00 = त्रिकोण तरंग
  • 01 = चूल्हा लहराना
  • 02 = पल्स वेव (अभी के लिए चौकोर है)
  • 03 = शोर
  • यदि मान गलत हैं, तो ध्वनि नहीं चलती है


10 00 एलएल एचएचजेएमपी एचएचएलएलनिर्दिष्ट HHLL पते पर जाएं
12 0x एलएल एचएचजेएक्स एचएचएलनिर्दिष्ट HHLL पते पर 'x' स्थिति पर जाएं। (परिस्थितियों के प्रकार देखें)
13 वाईएक्स एलएल एचएचजेएमई आरएक्स, आरवाई, एचएचएलएलनिर्दिष्ट HHLL पते पर जाएं यदि रजिस्टर X, Y रजिस्टर करने के बराबर है
16 0X 00 00जेएमपी आरएक्सरजिस्टर एक्स में निर्दिष्ट पते पर जाएं
14 00 एलएल एचएचकॉल एचएचएलएलHHLL पर नियमित कॉल करें। [SP] में PC बचाता है, SP को 2 से बढ़ाता है
15 00 00 00आरईटीसबरूटीन से लौटें। SP को 2 से घटाता है और PC को [SP] से पुनर्स्थापित करता है
17 0x एलएल एचएचCx hhllयदि स्थिति 'x' मिलती है, तो सबरूटिन को कॉल करें। (परिस्थितियों के प्रकार देखें)
18 0X 00 00आरएक्स को बुलाओएक्स में रजिस्टर में पते पर सबरूटिन को बुलाओ [पीसी] में पीसी बचाता है, एसपी को 2 से बढ़ाता है
20 0X एलएल एचएचLDI RX, HHLLHHLL को तत्काल मान रजिस्टर X में रखें
21 00 एलएल एचएचLDI SP, HHLLHHLL पते पर स्टैक पॉइंटर सेट करें। स्टैक पर पुराने मानों को एक नए पते पर स्थानांतरित नहीं करता है
22 0X एलएल एचएचएलडीएम आरएक्स, एचएचएलएलHHLL पते पर मेमोरी से रजिस्टर X 16-बिट मान में रखें
22 YX 00 00एलडीएम आरएक्स, आरवाईरजिस्टर Y में रजिस्टर वाई द्वारा बताए गए पते पर मेमोरी से 16-बिट मान रखें
24 YX 00 00MOV RX, RYएक्स रजिस्टर करने के लिए रजिस्टर वाई की कॉपी मूल्य
30 0X एलएल एचएचएसटीएम आरएक्स, एचएचएलएलHHLL पते पर मेमोरी में रजिस्टर X का मान सहेजें
31 YX 00 00एसटीएम आरएक्स, आरवाईरजिस्टर Y में स्थित पते पर मेमोरी में रजिस्टर X के मूल्य को स्टोर करें
40 0X एलएल एचएचADDI RX, HHLLX रजिस्टर में तत्काल HHLL मान जोड़ें। झंडे को प्रभावित करता है [c, z, o, n]
41 YX 00 00ADD RX, RYX को रजिस्टर करने के लिए रजिस्टर Y का मान जोड़ें। परिणाम रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [c, z, o, n]
42 YX 0Z 00ADD RX, RY, RZX रजिस्टर करने के लिए रजिस्टर Y का मान जोड़ें। परिणाम Z में रखा गया है। झंडे को प्रभावित करता है [c, z, o, n]
50 0X एलएल एचएचसुबी आरएक्स, एचएचएलएलरजिस्टर X से तत्काल HHLL मान घटाएं। परिणाम X में है। झंडे [c, z, o, n] को प्रभावित करता है।
51 YX 00 00सब आरएक्स, आरवाईरजिस्टर X से रजिस्टर Y के मूल्य को घटाएं। परिणाम को रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [c, z, o, n]
52 YX 0Z 00सब आरएक्स, आरवाई, आरजेडरजिस्टर X से रजिस्टर Y के मूल्य को घटाएं। परिणाम Z में रखा गया है। झंडे को प्रभावित करता है [c, z, o, n]
53 0X एलएल एचएचसीएमपीआई आरएक्स, एचएचएलएलरजिस्टर X से तत्काल HHLL मान घटाएँ। परिणाम सहेजा नहीं गया है। झंडे को प्रभावित करता है [सी, जेड, ओ, एन]
54 YX 00 00सीएमपी आरएक्स, आरवाईरजिस्टर X से रजिस्टर Y के मूल्य को घटाएं। परिणाम सहेजा नहीं गया है। झंडे को प्रभावित करता है [सी, जेड, ओ, एन]
60 0X एलएल एचएचANDI RX, HHLLलॉजिकल ऑपरेशन 'और' के लिए X को रजिस्टर करने के लिए HHLL का मान। रजिस्टर X में परिणाम। झंडे को प्रभावित करता है [z, n]
61 YX 00 00और आरएक्स, आरवाईX को रजिस्टर करने के लिए लॉजिकल ऑपरेशन 'और' रजिस्टर Y में मान। परिणाम को रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [z, n]
62 YX 0Z 00और आरएक्स, आरवाई, आरजेडलॉजिकल ऑपरेशन 'और' रजिस्टर Y में X को पंजीकृत करने के लिए मान। परिणाम Z में रखा गया है। झंडे को प्रभावित करता है [z, n]
63 0X एलएल एचएचTSTI RX, HHLLX को पंजीकृत करने के लिए HHLL के प्रत्यक्ष मूल्य का तार्किक संचालन 'AND'। परिणाम सहेजा नहीं गया है। झंडे को प्रभावित करता है [z, n]
64 YX 00 00TST RX, RYलॉजिकल ऑपरेशन 'और' रजिस्टर Y में X रजिस्टर करने के लिए मान। परिणाम नहीं बचा है। झंडे को प्रभावित करता है [z, n]
70 0X एलएल एचएचORI RX, HHLLX को पंजीकृत करने के लिए HHLL के प्रत्यक्ष मूल्य का लॉजिकल ऑपरेशन 'OR'। परिणाम रजिस्टर X में है। झंडे को प्रभावित करता है [z, n]
71 YX 00 00या आरएक्स, आरवाईएक्स रजिस्टर करने के लिए रजिस्टर वाई में लॉजिकल ऑपरेशन 'या' मान। परिणाम को रजिस्टर एक्स में रखा गया है। झंडे को प्रभावित करता है [z, n]
72 YX 0Z 00या आरएक्स, आरवाई, आरजेडलॉजिकल ऑपरेशन 'या' रजिस्टर Y से रजिस्टर X में मान। परिणाम को रजिस्टर Z में रखा गया है। झंडे को प्रभावित करता है [z, n]
80 0X एलएल एचएचXORI RX, HHLLX को पंजीकृत करने के लिए HHLL के प्रत्यक्ष मूल्य का लॉजिकल ऑपरेशन 'XOR'। परिणाम X में रजिस्टर है। झंडे को प्रभावित करता है [z, n]
81 YX 00 00एक्सओआर आरएक्स, आरवाईX को रजिस्टर करने के लिए रजिस्टर Y में लॉजिकल ऑपरेशन 'XOR' का मान। परिणाम को रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [z, n]
82 YX 0Z 00XOR RX, RY, RZरजिस्टर वाई में रजिस्टर करने के लिए लॉजिकल ऑपरेशन 'XOR' मान। परिणाम को रजिस्टर Z में रखा गया है। झंडे को प्रभावित करता है [z, n]
90 0X एलएल एचएचमुलि आरएक्स, एचएचएलएलतत्काल HHLL मान को रजिस्टर X से गुणा करना। परिणाम रजिस्टर X में है। [c, z, n) झंडे को प्रभावित करता है
91 YX 00 00मूल आरएक्स, आरवाईरजिस्टर Y द्वारा रजिस्टर Y में मूल्य को गुणा करें। परिणाम को रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [c, z, n]
92 YX 0Z 00मूल आरएक्स, आरवाई, आरजेडरजिस्टर Y द्वारा रजिस्टर Y में मूल्य को गुणा करें। परिणाम रजिस्टर Z में रखा गया है। झंडे को प्रभावित करता है [c, z, n]
A0 0X एलएल एचएचडिवि आरएक्स, एचएचएलएलएचएचएलएल के तत्काल मूल्य में रजिस्टर एक्स का विभाजन। परिणाम रजिस्टर एक्स में है। झंडे को प्रभावित करता है [सी, जेड, एन]
ए 1 वाईएक्स 00 00डिव आरएक्स, आरवाईरजिस्टर Y में मूल्य के अनुसार रजिस्टर X का विभाजन। परिणाम को रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [c, z, n]
A2 YX 0Z 00डिव आरएक्स, आरवाई, आरजेडरजिस्टर Y में मूल्य के अनुसार रजिस्टर X का विभाजन। परिणाम को रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [c, z, n]
B0 0X 0N 00एसएचएल आरएक्स, एनरजिस्टर X में मान का तार्किक बदलाव बाईं N- बार के लिए। झंडे को प्रभावित करता है [z, n]
बी 1 0 एक्स 0 एन 00SHR RX, एनरजिस्टर X में दाईं ओर N बार मान का तार्किक बदलाव। झंडे को प्रभावित करता है [z, n]
B0 0X 0N 00एसएएल आरएक्स, एनबाईं ओर N समय में रजिस्टर X में एक मान का अंकगणितीय बदलाव। झंडे को प्रभावित करता है [z, n]। SHL के समान
बी 2 0X 0 एन 00एसएआर आरएक्स, एनरजिस्टर X में सही N समय के मान का अंकगणितीय बदलाव। झंडे को प्रभावित करता है [z, n]
बी 3 वाईएक्स 00 00एसएचएल आरएक्स, आरवाईरजिस्टर Y में बाईं ओर रजिस्टर X में वैल्यू की तार्किक पारी। झंडे को प्रभावित करता है [z, n]
B4 YX 00 00SHR RX, RYरजिस्टर Y में मूल्य द्वारा दाईं ओर रजिस्टर X में मूल्य की तार्किक पारी। झंडे को प्रभावित करता है [z, n]
बी 3 वाईएक्स 00 00साल आरएक्स, आरवाईरजिस्टर में मूल्य के बाईं ओर रजिस्टर X में मूल्य के अंकगणितीय बदलाव Y. झंडे को प्रभावित करता है [z, n]। SHL के समान
B5 YX 00 00एसएआर आरएक्स, आरवाईरजिस्टर X में मान के दाईं ओर रजिस्टर X में मूल्य के अंकगणितीय बदलाव। झंडे को प्रभावित करता है [z, n]
C0 0X 00 00PUSH RXस्टैक पर रजिस्टर X का मान पुश करें। एसपी को 2 से बढ़ाता है
C1 0X 00 00पॉप आरएक्स2 से एसपी कम हो जाता है। स्टैक से रजिस्टर एक्स के मूल्य को पुनर्स्थापित करें।
C2 00 00 00PUSHALLस्टैक पर सभी सामान्य रजिस्टरों (r0-rf) के मूल्यों को सहेजें। 32 से एसपी बढ़ता है
C3 00 00 00POPALL32 से सपा घटाता है। स्टैक से सभी सामान्य रजिस्टरों (r0-rf) के मूल्यों को पुनर्स्थापित करें।
C4 00 00 00PUSHFस्टैक पर ध्वज रजिस्टर की स्थिति को सहेजें। बिट्स 7-7 मुख्य झंडे हैं, बिट्स 8-15 खाली (हमेशा शून्य) हैं। एसपी को 2 से बढ़ाता है
C5 00 00 00PUSHFसपा को घटाता है 2. स्टैक से ध्वज रजिस्टर की स्थिति को पुनर्स्थापित करें
D0 00 एलएल एचएचपाल एचएचएलएलएचएचएलएल, 16 * 3 बाइट्स, आरजीबी प्रारूप में स्थित पैलेट डाउनलोड करें; अंतिम VBlank के तुरंत बाद प्रभावी होगा
डी 1 0x 00 00पाल rxरजिस्टर एक्स, 16 * 3 बाइट्स, आरजीबी प्रारूप में पते पर स्थित पैलेट डाउनलोड करें; अंतिम VBlank के तुरंत बाद प्रभावी होगा


अधिक विस्तार से कहां पढ़ें, "महसूस" कैसे करें?

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

एक अच्छा RefCHIP16 एमुलेटर: code.google.com/p/refchip16/downloads/list C ++ स्रोत, सरल व्याख्या और AOT (समय से आगे) संकलन दोनों की संभावना है, जो निस्संदेह वितरित करता है। शायद एकमात्र सामान्य एमुलेटर है जो विनिर्देश 1.1 (विशेष रूप से एडीएसआर ध्वनि) को सही ढंग से संसाधित करता है।

CHIP16 के लिए गेम, डेमो और परीक्षण छवियों का एक थोड़ा पुराना सेट। अधिकांश कार्यक्रमों के लिए कोडांतरक स्रोत हैं: rghost.ru/38862474 नए खेल और कार्यक्रम फोरम थ्रेड में रखे गए हैं।

डिज़ाइन

CHIP16 के लिए कार्यक्रम और खेल अत्यधिक असेंबलर में लिखे गए हैं। आप इसे यहां डाउनलोड कर सकते हैं: code.google.com/p/tchip16/downloads/list उदाहरण के लिए, इस विषय (तीर) से हमारा स्प्राइट लें और इसे स्क्रीन पर प्रदर्शित करें। ऐसा करने के लिए, कोई भी टेक्स्ट एडिटर खोलें, एक खाली habr.asm फ़ाइल बनाएं और वहां कमांड लिखें:

spr #0504 ;    8x5 ldi r0,10 ;   r0 - X  ldi r1,10 ;   r1 - Y  drw r0,r1,arrow ;       (10,10) end: jmp end ;   ;  arrow: db #f1, #11, #11, #ff db #f1, #1f, #ff, #ff db #f1, #f1, #ff, #ff db #f1, #ff, #1f, #ff db #f1, #ff, #f1, #ff 


फिर इस कमांड का उपयोग करके प्रोग्राम संकलित करें:
tchip16.exe habr.asm -o habr.c16
फिर एमुलेटर में परिणामी habr.c16 फ़ाइल खोलें और एक सफेद पृष्ठभूमि पर एक काले तीर के रूप का आनंद लें :)

जटिल एल्गोरिदम को डीबग करने के लिए, आप मेरे डीबगर - Chip16debugger: code.google.com/p/chip16debugger/downloads/list का उपयोग कर सकते हैं
छवि
जबकि अल्फा संस्करण, गोवनोकॉड, शायद बग के साथ, लेकिन कुछ भी नहीं से बेहतर है। कभी-कभी यह वास्तव में एक बग को पकड़ने में मदद करता है।

एमुलेटर ... और क्या आप शांत सामान हलचल कर सकते हैं?

उदाहरण के लिए, उच्च स्तरीय भाषा के कुछ संकलक (या अनुवादक)। उदाहरण के लिए, मैंने पास्कल जैसी भाषा के एक अनुवादक को लिखने की कोशिश की। कुछ निश्चित रूप से हुआ, लेकिन स्पष्ट रूप से पूर्ण भाषा तक नहीं पहुंचता है। इन कार्यक्रमों पर लिखा जा सकता है:
 var xPixels, yPixels, xStart, yStart, Xsize, YSize, maxiter : integer; xStep, yStep : integer; ix,iy,x,y,x0,y0,iteration,xtemp : integer; dist : byte; temp : byte; xx,yy : byte; begin XPixels := 160; YPixels := 100; XStart := $FF9c; YStart := $FFce; XSize := 160; YSize := 100; MaxIter := 16; XStep := XSize div XPixels; YStep := YSize div YPixels; yy := 20; For iy := 0 to yPixels do begin xx := 0; For ix := 0 to xPixels do begin x := xStart + ix * xStep; y := yStart + iy * yStep; x0 := x; y0 := y; iteration := 0; Repeat xtemp := ((x*x) div 48) - ((y*y) div 48) + x0; y := 2*((x*y) div 48) + y0; x := xtemp; iteration := iteration + 1; dist := ((x*x) div 48) + ((y*y) div 48); If iteration = maxiter then dist := 4000; Until dist > 192; If iteration <> maxiter then If iteration > 1 then begin temp := ((iteration shl 4) or iteration) shl 8; temp := temp or ((iteration shl 4) or iteration); DrawSprite(xx,yy,$0201,^temp); end; xx := xx + 2; end; yy := yy + 2; end; end. 


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


दुर्भाग्य से मैंने इसे त्याग दिया, सब कुछ जारी करने या कम से कम बीटा लाने के लिए पर्याप्त कौशल नहीं था।

और क्या ... ओह हां, एक दिलचस्प मामला था - वे CHIP16 डेमो कम्पो को छेड़ना चाहते थे, जैसे कि विषय के तहत डेमो लिखना। ठीक है, पुराने स्कूल, संसाधन सीमित हैं, ये ऑपरेटर्स के साथ नहीं हैं। सिद्धांत रूप में, आप पुराने प्रभावों को पूरी तरह से मोड़ सकते हैं, जैसे कि कोई फ्रेम बफर नहीं है, पूरे स्क्रीन के आकार को स्प्राइट करने के लिए 32Kb रैम है। और प्रति कोड 32Kb रहता है। यह स्क्रीन को ब्लिंक किए बिना भी होगा। मेरा छोटा डेमो sinedots है (ऐसे बिंदु अंतरिक्ष में घूमते हैं, यह पता चला है, जैसा कि यह तीन आयामी था)। सच है, मैंने यहां कदम रखा, और बिंदुओं को डॉट्स (एक बाइट के स्प्राइट्स) के साथ बिल्कुल काट दिया, यही कारण है कि निमिष परिणाम।

आप अभी भी हार्डवेयर (FPGAs और अन्य ट्रांजिस्टर के प्रशंसकों के लिए) में पूरे मंच बना सकते हैं। और शायद मैं हार्डवेयर के इस टुकड़े के लिए अपना एमुलेटर लिखूंगा:

और इसे हार्डवेयर के संदर्भ में पूरी तरह से हार्डवेयर न होने दें (एक नियमित MIPS प्रोसेसर है), लेकिन फिर भी दिलचस्प है।

सभी को शुभकामनाएँ!

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


All Articles