1 điểm bởi GN⁺ 2023-07-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • Đây là một dự án tri ân cá nhân hiện thực VM, blitter và rasterizer của Another World / Out of This World bằng phần cứng FPGA mà không dùng CPU tiêu chuẩn
  • Thiết kế cốt lõi gồm việc biến VM thành một bộ xử lý tùy biến thực sự, kết hợp thành một SoC với blitter phụ trách sao chép/đổ đầy giữa các framebuffer, rasterizer vẽ polygon và phần cập nhật hiển thị
  • 128KB SPRAM của Lattice UP5K vừa khít với 4 framebuffer 320x200 4-bit, trong đó mỗi khối SPRAM 32KB tương ứng với một framebuffer, tạo thành bố trí bộ nhớ
  • Dữ liệu game không được bao gồm trong kho lưu trữ; cần sao chép BANK01~BANK0DMEMLIST.BIN vào thư mục GAMEDATA thì mới có thể dùng gói dữ liệu và bitstream
  • Cách chạy hỗ trợ cả mô phỏng lẫn bo mạch thực
    • Với mô phỏng, sau khi cài Silice có thể chạy phần intro bằng make simul1
    • Phần cứng hỗ trợ icebreaker + VGA PMOD, mch2022 badge và ULX3S HDMI
    • Có kèm bitstream dựng sẵn, nhưng vẫn cần dữ liệu game riêng
  • Việc chạy VM lấy lệnh và toán hạng từ bộ nhớ SPI, và để giảm độ trễ sẽ đọc trước 64 byte vào một bộ đệm BRAM nhỏ
  • Đường đi đồ họa sử dụng 4 framebuffer, double buffering, giới hạn truy cập trong vùng vblank và cơ chế phân xử truy cập framebuffer giữa blitter và rasterizer
  • Rasterizer vẽ các polygon lồi của Another World dưới dạng các span ngang; để tạo hiệu ứng trong suốt, nó có thể đọc và sửa giá trị pixel hiện có hoặc sao chép pixel từ một framebuffer nguồn khác
  • Kết xuất văn bản và một phần nền của part 6 được xử lý bằng cách lưu các pixel buffer đã render sẵn trong ROM rồi sao chép qua đường op_drawString, do ngân sách LUT còn lại hạn chế
  • Các giới hạn và việc còn lại được nêu rõ gồm: chưa có âm thanh/nhạc, cần bitstream và gói dữ liệu riêng cho từng part, chưa kiểm chứng xong toàn bộ quá trình chơi game, cần chỉnh lại timing đang nhanh hơn bản gốc, và đang tìm cách nối các part
  • Giấy phép gồm: thiết kế Silice theo MIT License, tài liệu theo CC BY-NC-SA 4.0, bản port C++ đã chỉnh sửa vẫn giữ GPL gốc, còn dữ liệu game thuộc phạm vi bản quyền

