Apakah 6502 memasukkan FF ke register penunjuk tumpukan segera setelah mendapat daya untuk pertama kalinya?

8

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.

mring
sumber
Apa kelebihan / kekurangan seseorang yang benar-benar mengetahui hal ini, saya heran ... :)
Shinrai

Jawaban:

3

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 .Snilai 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:

SEI ;disable interrupts (set interrupt disable flag)
CLD ;turn decimal mode off
LawrenceC
sumber
1
Reset Apple I dan II sebenarnya tidak mengatur SP. Mungkin lebih aman untuk mengatakan sebagian besar ROM mengaturnya, tetapi sebenarnya tidak diperlukan dalam kebanyakan kasus.
Dennis Munsie
Menarik ... Saya kira jujur ​​jika Anda akan menggunakannya sebagai tumpukan untuk JSR, PLA, PHA, dll. Dan tidak pernah merujuk langsung sebagai memori dengan LDA, dll. (Dan memang memiliki 256 byte RAM di sana - Atari 2600 misalnya hanya memiliki 128 byte dari $ 80 - $ FF) - tidak masalah di mana ia "dimulai." - kecuali jika Anda ingin "menghapus" itu kapan-kapan. Taruhan Woz hanya ingin menyimpan 3 byte di ROM-nya.
LawrenceC
3

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.

Dennis Munsie
sumber
2

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)

pjc50
sumber
kembali "tidak masalah jika Anda tidak peduli tentang posisi tepat tumpukan": jika Anda menggunakan tumpukan untuk menyimpan argumen lokal atau fungsi, Anda akan peduli tentang posisi tepat tumpukan. Misalnya membaca lokal kedua dari tumpukan ke akumulator (TSX / LDA $ 00FF, X) akan gagal jika penunjuk tumpukan berada di 0 karena Anda akan membaca dari $ 00FF bukannya $ 01FF. Ini dapat dengan mudah terjadi jika tumpukan dimulai pada alamat yang terlalu rendah. Masalah ini hanya berlaku jika Anda mengakses tumpukan dengan pengalamatan berindeks absolut.
snarf
0

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.

Jonathan Kendall
sumber