2011-12-16 17 views
7

मुझे फिर से एक और निर्दोष Z80 प्रश्न के साथ :-) जिस तरह से मेरा एमुलेटर कोर वर्तमान में संरचित है, मैं मेमोरी रीफ्रेश रजिस्टर के निचले 7 बिट्स को बढ़ा रहा हूं, हर बार एक ओपोड बाइट स्मृति से प्राप्त किया जाता है - इसका मतलब है बहु-बाइट निर्देशों के लिए, जैसे कि डीडी या एफडी शुरू करते हैं, मैं दो बार रजिस्टर में वृद्धि कर रहा हूं - या आरएलसी (आईएक्स + डी) जैसे तीन बार निर्देश के उदाहरण में (जैसा कि इसे opcode1-opcode2-d रखा गया है -opcode3)।Z80 मेमोरी रीफ्रेश रजिस्टर

क्या यह सही है? मुझे यकीन नहीं है - Z80 मैनुअल इस पर थोड़ा अस्पष्ट है, क्योंकि यह कहता है कि सीपीडीआर (दो बाइट निर्देश) इसे दो बार बढ़ाता है, हालांकि 'मेमोरी रीफ्रेश रजिस्टर' सेक्शन में केवल प्रत्येक निर्देश लाने के बाद यह वृद्धि होती है। मैंने देखा है कि जे 80 (एक एमुलेटर जिसे मैंने चेक किया है क्योंकि मुझे इस बारे में निश्चित नहीं है) केवल निर्देश के पहले ओपोड बाइट के बाद ही वृद्धि हुई है।

कौन सा सही है? मुझे लगता है कि यह किसी भी मामले में बेहद महत्वपूर्ण नहीं है, लेकिन यह जानना अच्छा होगा :-) बहुत धन्यवाद।

सादर, फिल पॉटर

+0

मुझे लगता है कि सीपीडीआर निर्देश मेमोरी रीफ्रेश रजिस्टर को एक बार नहीं, और न ही दो बार बढ़ाएगा, लेकिन जितनी बार इसे दोहराया जाएगा, क्योंकि यह दोहराना निर्देश है। (और मुझे संदेह है कि दोहराने के निर्देशों की पूरी अवधि के लिए स्मृति को ताज़ा किए जाने की उम्मीद थी।) –

उत्तर

-1

सभी संदर्भ मैं ऑनलाइन प्राप्त कर सकते हैं का कहना है कि आर एक बार अनुदेश प्रति इसकी लंबाई पर ध्यान दिए बिना वृद्धि की जाती है।

+3

दरअसल, यह प्रति एम 1 राज्य में एक बार बढ़ी है। सीबीएच, ईडीएच, (या आईएक्स/आईवाई उपसर्ग) द्वारा पूर्ववर्ती निर्देश दो बार वृद्धि करता है। आप इस डीडी डीडी डीडी डीडी डीडी 21 00 00 (यानी, एलडी आईएक्स, 0000h के साथ कई डीडीएच उपसर्गों के साथ एक निर्देश भी प्राप्त कर सकते हैं, जो वैध है) जो 6 से बढ़ेगा। –

5

Sean Young's Z80 Undocumented Features की एक अलग कहानी है। एक बार अपरिक्स्ड के लिए, एक उपसर्ग के लिए दो बार, डबल उपसर्ग (केवल डीडीसीबी) के लिए दो बार, और एक बार नो-ऑप उपसर्ग के लिए।

पाठ्यक्रम के ब्लॉक निर्देश हर बार जब वे दौड़ते हैं (और वे बीसी बार चलाते हैं) को प्रभावित करते हैं।

+0

इसके लिए धन्यवाद - मैं इस दस्तावेज़ को दूंगा एक ब्राउज़ :-) – PhilPotter1987

+0

क्या किसी ने समय-समय पर चित्रों को जांचने के लिए जांच की है कि क्या यह प्रतीत होता है कि मनमाने ढंग से नियम 'प्रति ताज़ा चक्र' पर टूट जाता है? यह सहजता से ऐसा लगता है। – Tommy

+0

@ टॉमी मैंने उन्हें चेक नहीं किया है, लेकिन आईआईआरसी आप सही हैं – harold

11

ज़िलोग टाइमिंग आरेखों में आपके प्रश्न का उत्तर है।