1 bình luận

 
GN⁺ 2023-07-16
Ý kiến trên Hacker News
  • Hồi nhỏ chơi Out of this World trên Sega Genesis, tôi từng nghĩ đồ họa không thể nào đẹp hơn thế được nữa
    Đó là lần đầu tôi thấy những đoạn cắt cảnh hoạt họa hoàn chỉnh như vậy trên Sega, và chúng thật sự rất ấn tượng. Dĩ nhiên đồ họa sau này đã đẹp hơn, nhưng tôi vẫn cảm thấy Another World đến nay vẫn đứng vững về mặt nghệ thuật. Phong cách rất rõ nét, và khi chơi lại khoảng một năm trước, nó vẫn gây ấn tượng
    Khá nhiều câu đố gần như là thử-sai, và game cũng cực kỳ ngắn, nhưng dù vậy tôi không muốn thay đổi điều gì. Nếu là fan của Another World, tôi cũng khuyên thử Flashback: The Quest for Identity. Nó có bầu không khí điện ảnh tương tự; ban đầu tôi không thích lắm, nhưng trong 10 năm qua càng ngày càng thấy hay hơn
    • Tôi rất thích Flashback. Bối cảnh cyberpunk hợp gu tôi, phông nền đẹp và câu chuyện cũng tuyệt
      Dù vậy Another World là một tác phẩm nghệ thuật. Poster của game trông như tranh sơn dầu, thật sự rất đẹp [1]
      [1] http://www.anotherworld.fr/download/AnotherWorld_Poster.jpg
    • Vì quá thích Flashback nên tôi đã cố phá đảo ở độ khó chuyên gia, nhưng bị kẹt đâu đó ở nửa sau và không thắng được slime man
    • Bản Genesis ra khá muộn. Tôi chơi bản Amiga ngay sau khi phát hành năm 1991 và hoàn toàn bị choáng ngợp; trước đó chưa từng thấy game nào như vậy
    • Tôi biết đến Flashback trên Sega trước và lập tức thích nó. Sau này khi chơi Out of this World thì mất một lúc mới nhập tâm được, nhưng cả hai đều là những tác phẩm nghệ thuật xuất sắc
    • Flashback là tác phẩm của Delphine Software, và một phần công nghệ polygon tương tự cũng được dùng trong game trinh thám Cruise for a Corpse
  • Một số tài liệu đáng xem cùng:
    Bản reverse engineering và port JavaScript Infernal Runner cho Amstrad CPC của cyxx. Đây là tác phẩm của nhà sáng tạo Another World, và cả hai đều tận dụng kiến trúc máy ảo: https://github.com/cyxx/infernal_js
    Bài thuyết trình The Virtual Machine Architecture of Infernal Runner của Norbert Kehrer. Bài nói bằng tiếng Đức, có slide tiếng Anh: 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
    Bản port Nintendo 64 của Another World: https://github.com/jnmartin84/aw64
    Bản port PlayStation 1 của Another World: https://github.com/fgsfdsfgs/rawpsx
  • Nếu bạn thấy HDL khó hiểu, đây là ngôn ngữ tùy chỉnh của tác giả: https://github.com/sylefeb/Silice/tree/master
    Nó cung cấp trình biên dịch biên dịch sang Verilog, rồi có thể đưa kết quả vào luồng thiết kế hiện có
  • Phần intro thật tuyệt diệu. Ngay cả khi chỉ có loa PC và không có card âm thanh cũng vậy
    Ngay hành động đầu tiên đã phải bơi để trốn thoát, rồi tiếp đó phải thoát khỏi một sinh vật giống sư tử — đó là một trong những trải nghiệm game khắc nghiệt nhất mọi thời. Chỉ cần chơi game này 1 phút cũng sẽ nhớ cả đời
    • Tôi nghĩ mình chỉ chơi hơn vài phút, nhiều lắm là vài giờ và gần như chẳng tiến được bao nhiêu, nhưng phần intro và cuộc đào thoát đầu tiên đó đến giờ vẫn khắc sâu trong trí nhớ
      Ở thời điểm đó, các hiệu ứng camera kịch tính của game này thật sự giống như đúng cái tên: một thế giới khác
    • Tôi chưa từng tự chơi game này, nhưng chỉ riêng đoạn dài 2 phút trên băng VHS quảng bá đi kèm tạp chí trò chơi điện tử cũng đã in sâu trong đầu tôi suốt 30 năm
      Hình bìa cũng rất tuyệt
    • Câu “thoại” trong game ngay sau khi người bạn mới cứu bạn khỏi thứ giống sư tử đó cũng không thể nào quên
      konanaka beetzai! motsuubo! /wave
    • Không chỉ phần intro, việc toàn bộ game nằm gọn trên một đĩa mềm cũng gây sốc
    • Tôi cũng có ký ức y hệt: chơi khoảng 1 phút rồi bị kẹt. 25 năm sau chơi lại và phá đảo; chỉ cần vượt qua rào cản tốc độ phản xạ thì đây là một game xuất sắc và đáng nhớ
  • Nhà phát triển gốc của Another World từng có bài hồi tưởng tại GDC, và đây là một trong những bài GDC khá hay:
    https://www.youtube.com/watch?v=JFaOYYSxSEA
    Theo tôi nhớ thì ông cũng cho xem một phần công cụ phát triển, trong đó có cách trực tiếp sửa animation theo từng dòng trong bytecode của máy ảo và chạy từng bước
  • Tôi tò mò không biết máy ảo cho toàn bộ trò chơi phổ biến đến mức nào trong thập niên 90. Game này còn cũ hơn tôi, và hồi đó trên PC, lớp máy ảo hẳn không gây hao hụt hiệu năng lớn sao?
    • Việc cho cùng một phần mềm chạy trên Amiga, x86 (DOS), Mac và vô số hệ máy khác quan trọng hơn nhiều
      Ngày nay số loại máy ít hơn so với giai đoạn bùng nổ của thập niên 80. Ngay cả bây giờ, có thể xem phần lớn “phần mềm” là JavaScript do trình duyệt web diễn dịch. Thập niên 80 cũng đã có vấn đề về tính di động, thậm chí khi đó còn khó hơn vì phải tự viết interpreter
      Có vẻ nhiều, có khi là hầu hết, trò chơi điện tử trước Doom hoặc trước đồ họa 3D hiệu năng cao đều được viết bằng máy ảo. Game console có lẽ nhiều khả năng dùng C hoặc assembly vì lý do hiệu năng

