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

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

और यह सब
2010 में कहीं से शुरू
हुआ था , तब से विनिर्देशन संस्करण 1.1 का अधिग्रहण किया गया था, मुख्य दोषों को तय किया गया था, इस प्लेटफॉर्म के लिए गेम और अन्य प्रोग्राम बनाने के लिए मुख्य उपकरण लिखे गए थे (कोडांतरक, डिबगर, छवि कनवर्टर, आदि)। एक ही सीएचआईपी -8 से मुख्य अंतर एक बड़ी स्क्रीन रिज़ॉल्यूशन, अधिक रंग, अधिक अंकगणित और अन्य निर्देशों की उपस्थिति, बेहतर ध्वनि समर्थन और अनिर्दिष्ट सुविधाओं की अनुपस्थिति है।
उपसर्ग में 16-बिट प्रोसेसर, मेमोरी, दो इनपुट डिवाइस (जॉयस्टिक जैसे डेंडी), एक ध्वनि और वीडियो सबसिस्टम है। इस पूरे गुच्छा पर अधिक विस्तार से विचार करें।
प्रोसेसर
प्रोसेसर में शामिल हैं:
- एक 16-बिट अनुदेश काउंटर (पीसी)
- एक 16-बिट स्टैक पॉइंटर (SP)
- सोलह 16-बिट सामान्य प्रयोजन रजिस्टर (R0 - RF)
- एक 8-बिट ध्वज रजिस्टर
प्रत्येक ओपकोड (प्रोसेसर कमांड) का निष्पादन ठीक एक चक्र लेता है, प्रोसेसर 1 मेगाहर्ट्ज की आवृत्ति पर चलता है। यहां मैं एक आरक्षण करूंगा कि वास्तव में, जब तक कि आवृत्ति अंत तक स्पष्ट नहीं होती है, और प्रत्येक एमुलेटर पर 1 मेगाहर्ट्ज से अधिक तेजी से कमांड निष्पादित करता है। कभी-कभी अधिकतम उत्सर्जन गति के साथ। सामान्य तौर पर, जबकि आप इस बारे में परेशान नहीं कर सकते।
स्मृति
केवल 64Kb (65536 बाइट्स)। स्मृति निम्नानुसार आवंटित की गई है:
0x0000 - बाइनरी डेटा की शुरुआत
0xFDF0 - स्टैक की शुरुआत (512 बाइट्स)।
0xFFF0 - I / O पोर्ट (I / O, जॉयस्टिक की स्थिति पर नज़र रखने के लिए)।
वीडियो
स्क्रीन रेजल्यूशन 320x240 पिक्सल है। एक ही समय में प्रदर्शित रंगों की संख्या मानक पैलेट से 16 है।
पैलेट में सूचकांक | हेक्स। अर्थ | रंग |
---|
0x0 | 0x000000 | एक पृष्ठभूमि परत पर काले पारदर्शी |
0x1 | 0x000000 | काला |
0x2 | 0x888888 | धूसर |
0x3 | 0xBF3932 | लाल |
0x4 | 0xDE7AAE | गुलाबी |
0x5 | 0x4C3D21 | गहरा भूरा |
0x6 | 0x905F25 | भूरा |
0x7 | 0xE49452 | नारंगी |
0x8 | 0xEAD979 | पीला |
0x9 | 0x537A3B | ग्रीन |
0xA | 0xABD54A | हल्का हरा |
0xB | 0x252E38 | नीली नीली |
0xC | 0x00467F | नीला |
0xD | 0x68ABCC | हल्का नीला |
0xE | 0xBCDEE4 | आसमानी नीला |
0xF | 0xFFFFFF | सफेद |