सभी एम 1 (ओपोड लाने) चक्रों के टी 3 और टी 4 के दौरान एक ताज़ा होता है।

एकल-ऑपोड निर्देशों के मामले में, यह प्रति निर्देश एक ताज़ा है। एकल-उपसर्ग निर्देशों के लिए (उपसर्गों को एम 1 चक्रों का उपयोग करके पढ़ा जाता है) जो प्रति निर्देश दो रीफ्रेश हैं।

उन अजीब DD-सीबी-disp-opcode और एफडी सीबी-disp-opcode प्रकार के निर्देशों के लिए (अजीब क्योंकि विस्थापन बाइट आता से पहले अंतिम opcode बल्कि यह बाद से), ताज़ा करने के लिए संख्या कम से कम है 3 (दो उपसर्गों और अंतिम ओपोड के लिए), लेकिन मुझे यकीन नहीं है कि विस्थापन बाइट एम 1 चक्र (जो एक और ताज़ा ट्रिगर करेगा) या एक सामान्य मेमोरी रीड चक्र (कोई ताज़ा नहीं) के हिस्से के रूप में पढ़ा जाता है। मुझे विश्वास है कि विस्थापन बाइट इन निर्देशों के लिए एम 1 चक्र में पढ़ा जाता है, लेकिन मुझे यकीन नहीं है। मैंने इस बारे में शॉन यंग से पूछा; वह या तो निश्चित नहीं था। क्या किसी को निश्चित रूप से पता है?

अद्यतन:

मैं उन अजीब DD-सीबी-disp-opcode और एफडी सीबी-disp-opcode निर्देश फिर से अपने ही सवाल का जवाब दे। यदि आप आरएलसी (आईएक्स + डी) जैसे प्रकार के निर्देशों के लिए ज़िलोग के दस्तावेज़ों की जांच करते हैं, तो आप ध्यान दें कि निर्देश के लिए 6 एम-चक्र और 23 टी-चक्रों को तोड़ने की आवश्यकता है: (4,4,3,5, 4,3)।

