2012-10-27 16 views
6

मैं एनईएस के Javascript emulator पर देख रहा हूं कि यह कैसे काम करता है और समझने के लिए।ऑपरेशन पता दो से बढ़ता क्यों है?

this line पर:

addr = this.load(opaddr+2); 

opcode दो से वृद्धि की जाती है। हालांकि, documentation (परिशिष्ट ई देखें) मैं पढ़ रहा हूँ कहते हैं:

शून्य पेज का उपयोग करता है को संबोधित एक भी संकार्य जो शून्य पेज ($ 0000- $ 00FF) जहां के लिए डेटा में कोई पता करने के लिए एक सूचक रूप में कार्य करता संचालित किया जा सकता है। शून्य पेज एड्रेसिंग का उपयोग करके, ऑपरेटर के लिए केवल एक बाइट आवश्यक है, इसलिए निर्देश छोटा है और इसलिए, दो ऑपरेटरों को संबोधित करने वाले मोड के साथ निष्पादित करने के लिए तेज़ी से निष्पादित करने के लिए तेज़ है। शून्य पृष्ठ निर्देश का एक उदाहरण और $ 12 है।

तो यदि ऑपरेंड का तर्क केवल एक बाइट है, तो इसे इसके बाद सीधे दिखाई नहीं देना चाहिए, और + 2 के बजाय + 1 होना चाहिए? क्यों +2?

इस तरह मुझे लगता है कि यह काम करता है, जो गलत हो सकता है।

------------------------- 
| 0 | 1 | 2 | 3 | 4 | 5 | <- index 
------------------------- 
| a | b | c | d | e | f | <- memory 
------------------------- 
^ 
    \ 
    PC 

और हमारे पीसी 0 है, a की ओर इशारा करते: हमारी स्मृति लगता है कि मान लीजिए। इस चक्र के लिए, हम कहते हैं कि opcode:

var pc= 0; //for example's sake 
var opcode= memory[pc]; //a 

तो नहीं पहले संकार्य अगले स्लॉट होना चाहिए, जैसे कि b?

var first_operand = memory[pc + 1]; //b 
+1

ओपोड कितना विस्तृत है? –

+0

@PlatinumAzure पीसी 16 बिट है, मुझे लगता है कि ओपोड 8 बिट –

+0

है मुझे लगता है कि @PlatinumAzure सही रास्ते पर है। एकल बाइट ऑपरेंड तक पहुंचने के लिए ओपोड पर छोड़ना है। –

उत्तर

2

आपका विश्लेषण पहली नज़र में सही प्रतीत होता है लेकिन चूंकि एमुलेटर काम करता है तो कुछ और चलना चाहिए।

प्रासंगिक कोड इस प्रकार है:

var opinf = this.opdata[this.nes.mmap.load(this.REG_PC+1)]; 
    var cycleCount = (opinf>>24); 
    var cycleAdd = 0; 

    // Find address mode: 
    var addrMode = (opinf >> 8) & 0xFF; 

    // Increment PC by number of op bytes: 
    var opaddr = this.REG_PC; 
    this.REG_PC += ((opinf >> 16) & 0xFF); 

    var addr = 0; 
    switch(addrMode){ 
     case 0:{ 
      // Zero Page mode. Use the address given after the opcode, 
      // but without high byte. 
      addr = this.load(opaddr+2); 
      break; 

नोट प्रस्तुति का ढंग पहली पंक्ति पर, स्मृति पहुँच अनुदेश जानकारी पाने के लिए पता REG_PC+1 पर है। तो पीसी वास्तव में बाइट को से पहले ऑपोड निष्पादित किया जा रहा है और इसलिए ऑपरेटर उस पते पर शुरू होते हैं। 2. ओपोड स्वयं को opinf के निचले 8 बाइट्स के रूप में एन्कोड किया गया है और निष्पादित स्विच में एक पृष्ठ या उससे नीचे स्विच किया जाता है कोड सेगमेंट दिखाया गया।

+0

सत्यापन के लिए धन्यवाद, भले ही यह एकमात्र उत्तर था ;-) बस जानकारी के लिए जिस स्थिति को आपने हाइटलाइट किया है वह असामान्य है। पीसी आमतौर पर वर्तमान निर्देश या अगले निर्देश को इंगित करता है। यह पहली बार है जब मैंने वर्तमान निर्देश के पीछे एक बिंदु देखा है। – HBP

+0

यदि आपको कोई बात नहीं है, तो मेरे पास एक फॉलो अप प्रश्न है। ओपोड को सीधे 'this.REG_PC' पर पढ़ा नहीं जाना चाहिए, +1 नहीं? धन्यवाद –

+0

मैंने सभी तर्कों का पता नहीं लगाया है लेकिन अनिवार्य रूप से केवल स्थिरता का मामला है। वर्तमान निर्देश से कम एक पीसी मूल्य होने के कारण असामान्य और काफी उलझन में है, लेकिन यदि पीसी मान ** हमेशा ** निर्देश से निष्पादित होने से कम एक है और आप ** ** ** के लिए खाते हैं जहां पीसी है सभी से संदर्भित होना चाहिए अच्छी तरह से होना चाहिए। – HBP

संबंधित मुद्दे