หากใครเคยเขียนภาษา BASIC ในยุคก่อน อาจคุ้นเคยกับคำสั่ง REM (Remark) ที่ใช้สำหรับเขียนคอมเมนต์อธิบายโค้ดและไม่มีผลต่อการทำงานของโปรแกรม แต่สำหรับเครื่องคอมพิวเตอร์รุ่นเก๋าอย่าง Exidy Sorcerer ในปี 1980 นักพัฒนากลับใช้ช่องทางนี้ในการ "ซ่อน" และ "รัน" ภาษาเครื่องได้อย่างเหนือชั้น
บล็อกเกอร์นามว่า Beej ได้พาเราย้อนอดีตไปเจาะลึกโค้ดของเกมเก่าแก่ชื่อ "The Wizard's Castle" ซึ่งเผยให้เห็นการทำงานสุดแปลกในบรรทัดที่ 10 ซึ่งระบุว่า "10 REM"_(C2SLFF4" และบรรทัดที่ 40 ที่มีการใช้คำสั่ง POKE และฟังก์ชัน USR(0) เพื่อนำค่าที่ได้ไปใช้เป็น Seed สำหรับการสุ่มตัวเลขในบรรทัดที่ 80
คำถามคือ ตัวเครื่องรู้ได้อย่างไรว่าต้องไปเรียกโปรแกรมภาษาเครื่องจากที่ไหน? คำตอบอยู่ที่การบริหารจัดการหน่วยความจำอันจำกัดของคอมพิวเตอร์ในยุคนั้น โดยปกติแล้วคำสั่งแรกของ BASIC ในเครื่อง Sorcerer จะถูกเก็บไว้ที่แอดเดรส (Address) 469 เสมอ ซึ่งโครงสร้างของบรรทัดคำสั่ง REM จะประกอบด้วยพอยน์เตอร์ เลขบรรทัด และโทเค็นคำสั่ง REM รวม 5 ไบต์ ทำให้ตัวอักษรแรกในคอมเมนต์จะเริ่มเก็บที่แอดเดรส 474 เสมอ
เมื่อพิจารณาคำสั่งในบรรทัดที่ 40 คือ "POKE 260,218" และ "POKE 261,1" ระบบจะคำนวณแอดเดรสปลายทางโดยการนำค่าในไบต์สูง (High Byte) คูณด้วย 256 แล้วบวกกับไบต์ต่ำ (Low Byte) ซึ่งก็คือ (256 * 1) + 218 เท่ากับ 474 พอดี! ส่งผลให้ฟังก์ชัน USR กระโดดไปรันรหัสเครื่องที่ซ่อนอยู่ในคำสั่ง REM บรรทัดแรกได้อย่างแม่นยำ ถือเป็นเทคนิคการแฮกฮาร์ดแวร์และซอฟต์แวร์ที่น่าทึ่งในยุคคอมพิวเตอร์ 8 บิต
🏷️ หมวดหมู่: Retrocomputing, basic, exidy sorcerer, z80
🔗 อ่านบทความฉบับเต็ม: hackaday
