Saya membaca tentang set instruksi prosesor 6502 dari banyak tautan di 6502.org, dan satu tutorial menyatakan:
Penunjuk tumpukan (S) menunjuk ke sebuah byte pada Halaman 1, yaitu, ke byte yang alamatnya dari 0100 hingga 01FF, di mana dua digit terakhir dipasok oleh S. Ketika satu byte didorong pada stack, ada tertulis di alamat di S, dan kemudian S dikurangi.
Register S adalah 1 byte, jadi itu jelas memegang nilai dari 00 hingga FF, tetapi karena menurun ketika ditekan, ketika belum ada yang didorong, ia harus mulai dari FF. Apakah perangkat keras fisik (transistor) dalam chip mengatur semua bit dalam register menjadi '1' ketika chip mendapatkan napas kekuatan pertamanya?
Saya hanya ingin mengetahui detail level rendah.
cpu
cpu-architecture
mring
sumber
sumber
Jawaban:
Setiap ROM berdasarkan 6502 dan kode yang kompatibel yang pernah saya lihat menginisialisasi stack pointer (
LDX #$FF
,TXS
) selama rutin RESET. Kamu juga harus.Mungkin nanti 6502 revisi (yaitu 65C02 di Apple II) secara eksplisit menginisialisasi, serta 65816 varian 16-bit dan yang lebih baru.
Saya berani bertaruh secara signifikan bahwa
.S
nilai acak pada power up pada 6502 asli dan 6510 di Commodore 64, dan mungkin bahkan 2A07 di NES.Umumnya setiap rutin reset 6502 juga dimulai dengan yang berikut, umumnya sebagai dua instruksi pertama:
sumber
Jika Anda menonton presentasi Michael Steil tentang rekayasa balik 6502 ( http://www.youtube.com/watch?v=fWqBmmPQP40 ), Anda akan melihat sekitar 42:15 bahwa ia menjelaskan apa yang terjadi ketika RESET terjadi. Sebagai bagian dari penanganan RESET, 6502 benar-benar mendorong nilai PC dan P. Penunjuk tumpukan dimulai pada 0x100 dan setelah mendorong ketiga byte tersebut, berakhir pada 0x1fd karena itu.
sumber
http://forum.6502.org/viewtopic.php?t=468&sid=ccdf15a560f1520a347ba896ae89767f mengklaim bahwa itu tidak ditentukan.
http://whats.all.this.brouhaha.com/2011/07/07/stack-usage-in-the-apple-1-monitor/ juga mengklaim bahwa itu tidak ditentukan dan lebih lanjut bahwa itu tidak masalah jika Anda tidak peduli tentang posisi persis tumpukan di halaman itu. Di mana pun itu mulai akan membungkus, jadi selama Anda tidak menggunakan lebih dari 256 byte tumpukan Anda baik-baik saja.
http://visual6502.org/JSSim/ yang merupakan simulasi level transistor dari perangkat keras yang sebenarnya muncul untuk boot dengan set SP ke FD; Anda mungkin dapat melacak register aktual di sana dan menentukan apakah itu disengaja atau hanya kebetulan.
(Dalam konteks itu "monitor" berarti program kontrol level rendah daripada tampilan)
sumber
Untuk aplikasi perangkat lunak, biasanya tidak masalah. Jika program Anda tidak akan kembali ke dasar, Anda dapat melakukan seperti yang telah dikatakan di atas, yang mengendalikan SP sendiri. Jika Anda akan kembali ke dasar maka Anda harus yakin Anda kembali dengan tumpukan dalam kondisi yang sama sebelum sebelum program Anda dimulai atau BASIC akan macet.
Respons oleh Snarfblam di atas secara teknis menyesatkan, pertama karena "membaca lokal kedua" tidak memiliki arti khusus, tetapi juga karena dengan TSX, LDA $ 00FF, X tidak akan pernah LDA dari alamat mana pun yang lebih tinggi dari $ 01FE karena maks untuk X adalah $ FF: $ 00FF + FF = $ 01FE. Juga, jika Anda ingin akumulator membaca nilai sebelumnya yang didorong ke stack, PLA akan cukup.
sumber