हम जानते हैं कि पहले दो एम-चक्र डी 1 और सीबी उपसर्ग (4 टी-चक्र प्रत्येक) लाने के लिए एम 1 चक्र हैं। अगला एम-चक्र विस्थापन बाइट डी पढ़ता है। लेकिन एम-चक्र केवल 3 टी-चक्र का उपयोग करता है, 4 नहीं, इसलिए यह एम 1 चक्र नहीं हो सकता है; इसके बजाय यह एक सामान्य मेमोरी रीड चक्र है।0xCB उपसर्ग को पढ़ने के लिए 0xDD उपसर्ग (4 टी चक्र)

  • एम 1 चक्र को पढ़ने के लिए

    1. एम 1 चक्र:

      यहाँ RLC (नौवीं + घ) अनुदेश के छह एम चक्र के टूटने है (4 टी चक्र)

    2. मेमोरी पढ़ें चक्र 0x06 opcode और लोड नौवीं ALU में (5 टी चक्र)
    3. मेमोरी पढ़ें लाने के लिए विस्थापन बाइट (3 टी चक्र)
    4. एम 1 चक्र को पढ़ने के लिए पता IX + डी (4 टी-साइ।) से गणना और पढ़ने के लिए चक्र cles)
    5. मेमोरी लिखें चक्र RLC की गणना और नौवीं + d (3 टी चक्र) को संबोधित करने के परिणाम लिखने

    (RLC गणना overlaps एम चक्र 5 और 6.)

    इन करने के लिए प्रकार के निर्देश अद्वितीय हैं कि वे एकमात्र Z80 निर्देश हैं जिनमें गैर-संगत एम 1 चक्र (एम-चक्र 1, 2 और 4 ऊपर) हैं। वे भी सबसे धीमे हैं!

    पॉल

  • +0

    हां कि पूरी डीडी-सीबी- जो कुछ भी मुझे पहले से बाहर निकाल देता है :- डी मेरा जेड 80 अब 100% काम कर रहा है, और वास्तव में हिस्सा एक अधूरा राज्य में चलने वाले एक एमुलेटर की, हालांकि एक अधूरा राज्य में। यह मुद्दा अभी भी कुछ है जिसे मुझे फिर से देखने की आवश्यकता है। आपके उत्तर के लिए धन्यवाद। – PhilPotter1987

    +0

    बहुत उपयोगी। क्या सभी ऑपोड्स के लिए उपरोक्त उपलब्ध ब्रेकडाउन है? टी/एम चक्र टूटना मैनुअल में है, लेकिन यह नहीं बताता कि एम चक्र में क्या होता है। मैं उनमें से अधिकतर अनुमान लगा सकता हूं, लेकिन सटीक अवलोकन होने से मदद मिलेगी। –

    1

    मैं टिप्पणियों के एक जोड़े अब देखा है कि इन अजीब DDCB और FDCB निर्देश केवल दो बार आर रजिस्टर को बढ़ा देते।

    यह हमेशा मेरी धारणा (और जिस तरह से मैंने अपना Z80 एमुलेटर लागू किया) यह है कि आर रजिस्टर के प्रत्येक एम 1 चक्र के अंत में लागू किया गया है।

    सारांश यह है इन अजीब DDCB और FDCB निर्देश चार बाइट्स लंबे होते हैं:

    डीडी सीबी disp opcode

    एफडी सीबी disp opcode

    यह स्पष्ट है कि दो उपसर्ग opcodes एम 1 चक्र का उपयोग करके पढ़ा रहे हैं , जिससे उन प्रत्येक चक्र के अंत में आर रजिस्टर को बढ़ाया जा सकता है।

    यह भी स्पष्ट है कि सीबी उपसर्ग का पालन करने वाले विस्थापन बाइट को सामान्य पढ़ने चक्र द्वारा पढ़ा जाता है, इसलिए आर चक्र उस चक्र के अंत में वृद्धि नहीं होता है।

    जो अंतिम ओपोड छोड़ देता है। यदि यह एम 1 चक्र द्वारा पढ़ा जाता है, तो या तो आर रजिस्टर को चक्र के अंत में बढ़ाया जाता है, जिसके परिणामस्वरूप कुल 3 वेतन वृद्धि होती है, या जेड 80 विशेष मामलों में यह एम 1 चक्र होता है और आर रजिस्टर में वृद्धि नहीं करता है।

    एक और संभावना है। क्या होगा यदि अंतिम ओपोड सामान्य रीड चक्र द्वारा पढ़ा जाता है, जैसे कि विस्थापन बाइट जो इससे पहले था, और एम 1 चक्र से नहीं? निश्चित रूप से इन निर्देशों के लिए आर रजिस्टर को केवल दो बार बढ़ाया जाएगा, और Z80 को प्रत्येक एम 1 चक्र के अंत में आर रजिस्टर में वृद्धि न करने का अपवाद नहीं होगा।

    यह Z80 के आंतरिक राज्य के संदर्भ में भी बेहतर समझ सकता है। एक बार जब यह सामान्य हो जाता है तो एक निर्देश के अतिरिक्त बाइट्स को पढ़ने के लिए चक्र पढ़ें (इस मामले में सीबी उपसर्ग के बाद विस्थापन बाइट), यह कभी भी अगली निर्देश शुरू होने तक एम 1 चक्रों पर वापस स्विच नहीं करता है।

    क्या कोई भी डीडीसीबी या एफडीसीबी निर्देशों में से किसी एक के बाद आर रजिस्टर के मूल्य की पुष्टि करने के लिए वास्तविक Z80 हार्डवेयर पर इसका परीक्षण कर सकता है?

    +1

    मैंने डीडीसीबी की पुष्टि करने वाले वास्तविक जेड -80 पर एक परीक्षण चलाया है और एफडीसीबी निर्देश आर पंजीकरण को दो बार बढ़ाते हैं। इसे ठोस शब्दों में रखने के लिए, निम्न अनुक्रम 4 के साथ लोड किए गए एक रजिस्टर के साथ समाप्त होगा: "ld ix, memloc; xor a; ld r, a; sla (ix); ld a, r"। चूंकि "एलडी ए, आर" 2 से बढ़ता है, "स्लै (ix)" में केवल 2 तक वृद्धि हुई है। –

    +1

    आश्चर्यजनक रूप से मैं @ जॉर्ज फिलिप्स के परिणाम की पुष्टि करता हूं, मुझे Z84C0020 पर 4 मिल गया है। जांचें: मैंने तीन slops के साथ 'sla (ix)' को बदल दिया है और 5 मिल गया है। – lvd

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