Đối với NES (và SNES cũng vậy), đây là một tổng quan cơ bản. Tôi đã không viết bất kỳ trò chơi NES nào nhưng đã viết một trình giả lập NES (Graybox) và đã thực hiện một số lượng khá lớn các kỹ thuật tái tạo xe đẩy cũ.
Đối với ngôn ngữ lập trình: có, tất cả là lắp ráp. Lập trình NES có nghĩa là làm việc trực tiếp với các ngắt phần cứng, cổng DMA, chuyển đổi ngân hàng, v.v ... May mắn thay, lập trình 6502 (hay đúng hơn là 2A03) khá dễ dàng [1]:
- Có một vài thanh ghi: A, X và Y là chủ yếu, hai cái sau chỉ có thể sử dụng để lập chỉ mục và lặp
- bộ hướng dẫn là nhỏ và chủ yếu là đơn giản
- không có nhiều bộ nhớ: RAM chính là 2KB, với phần mở rộng 8KB được hỗ trợ bằng pin. Trong số 2KB đó, 256 byte được dành riêng cho ngăn xếp và trang 0 (256 byte đầu tiên) là nơi bạn muốn lưu trữ các con trỏ và giá trị được sử dụng nhiều nhất của mình do một số chế độ địa chỉ đặc biệt
Cả 3 điều này tạo nên một môi trường đủ dễ để ghi nhớ trong khi làm việc với nó. Có, bạn tự mình quản lý tất cả bộ nhớ nhưng điều đó có nghĩa là về cơ bản là bạn tạo một bản đồ đầy đủ về nơi mọi thứ đi lên phía trước và bản đồ đó không lớn lắm vì bạn chỉ phải lo lắng về 2K, vì vậy bạn có thể vẽ ra một mảnh biểu đồ. Bạn phải lập kế hoạch cho mọi thứ nhiều hơn một chút và gán tĩnh các biến và hằng cho các vị trí RAM và ROM (trên hộp mực).
Nó có một chút khó khăn hơn khi dữ liệu hộp mực của bạn vượt quá giới hạn địa chỉ của CPU. Đó là 64KB, trong đó 32KB thấp hơn được đặt trong đá và được ánh xạ tới tất cả các loại cổng phần cứng và RAM. Đây là lúc chuyển đổi ngân hàng phát huy tác dụng, có nghĩa là ánh xạ một phần của ROM vào (một phần) không gian địa chỉ 32KB cao hơn.
Điều này có thể được sử dụng theo cách mà lập trình viên muốn, nhưng một ví dụ sử dụng có thể có một trò chơi với 3 cấp độ, với tất cả dữ liệu cấp độ, dữ liệu meta và mã cho mỗi cấp độ được nhồi nhét vào các vùng nhớ 8KB riêng biệt trên hộp mực. Cấp độ có thể có các cuộc gọi lại, ví dụ như khởi tạo, cập nhật mỗi khung hình, v.v. "Đang tải" cấp độ có nghĩa là ánh xạ khối 8KB của bộ nhớ ở mức 0xC000. Sau đó, bạn có thể chỉ định rằng thường trình init luôn ở mức 0xC000, thói quen cập nhật khung là 0xC200 và dữ liệu mức bắt đầu từ 0xC800. Mã chính của trò chơi nằm trong một đoạn bộ nhớ khác, sau đó kiểm soát các thay đổi cấp độ chỉ bằng cách hoán đổi ở đoạn bên phải và nhảy đến địa chỉ tuyệt đối 0xC000 và 0xC200 vào những thời điểm thích hợp.
Dữ liệu đồ họa Wrt: dữ liệu gạch của NES là bản đồ pixel 8 bit 8 bit. Đối với nền, chúng được kết hợp với lớp 2 bit độ phân giải 1/4. Các giá trị 4 bit này sau đó được lập chỉ mục vào bảng màu 16 mục, với tôi tin rằng 53 màu độc đáo hiệu quả có sẵn. Sprites cũng sử dụng dữ liệu pixel 2 bit và mỗi sprite chỉ định lại chỉ số nhóm 2 bit của chính nó tạo thành chỉ số pal 4 bit. Hình ảnh BG trên màn hình là một mảng 32x30 của số chỉ mục ô.
Về cơ bản, bằng cách có rất nhiều sự lặp lại và lập chỉ mục thành các chỉ mục, bạn có thể giữ dữ liệu rất nhỏ. Dữ liệu mức thường được lưu trữ dưới dạng các thanh dọc của các chỉ mục gạch và vì các thanh dọc đó cũng được sử dụng lại, chúng cũng được lập chỉ mục và chỉ được lưu trữ một lần trên hộp mực. Kỹ thuật nén dữ liệu đơn giản hoạt động tương tự. Điều này cho phép Mario 1 có được 32KB dữ liệu (có chỗ trống) và 8KB dữ liệu bitmap.
Đối với môi trường nhà phát triển, tôi đã thấy một số hình ảnh nơi mọi người làm việc trên một số máy tính cổ xưa chắc chắn được nối với các ổ ghi EEPROM để làm việc. Gỡ lỗi được hỗ trợ bởi công cụ không thực sự là một khả năng cho đến sau tuổi SNES [2]. Đây là lý do chính khiến rất nhiều game cũ có lỗi "rõ ràng" trong đó và tại sao những thứ như Gameshark có thể làm những gì họ làm; sức khỏe người chơi sẽ luôn ở vị trí mem-X, vì vậy bạn có thể buộc nó là 100 mọi lúc.
Nếu bạn thấy những điều này thú vị, tôi khuyến khích bạn xem ví dụ: http://wiki.nesdev.com/w/index.php/Nesdev_Wiki
Có khá nhiều khóa học lập trình cho NES được tìm thấy trực tuyến.
Tôi hy vọng tổng quan đơn giản này đã cung cấp một số cái nhìn sâu sắc về phát triển trò chơi từ những năm 80.
[1] Nói một cách tương đối. Ngoài ra, tôi thiên vị khi tôi tự viết Graybox trong khoảng 85% PowerPC. [2] Xem việc tạo ra bài viết FF6: http://www.edge-online.com/features/the-making-of-final-fantasy-vi/