Vi xử lý 65816, trái tim của Super Nintendo, có một tập lệnh phong phú cho phép thao tác dữ liệu với nhiều kích thước khác nhau. Điều này bao gồm khả năng làm việc với cả dữ liệu 8 bit và 16 bit, mang lại sự linh hoạt cho các lập trình viên. Tuy nhiên, không phải tất cả các thanh ghi trong 65816 đều có khả năng lưu trữ dữ liệu 16 bit. Vậy, thanh ghi nào không phải 16 bit?
Trong 65816, thanh ghi tích lũy (Accumulator – A), thanh ghi chỉ số X và thanh ghi chỉ số Y đều có thể hoạt động ở chế độ 8 bit hoặc 16 bit. Chế độ hoạt động của chúng được điều khiển bởi bit “m” trong thanh ghi trạng thái (Processor Status Register – P). Khi bit “m” được đặt là 0, các thanh ghi này hoạt động ở chế độ 16 bit, cho phép chúng lưu trữ các giá trị lên đến 65535. Khi bit “m” được đặt là 1, chúng hoạt động ở chế độ 8 bit, giới hạn phạm vi giá trị từ 0 đến 255. Việc chuyển đổi giữa các chế độ này được thực hiện bằng các lệnh REP #$30
(đặt chế độ 16-bit) và SEP #$30
(đặt chế độ 8-bit).
Tuy nhiên, thanh ghi trạng thái (P) lại là một thanh ghi 8 bit. Nó chứa các cờ (flag) phản ánh trạng thái của vi xử lý, chẳng hạn như cờ zero (Z), cờ carry (C), cờ overflow (V), và cờ negative (N). Mỗi cờ này chiếm một bit riêng biệt trong thanh ghi P. Do đó, thanh ghi P không thể lưu trữ dữ liệu 16 bit.
Vì thanh ghi P chỉ có 8 bit, nên nó không thể hoạt động ở chế độ 16 bit như thanh ghi A, X và Y. Điều này có nghĩa là các lệnh thao tác với dữ liệu 16 bit, chẳng hạn như LDA #$1234
, sẽ chỉ ảnh hưởng đến thanh ghi A và không ảnh hưởng đến thanh ghi P.
Khi lập trình cho 65816, điều quan trọng là phải hiểu rõ kích thước và chức năng của từng thanh ghi. Việc sử dụng sai kích thước dữ liệu hoặc thanh ghi có thể dẫn đến lỗi trong chương trình. Ví dụ, nếu cố gắng lưu trữ một giá trị 16 bit vào thanh ghi P, sẽ chỉ có byte thấp của giá trị được lưu trữ, dẫn đến mất mát dữ liệu. Do đó, cần phải cẩn thận khi làm việc với các thanh ghi khác nhau và đảm bảo sử dụng đúng kích thước dữ liệu cho từng thanh ghi.