ใน Amiga จะเกิดอะไรขึ้นเมื่อฉันเขียนถึง $ DFC5A0 โดยไม่ได้ตั้งใจ
ฉันกำลังแก้ไขเกม (TV Sports Basketball) ที่พยายามเขียนข้อมูลเสียง (โดยใช้ช่วง$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
นอกจากนี้ยังขึ้นอยู่กับตำแหน่งหน่วยความจำของการขยายหน่วยความจำ (การใช้หน่วยความจำชิปเพียงอย่างเดียวจะไม่ทำให้เกิดข้อผิดพลาด)
ฉันรู้ว่าระบบที่อยู่ Amiga มีมาสก์สำหรับรีจิสเตอร์ที่กำหนดเองและ CIA และบางทีมันอาจจะเขียนไปยังที่อยู่ที่ถูกต้อง (ฉันสงสัยว่ามัน$D50
เป็นค่าฐานสำหรับดัชนีช่อง ... ) แต่ถ้าฉันแก้ไขปัญหาโดย การลบการเขียนเมื่อดัชนีอยู่นอกช่วงอาจเป็นไปได้ว่าเสียงจะไม่ทำงานในขณะที่มันใช้งานได้กับที่อยู่ปลอมนั้น
ตัวอย่างเช่นถ้าฉันเขียนบางอย่างไป$DFC09A
มันมีผลกับ$DFF09A
(INTENA ง่ายกว่าในการตรวจสอบกับรีจิสเตอร์นี้ซึ่งมีคู่แบบอ่านอย่างเดียว) แต่ถ้าฉันเขียนถึง$DFC59A
มันจะไม่มีผลกับ INTENA
ฉันไม่ต้องการออกจากที่อยู่ปลอมอย่างที่เป็นอยู่เพราะมันละเมิดเค้าโครงหน่วยความจำ มีสูตรในการปิดบังที่อยู่นี้และกลับมาอยู่ใน$DFF0A0 - $DFF0D0
ช่วงนี้หรือไม่?
คำตอบ
หมายเหตุ: ฉันกำลังตอบคำถามของตัวเองหลังจากค้นคว้าและทดลองเพิ่มเติม
$DFF000
ฐานเป็นชิปที่กำหนดเองอยู่ฐานทะเบียนแนะนำโดยพลเรือจัตวา
แต่ที่อยู่ฐานอื่น ๆ อีกมากมายใช้งานได้ บรรทัดที่อยู่บางบรรทัดเลือกฐานชิปที่กำหนดเองและบางบรรทัดจะถูกละเว้น
พื้นที่ที่อยู่ชิปที่กำหนดเองDF0000-DFFFFF
จึงเป็นฐานที่เหมือนการ$DFx000
ทำงาน
สิ่งนี้ได้รับการยืนยันโดยทำการทดสอบบางอย่างบนโปรแกรมจำลอง WinUAE ซึ่งมีความเชื่อมั่นในแง่มุมเหล่านั้นมากและมีความสามารถที่น่าสนใจในการอ่านสิ่งที่เขียนในการลงทะเบียนโดยใช้ดีบักเกอร์ภายใน
ดังนั้นถ้าผมเขียน$12345678
ใน$DFC0A0
ตัวอย่างเช่น$12345678
จะปรากฏใน$DFF0A0
เมื่ออ่านลงทะเบียนที่กำหนดเอง (โดยใช้โปรแกรมจำลอง): $DFC000
เป็นดี$DFF000
เป็นที่อยู่ฐานชิปที่กำหนดเองและบางเกม (เช่นคำสาปของ Ra) ใช้ที่อยู่ฐานที่กำหนดเองอื่น (คำสาปของ Ra ใช้$DFE000
) อาจเพื่อสร้างความสับสนให้กับแฮ็กเกอร์หรือเพื่อให้เป็นต้นฉบับ
ตอนนี้เมื่อฉันเขียนค่า 32 บิตเป็น$DFC5A0
(ตัวอย่างในชีวิตจริง) ที่อยู่จะแปลเป็นรีจิสเตอร์ที่กำหนดเอง$1A0
และ$1A2
ซึ่งเป็นรีจิสเตอร์สี 16 และ 17 ( $5A0
ถูกปกปิด$1A0
มีรีจิสเตอร์ที่กำหนดเองเพียง $ 100 16 บิตบิตที่สูงกว่าจะถูกละเว้น ) ดังนั้นในกรณีนี้จะไม่มีการเขียนทะเบียนเสียงการลงทะเบียนสีจะถูกเขียนแทนดังนั้นจึงมีข้อบกพร่องในรูทีนเสียงจริงๆ
ทำไมมันไม่มีเอฟเฟกต์ของภาพล่ะ? เนื่องจากการเขียนลงทะเบียนสีมักจะไม่มีผล: รายการทองแดงส่วนใหญ่จะเขียนทับสิ่งเหล่านี้ในแต่ละจุดเริ่มต้นของลำแสงทุกๆ 20ms ใน PAL สามารถสังเกตเห็นได้ชัดเจนสำหรับสีพื้นหลัง (พื้นหลังจะกะพริบสั้น ๆ ) แต่สำหรับสีเบื้องหน้านั้นแทบจะมองไม่เห็นหรือมองไม่เห็น
ตอนนี้ฉันต้องตัดสินใจว่าฉันจะไม่ดำเนินการใด ๆ ในกรณีนั้น (เช่นเกมต้นฉบับ) หรือถ้าฉันปิดบังค่าเพื่อเลือกช่องเสียงที่ถูกต้องและดูว่ามันเปลี่ยนเสียงหรือไม่และอาจจะแก้ไขข้อผิดพลาดในระยะยาว เกม.