Nick Kossolapov, một kỹ sư phần mềm với 8 năm kinh nghiệm, thừa nhận anh chưa bao giờ thực sự hiểu cách máy tính hoạt động. Thay vì xây dựng phần cứng như Ben Eater, anh chọn cách mô phỏng một hệ thống quen thuộc: máy Game Boy. Kết quả là Fame Boy, một emulator chạy trên cả desktop và web, hoàn chỉnh với âm thanh.

Từ NAND đến Tetris: Hành trang lập trình emulator

Trước khi bắt tay vào Fame Boy, Kossolapov đã hoàn thành khóa học From NAND to Tetris để nắm vững kiến thức nền tảng về thanh ghi, bộ nhớ và ALU. Sau đó, anh xây dựng CHIP-8 emulator (Fip-8) trong F# để làm quen. Với Game Boy, thiết bị có cấu trúc đơn giản nhưng gắn bó với tuổi thơ săn Pokémon, mục tiêu của anh là tạo ra một emulator trung thực với phần cứng thật.

Kiến trúc lấy cảm hứng từ phần cứng thật

Fame Boy được thiết kế với giao diện tối giản: hai mảng dữ liệu (framebuffer 160x144 pixel và audiobuffer 32768 Hz) cùng hai hàm stepEmulator() và getJoypadState(). CPU mô phỏng Sharp LR35902 không biết gì ngoài memory map, trong khi Memory.fs đóng vai trò bus kết nối CPU, IO Controller, PPU và cartridge. Một điểm thú vị: IO Controller là sáng tạo của Kossolapov, không tồn tại trong phần cứng gốc, nhưng giúp quản lý các thanh ghi an toàn hơn. Hàm stepper() trong Emulator.fs là "chất keo" kết nối tất cả component, từ CPU, timer, serial đến APU và PPU.

Bài học cho cộng đồng lập trình viên

Câu chuyện này cho thấy việc xây dựng phần mềm mô phỏng phần cứng không chỉ dành cho chuyên gia. Bất kỳ ai cũng có thể bắt đầu từ những dự án nhỏ như emulator để hiểu sâu hơn về cách máy tính hoạt động. Kossolapov dành hàng trăm giờ, thường thức đến 2 giờ sáng, nhưng kết quả là một sản phẩm open source có thể chạy trên web. Nếu bạn muốn khám phá cách máy tính hoạt động, hãy thử bắt đầu với một emulator Game Boy.