अपना खुद का रंग पैलेट सेट करना संभव है। स्क्रीन रिफ्रेश रेट 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) |
0x06 | ROM फ़ाइल का आकार (बाइट्स में शामिल नहीं, बाइट्स में) |
0x0A | प्रारंभ पता (पीसी कमांड काउंटर वैल्यू) |
0x0C | CRC32 चेकसम (हेडर, बहुपद = 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] | नीचे (बिना थके कम) |
BE | 0xA | [c == 1 || z == 1] | बराबरी से नीचे (बिना थके कम या बराबर) |
जी | 0xB | [o == n && z == 0] | ग्रेटर थान पर हस्ताक्षर किए |
जीई | 0xC | [ओ == एन] | ग्रेटर थान या समान पर हस्ताक्षर किए |
एल | 0xD | [ओ! = एन] | से कम पर हस्ताक्षर किए |
LE | 0xE | [ओ! = एन || 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 00 | VBLNK | ऊर्ध्वाधर सिंक की अपेक्षा करें। यदि फ़्रेम को खींचने का प्रबंधन नहीं किया गया है, तो पीसी- = 4 |
03 00 0 एन 00 | बीजीसी एन | इंडेक्स एन के साथ पृष्ठभूमि का रंग सेट करें। यदि इंडेक्स 0 है, तो पृष्ठभूमि का रंग काला है |
04 00 एलएल एचएच | एसपीआर एचएचएलएल | स्प्राइट का आकार सेट करें: चौड़ाई (LL) और ऊँचाई (HH) |
05 वाईएक्स एलएल एचएच | DRW RX, RY, HHLL | एक्स और वाई रजिस्टरों में निर्दिष्ट निर्देशांक पर एचएचएलएल मेमोरी में पते से एक स्प्राइट ड्रा करें। परिणाम ध्वज को ठीक करता है। |
06 YX 0Z 00 | DRW RX, RY, RZ | रजिस्टर में दिए गए निर्देशांक X और Y में दिए गए रजिस्टर Z द्वारा बताई गई याद में पते से एक स्प्राइट ड्रा करें। परिणाम ध्वज को ले जाता है। |
07 0X एलएल एचएच | आरएनडी आरएक्स, एचएचएलएल | रजिस्टर X में एक यादृच्छिक संख्या रखो। HHLL द्वारा अधिकतम मूल्य निर्धारित किया गया है |
08 00 00 00 | पलटें ०, ० | स्प्राइट डिस्प्ले का ओरिएंटेशन सेट करें। क्षैतिज फ्लिप = सं, ऊर्ध्वाधर फ्लिप = सं |
० 01 ०० ०० ०१ | फ्लिप 0, 1 | स्प्राइट डिस्प्ले का ओरिएंटेशन सेट करें। क्षैतिज फ्लिप = सं, ऊर्ध्वाधर फ्लिप = हाँ |
०। ०० ०० ०२ | फ्लिप 1, 0 | स्प्राइट डिस्प्ले का ओरिएंटेशन सेट करें। क्षैतिज फ्लिप = हाँ, ऊर्ध्वाधर फ्लिप = सं |
०। ०० ०० ०३ | फ्लिप 1, 1 | स्प्राइट डिस्प्ले का ओरिएंटेशन सेट करें। क्षैतिज फ्लिप = हाँ, ऊर्ध्वाधर फ्लिप = हाँ |
09 00 00 00 | SND0 | आवाज बंद करो |
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, HHLL | HHLL को तत्काल मान रजिस्टर X में रखें |
21 00 एलएल एचएच | LDI SP, HHLL | HHLL पते पर स्टैक पॉइंटर सेट करें। स्टैक पर पुराने मानों को एक नए पते पर स्थानांतरित नहीं करता है |
22 0X एलएल एचएच | एलडीएम आरएक्स, एचएचएलएल | HHLL पते पर मेमोरी से रजिस्टर X 16-बिट मान में रखें |
22 YX 00 00 | एलडीएम आरएक्स, आरवाई | रजिस्टर Y में रजिस्टर वाई द्वारा बताए गए पते पर मेमोरी से 16-बिट मान रखें |
24 YX 00 00 | MOV RX, RY | एक्स रजिस्टर करने के लिए रजिस्टर वाई की कॉपी मूल्य |
30 0X एलएल एचएच | एसटीएम आरएक्स, एचएचएलएल | HHLL पते पर मेमोरी में रजिस्टर X का मान सहेजें |
31 YX 00 00 | एसटीएम आरएक्स, आरवाई | रजिस्टर Y में स्थित पते पर मेमोरी में रजिस्टर X के मूल्य को स्टोर करें |
40 0X एलएल एचएच | ADDI RX, HHLL | X रजिस्टर में तत्काल HHLL मान जोड़ें। झंडे को प्रभावित करता है [c, z, o, n] |
41 YX 00 00 | ADD RX, RY | X को रजिस्टर करने के लिए रजिस्टर Y का मान जोड़ें। परिणाम रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [c, z, o, n] |
42 YX 0Z 00 | ADD RX, RY, RZ | X रजिस्टर करने के लिए रजिस्टर 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, HHLL | X को पंजीकृत करने के लिए HHLL के प्रत्यक्ष मूल्य का तार्किक संचालन 'AND'। परिणाम सहेजा नहीं गया है। झंडे को प्रभावित करता है [z, n] |
64 YX 00 00 | TST RX, RY | लॉजिकल ऑपरेशन 'और' रजिस्टर Y में X रजिस्टर करने के लिए मान। परिणाम नहीं बचा है। झंडे को प्रभावित करता है [z, n] |
70 0X एलएल एचएच | ORI RX, HHLL | X को पंजीकृत करने के लिए HHLL के प्रत्यक्ष मूल्य का लॉजिकल ऑपरेशन 'OR'। परिणाम रजिस्टर X में है। झंडे को प्रभावित करता है [z, n] |
71 YX 00 00 | या आरएक्स, आरवाई | एक्स रजिस्टर करने के लिए रजिस्टर वाई में लॉजिकल ऑपरेशन 'या' मान। परिणाम को रजिस्टर एक्स में रखा गया है। झंडे को प्रभावित करता है [z, n] |
72 YX 0Z 00 | या आरएक्स, आरवाई, आरजेड | लॉजिकल ऑपरेशन 'या' रजिस्टर Y से रजिस्टर X में मान। परिणाम को रजिस्टर Z में रखा गया है। झंडे को प्रभावित करता है [z, n] |
80 0X एलएल एचएच | XORI RX, HHLL | X को पंजीकृत करने के लिए HHLL के प्रत्यक्ष मूल्य का लॉजिकल ऑपरेशन 'XOR'। परिणाम X में रजिस्टर है। झंडे को प्रभावित करता है [z, n] |
81 YX 00 00 | एक्सओआर आरएक्स, आरवाई | X को रजिस्टर करने के लिए रजिस्टर Y में लॉजिकल ऑपरेशन 'XOR' का मान। परिणाम को रजिस्टर X में रखा गया है। झंडे को प्रभावित करता है [z, n] |
82 YX 0Z 00 | XOR 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 एन 00 | SHR 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 00 | SHR 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 00 | PUSH RX | स्टैक पर रजिस्टर X का मान पुश करें। एसपी को 2 से बढ़ाता है |
C1 0X 00 00 | पॉप आरएक्स | 2 से एसपी कम हो जाता है। स्टैक से रजिस्टर एक्स के मूल्य को पुनर्स्थापित करें। |
C2 00 00 00 | PUSHALL | स्टैक पर सभी सामान्य रजिस्टरों (r0-rf) के मूल्यों को सहेजें। 32 से एसपी बढ़ता है |
C3 00 00 00 | POPALL | 32 से सपा घटाता है। स्टैक से सभी सामान्य रजिस्टरों (r0-rf) के मूल्यों को पुनर्स्थापित करें। |
C4 00 00 00 | PUSHF | स्टैक पर ध्वज रजिस्टर की स्थिति को सहेजें। बिट्स 7-7 मुख्य झंडे हैं, बिट्स 8-15 खाली (हमेशा शून्य) हैं। एसपी को 2 से बढ़ाता है |
C5 00 00 00 | PUSHF | सपा को घटाता है 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 प्रोसेसर है), लेकिन फिर भी दिलचस्प है।
सभी को शुभकामनाएँ!