เรื่องราวของคำสั่ง 68030 ที่ไม่ถูกต้องซึ่งทำให้ Mac Classic II บูตได้
- Apple ทำพลาดใน ROM ของ Macintosh Classic II ซึ่งอาจขัดขวางการบูตได้ อย่างไรก็ตาม CPU Motorola MC68030 ได้รันคำสั่งที่ไม่ได้กำหนดไว้ ทำให้หลีกเลี่ยงการแครชและบูตสำเร็จ
MAME และการอีมูเลต Mac
- MAME เป็นอีมูเลเตอร์ที่รองรับเกมอาร์เคดหลากหลายเกม และได้รับการประเมินว่าเป็นหนึ่งในอีมูเลเตอร์สำหรับ Mac รุ่นที่ใช้ 68000 ที่สมบูรณ์ที่สุด
- ผู้เขียนต้องการใช้ MAME เพื่อแก้ปัญหาของ Mac Classic II และพบว่าสามารถบูตได้ตามปกติในโหมดที่อยู่แบบ 24 บิต แต่ล้มเหลวในโหมดที่อยู่แบบ 32 บิต
โหมดที่อยู่ 24 บิต vs 32 บิต
- โปรเซสเซอร์ Motorola 68000 มีสายที่อยู่ 24 เส้น และ Apple ใช้ 8 บิตที่เหลือสำหรับเก็บแฟล็ก
- เครื่องและโปรเซสเซอร์รุ่นใหม่รองรับพื้นที่แอดเดรสแบบ 32 บิต และเพื่อแก้ปัญหาความเข้ากันได้จึงมีการจัดเตรียมไว้สองโหมด
การวิเคราะห์สาเหตุของปัญหา
- เพื่อค้นหาว่าเหตุใด Classic II จึงบูตล้มเหลวในโหมด 32 บิตบน MAME ผู้เขียนได้ใช้ดีบักเกอร์เพื่อติดตามโค้ด
- ตามเอกสารทางเทคนิคของ Apple ค่า 0000000F หมายถึงมีการเกิดข้อยกเว้น และ 00000001 หมายถึง bus error
การวิเคราะห์โค้ดใน ROM
- พบคำสั่งที่เข้าถึงแอดเดรสที่ไม่ถูกต้องในโค้ดของ ROM
- คำสั่งนี้เก็บแอดเดรสที่ไม่ถูกต้องไว้ในรีจิสเตอร์ A1 และทำให้เกิดข้อผิดพลาด Sad Mac
ความแตกต่างจากฮาร์ดแวร์จริง
- บนฮาร์ดแวร์จริง คำสั่งที่ไม่ถูกต้องดังกล่าวจะเปลี่ยนค่าของ A1 ให้กลายเป็นแอดเดรสที่ใช้งานได้
- อีมูเลเตอร์ของ MAME จัดการคำสั่งนี้ได้ไม่ถูกต้อง จึงทำให้ A1 ยังคงเป็นแอดเดรสที่ไม่ถูกต้อง
บทสรุป
- Apple ไม่ได้ตระหนักถึงบั๊กที่อาจเกิดขึ้นใน ROM ของ Classic II และคำสั่งที่ไม่ถูกต้องของ 68030 ได้ซ่อนปัญหานี้ไว้
- MAME แก้ปัญหานี้โดยแพตช์บั๊กใน ROM เพื่อให้ Classic II บูตได้
- กรณีนี้แสดงให้เห็นว่าอีมูเลเตอร์สามารถค้นพบข้อเท็จจริงใหม่เกี่ยวกับฮาร์ดแวร์ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
แบ่งปันประสบการณ์การค้นพบคำสั่งที่ไม่มีการบันทึกไว้ของ MC68030 โดยคำสั่งนี้จะเปลี่ยนค่าของรีจิสเตอร์ A1 และทำ bus cycle แบบ read-modify-write
กล่าวถึงว่ามีรายงานบั๊กเกี่ยวกับการ emulation ของคำสั่ง CAS อยู่มาก
แบ่งปันความทรงจำเกี่ยวกับ Amiga 2000 และโปรเซสเซอร์ 68000
CPU ส่วนใหญ่มีคำสั่งที่ไม่มีการบันทึกไว้ และ 68k ก็ไม่ใช่ข้อยกเว้น
จำเป็นต้องพยายามทำความเข้าใจพฤติกรรมที่แน่นอนของคำสั่งที่ไม่มีการบันทึกไว้ของ MC68030
ชื่นชมประสิทธิภาพของ UI ดีบักเกอร์บน Mac
สงสัยว่าคำสั่งนี้ถูกใช้เพื่อจุดประสงค์ด้านการป้องกันการคัดลอกหรือไม่ และเกิดขึ้นบน 68030 ทุกตัวหรือเปล่า
สงสัยว่า '040/060 รองรับ "คำสั่งที่ไม่มีการบันทึกไว้" นี้ด้วยหรือไม่