ใน Amiga จะเกิดอะไรขึ้นเมื่อฉันเขียนถึง $ DFC5A0 โดยไม่ได้ตั้งใจ

Aug 18 2020

ฉันกำลังแก้ไขเกม (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ช่วงนี้หรือไม่?

คำตอบ

9 Jean-FrançoisFabre Aug 19 2020 at 04:36

หมายเหตุ: ฉันกำลังตอบคำถามของตัวเองหลังจากค้นคว้าและทดลองเพิ่มเติม

$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 สามารถสังเกตเห็นได้ชัดเจนสำหรับสีพื้นหลัง (พื้นหลังจะกะพริบสั้น ๆ ) แต่สำหรับสีเบื้องหน้านั้นแทบจะมองไม่เห็นหรือมองไม่เห็น

ตอนนี้ฉันต้องตัดสินใจว่าฉันจะไม่ดำเนินการใด ๆ ในกรณีนั้น (เช่นเกมต้นฉบับ) หรือถ้าฉันปิดบังค่าเพื่อเลือกช่องเสียงที่ถูกต้องและดูว่ามันเปลี่ยนเสียงหรือไม่และอาจจะแก้ไขข้อผิดพลาดในระยะยาว เกม.