Ini semacam terinspirasi oleh tantangan Intel 8086 yang juga ada di sini, tapi saya pikir tantangan 6502 akan menarik juga.
Tantangan
Saya pikir ini akan menyenangkan untuk melihat hasilnya. Yang ini jelas menuju sisi spektrum yang lebih maju. Tantangannya adalah untuk menulis emulator CPU 6502 Anda sendiri. Ini tentu saja melibatkan pengertian set instruksinya dan format penyandiannya. Sumber daya terkait di bagian bawah ini. 6502 adalah salah satu prosesor dunia nyata yang paling mudah ditiru. Untuk keperluan tantangan ini, Anda tidak perlu khawatir tentang waktu siklus jika Anda tidak mau - tetapi itu selalu merupakan nilai tambah untuk disertakan!
JANGAN SALINAN KODE APA SAJA LAIN !! Tentu saja, Anda pasti bisa mengintip emulator lain untuk membantu Anda memahami, tetapi tidak ada salinan dan tempel! :)
Setelah kode Anda berfungsi, Anda selalu dapat bekerja lebih keras jika Anda suka dan mengubahnya menjadi emulator Apple II, atau NES, C64, VIC-20 atau miliaran lain dari sistem berbasis 6502 lama dari masa lalu.
Menguji emulator Anda
Saya telah menyusun 6502 test suite yang saya temukan kode sumbernya di sini: http://code.google.com/p/hmc-6502/source/browse/trunk/emu/testvectors/AllSuiteA.asm
Versi kompilasi saya dapat diunduh di sini: http://rubbermallet.org/AllSuiteA.zip
Masukkan biner 48 KB ke dalam ruang memori emulator Anda pada $ 4000, yang menyisakan 16 KB RAM baca-tulis di bawahnya. Ketika tes telah selesai dijalankan, nilai dalam alamat $ 0210 harus menjadi $ FF, jika CPU Anda lulus. Anda akan tahu bahwa tes selesai ketika penghitung program (PC) telah mencapai alamat $ 45C0.
Tes lain juga tersedia di sini: http://visual6502.org/wiki/index.php?title=6502TestPrograms
Melakukan sesuatu yang lebih interaktif dengannya
Setelah CPU Anda berfungsi, Anda mungkin ingin melakukan sesuatu yang lebih menyenangkan daripada menatap hasil tes! Saya mengkompilasi gambar ROM Enhanced BASIC untuk 6502. Ini 16 KB, jadi Anda harus memuatnya ke $ C000 dari ruang memori yang Anda tiru, atur ulang virtual 6502 Anda, dan mulai eksekusi.
Unduh ZIP ini, yang berisi ehbasic.bin: http://rubbermallet.org/ehbasic.zip
Cara EhBASIC menangani input / output sangat sederhana. Ketika ingin menulis karakter ke konsol, ia menulis byte ke lokasi memori $ F001. Jadi, ketika emulator Anda melihat 6502 mencoba menulis ke lokasi itu, cukup cetak nilai karakter itu ke konsol dengan printf ("% c", value); atau bagaimanapun yang Anda inginkan. (Tantangan ini tidak terbatas pada C saja)
Ketika polling untuk karakter yang dimasukkan dari konsol, itu sangat mirip. Itu terus membaca dari lokasi memori $ F004, di mana Anda harus memiliki nilai karakter ASCII berikutnya dari keyboard yang menunggu untuk dibaca. Jika tidak ada lagi input untuk dibaca, itu harus mengembalikan nilai nol.
EhBASIC memungut nilai di lokasi itu sampai nol, yang memungkinkannya mengetahui byte itu input keyboard yang valid. Itu sebabnya jika tidak ada lagi input untuk dibaca, emulator harus mengembalikan nol di sana. EhBASIC akan berputar di atasnya sampai kunci sah berikutnya ketika sedang mencari input.
Jika Anda tidak menghapus nilai itu menjadi nol setelah membaca nilai kunci terakhir, itu akan membuatnya mengulang seolah-olah Anda menahan kunci, jadi berhati-hatilah untuk melakukannya dengan benar!
Jika emulator Anda bekerja dengan benar, inilah yang akan Anda lihat dicetak pada konsol Anda ketika mengeksekusi gambar ROM:
6502 EhBASIC [C]old/[W]arm ?
Tekan C, lalu tekan enter dan Anda akan melihat:
Memory size ?
31999 Bytes free
Enhanced BASIC 2.22
Ready
Bytes gratis mungkin berbeda untuk Anda, tetapi dalam emulator saya, saya membatasi area memori yang dapat ditulis hingga batas 32 KB. Anda benar-benar bisa pergi ke mana ROM dimulai, yang merupakan tanda 48 KB.
6502 tautan sumber daya CPU
Berikut adalah beberapa sumber yang dapat memberi Anda informasi yang cukup untuk dikerjakan:
http://www.obelisk.demon.co.uk/6502/instructions.html
http://www.e-tradition.net/bytes/6502/6502_instruction_set.html
http://www.llx.com/~nparker/a2/opcodes.html <- yang ini memiliki beberapa info yang sangat menarik
http://en.wikipedia.org/wiki/MOS_Technology_6502
Jika Anda memiliki pertanyaan atau memerlukan informasi teknis lebih lanjut, jangan ragu untuk bertanya kepada saya. Ada juga banyak informasi 6502 lainnya di web. Google adalah temanmu!
sumber
Jawaban:
Saya pikir saya akan terus maju dan memposting implementasi saya sendiri. Ini SEPENUHNYA ungolfed, tapi ini implementasi penuh.
sumber
A MOS 6502 emulator in Haskell. Features include:
Ini adalah versi yang agak golf dari implementasi penuh (dengan lebih banyak fitur) yang saya lakukan untuk tantangan ini yang akan saya posting nanti. Meskipun ada golf, kodenya masih lurus ke depan. Hanya fitur yang hilang yang diketahui adalah mode BCD (datang ...)
Menjalankan kode ehBASIC:
Dan kode, di bawah total 300 baris:
sumber
Bagi siapa pun yang tertarik, saya pikir saya akan membagikan implementasi 6502 saya di C #. Seperti halnya posting lain di sini, hal ini sepenuhnya ungolfed tetapi merupakan implementasi fitur yang lengkap.
Saya memulai proyek ini dengan membuat spreadsheet instruksi ketika saya pertama kali belajar tentang CPU. Saya menyadari bahwa saya dapat menggunakan spreadsheet ini untuk menghemat pengetikan. Saya mengubahnya menjadi tabel file teks yang memuat emulator untuk membantu menghitung siklus dan untuk memudahkan pembongkaran output.
Seluruh proyek tersedia di Github https://github.com/amensch/e6502
sumber