2008-09-21 30 views
17

Đó là ngày cuối tuần, vì vậy tôi thư giãn với việc lập kế hoạch cả tuần bằng cách viết một dự án sở thích.6502 Thi đua CPU

Tôi đã viết khung của bộ mô phỏng CPU MOS 6502 ngày hôm qua, thanh ghi, ngăn xếp, bộ nhớ và tất cả các opcodes được triển khai. (Liên kết đến nguồn bên dưới)

Tôi có thể chạy một loạt các thao tác trong trình gỡ lỗi mà tôi đã viết, nhưng tôi muốn tải một rom NES và chỉ trỏ bộ đếm chương trình theo hướng dẫn của nó. cách nhanh nhất để tìm các opcodes thiếu sót.

Tôi đã viết bộ tải rom NES nhanh và tải các ngân hàng ROM vào bộ nhớ CPU.

Vấn đề là tôi không biết mã opcodes được mã hóa như thế nào. Tôi biết rằng các opcodes mình theo một khuôn mẫu của một byte cho mỗi opcode xác định duy nhất các opcode,

0 - BRK 
1 - ORA (D,X) 
2 - COP b 

vv

Tuy nhiên tôi không chắc chắn nơi tôi phải tìm ra lý lẽ opcode. Có phải byte trực tiếp theo sau không? Trong bộ nhớ tuyệt đối, tôi cho rằng nó có thể không phải là một byte nhưng một đoạn ngắn.

Có ai quen thuộc với mô hình bộ nhớ của CPU này không?

EDIT: Tôi nhận ra rằng điều này có thể bị bắn trong bóng tối, nhưng tôi đã hy vọng có một số tin tặc cũ của Apple và Commodore ẩn nấp ở đây.

EDIT: Cảm ơn sự giúp đỡ của mọi người. Sau khi tôi thực hiện các thay đổi thích hợp để căn chỉnh từng hoạt động mà CPU có thể tải và chạy Mario Brothers. Nó không làm bất cứ điều gì nhưng vòng lặp chờ đợi Bắt đầu, nhưng một dấu hiệu tốt của nó :)

Tôi đã tải lên nguồn:

http://www.codeplex.com/Cpu6502/SourceControl/DirectoryView.aspx?SourcePath=&changeSetId=1810

Nếu ai đã bao giờ tự hỏi làm thế nào một công trình giả lập, nó khá dễ dàng để làm theo. Không được tối ưu hóa trong ít nhất, nhưng sau đó một lần nữa, tôi bắt chước một CPU chạy ở 2MHz trên một máy 2.4GHz :)

+0

Hey tôi khá nhiều trong tình cảnh tương tự của bạn (ở thời điểm niêm yết) Tôi muốn để kiểm tra mã của bạn, nhưng liên kết dường như bị hỏng. Bạn vẫn giữ nó chứ? – Petruza

Trả lời

12

Opcode mất một byte và toán hạng nằm trong các byte sau. Ví dụ, hãy kiểm tra cột kích thước byte here.

+0

Vì vậy, tôi sẽ phải sửa đổi mỗi opcode để nó biết cách xa để nhìn về phía trước từ máy tính để có được các đối số của nó? – FlySwat

+0

Bạn sẽ phải giữ bàn ở đâu đó, vâng. Mặc dù nó sẽ không bao giờ nhiều hơn ba byte. Hoặc chỉ cần hardwire nó trong mã mà làm công việc của mỗi hướng dẫn. – moonshadow

+1

Tôi thực sự có cuốn sách đó. –

1

Cuốn sách này có thể giúp: http://www.atariarchives.org/mlb/

Ngoài ra, hãy thử examing bất kỳ khác 6502 aseembler/giả lập/trình gỡ lỗi ra khỏi đó để xem cách Assembly được mã hóa là Machine Language.

3

Nếu bạn nhìn vào tài liệu tham khảo như http://www.atarimax.com/jindroush.atari.org/aopc.html, bạn sẽ thấy rằng mỗi opcode có một mã hóa quy định như:

HEX LEN TIM 

Các HEX là bạn opcode 1-byte. Ngay sau đó là LEN byte của đối số của nó. Tham khảo tài liệu tham khảo để xem những đối số đó là gì. Dữ liệu TIM là quan trọng đối với trình giả lập - đó là số chu kỳ đồng hồ mà lệnh này thực hiện. Bạn sẽ cần điều này để có được thời gian của bạn chính xác.

Các giá trị này (LEN, TIM) không được mã hóa trong chính mã opcode. Bạn cần phải lưu trữ dữ liệu này trong trình nạp/thực thi chương trình của bạn. Nó chỉ là một bảng tra cứu lớn.Hoặc bạn có thể định nghĩa một ngôn ngữ mini để mã hóa dữ liệu và trình đọc.

+0

Tôi không nghĩ rằng LEN và TIM thực sự được mã hóa, tôi nghĩ bạn phải cung cấp điều đó. Tôi đã làm điều đó với thời gian, mỗi opcode là nhận thức của bao nhiêu chu kỳ của nó "nghĩa vụ" để có. – FlySwat

+1

Chúng thực sự nằm trong nhiều trường hợp. Đối với tất cả các opcodes với một bit đối số [4: 2] của opcode xác định mã hóa 3 bit của chế độ địa chỉ. Tôi đã thấy nó nhất quán: 0 = INDIRECT X, 1 = ZERO PAGE, 2 = IMMEDIATE (đôi khi ACCUMULATOR), 3 = ABSOLUTE, 4 = INDIRECT Y, 5 = ZERO PAGE X, 6 = ABSOLUTE Y, 7 = TUYỆT ĐỐI X –

1

Hướng dẫn sử dụng 6502 có trên Web, tại các trang web lịch sử khác nhau. Kim-1 được vận chuyển cùng với chúng. Có lẽ nhiều hơn trong họ hơn bạn cần biết.

0

Apple II roms bao gồm một bộ tách rời, tôi nghĩ đó là những gì nó được gọi, và nó sẽ cho bạn thấy một định dạng tốt đẹp các opcodes hex và opcode 3 ký tự và các toán hạng. Vì vậy, với ít bộ nhớ có sẵn, họ đã xoay xở trong số byte toán hạng (luôn là 0, 1 hoặc 2) mã opcode 3 ký tự cho toàn bộ 6502 lệnh được đặt thành một không gian thực sự nhỏ, bởi vì thực sự không có Phần lớn của nó.

Nếu bạn có thể đào lên một quả táo rom II, bạn có thể chỉ cần cắt và dán từ đó ...

Các vấn đề liên quan