Vào thời đó, game “máy tính” là giai đoạn trước khi IBM PC trở thành chuẩn, hoặc ít nhất là trước khi PC thắng thế và Microsoft thống trị. Trong bối cảnh chưa biết Amiga, PC-98, IBM PC, Mac, v.v. cái nào sẽ thắng, việc tạo một máy ảo là hợp lý, và SCUMM là thứ hiện ngay trong đầu

  • Dù vậy, người ta cũng không làm những thứ như Elite bằng các máy ảo chuyên dụng kiểu này
    Tính di động cũng quan trọng, nhưng vào thời điểm định luật Moore đang chạy hết tốc lực và vòng đời nền tảng ngắn như phù du, máy ảo còn mang lại hiệu quả nén. Binary đã biên dịch hoàn chỉnh có thể ngốn quá nhiều dung lượng đĩa hoặc băng từ, cũng như RAM
    Ngược lại, một máy ảo rất nhỏ có thể tạo ra một ngôn ngữ tùy chỉnh để diễn giải tức thời, và trong hoàn cảnh phải tiết kiệm từng kilobyte, nó giảm dung lượng đi đáng kể. Cứ nghĩ đến chênh lệch kích thước giữa print "Hello world!" và một binary biên dịch cơ bản là được. Một game phiêu lưu văn bản dù nhanh đến đâu cũng vô dụng nếu không nhét vừa trong X KB
  • Vào thời hoàng kim của hợp ngữ, máy ảo cũng phổ biến trong phần mềm nghiệp vụ. Khi đó trình biên dịch C tuân thủ chuẩn nhắm tới nhiều hệ thống vẫn chưa có hoặc rất đắt, nên cách này giúp việc port sang các hệ thống khác nhau dễ hơn
  • Mẹo của các máy ảo thời kỳ đầu như Z-Machine của Infocom, mã Pascal thông dịch của Wizardry, SCUMM, AGI và SCI của Sierra, Another World, các game của Horrorsoft, v.v. nằm ở chỗ họ hiểu rõ rằng game họ làm chủ yếu là “thiết bị truyền tải nội dung”
    Chúng có nhiều văn bản và tài nguyên đồ họa, còn tính toán thì tương đối đơn giản. Các ràng buộc về sáng tác chỉ gắn với phần cứng ở khía cạnh nhập/xuất và nén dữ liệu, còn mã do trình thông dịch chạy thường chỉ là phần “khởi tạo cảnh” chạy một lần và một chút bộ đếm thời gian cho hoạt ảnh
    Ý tưởng ngược lại thể hiện rõ hơn ở game arcade, rồi về sau là những thứ như Doom và Quake. Những gì game mô phỏng gắn với phần cứng chặt chẽ hơn nhiều, còn định nghĩa cảnh chỉ ở mức “đặt quái vật ở đây, đặt vật phẩm hồi máu ở kia”, nên nó gần với dữ liệu bản đồ hơn là logic script
  • Còn tùy bạn nhìn nhận “máy ảo cho toàn bộ game” như thế nào. Các game phiêu lưu của Infocom chạy toàn bộ mã game trên máy ảo, và game phiêu lưu đồ họa của Sierra cũng như LucasArts cũng vậy
    Tất nhiên, hai nhóm sau có dùng một số phép toán nguyên thủy đồ họa native
  • Có cảm giác Only Amiga makes it possible sau 30 năm đã được thay bằng FPGA
  • Đoạn “[độ trong suốt] làm tăng độ phức tạp cho rasterizer. Nếu chỉ muốn đảo một bit [của giá trị màu], cần biết giá trị trước đó của pixel tại vị trí ấy” gần như là một trong ba lợi thế có được khi dùng đồ họa phẳng như Amiga
    Nếu dùng bitplane thì không cần đọc lại bộ nhớ video. Chỉ cần giả định bit cao nhất dành riêng cho hiệu ứng trong suốt rồi đổ nguyên các span ra là được
    Hai lợi thế còn lại là có thể di chuyển các mặt phẳng tương đối với nhau để tạo hiệu ứng moiré đẹp mắt, và hiệu quả tốt về bộ nhớ cũng như băng thông bus ở các độ sâu màu lưng chừng không khớp gọn với byte hay nibble, chẳng hạn 8 màu (3 bit mỗi pixel) hoặc 32 màu (5 bit mỗi pixel)
  • Nhờ thread này mà rốt cuộc tôi thừa nhận chắc mình sẽ không tự phá đảo được game này, nên đã xem video gameplay trên YouTube. Video dài 22 phút. Tôi nghĩ tất cả những gì tôi từng làm được chỉ là đi qua con sư tử một lần