Amiga पर, जब मैं गलती से $ DFC5A0 को लिखता हूं तो क्या होता है?
मैं एक खेल (टी वी खेल बास्केटबॉल) कि ऑडियो डेटा में लिखने के लिए कोशिश करता (रेंज का उपयोग कर रहा हूँ फिक्सिंग $DFF0A0
के लिए $DFF0D0
), लेकिन किसी कारण (बुरा प्रोग्रामिंग) के लिए, सूचकांक कभी कभी (हमेशा) फर्जी है
MOVEA.L #$00DFF0A0,A0 ;004e78: 207c00dff0a0 load custom address in A0 MOVE.W $0008(A5),D0 ;004e80: 302d0008 audio channel 0-3
LSL.W #4,D0 ;004e84: e948 shifting (mul by 16)
MOVE.L -$346E(A4),(A0,D0.W) ;004e86: 21accb920000 write to register
यदि D0
3 से अधिक है, तो लिखना (A0,D0.W)
सीमा से बाहर है। मेरे मामले में यह लिखता है $DFC5A0
, क्योंकि स्थानांतरण के बाद D0
है $D500
। यह मेमोरी विस्तार के मेमोरी स्थान पर भी निर्भर करता है (केवल चिप मेमोरी का उपयोग बग को ट्रिगर नहीं करता है)।
मुझे पता है कि अमिगा एड्रेसिंग सिस्टम में कस्टम रजिस्टरों और सीआईए के लिए मास्क हैं, और शायद यह वास्तव में सही पते पर लिखेगा (मुझे संदेह है कि यह $D50
चैनल इंडेक्स के लिए आधार मूल्य के रूप में है ...), लेकिन अगर मैं इस मुद्दे को ठीक करता हूं सूचकांक से बाहर होने पर लेखन को हटा दें, हो सकता है कि ध्वनि काम न करे, जबकि यह उस फर्जी पते के साथ काम करता है।
उदाहरण के लिए, अगर मैं $DFC09A
इसे लिखता हूं तो वास्तव में इसका प्रभाव $DFF09A
(INTENA पर पड़ता है, इस विशेष रजिस्टर के साथ जांच करना आसान है, जिसमें केवल पढ़ने के लिए प्रतिपक्ष है) लेकिन अगर मैं $DFC59A
इसे लिखता हूं तो INTENA पर कोई प्रभाव नहीं पड़ता है।
मैं उस फर्जी पते को छोड़ना नहीं चाहता, क्योंकि यह मेमोरी लेआउट का उल्लंघन करता है। क्या इस पते का पता लगाने और $DFF0A0 - $DFF0D0
सीमा में वापस आने का कोई सूत्र है ?
जवाब
नोट: मैं अधिक शोध और प्रयोग के बाद अपने प्रश्न का उत्तर दे रहा हूं।
$DFF000
आधार कस्टम चिप रजिस्टर आधार पता है कमोडोर द्वारा सिफारिश की ।
लेकिन कई अन्य आधार पते काम करते हैं। कुछ पता लाइनें कस्टम चिप बेस का चयन करती हैं, और कुछ को अनदेखा किया जाता है।
कस्टम चिप पता क्षेत्र काम की DF0000-DFFFFF
तरह कोई भी आधार है $DFx000
।
WinUAE एमुलेटर पर कुछ परीक्षण करने से इस बात की पुष्टि होती है, जो उन पहलुओं के बारे में बहुत वफादार है, और जो अपने आंतरिक डिबगर का उपयोग करके रजिस्टर में क्या लिखा है यह पढ़ने में सक्षम होने की दिलचस्प क्षमता है ।
तो अगर मैं लिखने $12345678
में $DFC0A0
उदाहरण के लिए, $12345678
में दिखाई देगा $DFF0A0
जब कस्टम रजिस्टरों पढ़ने (एमुलेटर का प्रयोग करके): $DFC000
के रूप में अच्छा के रूप में है $DFF000
एक कस्टम चिप आधार पते के रूप में, और कुछ खेल (रा के उदाहरण अभिशाप के लिए) वैकल्पिक कस्टम आधार पते का उपयोग करें (का अभिशाप रा का उपयोग करता है $DFE000
), शायद हैकर्स को भ्रमित करने के लिए, या बस मूल होने के लिए।
अब जब मैं $DFC5A0
(वास्तविक जीवन का उदाहरण) के लिए 32-बिट मान लिखता हूं , तो पता कस्टम रजिस्टरों में बदल जाता है $1A0
और $1A2
जो रंग रजिस्टर 16 और 17 हैं ( $5A0
नकाबपोश हैं $1A0
, केवल $ 100 16 बिट कस्टम रजिस्टर हैं, किसी भी उच्च बिट को अनदेखा किया जाता है) ), इसलिए उस मामले में, ऑडियो रजिस्टर नहीं लिखा गया है, इसके बजाय रंग रजिस्टर लिखे गए हैं, इसलिए ध्वनि दिनचर्या में वास्तव में एक बग है।
अब इसमें विजुअल का प्रभाव क्यों नहीं है? क्योंकि रंग रजिस्टरों को लिखने का आमतौर पर कोई प्रभाव नहीं पड़ता है: अधिकांश ताम्रकार उन बीम के प्रत्येक प्रारंभ में ओवरराइट करते हैं, प्रत्येक 20ms में PAL। यह पृष्ठभूमि के रंग के लिए ध्यान देने योग्य हो सकता है (पृष्ठभूमि संक्षेप में फ्लैश होगी) लेकिन अग्रभूमि के रंगों के लिए यह मुश्किल से दिखाई देगा या अदृश्य भी होगा।
इसलिए अब मुझे सिर्फ यह तय करना है कि क्या मैं उस मामले में (मूल खेल की तरह) कोई कार्रवाई नहीं करता हूं या यदि मैं एक वैध ऑडियो चैनल का चयन करने के लिए मान रखता हूं और यह देखता हूं कि क्या यह ध्वनि को बदलता है, और शायद एक दीर्घकालिक बग को सही करता है? खेल।