- Mac Classic II เกือบจะเขียนไปยังแอดเดรสที่ผิดพลาดจาก บั๊กกระโดดออกนอกขอบเขต ใน ROM แต่ CPU Motorola MC68030 จริงกลับรันคำสั่งที่ไม่มีเอกสารอธิบายและเปลี่ยนรีจิสเตอร์ A1 ทำให้หลีกเลี่ยงการแครชได้
- ปัญหานี้ถูกเปิดเผยเมื่อเปิดใช้ การกำหนดแอดเดรส 32 บิต ในอีมูเลชัน Classic II ของ MAME โดยจะขึ้น Sad Mac และ Chimes of Death ขณะที่ในโหมดกำหนดแอดเดรส 24 บิตจะดูเหมือนบูตได้ตามปกติ
- เส้นทาง
InstallSoundIntHandler ใน ROM นำ BoxFlag 17 ของ Classic II ไปใช้กับตารางสาขาที่มี 16 รายการ ทำให้กระโดดไปยัง 0x40A43B94 ซึ่งตำแหน่งนี้เดิมเป็นกลางคำสั่ง MOVEA.L
- ชุดไบต์
0C EC 08 A9 00 04 คล้ายกับ CAS D1,D2,$0004(A4) แต่เป็น คำสั่งตระกูล CAS ที่ไม่ถูกต้อง เพราะมีการตั้งค่าบิตสงวนไว้ และบน 68030 จริงมันเปลี่ยนค่า A1 จาก FFFF8FBA เป็น 40A4BBB2
- เมื่อตรวจสอบกับเครื่อง Classic II จริงโดยใช้ ROM ดัดแปลง 3 แบบ พบว่าถ้าลบคำสั่งนี้ด้วย NOP ฮาร์ดแวร์จริงก็จะล้มเหลวพร้อม Sad Mac เช่นกัน และ MAME จึงต้องเลี่ยงด้วยการแพตช์ ROM ชั่วคราวจนกว่าจะรู้พฤติกรรมที่ถูกต้อง
การบูตล้มเหลวของ Classic II ที่ถูกเปิดเผยใน MAME
- MAME เป็นที่รู้จักกันดีในฐานะอีมูเลเตอร์เกมอาร์เคด แต่ก็รองรับการอีมูเลต Mac รุ่นที่ใช้ 68000 ด้วย
- ระหว่างแก้ไขฟังก์ชันใน MAME ที่ใช้เรียกดีบักเกอร์ด้วยคีย์ลัด command+power ก็พบพฤติกรรมแปลกใน Classic II
- Classic II มีปุ่มอินเทอร์รัปต์จริง และยังมีไมโครคอนโทรลเลอร์ “Egret” 68HC05 ที่จัดการคีย์บอร์ด เมาส์ และอื่น ๆ
- ใน MacsBug มีโค้ดที่ส่งคำสั่งเพื่อเปิดใช้งานคีย์ลัด command+power
- Classic II บูตได้ปกติใน โหมดกำหนดแอดเดรส 24 บิต แต่เมื่อเปิด โหมดกำหนดแอดเดรส 32 บิต ที่จำเป็นต่อการโหลด MacsBug จะขึ้น Sad Mac และ Chimes of Death
- ตามเอกสาร Apple Tech Info Library รหัส Sad Mac
0000000F หมายถึง exception และ 00000001 หมายถึง bus error
- บน Mac ตระกูล 68k นั้น bus error มักหมายถึงการเข้าถึงแอดเดรสที่ผิด เช่น การพยายามเข้าถึงการ์ดขยายที่ไม่มีอยู่จริง
แกะรอย ROM: เส้นทางเริ่มต้น sound interrupt
- ในดีบักเกอร์ของ MAME มีการตั้ง breakpoint ที่แอดเดรสตัวจัดการ bus error
0x40A026F0 แล้วไล่เส้นทางการเรียกด้วย ROM symbol map
- แอดเดรสนี้ถูกระบุเป็น
GenExcps ใน ROM map
- รูทีนจัดการข้อผิดพลาดร่วมถูกระบุชื่อว่า
ToDeepShit
- คำสั่งที่ทำให้เกิด bus error คือโค้ดต่อไปนี้ที่
0x40A43B9C
move.b #$90, ($1c00,A1)
- โค้ดนี้อยู่ในรูทีนที่ ROM map ระบุชื่อว่า
InstallSoundIntHandler และเกี่ยวข้องกับการเริ่มต้น sound interrupt ของ Classic II
- จริง ๆ แล้ว Classic II มีสถาปัตยกรรมใกล้กับตระกูล Macintosh LC มากกว่า Macintosh Classic ดั้งเดิม และใช้ EAGLE gate array ที่คล้ายกับชิป V8 ของ LC
- นี่จึงเป็นเหตุผลที่ในโค้ด ROM มีชื่ออย่าง
V8SndIntPatch1
- EAGLE มีฟังก์ชันที่เทียบได้กับ Apple Sound Chip (ASC) เวอร์ชันย่อส่วนอยู่ภายใน
ปัญหาตารางสาขาที่ผิดพลาดและรีจิสเตอร์ A1
V8SndIntPatch1 ใช้ตัวเลือก gestaltHardwareAttr ของ Gestalt trap หรือก็คือ 'hdwr' เพื่อตรวจสอบคุณสมบัติของฮาร์ดแวร์
- ถ้าไม่มีบิต
gestaltHasASC ก็จะคืนค่าทันที
- ใน Classic II มีการตั้งค่าบิต
gestaltHasASC ไว้
- หลังจากนั้นโค้ดจะอ่านค่า
BoxFlag จาก 0xCB3 ใน RAM แล้วใส่ลงใน D0
- ค่า
BoxFlag ของ Classic II คือ 0x11 หรือ 17
- โค้ดสาขาที่เป็นปัญหาจะคูณ D0 เป็นสองเท่าแล้วใช้เป็นออฟเซ็ตกระโดดแบบ PC-relative
add.w d0,d0
jmp loc_40A43B72(pc,d0.w)
- เนื่องจากแต่ละคำสั่ง
BRA.S ยาว 2 ไบต์ จึงออกแบบให้คูณค่า BoxFlag เป็นสองเท่าเพื่อนำไปใช้เป็นดัชนีของตารางสาขา
- แต่ตารางจริงมีเพียง 16 รายการสำหรับ BoxFlag 0~15 เท่านั้น และค่า 17 ของ Classic II จึงอยู่นอกขอบเขต
- เป้าหมายการกระโดดที่คำนวณได้คือ
0x40A43B72 + 0x22 = 0x40A43B94
- ตำแหน่งนี้ไม่ใช่จุดเริ่มต้นของคำสั่งที่ตั้งใจไว้ แต่เป็นกลางคำสั่ง
MOVEA.L
- เดิมที
MOVEA.L ควรจะโหลดแอดเดรสที่ถูกต้องเข้า A1 แต่เมื่อกระโดดเข้ากลางคำสั่ง A1 จึงคงค่าเดิมจากการคำนวณกระโดดแบบ relative ก่อนหน้าไว้ที่ 0xFFFF8FBA
- จากนั้นเมื่อรัน
move.b #$90, ($1c00,A1) แอดเดรสปลายทางสำหรับการเขียนจะกลายเป็น 0xFFFF8FBA + 0x1C00 = 0xFFFFABBA ซึ่งเป็นแอดเดรสที่ไม่ถูกต้องบน Classic II
พฤติกรรม 68030 ที่ไม่มีเอกสารอธิบาย
- ชุดไบต์ที่การกระโดดออกนอกขอบเขตไปถึงคือดังนี้
0C EC 08 A9 00 04
- ทั้ง IDA และ GNU objdump ไม่สามารถ disassemble ตำแหน่งนี้เป็นคำสั่งปกติได้อย่างถูกต้อง
- เมื่อนำชุดไบต์เดียวกันไปรันใน MacsBug บน Macintosh IIci มันถูกแสดงผลคล้าย
CAS.W D1,D2,$0004(A4) แต่หลังรันแล้วค่า A1 กลับเปลี่ยนไป
- A1 เปลี่ยนจาก
0xFFFF8FBA ไปเป็นค่าที่ดูเหมือนแอดเดรสใน RAM
- พบว่าค่า A1 ใหม่ขึ้นกับ A1 เดิม, A7 และ program counter
- ตาม Motorola M68000 Family Programmer’s Reference Manual เวิร์ดแรกดูคล้ายคำสั่ง CAS แต่ในเวิร์ดที่สองมีบิต 3 บิตที่ควรเป็น 0 กลับถูกตั้งเป็น 1
- เพราะฉะนั้นคำสั่งนี้จึงไม่ใช่ CAS ที่ถูกต้องตามเอกสาร แต่เป็น คำสั่งที่ไม่ถูกต้องซึ่งเปิดบิตสงวนไว้
- บน 68030 จริง CPU ไม่ได้จัดการคำสั่งนี้เป็น illegal instruction exception แต่กลับทำ read-modify-write bus cycle ที่
A4+4
- ถ้าตั้ง A4 เป็นแอดเดรสที่ไม่ถูกต้อง MacsBug จะแสดง bus error ระหว่างทำ read-modify-write ที่
A4+4
- และ A1 ซึ่งปกติไม่ควรถูกเปลี่ยนโดย CAS ที่ถูกต้อง ก็กลับถูกเปลี่ยนด้วย
การตรวจสอบกับฮาร์ดแวร์ Classic II จริง
- เพื่อพิสูจน์สมมติฐานนี้ ผู้เขียนได้ซื้อและซ่อม Classic II ที่ผลิตในปี 1991 แล้วเปลี่ยน ROM เป็น SST29EE010 EEPROM แบบโปรแกรมได้
- คาปาซิเตอร์แบบติดผิวบน Mac รุ่นเก่าอาจมีน้ำยารั่วที่กัดกร่อนได้ จึงต้องถอดและซ่อมก่อนจ่ายไฟ
- ใช้งาน logic board แยกจาก CRT และ analog board พร้อมใช้ตัวแปลง VGA ที่ทำจาก Raspberry Pi Pico เพื่อตรวจสอบภาพบนหน้าจอ
- มีการใส่โค้ดแอสเซมบลี 68030 สำหรับแสดงค่า A1 ลงในพื้นที่ว่างของ ROM แล้วสร้าง ROM ดัดแปลง 3 แบบ
- Custom ROM 1: แทนที่
MOVE.B ที่ 0x40A43B9C ซึ่งทำให้ Sad Mac ใน MAME ด้วยโค้ดแสดงค่า A1
- Custom ROM 2: แทนที่คำสั่งคล้าย CAS ที่
0x40A43B94 ซึ่งเป็นเป้าหมายของการกระโดดออกนอกขอบเขต ด้วยโค้ดแสดงค่า A1
- Custom ROM 3: แทนที่คำสั่งคล้าย CAS ที่
0x40A43B94 ด้วย NOP
- Custom ROM 1 แสดงว่าโค้ดจุดนี้ถูกรันบนฮาร์ดแวร์จริงเช่นกัน และค่า A1 ณ จุดที่ MAME แครชคือ
0x40A4BBB2
- ค่านี้เป็นแอดเดรสใน ROM จึงไม่เหมาะจะใช้เป็นปลายทางการเขียน แต่ถึงพยายามเขียนก็ไม่ทำให้เกิด bus error
- Custom ROM 2 แสดงว่า A1 ก่อนการกระโดดออกนอกขอบเขตมีค่า
0xFFFF8FBA ตรงกับที่เห็นใน MAME
- แปลว่าการกระโดดออกนอกขอบเขตเกิดขึ้นจริง
- และสอดคล้องกับสมมติฐานที่ว่าคำสั่งคล้าย CAS ที่ตามมาคือสิ่งที่เปลี่ยน A1
- Custom ROM 3 แสดงว่าเมื่อเอาคำสั่งคล้าย CAS ออก Classic II จริงก็ล้มเหลวพร้อม Sad Mac เช่นกัน
- ในการทดสอบนี้ ฮาร์ดแวร์จริงขึ้น Sad Mac เดียวกันแม้อยู่ในโหมด 24 บิต
- การที่ MAME ไม่ส่ง bus error กับการเขียนผิดพลาดในโหมด 24 บิต จึงเป็นพฤติกรรมที่ผ่อนปรนกว่าฮาร์ดแวร์จริง
ปัญหาที่ยังเหลืออยู่ใน MAME และวงการอีมูเลชัน
- พฤติกรรมที่ค้นพบนี้เป็นกรณีที่ คำสั่ง MC68030 ที่ไม่มีเอกสารอธิบาย ทำ read-modify-write bus cycle และยังเปลี่ยนรีจิสเตอร์ A1 ด้วย
- บั๊กใน ROM ของ Classic II ถูกซ่อนอยู่ได้เพราะพฤติกรรมนี้ และเครื่องจริงจึงทำงานได้ตามปกติ
- โค้ดชิ้นเดียวกันนี้ยังพบใน ROM ของ Macintosh IIvx ที่ใหม่กว่า แต่ใน ROM นั้นมีการขยายขนาด jump table และกรณีของ Classic II จะกระโดดไป
RTS ทันที
- ด้วยพฤติกรรมนี้ จึงดูมีความเป็นไปได้สูงว่ายังไม่มีอีมูเลเตอร์หรือ implementation โคลนของ Motorola MC68030 ที่สมบูรณ์แบบ 100%
- สามารถเขียนโค้ดสั้น ๆ ที่รันคำสั่งนี้แล้วตรวจค่า A1 เพื่อแยกแยะ 68030 จริงออกจากอีมูเลเตอร์ได้
- จนกว่าจะเข้าใจพฤติกรรมของคำสั่งนี้อย่างถูกต้อง MAME จึงเลือก แพตช์บั๊ก ROM ของ Classic II เพื่อให้บูตได้
- แยกอีกประเด็นหนึ่ง คีย์ลัด command+power ทำงานได้บน Classic II จริงเมื่อมีการติดตั้ง MacsBug แต่ใน MAME ยังใช้งานไม่ได้
1 ความคิดเห็น
ความเห็นจาก Hacker News
พฤติกรรมของ MC68030 ที่ค้นพบอาจไม่ใช่คำสั่ง “ของจริง” ที่ผู้ออกแบบ CPU ตั้งใจสร้างไว้ แต่เป็นผลจากการที่ลอจิกภายใน CPU เผลอทำงานเมื่อเจอกับ illegal instruction และได้รับอินพุตแบบ don’t-care
ปกติแล้ว CPU ควรตรวจจับ illegal instruction และโยน exception ออกมา แต่ดูเหมือนว่าในบางกรณีจะไม่เป็นเช่นนั้น
หน้า 8-9 ของ https://www.nxp.com/docs/en/reference-manual/MC68030UM.pdf ระบุว่ามีการนิยาม illegal instruction จากแพตเทิร์นบิตของ “word แรก”
คำสั่งครั้งนี้มี 3 word โดย word แรกถูกต้อง และบิตแปลกอยู่ใน word ที่สอง จึงมีความเป็นไปได้สูงว่า 68030 ไม่ได้ตรวจสอบ word ที่สอง แล้วเดินหน้าต่อด้วยลอจิกที่ใช้ implement คำสั่ง CAS
opcode ที่ “ใช้ได้” ก็เป็นเพียงชุดค่าผสมที่มีประโยชน์พอจะเขียนลงเอกสาร ส่วนชุดที่ “ใช้ไม่ได้” ก็คือค่าผสมที่ไร้ประโยชน์หรือไม่มีความหมาย
มองแบบนี้แล้ว illegal/mystery opcode ไม่ใช่ข้อยกเว้นที่น่าประหลาดใจ แต่แทบจะเป็นสิ่งที่หลีกเลี่ยงไม่ได้
ปกติคงคาดหวังว่าบิต 0 ที่ไม่มีความหมายตามเอกสารจะถูกเพิกเฉยไปทั้งหมด
แต่ใน 68030 บิตเหล่านั้นอาจจำเป็นต้องเป็น 0 จริง ๆ และถ้ามีบิตถูกเปิดขึ้นมา ก็อาจไปกระตุ้นลอจิกฮาร์ดไวร์ของคำสั่งอื่น เหมือน illegal opcode ของ 6502
CAS เป็นตัวปัญหามาโดยตลอด และน่าจะเป็นคำสั่งที่ผมได้รับบั๊กรายงานจากฝั่งอีมูเลชันมากที่สุดด้วย
เกม King of Fighters รุ่นเก่าเคยมีบั๊กที่ตรวจสอบ carry flag ของคำสั่ง SBCD “ผิด” และนำไปใช้กับการลดตัวจับเวลารอบและการจบรอบ
แม้จะเป็นพฤติกรรมที่ไม่ได้บันทึกไว้ แต่ถ้าไม่อีมูเลต arithmetic status flag ของการคำนวณเลขฐานสิบแบบไบนารี KOF ก็จะมีตัวจับเวลารอบวนจาก 00 กลับไป 99 ไม่จบเสียที
SNK นี่คือเทพแห่ง ชิป 68000 จริง ๆ
เป็นการเดินทางที่ยาวมากจริง ๆ
ทุกวันนี้ผมอาจไม่มีความอดทนจะมุดลงโพรงกระต่ายลึกขนาดนั้นแบบผู้เขียนแล้ว แต่ผมเข้าใจความ ภูมิใจจากการค้นคว้าจนรู้จริง ต่างจากแค่คิดว่าตัวเองรู้ได้มากเลย
ถึงจะใช้เวลามาก แต่ถ้าไปจนสุดทางได้ก็คุ้มค่ามากจริง ๆ
ผ่านมา 30 กว่าปีแล้ว ผมก็ยังทึ่งอยู่เสมอว่า UI ของดีบักเกอร์บน Mac สามารถมีประสิทธิภาพได้มากขนาดนั้นบนความละเอียดหน้าจอที่เล็กมาก
รู้สึกได้ถึงงานฝีมือจริง ๆ
CPU แทบทุกตัวมี คำสั่งที่ไม่ได้บันทึกไว้ในเอกสาร และ 68k ก็ไม่ใช่ข้อยกเว้น
เพียงแต่ในยุคนั้น คนที่มีทั้งความสนใจและความรู้ระดับล่างพอจะขุดเรื่องแบบนี้ ส่วนใหญ่ไปโฟกัสที่ x86/PC กันหมด ซึ่ง x86/PC ก็อาจถือได้ว่าเป็นสถาปัตยกรรมที่เปิดกว้างและเสถียรกว่าฝั่ง Apple มาก
ไมโครโค้ดของ 8088 และ 8086 ถูก disassemble เมื่อไม่กี่ปีก่อนและมีการศึกษากันมากพอสมควร รวมถึงมีความพยายามทำ simulation ระดับทรานซิสเตอร์ด้วย
โครงสร้างของพื้นที่ opcode บน x86 ก็ถูกสำรวจไว้อย่างละเอียดในเอกสารอย่าง
http://ref.x86asm.net/geek.html
https://gist.github.com/seanjensengrey/f971c20d05d4d0efc0781...
ตอนนี้ยังไม่รู้แน่ชัดว่าคำสั่งนี้ทำอะไรเป๊ะ ๆ
จากการทดสอบอย่างจำกัด ดูเหมือนว่าค่าผลลัพธ์ของ A1 จะขึ้นกับค่าเดิมของ A1, ค่า A7 และ program counter แต่ก็ยังไม่แน่นอน
ถ้ามีใครทำโปรแกรมที่ลองใส่ค่าหลาย ๆ แบบให้กับรีจิสเตอร์และข้อมูลในหน่วยความจำเพื่ออนุมานพฤติกรรมที่แน่ชัดได้ ก็อาจทำให้อีมูเลชันแม่นยำขึ้นอีก
ตอนนี้ MAME ยังแพตช์บั๊กนี้ใน ROM เพื่อให้ Classic II บูตได้ไปก่อน จนกว่าจะมีคนเห็นว่ามันคุ้มค่าพอจะขุดต่อ
โดยส่วนตัวผมคิดว่ามันคุ้มค่าพอที่จะศึกษาให้ชัดเพื่อ ความแม่นยำของอีมูเลชัน
ผมไม่ได้คุ้นกับ 68k มากนัก แต่บิตของคำสั่งให้เบาะแสอยู่ สมมติฐานหนึ่งคือบิต 5:3 ของ word ที่สองดูคล้าย mode field อีกชุดหนึ่ง และแทนที่จะเป็นโหมด 000 เพื่อเลือก Dn register กลับกลายเป็นว่า 101 ใช้เลือก (d16, An) อีกครั้ง ส่วนฟิลด์ Dc ที่มีค่า 001 ก็อาจถูกตีความเป็น A1
68030 เป็น CPU เอนกประสงค์ที่ยอดเยี่ยมมากตัวหนึ่งในยุคนั้น และยังถูกใช้ใน Amiga 3000, Atari Falcon, Sun 3, NeXT Cube ฯลฯ ด้วย
ฝั่งเดโมซีนยังคงหมกมุ่นกับคอมพิวเตอร์บ้าน 8 บิตอยู่ ส่วนคนที่ใช้ระบบ 16 บิตในบ้านก็มักโฟกัสไปที่ Atari กับ Amiga
ที่ PC และ x86 เริ่มบูมในบ้านกันจริง ๆ คือหลังจากที่ VGA และการ์ดเสียง กลายเป็นองค์ประกอบมาตรฐานของ PC
ตอนเด็ก ๆ ผมเคยมี Amiga 2000 ที่ใช้โปรเซสเซอร์ 68000
ตอนที่ได้ยินข่าว 68020 หรือ 68030 ผมตื่นเต้นมาก และหลังจากนั้นก็รู้สึกแบบเดียวกันกับสถาปัตยกรรม RISC
เวลาให้ Amiga พูดประโยคอย่าง “Hello, how are you?” ด้วยเสียงเหมือนหุ่นยนต์ เพื่อน ๆ จะตื่นตะลึงกันเหมือนเพิ่งไปดวงจันทร์มา
ไม่เคยนึกเลยว่าไม่ถึง 40 ปีต่อมา เราจะได้คุยกับคอมพิวเตอร์ด้วยภาษาธรรมชาติผ่าน LLM และใช้ Python, VS Code กับ LLM เป็นเครื่องมือทำงานอัตโนมัติแทบทุกอย่างที่ต้องการ
เป็นยุคที่บ้าคลั่งจริง ๆ
คิดถึง ตระกูล 68000
มันเป็นชิปที่ยอดเยี่ยมจริง ๆ
มันชัดเจนและมีเหตุมีผลอย่างที่งานวิศวกรรมที่ดีควรจะเป็น แค่อ่านผ่าน ๆ ก็เข้าใจได้ทันทีว่าเกิดอะไรขึ้น
ตรงกันข้าม แอสเซมบลี x86 ส่วนใหญ่ดูเหมือนกองลูกเล่นแปลก ๆ ที่คนฉลาดฝืนเขียนออกมาหลังอดนอนมาทั้งคืน
แนวคิดแบบเอารีจิสเตอร์มาลบกับตัวเองเพื่อให้ได้ 0 นี่เกินไปจริง ๆ
สงสัยว่านี่เป็น การป้องกันการคัดลอก เพื่อไม่ให้รันบนบางระบบโดยเฉพาะ หรือเป็นอาการที่เกิดขึ้นบน 68030 ทุกตัว
รายการสำหรับเครื่องนั้นหายไปจาก jump table ที่เกี่ยวข้อง และน่าจะเป็นไปได้ว่าทีมที่ทำ ROM ลืมเพิ่มรายการใหม่กันหมด แต่กลับทำงานได้แม้ไม่มีรายการในตารางโดยบังเอิญล้วนๆ
บน Mac ยุคปัจจุบัน เรื่องแบบนี้ดูเหมือนจะเป็นไปไม่ได้อีกต่อไป
ทุกวันนี้ เอกสารทางเทคนิค ของ Apple แย่มาก
ไม่ได้เปิด system bus ออกมาเป็นคอนเน็กเตอร์ให้ผู้ใช้เสียบการ์ดและให้นักพัฒนาภายนอกโต้ตอบกับฮาร์ดแวร์โดยตรงเหมือนเมื่อก่อน
บน Mac ยุคใหม่ สิ่งที่โปรแกรมใน user space จัดการได้มี USB กับ Thunderbolt
แน่นอนว่าไม่ได้ปฏิเสธว่าเอกสารของ API บางส่วนใน macOS รุ่นใหม่ก็ห่วยมาก
ถ้าไปเจอหน้าเก่าที่มีหัวเว็บเป็นไล่เฉดสีน้ำเงินและเขียนว่า “Apple documentation archive” ก็จะรู้ทันทีว่าคุณได้เจอของดีเข้าแล้ว
address space ใหญ่กว่ามาก และที่อยู่ส่วนใหญ่ก็ไม่ได้ถูกแมปไว้ ดังนั้นถ้าทำ memory operation ไปยังที่อยู่ขยะก็มักจะล้มเหลว และคำสั่งที่ไม่ถูกต้องก็น่าจะล้มเหลวเช่นกัน
บั๊กที่ไปอ่าน jump table ด้วยดัชนีนอกช่วงแบบนี้ยังเกิดในซอฟต์แวร์สมัยใหม่ได้ แต่แทนที่จะวิ่งต่อแบบในกรณีนี้ โปรเซสน่าจะตายมากกว่า
อ้างอิงเพิ่มเติมคือ WebAssembly มี linear address space เดียวและทุกที่อยู่สามารถอ่านและเขียนได้ จึงมีโอกาสเกิดบั๊กประเภทนี้ได้มากกว่า
ถ้าที่อยู่ขยะยังอยู่ในช่วง ก็อาจอ่าน เขียน หรือทำ CAS ผิดที่แล้วรอดต่อไปได้
แต่คำสั่งที่ไม่ถูกต้องแบบในบทความต้นฉบับจะทำให้โหลดโมดูล WASM ไม่สำเร็จ ดังนั้นจึงไม่เหมือนกับปัญหาใน Mac ROM นี้แบบ 1:1
สงสัยว่า 040/060 รองรับ “คำสั่งที่ไม่มีเอกสาร” นี้ด้วยหรือไม่
A1 ไม่ได้ถูกแตะเลย และแม้จะไม่ได้ทดสอบต่อ แต่ก็อาจเป็นไปได้ว่ามันแค่ถูกจัดการเป็น CAS ปกติ
ตอน step คำสั่งนี้ครั้งแรกใน MacsBug บน LC 475 ระบบเกิด system error แต่หลังจากนั้นก็ไม่มีปัญหา
เป็นผลจากการทดสอบอย่างรวดเร็วมากกับ instruction word นั้นเพียงอย่างเดียว