a5k - Another World / Out of This World ที่พอร์ตไปยัง FPGA
(github.com/sylefeb)- เป็น โปรเจกต์อุทิศส่วนตัว ที่นำ VM, blitter และ rasterizer ของ Another World / Out of This World ไปใช้งานบนฮาร์ดแวร์ FPGA โดยไม่ใช้ CPU มาตรฐาน
- การออกแบบหลักประกอบด้วยการสร้าง VM ให้เป็นโปรเซสเซอร์คัสตอมจริง และรวม blitter ที่รับผิดชอบการคัดลอก·เติมข้อมูลระหว่าง framebuffer, rasterizer สำหรับวาด polygon และการอัปเดต display เข้าเป็น SOC
- SPRAM ขนาด 128KB ของ Lattice UP5K พอดีกับ framebuffer 320x200 แบบ 4 บิตจำนวน 4 ชุด โดย SPRAM แต่ละบล็อกขนาด 32KB จะสอดคล้องกับ framebuffer หนึ่งชุด เป็น การจัดวางหน่วยความจำ
- ข้อมูลเกมไม่ได้รวมอยู่ใน repository และต้องคัดลอก
BANK01~BANK0DกับMEMLIST.BINไปไว้ในโฟลเดอร์GAMEDATAจึงจะใช้แพ็กเกจข้อมูลและ bitstream ได้ - วิธีรันรองรับทั้ง simulation และบอร์ดจริง
- simulation สามารถรัน intro ได้ด้วย
make simul1หลังติดตั้ง Silice - ฮาร์ดแวร์รองรับ icebreaker + VGA PMOD, mch2022 badge และ ULX3S HDMI
- มี bitstream ที่ build ไว้ล่วงหน้ารวมอยู่ด้วย แต่ข้อมูลเกมต้องจัดหาแยกต่างหาก
- simulation สามารถรัน intro ได้ด้วย
- การรัน VM จะดึงคำสั่งและ operand จากหน่วยความจำ SPI และเพื่อลด latency จะอ่าน 64 ไบต์เข้า cache BRAM ขนาดเล็กก่อน
- เส้นทางกราฟิกใช้ framebuffer 4 ชุด, double buffering, การจำกัดการเข้าถึงในช่วง
vblankและการไกล่เกลี่ยการเข้าถึง framebuffer ของ blitter กับ rasterizer - rasterizer วาด convex polygon ของ Another World เป็น horizontal span และเพื่อเอฟเฟกต์ความโปร่งใส สามารถอ่านและแก้ไขค่าพิกเซลเดิม หรือคัดลอกพิกเซลจาก source framebuffer อื่นได้
- การเรนเดอร์ข้อความและบางฉากหลังของ part 6 จัดการโดยเก็บ pixel buffer ที่เรนเดอร์ไว้ล่วงหน้าใน ROM เนื่องจากงบ LUT ที่เหลือมีจำกัด แล้วคัดลอกผ่านเส้นทาง
op_drawString - ข้อจำกัดและงานที่เหลือที่ระบุไว้คือ ยังไม่มีเสียง·เพลง, ต้องใช้ bitstream และ data pack แยกตาม part, ยังตรวจสอบการเล่นทั้งเกมไม่เสร็จ, การปรับ timing ที่เร็วกว่าต้นฉบับ และการสำรวจวิธีเชื่อมต่อระหว่าง part
- ไลเซนส์คือ Silice design ใช้ MIT License, เอกสารใช้ CC BY-NC-SA 4.0, พอร์ต C++ ที่แก้ไขแล้วยังคง GPL เดิม และข้อมูลเกมอยู่ภายใต้ลิขสิทธิ์
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
นั่นเป็นครั้งแรกที่ได้เห็นคัตซีนแอนิเมชันเต็มรูปแบบแบบนั้นบน Sega และมันน่าทึ่งมาก แน่นอนว่ากราฟิกพัฒนาไปไกลกว่านั้นแล้ว แต่รู้สึกว่า Another World ก็ยังยืนหยัดในเชิงศิลปะได้ดีมากจนถึงทุกวันนี้ มีสไตล์ที่ชัดเจนมาก และตอนกลับไปเล่นอีกครั้งเมื่อราว 1 ปีก่อนก็ยังประทับใจเหมือนเดิม
ปริศนาหลายส่วนค่อนข้างเป็นการลองผิดลองถูก และตัวเกมก็สั้นมาก แต่ก็ไม่มีอะไรที่อยากให้เปลี่ยน ถ้าเป็นแฟน Another World ก็ขอแนะนำ Flashback: The Quest for Identity ด้วย มีบรรยากาศแบบภาพยนตร์คล้ายกัน ตอนแรกไม่ค่อยชอบเท่าไร แต่ในช่วง 10 ปีที่ผ่านมาเริ่มชอบมันมากขึ้นเรื่อย ๆ
แต่ถึงอย่างนั้น Another World ก็เป็นงานศิลปะชิ้นหนึ่ง โปสเตอร์เกมดูเหมือนภาพสีน้ำมันและสวยมากจริง ๆ [1]
[1] http://www.anotherworld.fr/download/AnotherWorld_Poster.jpg
งาน reverse engineering และพอร์ตเป็น JavaScript ของ Infernal Runner สำหรับ Amstrad CPC โดย cyxx เป็นผลงานของผู้สร้าง Another World และทั้งสองเกมใช้โครงสร้างแบบ virtual machine: https://github.com/cyxx/infernal_js
งานบรรยาย The Virtual Machine Architecture of Infernal Runner โดย Norbert Kehrer เป็นการบรรยายภาษาเยอรมันพร้อมสไลด์ภาษาอังกฤษ: https://media.ccc.de/v/vcfb20_-146-en-202010111400-_th...
The Story of Another World on the Amiga | MVG: https://www.youtube.com/watch?v=0iz9PJbs5rE
พอร์ต Another World ลง Nintendo 64: https://github.com/jnmartin84/aw64
พอร์ต Another World ลง PlayStation 1: https://github.com/fgsfdsfgs/rawpsx
มีคอมไพเลอร์ที่คอมไพล์ไปเป็น Verilog ได้ และสามารถนำผลลัพธ์ไปใส่ในขั้นตอนการออกแบบแบบเดิมได้
การที่แอ็กชันแรกคือคุณต้องว่ายน้ำหนี แล้วต่อด้วยการหนีสัตว์คล้ายสิงโต เป็นหนึ่งในประสบการณ์เกมที่โหดที่สุดตลอดกาล เกมนี้เล่นแค่นาทีเดียวก็จำไปทั้งชีวิต
สำหรับยุคนั้น เอฟเฟกต์กล้องที่ดรามาติกของเกมนี้ทำให้มันเหมือนอีกโลกหนึ่งสมชื่อจริง ๆ
ภาพบนปกก็ยอดเยี่ยมมาก
konanaka beetzai! motsuubo! /wave
https://www.youtube.com/watch?v=JFaOYYSxSEA
ถ้าจำไม่ผิด เขายังโชว์เครื่องมือพัฒนาบางส่วนด้วย รวมถึงวิธีแก้แอนิเมชันโดยตรงทีละบรรทัดใน virtual machine bytecode และรันแบบ step-through
ทุกวันนี้จำนวนแพลตฟอร์มยังน้อยกว่ายุคเติบโตระเบิดของทศวรรษ 80 เสียอีก แม้ตอนนี้ “ซอฟต์แวร์” ส่วนใหญ่ก็อาจมองได้ว่าเป็น JavaScript ที่เว็บเบราว์เซอร์ตีความอยู่ ในยุค 80 ก็มีปัญหาเรื่องการพอร์ตเช่นกัน และจริง ๆ แล้วยากกว่าด้วยซ้ำ เพราะต้องสร้างอินเทอร์พรีเตอร์เอง
ดูเหมือนว่าวิดีโอเกมจำนวนมาก หรืออาจจะส่วนใหญ่ ก่อนยุค Doom และกราฟิก 3D สมรรถนะสูง จะเขียนบน virtual machine ส่วนเกมคอนโซลน่าจะเป็น C หรือแอสเซมบลีมากกว่าเพราะเรื่องประสิทธิภาพ
ในตอนนั้นเกม “คอมพิวเตอร์” ยังเป็นช่วงก่อนที่ IBM PC จะกลายเป็นมาตรฐาน หรืออย่างน้อยก็เป็นก่อนที่ PC จะชนะและ Microsoft จะครองตลาด ในสถานการณ์ที่ยังไม่รู้ว่า Amiga, PC-98, IBM PC, Mac ฯลฯ อะไรจะเป็นผู้ชนะ การสร้าง virtual machine จึงเป็นทางเลือกที่สมเหตุสมผล และทำให้นึกถึง SCUMM ทันที
ความสามารถในการพกพาข้ามแพลตฟอร์มเป็นเรื่องสำคัญก็จริง แต่ในยุคที่กฎของ Moore เดินหน้าเต็มสปีดและอายุของแพลตฟอร์มสั้นราวกับแมลงเม่า virtual machine ยังให้ผลด้านการบีบอัดด้วย ไบนารีที่คอมไพล์เต็มรูปแบบอาจกินพื้นที่ดิสก์หรือเทป และ RAM มากเกินไป
ในทางกลับกัน virtual machine ขนาดเล็กมากสามารถสร้างภาษาที่ออกแบบมาเฉพาะเพื่อให้ตีความได้ทันที และลดการใช้พื้นที่ลงอย่างมากในสถานการณ์ที่ต้องประหยัดทุกกิโลไบต์ แค่นึกถึงความต่างของขนาดระหว่าง
print "Hello world!"กับไบนารีที่คอมไพล์แบบพื้นฐานก็พอ ต่อให้ text adventure จะเร็วแค่ไหน ถ้ายัดลงใน X KB ไม่ได้ก็ไม่มีประโยชน์มีข้อความและทรัพยากรกราฟิกจำนวนมาก ขณะที่การคำนวณค่อนข้างเรียบง่าย ข้อจำกัดด้านการสร้างสรรค์จึงเชื่อมกับฮาร์ดแวร์แค่ในแง่ของ I/O และการบีบอัดข้อมูลเท่านั้น และโค้ดที่ interpreter รันก็มักเป็นเพียง “การตั้งค่าฉาก” ที่ทำครั้งเดียวกับตัวจับเวลาแอนิเมชันเล็กน้อย
แนวคิดอีกฝั่งจะเห็นได้ชัดกว่าในเกมอาร์เคด และต่อมาในเกมอย่าง Doom กับ Quake สิ่งที่เกมจำลองมีความผูกกับฮาร์ดแวร์แนบแน่นกว่ามาก และการกำหนดฉากก็ใกล้กับข้อมูลแผนที่มากกว่าตรรกะแบบสคริปต์ เช่น “วางมอนสเตอร์ไว้ตรงนี้ แล้ววางไอเท็มพลังชีวิตไว้ตรงนั้น”
แน่นอนว่าสองค่ายหลังใช้ primitive ด้านกราฟิกแบบเนทีฟบางส่วนด้วย
เมื่อใช้ bitplane ก็ไม่จำเป็นต้องอ่าน video memory กลับมาอีกครั้ง แค่สมมติให้บิตสูงสุดสงวนไว้สำหรับเอฟเฟกต์ความโปร่งใส แล้ววาด span ลงไปตรง ๆ ได้เลย
ข้อดีอีกสองอย่างคือสามารถเลื่อนแต่ละ plane ให้สัมพันธ์กันเพื่อสร้างเอฟเฟกต์มัวเรที่สวยงามได้ และยังมีประสิทธิภาพด้านหน่วยความจำกับแบนด์วิดท์บัสที่ดีสำหรับความลึกสีแบบก้ำกึ่งที่ไม่ลงตัวกับไบต์หรือนิบเบิลพอดี เช่น 8 สี (3 บิตต่อพิกเซล) หรือ 32 สี (5 บิตต่อพิกเซล)