Bab 4: Tutorial Bahasa Himpunan Mikropemproses 6502

Bab 4 Tutorial Bahasa Himpunan Mikropemproses 6502



Bab 4: Tutorial Bahasa Himpunan Mikropemproses 6502

4.1 Pengenalan

Mikropemproses 6502 dikeluarkan pada tahun 1975. Ia digunakan sebagai mikropemproses untuk beberapa komputer peribadi ketika itu seperti Apple II, Commodore 64, dan BBC Micro.







Mikropemproses 6502 masih dihasilkan dalam jumlah besar hari ini. Ia bukan lagi unit pemprosesan pusat yang digunakan dalam komputer peribadi (komputer riba) hari ini, tetapi ia masih dihasilkan dalam jumlah besar dan digunakan dalam peralatan elektronik dan elektrik hari ini. Untuk memahami seni bina komputer yang lebih moden, adalah sangat membantu untuk memeriksa mikropemproses yang lebih lama tetapi agak berjaya seperti 6502.



Memandangkan ia mudah difahami dan diprogramkan, ia merupakan salah satu mikropemproses terbaik (jika bukan yang terbaik) untuk digunakan untuk mengajar bahasa himpunan. Bahasa himpunan ialah bahasa peringkat rendah yang boleh digunakan untuk memprogram komputer. Ambil perhatian bahawa bahasa himpunan untuk satu mikropemproses berbeza daripada bahasa himpunan mikropemproses yang lain. Bahasa himpunan mikropemproses 6502 diajar dalam bab ini. Lebih tepat lagi, ia adalah 65C02 yang diajar, tetapi hanya dirujuk, sebagai 6502.



Komputer terkenal pada masa lalu dipanggil commodore_64. 6502 ialah mikropemproses bagi keluarga 6500. Komputer commodore_64 menggunakan mikropemproses 6510. Mikropemproses 6510 adalah daripada 6500 µP. Set arahan 6502 µP adalah hampir semua arahan 6510 µP. Pengetahuan bab ini dan seterusnya adalah berdasarkan komputer commodore_64. Pengetahuan ini digunakan sebagai asas untuk menerangkan seni bina komputer moden dan sistem pengendalian moden dalam bahagian kursus kerjaya dalam talian ini.





Seni bina komputer merujuk kepada komponen papan induk komputer dan penjelasan tentang bagaimana data mengalir dalam setiap komponen, terutamanya mikropemproses, bagaimana data mengalir antara komponen, dan juga bagaimana data berinteraksi. Tunggal bagi data ialah datum. Cara yang berkesan untuk mengkaji seni bina komputer komputer adalah dengan mengkaji bahasa pemasangan papan induk.

Komputer commodore_64 dikatakan sebagai komputer perkataan komputer 8-bit. Ini bermakna maklumat disimpan, dipindahkan dan dimanipulasi dalam bentuk kod binari lapan bit.



Gambarajah Blok Papan Induk Commodore 64
Gambar rajah blok papan induk komodor 64 ialah:


Rajah 4.1 Gambarajah Blok Unit Sistem Commodore_64

Bayangkan mikropemproses 6510 sebagai mikropemproses 6502. Jumlah memori ialah satu siri bait (8-bit setiap bait). Terdapat memori akses rawak (baca/tulis) yang mana bait boleh ditulis atau dipadamkan. Apabila kuasa komputer dimatikan, semua maklumat dalam memori akses rawak (RAM) dipadamkan. Terdapat juga memori baca sahaja (ROM). Apabila kuasa komputer dimatikan, maklumat dalam ROM kekal (tidak dipadamkan).

Terdapat port input/output (litar) yang dirujuk sebagai peranti input/output dalam rajah. Port ini tidak boleh dikelirukan dengan port yang boleh dilihat pada permukaan menegak kiri dan kanan atau depan dan belakang unit sistem komputer. Itu adalah dua perkara yang berbeza. Sambungan dari port dalam ini ke peranti persisian seperti cakera keras (atau cakera liut), papan kekunci dan monitor tidak ditunjukkan dalam rajah.

Terdapat tiga bas (kumpulan konduktor wayar elektrik yang sangat kecil) dalam rajah. Setiap wayar boleh memindahkan sedikit 1 atau bit 0. Bas data, untuk pemindahan bait lapan bit pada satu masa (satu nadi jam) ke RAM dan port input/output (peranti input/output) adalah dua arah. Bas data adalah lapan bit lebar.

Semua komponen disambungkan ke bas alamat. Bas alamat adalah satu arah dari mikropemproses. Terdapat enam belas konduktor untuk bas alamat, dan setiap satu membawa satu bit (1 atau 0). Enam belas bit dihantar dalam satu nadi jam.

Terdapat bas kawalan. Beberapa konduktor bas kawalan akan memindahkan satu bit setiap satu daripada mikropemproses ke komponen lain. Beberapa talian kawalan membawa bit dari port input/output (IO) ke mikropemproses.

Memori Komputer
RAM dan ROM dianggap sebagai satu himpunan memori. Himpunan ini diwakili secara rajah seperti berikut di mana nombor heksadesimal mempunyai awalan '$':


Rajah 4.11 Susun Atur Memori untuk Komputer Commodore 64

RAM adalah dari 0000 16 kepada DFFF 16 yang ditulis sebagai dari $0000 hingga $DFFF. Dengan bahasa himpunan 6502 µP, nombor perenambelasan diawali dengan '$' dan tidak diakhiri (bersubskrip) dengan 16 atau H atau heks. Sebarang maklumat dalam RAM padam apabila komputer dimatikan. ROM bermula dari $E000 hingga $FFFF. Ia mempunyai subrutin yang tidak padam apabila komputer dimatikan. Subrutin ini adalah rutin yang biasa digunakan yang membantu dalam pengaturcaraan. Program pengguna memanggil mereka (rujuk bab seterusnya).

Ruang (bait) dari $0200 hingga $D000 adalah untuk program pengguna. Ruang dari $D000 hingga $DFFF adalah untuk maklumat yang berkaitan secara langsung dengan persisian (peranti input/output). Ini adalah sebahagian daripada sistem pengendalian. Jadi, sistem pengendalian komputer commodore-64 adalah dalam dua bahagian utama: bahagian dalam ROM yang tidak pernah padam dan bahagian dari $D000 hingga $DFFF yang terpadam apabila kuasa dimatikan. Data IO (input/output) ini perlu dimuatkan dari cakera setiap kali komputer dihidupkan. Hari ini, data sedemikian dipanggil pemacu persisian. Peranti bermula dari port Peranti Input/Output melalui sambungan pada papan induk ke port yang boleh dikenal pasti pada permukaan menegak komputer yang mana monitor, papan kekunci, dsb. disambungkan dan ke peranti itu sendiri (monitor, papan kekunci, dsb. .).

Memori terdiri daripada 2 16 = 65,536 bait lokasi. Dalam bentuk perenambelasan, ini adalah 10000 16 = 10000 H = 10000 hex = $10000 lokasi. Dalam pengkomputeran, pengiraan dalam asas dua, asas sepuluh, asas enam belas, dll. bermula dari 0 dan bukan dari 1. Jadi, lokasi pertama sebenarnya adalah nombor lokasi 0000000000000000 2 = 0 10 = 0000 16 = $0000. Dalam bahasa himpunan 6502 µP, pengenalan lokasi alamat diawali dengan $ dan tiada akhiran atau subskrip. Lokasi terakhir ialah nombor lokasi 11111111111111111 2 = 65,535 10 = FFFF 16 = $FFFF dan bukan 1000000000000000 2 , atau 65,536 10 , atau 10000 16 , atau $10000. 10000000000000000 2 , 65,536 10 , 10000 16 , atau $10000 memberikan jumlah lokasi bait.

Di sini, 2 16 = 65,536 = 64 x 1024 = 64 x 2 10 = 64 Kbait (Kilobait). Akhiran 64 dalam nama Commodore-64 bermaksud 64KB jumlah memori (RAM dan ROM). Satu bait ialah 8 bit, dan 8 bit akan masuk ke satu lokasi bait dalam ingatan.

64 Kbytes memori dibahagikan kepada halaman. Setiap halaman mempunyai 0100 16 = 256 10 lokasi bait. 256 yang pertama 10 = 0100 pertama 16 lokasi ialah halaman 0. Yang kedua ialah halaman 1, yang ketiga ialah halaman 2, dan seterusnya.

Untuk menangani 65,536 lokasi, 16 bit diperlukan untuk setiap lokasi (alamat). Jadi, bas alamat dari mikropemproses ke memori terdiri daripada 16 baris; satu baris untuk satu bit. Sedikit sama ada 1 atau 0.

Daftar 6502 µP
Daftar adalah seperti sel bait untuk lokasi memori bait. 6502 µP mempunyai enam daftar: lima daftar 8-bit dan satu daftar 16-bit. Daftar 16-bit dipanggil Kaunter Program yang disingkatkan sebagai PC. Ia memegang alamat memori untuk arahan seterusnya. Program bahasa himpunan terdiri daripada arahan yang diletakkan dalam ingatan. Enam belas (16) bit berbeza diperlukan untuk menangani lokasi bait tertentu dalam ingatan. Pada nadi jam tertentu, bit ini dihantar ke baris alamat 16-bit bas alamat untuk bacaan arahan. Semua daftar untuk 6502 µP digambarkan seperti berikut:


Rajah 4.12 6502 µP Daftar

Kaunter Program atau PC boleh dilihat sebagai daftar 16-bit dalam rajah. Lapan bit ketara yang lebih rendah dilabelkan sebagai PCL untuk Program Counter Low. Lapan bit signifikan yang lebih tinggi dilabelkan sebagai PCH untuk Program Counter High. Arahan dalam ingatan untuk Commodore-64 boleh terdiri daripada satu, dua atau tiga bait. 16 bit dalam PC menghala ke arahan seterusnya yang akan dilaksanakan, dalam ingatan. Antara litar dalam mikropemproses, dua daripadanya dipanggil Unit Logik Aritmetik dan Penyahkod Arahan. Jika arahan semasa yang sedang diproses dalam µP (mikropemproses) adalah satu bait panjang, kedua-dua litar ini meningkatkan PC untuk arahan seterusnya sebanyak 1 unit. Jika arahan semasa yang sedang diproses dalam µP adalah dua bait panjang, bermakna ia menduduki dua bait berturut-turut dalam ingatan, kedua-dua litar ini meningkatkan PC untuk arahan seterusnya sebanyak 2 unit. Jika arahan semasa yang sedang diproses dalam µP adalah tiga bait panjang, bermakna ia menduduki tiga bait berturut-turut dalam ingatan, kedua-dua litar ini meningkatkan PC untuk arahan seterusnya sebanyak 3 unit.

Akumulator 'A' ialah daftar tujuan umum lapan bit yang menyimpan hasil kebanyakan operasi aritmetik dan logik.

Daftar 'X' dan 'Y' masing-masing digunakan untuk mengira langkah program. Pengiraan dalam pengaturcaraan bermula dari 0. Jadi, ia dipanggil sebagai daftar indeks. Mereka mempunyai beberapa tujuan lain.

Walaupun daftar Stack Pointer, 'S' mempunyai 9 bit yang dianggap sebagai daftar lapan bit. Kandungannya menghala ke lokasi bait dalam halaman 1 Memori Akses Rawak (RAM). Halaman 1 bermula dari bait $0100 (256 10 ) kepada bait $01FF (511 10 ). Apabila program sedang berjalan, ia bergerak dari satu arahan ke arahan berturut-turut seterusnya dalam ingatan. Walau bagaimanapun, ini tidak selalu berlaku. Ada kalanya ia melompat dari satu kawasan memori ke kawasan ingatan yang lain untuk terus menjalankan arahan di sana, berturut-turut. Halaman 1 dalam RAM digunakan sebagai timbunan. Tindanan adalah kawasan memori RAM yang besar yang mempunyai alamat seterusnya untuk kesinambungan kod dari mana terdapat lompatan. Kod dengan arahan melompat tiada dalam timbunan; mereka berada di tempat lain dalam ingatan. Walau bagaimanapun, selepas arahan lompat ke dilaksanakan, alamat sambungan (bukan segmen kod) berada dalam timbunan. Mereka ditolak ke sana akibat arahan lompatan atau dahan.

Daftar Status Pemproses lapan bit bagi P ialah sejenis daftar khas. Bit individu tidak berkaitan atau bersambung antara satu sama lain. Setiap bit di sana dipanggil bendera dan dihargai secara bebas daripada yang lain. Makna bendera diberikan dalam perkara berikut apabila diperlukan.

Indeks bit pertama dan terakhir untuk setiap daftar ditunjukkan di atas setiap daftar dalam rajah sebelumnya. Indeks bit (kedudukan) mengira dalam daftar bermula dari 0 di sebelah kanan.

Halaman Memori dalam Perduaan, Heksadesimal dan Perpuluhan
Jadual berikut menunjukkan permulaan halaman memori dalam binari, perenambelasan dan perpuluhan:

Setiap muka surat mempunyai 1,0000,0000 2 bilangan bait yang sama dengan 100 H bilangan bait yang sama dengan 256 10 bilangan bait. Dalam rajah ingatan sebelumnya, halaman ditunjukkan naik dari halaman 0 dan tidak turun seperti yang ditunjukkan dalam jadual.

Lajur binari, perenambelasan dan perpuluhan jadual ini memberikan alamat lokasi bait memori dalam pangkalannya yang berbeza. Perhatikan bahawa untuk halaman sifar, hanya bit untuk bait yang lebih rendah diperlukan untuk menaip semasa pengekodan. Bit untuk bait yang lebih tinggi boleh diabaikan kerana ia sentiasa sifar (untuk halaman sifar). Untuk halaman yang lain, bit untuk bait yang lebih tinggi harus digunakan.

Selebihnya bab ini menerangkan Bahasa Himpunan 6502 µP menggunakan semua maklumat sebelumnya. Untuk memahami bahasa dengan cepat, pembaca perlu menambah dan menolak dalam asas enam belas dan bukannya asas sepuluh. Ia sebenarnya sepatutnya menjadi asas dua, tetapi mengira dalam asas dua adalah menyusahkan. Ingat bahawa apabila menambah dua nombor dalam asas dua, bawaan masih 1 seperti dalam asas sepuluh. Tetapi apabila menolak dua nombor dalam asas dua, pinjam adalah dua dan bukan sepuluh seperti dalam asas sepuluh. Apabila menambah dua nombor dalam asas enam belas, bawaan masih 1 seperti dalam asas sepuluh. Tetapi apabila menolak dua nombor dalam asas enam belas, pinjaman ialah enam belas dan bukan sepuluh seperti dalam asas sepuluh.

4.2 Arahan Pemindahan Data

Pertimbangkan jadual berikut bagi arahan pemindahan data bahasa pemasangan untuk 6502 µP:

Apabila bait (8-bit) disalin dari lokasi bait memori ke Daftar Akumulator, Daftar X atau Daftar Y, itu sedang dimuatkan. Apabila bait disalin daripada mana-mana daftar ini ke lokasi bait memori, itu adalah pemindahan. Apabila bait disalin dari satu daftar ke yang lain, itu masih dipindahkan. Dalam lajur kedua jadual, anak panah menunjukkan arah salinan untuk bait. Selebihnya daripada empat lajur menunjukkan mod pengalamatan yang berbeza.

Entri dalam lajur mod pengalamatan ialah kod bait sebenar untuk bahagian mnemonik yang sepadan bagi arahan dalam perenambelasan. AE, sebagai contoh, ialah kod bait sebenar untuk LDX yang memuatkan bait dari memori ke daftar X dalam mod pengalamatan mutlak seperti AE 16 = 10101110 2 . Jadi, bit untuk LDX dalam lokasi bait memori ialah 10101110.

Perhatikan bahawa untuk bahagian mnemonik LDX arahan, terdapat tiga bait yang mungkin iaitu A2, AE, dan A6, dan setiap satunya adalah untuk mod pengalamatan tertentu. Apabila bait yang dimuatkan ke dalam daftar X tidak untuk disalin daripada lokasi bait memori, nilai tersebut perlu ditaip dengan (sejurus selepas) mnemonik LDX dalam arahan dalam perenambelasan atau perpuluhan. Dalam bab ini, nilai tersebut ditaip dalam perenambelasan. Ini adalah pengalamatan segera, jadi bait sebenar dalam ingatan untuk mewakili LDX ialah A2 16 = 10100010 2 dan bukan AE 16 yang bersamaan dengan 10101110 2 .

Dalam jadual, semua bait di bawah tajuk mod pengalamatan dipanggil Kod Operasi yang disingkatkan sebagai opcodes. Terdapat lebih daripada satu opcode untuk satu mnemonik, bergantung pada mod pengalamatan.

Catatan: Perkataan 'beban' dalam unit sistem komputer boleh mempunyai dua makna: ia boleh merujuk kepada pemuatan fail dari cakera ke memori komputer atau ia boleh merujuk kepada pemindahan bait dari lokasi bait memori ke daftar mikropemproses. .

Terdapat lebih banyak mod pengalamatan daripada empat dalam jadual untuk 6502 µP.

Melainkan dinyatakan sebaliknya, semua kod pengaturcaraan pengguna dalam bab ini bermula dari alamat 0200 16 yang merupakan permulaan kawasan pengguna dalam ingatan.

Memori M dan Akumulator A

Memori kepada Akumulator

Penangkapan Segera
Arahan berikut menyimpan nombor FF 16 = 255 10 ke dalam penumpuk:

LDA #$FF

'$' bukan sahaja digunakan untuk mengenal pasti alamat memori. Secara umum, ia digunakan untuk menunjukkan bahawa nombor seterusnya yang berikut ialah perenambelasan. Dalam kes ini, $FF bukan alamat mana-mana lokasi bait memori. Ia adalah nombor 255 10 dalam heksadesimal. Asas 16 atau mana-mana subskrip lain yang setara tidak boleh ditulis dalam arahan bahasa himpunan. '#' menunjukkan bahawa apa sahaja yang berikut adalah nilai yang akan dimasukkan ke dalam daftar penumpuk. Nilai juga boleh ditulis dalam asas sepuluh, tetapi itu tidak dilakukan dalam bab ini. “#” bermaksud pengalamatan segera.

Sebuah mnemonik mempunyai beberapa persamaan dengan frasa bahasa Inggeris yang sepadan. “LDA #$FF” bermaksud memuatkan nombor 255 10 ke dalam penumpuk A. Oleh kerana ini adalah pengalamatan segera daripada jadual sebelumnya, LDA ialah A9 dan bukan AD atau A5. A9 dalam binari ialah 101010001. Jadi, jika A9 untuk LDA berada dalam alamat $0200 dalam ingatan, $FF berada dalam $0301 = 0300 + 1 alamat. #$FF adalah tepat operan untuk mnemonik LDA.

Alamat Mutlak
Jika nilai $FF berada di lokasi $0333 dalam ingatan, arahan sebelumnya ialah:

LDA $0333

Perhatikan ketiadaan #. Dalam kes ini, ketiadaan # bermakna bahawa yang berikut ialah alamat memori dan bukan nilai faedah (bukan nilai untuk dimasukkan ke dalam penumpuk). Jadi, opcode untuk LDA, kali ini, ialah AD dan bukan A9 atau A5. Operan untuk LDA di sini ialah alamat $0333 dan bukan nilai $FF. $FF berada di lokasi $0333 yang agak jauh. Arahan 'LDA $0333' menduduki tiga lokasi berturut-turut dalam ingatan, dan bukan dua, seperti ilustrasi sebelumnya. “AD” untuk LDA berada di lokasi $0200. Bait bawah 0333 iaitu 33 berada di lokasi $0301. Bait yang lebih tinggi daripada $0333 iaitu 03 berada di lokasi $0302. Ini adalah sedikit endian yang digunakan oleh bahasa himpunan 6502. Bahasa pemasangan mikropemproses berbeza adalah berbeza.

Ini adalah contoh pengalamatan mutlak. $0333 ialah alamat lokasi yang mempunyai $FF. Arahan terdiri daripada tiga bait berturut-turut dan tidak termasuk $FF atau lokasi bait sebenar.

Pengalamatan Halaman Sifar

Andaikan bahawa nilai $FF berada di lokasi memori $0050 dalam halaman sifar. Lokasi bait untuk halaman sifar bermula dari $0000 dan berakhir pada $00FF. Ini adalah 256 10 lokasi secara keseluruhan. Setiap halaman memori Commodore-64 ialah 256 10 panjang. Perhatikan bahawa bait yang lebih tinggi adalah sifar untuk semua lokasi yang mungkin dalam ruang halaman sifar dalam ingatan. Mod pengalamatan halaman sifar adalah sama dengan mod pengalamatan mutlak, tetapi bait 00 yang lebih tinggi tidak ditaip ke dalam arahan. Jadi, untuk memuatkan $FF dari lokasi $0050 ke dalam penumpuk, arahan mod pengalamatan halaman sifar ialah:

LDA $50

Dengan LDA ialah A5 dan bukan A9 atau AD, A5 16 = 10100101 2 . Ingat bahawa setiap bait dalam ingatan ialah 8 sel, dan setiap sel menempatkan sedikit. Arahan di sini terdiri daripada dua bait berturut-turut. A5 untuk LDA berada di lokasi memori $0200 dan alamat $50, tanpa bait 00 yang lebih tinggi, berada di lokasi $0301. Ketiadaan 00, yang akan menggunakan bait dalam jumlah memori 64K, menjimatkan ruang memori.

Akumulator kepada Memori

Alamat Mutlak
Arahan berikut menyalin nilai bait, walau apa pun, daripada penumpuk ke lokasi memori $1444:

IALAH $1444

Ini dikatakan memindahkan dari akumulator ke ingatan. Ia tidak memuatkan. Memuatkan adalah sebaliknya. Bait opcode untuk STA ialah 8D 16 = 10001101 2 . Arahan ini terdiri daripada tiga bait berturut-turut dalam ingatan. 8D 16 berada di lokasi $0200. Yang 44 16 daripada $1444 alamat berada di lokasi $0201. Dan 14 16 berada di lokasi $0202 – sedikit endian. Bait sebenar yang disalin bukan sebahagian daripada arahan. 8D dan bukan 85 untuk pengalamatan halaman sifar (dalam jadual) digunakan di sini untuk STA.

Sifar Halaman Alamat
Arahan berikut menyalin nilai bait, walau apa pun, daripada penumpuk ke lokasi memori $0050 dalam halaman sifar:

STA $0050

Byte opcode untuk STA di sini ialah 85 16 = 10000101 2 . Arahan ini terdiri daripada dua bait berturut-turut dalam ingatan. Yang 85 16 berada di lokasi $0200. Yang 50 16 daripada $0050 alamat berada di lokasi $0201. Isu endianness tidak timbul di sini kerana alamat hanya mempunyai satu bait iaitu bait yang lebih rendah. Bait sebenar yang disalin bukan sebahagian daripada arahan. 85 dan bukan 8D untuk pengalamatan halaman sifar digunakan di sini untuk STA.

Tidak masuk akal untuk menggunakan pengalamatan segera untuk memindahkan bait daripada penumpuk ke lokasi dalam ingatan. Ini kerana nilai sebenar seperti $FF perlu disebut dalam arahan dalam pengalamatan segera. Jadi, pengalamatan segera tidak mungkin untuk pemindahan nilai bait daripada daftar dalam µP ke mana-mana lokasi memori.

Mnemonik LDX, STX, LDY dan STY
LDX dan STX adalah serupa dengan LDA dan STA, masing-masing. Tetapi di sini, daftar X digunakan dan bukan daftar A (akumulator). LDY dan STY adalah serupa dengan LDA dan STA, masing-masing. Tetapi di sini, daftar Y digunakan dan bukan daftar A. Rujuk Jadual 4.21 untuk setiap opcode dalam perenambelasan yang sepadan dengan mnemonik tertentu dan mod pengalamatan tertentu.

Pemindahan Daftar-untuk-Mendaftar
Dua set arahan sebelumnya dalam Jadual 4.21 berkaitan dengan penyalinan memori/pemproses-mikro (pemindahan) dan penyalinan daftar/daftar (pemindahan). Arahan TAX, TXA, TAY, TYA, TSX dan TXS melakukan penyalinan (pemindahan) daripada daftar dalam mikropemproses ke daftar lain mikropemproses yang sama.

Untuk menyalin bait dari A ke X, arahannya ialah:

CUKAI

Untuk menyalin bait dari X ke A, arahannya ialah:

TX

Untuk menyalin bait dari A ke Y, arahannya ialah:

TANGAN

Untuk menyalin bait dari Y ke A, arahannya ialah:

TYA

Untuk komputer komodor 64, timbunan adalah halaman 1 hanya selepas halaman 0 dalam ingatan. Seperti setiap halaman lain, ia terdiri daripada 25610 10 lokasi bait, dari $0100 hingga $01FF. Biasanya, atur cara melaksanakan dari satu arahan ke arahan berturut-turut seterusnya dalam ingatan. Dari semasa ke semasa, terdapat lompatan ke segmen kod memori (set arahan) yang lain. Kawasan tindanan dalam memori (RAM) mempunyai alamat arahan seterusnya dari tempat lompatan (atau cawangan) berhenti untuk meneruskan program.

Penunjuk tindanan 'S' ialah daftar 9-bit dalam 6502 µP. Bit pertama (paling kiri) sentiasa 1. Semua alamat lokasi bait dalam halaman satu bermula dengan 1 diikuti dengan 8 bit berbeza untuk 256 10 lokasi. Penuding tindanan mempunyai alamat lokasi di halaman 1 yang mempunyai alamat arahan seterusnya yang perlu dikembalikan dan diteruskan oleh program selepas melaksanakan segmen kod semasa (melompat ke). Oleh kerana bit pertama semua alamat tindanan (halaman satu) bermula dengan 1, daftar penuding tindanan hanya perlu memegang lapan bit yang tinggal. Lagipun, bit pertamanya, iaitu bit paling kiri (bit kesembilan dikira dari kanannya), sentiasa 1.

Untuk menyalin bait dari S ke X, arahannya ialah:

TSX

Untuk menyalin bait dari X ke S, arahannya ialah:

TXT

Arahan daftar-untuk-daftar tidak mengambil sebarang operan. Mereka hanya terdiri daripada mnemonik. Setiap mnemonik mempunyai opcodenya dalam perenambelasan. Ini dalam mod pengalamatan tersirat kerana tiada operan (tiada alamat memori, tiada nilai).

Catatan: Tiada pemindahan X ke Y atau Y ke X (menyalin).

4.3 Operasi Aritmetik

Litar, Unit Logik Aritmetik dalam 6502 µP, hanya boleh menambah dua nombor lapan bit pada satu masa. Ia tidak menolak, ia tidak mendarab, dan ia tidak membahagi. Jadual berikut menunjukkan opcode dan mod pengalamatan untuk operasi aritmetik:

Catatan: Semua mnemonik untuk operasi aritmetik dan jenis operasi lain (iaitu semua 6502 mnemonik) mengambil satu bait kod operasi (op). Jika terdapat lebih daripada satu mod pengalamatan untuk mnemonik, akan terdapat opcode yang berbeza untuk mnemonik yang sama: satu bagi setiap mod pengalamatan. C, D dan V dalam jadual ialah bendera daftar status. Makna mereka akan diberikan kemudian apabila diperlukan.

Penambahan Nombor Tidak Bertanda
Dengan 6502 µP, nombor yang ditandatangani ialah nombor pelengkap dua. Nombor tidak bertanda ialah nombor positif biasa yang bermula dari sifar. Jadi, untuk bait lapan bit, nombor terkecil yang tidak ditandatangani ialah 00000000 2 = 0 10 = 00 16 dan nombor terbesar yang tidak ditandatangani ialah 11111111 2 = 255 10 = FF 16 . Untuk dua nombor tidak bertanda, penambahan ialah:

A+M+C→A

Ini bermakna kandungan 8-bit penumpuk ditambah oleh unit logik aritmetik kepada bait (8-bit) daripada memori. Selepas penambahan A dan M, pembawa ke bit kesembilan pergi ke sel bendera pembawa dalam daftar status. Sebarang bit pembawa sebelumnya daripada penambahan sebelumnya yang masih dalam sel bendera pembawa dalam daftar status juga ditambah kepada jumlah A dan M, menjadikan A+M+C→A. Hasilnya dimasukkan semula ke dalam penumpuk.

Jika penambahan faedah ialah:

A + M

Dan tidak perlu menambah sebarang pembawa sebelumnya, bendera pembawa perlu dikosongkan yang dibuat 0, supaya penambahannya ialah:

A+M+0→A sama seperti A+M→A

Catatan: Jika M ditambah kepada A, dan bawaan 1 berlaku kerana hasilnya lebih besar daripada 255 10 = 11111111 2 = FF 16 , ini adalah bawaan baharu. Pembawaan 1 baharu ini dihantar secara automatik ke sel bendera pembawa sekiranya ia diperlukan oleh pasangan lapan bit seterusnya untuk dijumlahkan (A + M yang lain).

Kod untuk Menambah Dua Lapan-Bit Tidak Ditandatangani
00111111 2 +00010101 2 adalah sama dengan 3F 16 + 15 16 yang sama dengan 63 10 +21 10 . Hasilnya ialah 010101002 2 yang sama dengan 54 16 dan 84 10 . Hasilnya tidak melebihi bilangan maksimum untuk lapan bit iaitu 255 10 = 11111111 2 = FF 16 . Jadi, tiada hasil bawaan 1. Dengan kata lain, bawaan yang terhasil ialah 0. Sebelum penambahan, tiada bawaan sebelumnya 1. Dengan kata lain, bawaan sebelumnya ialah 0. Kod untuk melakukan penambahan ini boleh jadi:

CLC
LDA#$3F
ADC #$15

Catatan: Semasa menaip bahasa pemasangan, kekunci 'Enter' papan kekunci ditekan pada penghujung setiap arahan. Terdapat tiga arahan dalam kod ini. Arahan pertama (CLC) mengosongkan bendera pembawa sekiranya penambahan sebelumnya mempunyai 1. CLC hanya boleh dilakukan dalam mod pengalamatan tersirat. Mnemonik untuk mod pengalamatan tersirat tidak memerlukan operan. Ini mengosongkan sel pembawa daftar status P. Pembersihan bermaksud memberikan bit 0 kepada sel bendera pembawa. Dua arahan seterusnya dalam kod menggunakan mod pengalamatan segera. Dengan pengalamatan segera, hanya terdapat satu operan untuk mnemonik iaitu nombor (dan bukan memori mahupun alamat daftar). Oleh itu, nombor mesti didahului dengan '#'. “$” bermaksud nombor yang berikut ialah perenambelasan.

Arahan kedua memuatkan nombor 3F 16 ke dalam penumpuk. Untuk arahan ketiga, litar unit logik aritmetik µP mengambil bawaan sebelumnya (dikosongkan) 0 (dipaksa kepada 0) sel bendera pembawa, daftar status dan menambahnya kepada 15 16 serta kepada nilai yang sudah ada dalam 3F 16 penumpuk dan meletakkan hasil lengkap semula ke dalam penumpuk. Dalam kes ini, terdapat pembawa yang terhasil sebanyak 0. ALU (Unit Logik Aritmetik) menghantar (meletakkan) 0 ke dalam sel bendera pembawa daftar status. Daftar status pemproses dan daftar status bermaksud perkara yang sama. Jika pembawaan 1 terhasil, ALU menghantar 1 ke bendera pembawa daftar status.

Tiga baris kod sebelumnya perlu berada dalam ingatan sebelum ia dilaksanakan. Opkod 1816 untuk CLC (pengalamatan tersirat) berada di lokasi $0200 bait. Opkod A9 16 untuk LDA (alamat segera) adalah di lokasi $0201 bait. Nombor 3F 10 berada di lokasi $0202 bait. Opcode 69 16 untuk LDA (alamat segera) adalah di lokasi $0203 bait. Nombor 15 10 berada di lokasi $0204 bait.

Catatan: LDA ialah arahan pemindahan (beban) dan bukan arahan aritmetik (mnemonik).

Kod untuk Menambah Dua Enam Belas Bit yang Tidak Ditandatangani
Semua daftar dalam 6502 µP pada dasarnya adalah daftar lapan-bit, kecuali PC (Pembilang Program) yang 16-bit. Malah daftar status adalah 8-bit lebar, walaupun lapan bitnya tidak beroperasi bersama. Dalam bahagian ini, penambahan dua 16 bit tidak bertanda, dengan pembawaan daripada pasangan pertama lapan bit kepada pasangan kedua lapan bit, dipertimbangkan. Bawaan kepentingan di sini ialah bawa dari kedudukan bit kelapan ke kedudukan bit kesembilan.

Biarkan nombornya 0010101010111111 2 = 2ABF16 16 = 10,943 10 dan 0010101010010101 2 = 2A95 16 = 10,901 10 . Jumlahnya ialah 0101010101010100 2 = 5554 16 = 21,844 10 .

Menambah dua nombor tidak bertanda ini dalam asas dua adalah seperti berikut:

Jadual berikut menunjukkan penambahan yang sama dengan pembawaan 1 dari bit kelapan ke kedudukan bit kesembilan, bermula dari kanan:

Dalam pengekodan ini, dua bait yang lebih rendah ditambah dahulu. Kemudian, ALU (Unit Logik Aritmetik) menghantar pembawaan 1 dari kedudukan bit kelapan ke kedudukan bit kesembilan, ke sel bendera pembawa dalam daftar status. Keputusan 0 1 0 1 0 1 0 0 tanpa bawa pergi ke penumpuk. Kemudian, pasangan bait kedua ditambah dengan pembawa. Mnemonik ADC bermaksud menambah dengan pembawa sebelumnya secara automatik. Dalam kes ini, bawaan sebelumnya, iaitu 1, tidak boleh ditukar sebelum penambahan kedua. Untuk tambahan pertama, memandangkan mana-mana pembawaan sebelumnya bukan sebahagian daripada tambahan lengkap ini, ia mesti dikosongkan (dijadikan 0).

Untuk penambahan lengkap dua pasang bait, penambahan pertama ialah:

A + M + 0 -> A

Tambahan kedua ialah:

A + M + 1 -> A

Jadi, bendera pembawa perlu dikosongkan (nilai diberi 0) sejurus sebelum penambahan pertama. Program berikut yang mana pembaca mesti membaca penjelasan yang berikut menggunakan mod pengalamatan mutlak untuk penjumlahan ini:

CLC
LDA $0213
ADC $0215
; tiada penjelasan kerana nilai carry flag diperlukan
STA $0217
LDA $0214
ADC $0216
STA $0218

Ambil perhatian bahawa dengan bahasa himpunan 6502, koma bertitik memulakan ulasan. Ini bermakna bahawa dalam pelaksanaan program, koma bertitik dan segala-galanya di sebelah kanannya diabaikan. Program yang ditulis sebelum ini adalah dalam fail teks disimpan dengan nama pilihan pengaturcara dan dengan sambungan '.asm'. Program sebelumnya bukanlah program tepat yang pergi ke memori untuk dilaksanakan. Atur cara yang sepadan dalam ingatan dipanggil program terjemahan di mana mnemonik digantikan dengan opcodes (bait). Sebarang ulasan kekal dalam fail teks bahasa himpunan, dan dilucutkan sebelum atur cara yang diterjemahkan mencapai memori. Malah, terdapat dua fail yang disimpan dalam cakera hari ini: fail '.asm' dan fail '.exe'. Fail '.asm' ialah fail dalam ilustrasi sebelumnya. Fail '.exe' ialah fail '.asm' dengan semua komen dilucutkan, dan semua mnemonik digantikan dengan opcodenya. Apabila dibuka dalam editor teks, fail '.exe' tidak dapat dikenali. Melainkan dinyatakan sebaliknya, untuk tujuan bab ini, fail “.exe” disalin ke memori bermula dari lokasi $0200. Ini adalah maksud lain untuk memuatkan.

Dua nombor 16-bit yang akan ditambah menduduki empat bait dalam memori untuk pengalamatan mutlak: dua bait setiap nombor (memori ialah urutan bait). Dengan pengalamatan mutlak, operan kepada opcode berada dalam ingatan. Hasil penjumlahan adalah dua bait lebar dan juga perlu diletakkan dalam ingatan. Ini memberikan sejumlah 6 10 = 6 16 bait untuk input dan output. Input bukan dari papan kekunci dan output bukan dari monitor atau pencetak. Input berada dalam memori (RAM) dan output (hasil penjumlahan) kembali ke memori (RAM) dalam keadaan ini.

Sebelum program dilaksanakan, versi terjemahan perlu berada dalam ingatan terlebih dahulu. Melihat kepada kod program sebelumnya, dapat dilihat bahawa arahan tanpa komen membentuk 19 10 = 13 16 bait. Jadi, atur cara mengambil lokasi $0200 bait dalam memori kepada $0200 + $13 – $1 = $0212 lokasi bait (bermula dari $0200 dan bukan $0201 yang membayangkan – $1). Menambah 6 bait untuk nombor input dan output menjadikan semua program berakhir pada $0212 + $6 = $0218. Jumlah panjang program ialah 19 16 = 25 10 .

Bait bawah augend hendaklah berada dalam alamat $0213, dan bait lebih tinggi bagi augend yang sama hendaklah berada dalam alamat $0214 – sedikit endian. Begitu juga, bait bawah addend hendaklah berada dalam alamat $0215, dan bait yang lebih tinggi daripada addend yang sama hendaklah berada dalam alamat $0216 – little endianness. Bait yang lebih rendah daripada hasil (jumlah) hendaklah berada dalam alamat $0217, dan bait yang lebih tinggi daripada hasil yang sama hendaklah berada dalam alamat $0218 – sedikit endian.

Opcode 18 16 untuk CLC (pengalamatan tersirat) berada di lokasi bait $0200. Opcode untuk 'LDA $0213', iaitu AD 16 untuk LDA (pengalamatan mutlak), berada di lokasi bait $0201. Bait bawah augend iaitu 10111111 berada dalam lokasi bait memori $0213. Ingat bahawa setiap opcode menduduki satu bait. Alamat '$0213' bagi 'LDA $0213' berada di lokasi bait $0202 dan $0203. Arahan 'LDA $0213' memuatkan bait bawah augend ke penumpuk.

Opcode untuk 'ADC $0215', iaitu 6D 16 untuk ADC (pengalamatan mutlak), berada di lokasi bait $0204. Bait bawah tambahan iaitu 10010101 berada di lokasi bait $0215. Alamat '$0215' bagi 'ADC $0215' berada di lokasi bait $0205 dan $0206. Arahan 'ADC $0215' menambah bait bawah addend kepada bait bawah augend yang sudah ada dalam penumpuk. Hasilnya diletakkan semula dalam penumpuk. Sebarang pembawaan selepas bit kelapan dihantar ke bendera pembawa daftar status. Sel bendera pembawa tidak boleh dikosongkan sebelum penambahan kedua bait yang lebih tinggi. Pembawaan ini ditambah kepada jumlah bait yang lebih tinggi secara automatik. Malah, pembawaan 0 ditambah kepada jumlah bait yang lebih rendah secara automatik pada permulaan (bersamaan dengan tiada pembawaan ditambah) kerana CLC.

Komen mengambil 48 seterusnya 10 = 30 16 bait. Walau bagaimanapun, ini hanya kekal dalam fail teks '.asm'. Ia tidak sampai ke ingatan. Ia dikeluarkan oleh terjemahan yang dilakukan oleh penghimpun (program).

Untuk arahan seterusnya iaitu “STA $0217”, opcode STA iaitu 8D 16 (pengalamatan mutlak) berada di lokasi bait $0207. Alamat '$0217' bagi 'STA $0217' berada di lokasi memori $0208 dan $0209. Arahan 'STA $0217' menyalin kandungan lapan-bit penumpuk ke lokasi memori $0217.

Bait augend yang lebih tinggi iaitu 00101010 berada dalam lokasi memori $0214, dan bait tambahan yang lebih tinggi iaitu 00101010 berada di lokasi bait $02 16 . Opkod untuk 'LDA $0214' iaitu AD16 untuk LDA (pengalamatan mutlak) berada di lokasi bait $020A. Alamat '$0214' bagi 'LDA $0214' berada di lokasi $020B dan $020C. Arahan 'LDA $0214' memuatkan bait augend yang lebih tinggi kepada penumpuk, memadamkan apa sahaja yang ada dalam penumpuk.

Opkod untuk 'ADC $0216' iaitu 6D 16 untuk ADC (pengalamatan mutlak) berada di lokasi bait $020D. Alamat '$0216' bagi 'ADC 0216' berada di lokasi bait $020E dan $020F. Arahan 'ADC $0216' menambah bait yang lebih tinggi daripada addend kepada bait yang lebih tinggi daripada augend yang sudah ada dalam penumpuk. Hasilnya diletakkan semula ke dalam penumpuk. Jika terdapat pembawa 1, untuk tambahan kedua ini, ia diletakkan secara automatik dalam sel pembawa daftar status. Walaupun pembawaan melebihi bit keenam belas (kiri) tidak diperlukan untuk masalah ini, adalah bagus untuk menyemak sama ada pembawa 1 berlaku dengan memeriksa sama ada bendera pembawa menjadi 1.

Untuk arahan seterusnya dan terakhir iaitu 'STA $0218', opcode STA iaitu 8D16 (alamat mutlak) berada di lokasi bait $0210. Alamat '$0218' bagi 'STA $0218' berada di lokasi memori $0211 dan $0212. Arahan 'STA $0218' menyalin kandungan lapan bit penumpuk ke lokasi memori $0218. Hasil daripada penambahan dua nombor enam belas bit ialah 0101010101010100, dengan bait yang lebih rendah 01010100 di lokasi ingatan $0217 dan bait yang lebih tinggi daripada 01010101 dalam lokasi ingatan $0218 – sedikit endian.

Penolakan
Dengan 6502 µP, nombor yang ditandatangani ialah nombor pelengkap dua. Nombor pelengkap dua boleh menjadi lapan bit, enam belas bit atau sebarang gandaan lapan bit. Dengan pelengkap dua, bit pertama dari kiri ialah bit tanda. Untuk nombor positif, bit pertama ini ialah 0 untuk menunjukkan tanda. Selebihnya bit membentuk nombor dengan cara biasa. Untuk mendapatkan pelengkap dua nombor negatif, terbalikkan semua bit untuk nombor positif yang sepadan, dan kemudian tambah 1 pada hasil dari hujung kanan.

Untuk menolak satu nombor positif daripada nombor positif yang lain, subtrahend ditukar kepada nombor negatif pelengkap dua. Kemudian, minuend dan nombor negatif baharu ditambah dengan cara biasa. Jadi, penolakan lapan bit menjadi:

Di mana pembawaan diandaikan sebagai 1. Hasil dalam penumpuk ialah perbezaan dalam pelengkap dua. Jadi, untuk menolak dua nombor, bendera pembawa mesti ditetapkan (dijadikan 1).

Apabila menolak dua nombor enam belas bit, penolakan dilakukan dua kali seperti dengan penambahan dua nombor enam belas bit. Oleh kerana penolakan ialah satu bentuk penambahan dengan 6502 µP, apabila menolak dua nombor enam belas bit, bendera pembawa ditetapkan sekali sahaja untuk penolakan pertama. Untuk penolakan kedua, sebarang tetapan bendera pembawa dilakukan secara automatik.

Memprogramkan penolakan untuk nombor lapan bit atau nombor enam belas bit dilakukan sama seperti pengaturcaraan penambahan. Walau bagaimanapun, bendera pembawa mesti ditetapkan pada awal-awal lagi. Mnemonik untuk melakukan ini ialah:

Penolakan dengan Nombor Positif Enam Belas bit
Pertimbangkan penolakan dengan nombor berikut:

Penolakan ini tidak melibatkan pelengkap dua. Oleh kerana penolakan dalam 6502 µP dilakukan dalam pelengkap dua, penolakan dalam asas dua dilakukan seperti berikut:

Hasil pelengkap kedua-duanya adalah sama dengan hasil yang diperoleh daripada penolakan biasa. Walau bagaimanapun, ambil perhatian bahawa 1 yang pergi ke kedudukan bit ketujuh belas dari kanan diabaikan. Minuend dan subtrahend dibahagikan kepada dua bit lapan setiap satu. Pelengkap kedua-dua 10010110 daripada bait kecil subtrahend ditentukan secara bebas daripada bait yang lebih tinggi dan sebarang pembawaan. Pelengkap kedua-dua 11101011 daripada bait subtrahend yang lebih tinggi ditentukan secara bebas daripada bait yang lebih rendah dan sebarang pembawaan.

16-bit minuend sudah berada dalam pelengkap dua, bermula dengan 0 dari kiri. Jadi, ia tidak memerlukan sebarang pelarasan dalam bit. Dengan 6502 µP, bait bawah minuend tanpa sebarang pengubahsuaian ditambahkan pada bait bawah pelengkap kedua-dua subtrahend itu. Bait bawah minuend tidak ditukar dalam pelengkap dua kerana enam belas bit keseluruhan minuend mestilah sudah berada dalam pelengkap dua (dengan 0 sebagai bit pertama di sebelah kiri). Dalam tambahan pertama ini, pembawaan wajib 1 ditambah kerana arahan 1=0 SEC.

Dalam penolakan berkesan semasa, terdapat pembawaan 1 (tambahan) dari bit kelapan ke bit kesembilan (dari kanan). Oleh kerana ini adalah penolakan dengan berkesan, apa sahaja bit yang sepatutnya ada dalam bendera bawa dalam daftar status dilengkapkan (terbalikkan). Jadi, pembawaan 1 menjadi 0 dalam bendera C. Dalam operasi kedua, bait minuend yang lebih tinggi ditambah pada bait pelengkap dua subtrahend yang lebih tinggi. Bit bendera bawa yang dilengkapkan secara automatik bagi daftar status (dalam kes ini ialah 0) juga ditambah (kepada bait yang lebih tinggi). Mana-mana 1 yang melampaui bit keenam belas dari kanan diabaikan.

Perkara seterusnya adalah hanya untuk mengekod semua skema itu seperti berikut:

SEK
LDA $0213
SBC $0215
; tiada penjelasan kerana nilai bendera bawa terbalik diperlukan
STA $0217
LDA $0214
SBC $0216
STA $0218

Ingat bahawa dengan bahasa himpunan 6502, koma bertitik memulakan ulasan yang tidak disertakan ke dalam versi program yang diterjemahkan dalam ingatan. Dua nombor 16-bit untuk penolakan menduduki empat bait memori dengan pengalamatan mutlak; dua setiap nombor (memori ialah satu siri bait). Input ini bukan daripada papan kekunci. Hasil penjumlahan ialah dua bait dan juga perlu diletakkan dalam ingatan di tempat yang berbeza. Output ini tidak pergi ke monitor atau pencetak; ia pergi ke ingatan. Ini memberikan sejumlah 6 10 = 6 16 bait untuk input dan output untuk diletakkan dalam memori (RAM).

Sebelum sesuatu program dilaksanakan, ia perlu berada dalam ingatan terlebih dahulu. Melihat kepada kod program, dapat dilihat bahawa arahan tanpa komen membentuk 19 10 = 13 16 bait. Memandangkan semua atur cara dalam bab ini bermula dari lokasi memori $0200, atur cara mengambil dari lokasi $0200 bait dalam memori ke lokasi $0200 + $13 – $1 = $0212 bait (bermula dari $0200 dan bukan $0201). Julat ini tidak termasuk rantau untuk bait input dan output. Dua nombor input mengambil 4 bait dan satu nombor output mengambil 2 bait. Menambah 6 bait untuk nombor input dan output menjadikan julat untuk program yang berakhir pada $0212 + $6 = $0218. Jumlah panjang program ialah 19 16 = 25 10 .

Bait bawah minuend hendaklah berada dalam alamat $0213, dan bait yang lebih tinggi bagi minuend yang sama hendaklah berada dalam alamat $0214 – sedikit endian. Begitu juga, bait bawah subtrahend hendaklah berada dalam alamat $0215, dan bait yang lebih tinggi bagi subtrahend yang sama hendaklah berada dalam alamat $0216 – sedikit endian. Bait yang lebih rendah daripada hasil (perbezaan) hendaklah berada dalam alamat $0217, dan bait yang lebih tinggi daripada hasil yang sama hendaklah berada dalam alamat $0218 – sedikit endian.

Opkod 38 16 untuk SEC (pengalamatan tersirat) adalah dalam alamat $0200. Semua program dalam bab ini diandaikan bermula pada lokasi memori $0200, membatalkan mana-mana program yang akan berada di sana; kecuali dinyatakan sebaliknya. Opcode untuk 'LDA $0213', iaitu AD 16 , untuk LDA (pengalamatan mutlak) berada di lokasi $0201 bait. Bait bawah minuend iaitu 10111111 berada dalam lokasi bait memori $0213. Ingat bahawa setiap opcode menduduki satu bait. Alamat '$0213' bagi 'LDA $0213' berada di lokasi bait $0202 dan $0203. Arahan 'LDA $0213' memuatkan bait bawah minuend ke penumpuk.

Opkod untuk 'SBC $0215', iaitu ED 16 , untuk SBC (pengalamatan mutlak) berada di lokasi $0204 bait. Bait bawah subtrahend iaitu 01101010 berada di lokasi $0215 bait. Alamat '$0215' bagi 'ADC $0215' berada di lokasi bait $0205 dan $0206. Arahan 'SBC $0215' menolak bait bawah subtrahend daripada bait bawah minuend yang sudah ada dalam penumpuk. Ini ialah penolakan pelengkap dua. Hasilnya diletakkan semula dalam penumpuk. Pelengkap (penyongsangan) mana-mana bawa selepas bit kelapan dihantar ke bendera pembawa daftar status. Bendera pembawa ini tidak boleh dikosongkan sebelum penolakan kedua dengan bait yang lebih tinggi. Pembawaan ini ditambah kepada penolakan bait yang lebih tinggi secara automatik.

Komen mengambil 57 seterusnya 10 = 3916 16 bait. Walau bagaimanapun, ini hanya kekal dalam fail teks '.asm'. Ia tidak sampai ke ingatan. Ia dikeluarkan oleh terjemahan yang dilakukan oleh penghimpun (program).

Untuk arahan seterusnya iaitu 'STA $0217', opcode STA, iaitu 8D 16 (pengalamatan mutlak), berada di lokasi $0207 bait. Alamat '$0217' bagi 'STA $0217' berada di lokasi memori $0208 dan $0209. Arahan 'STA $0217' menyalin kandungan lapan-bit penumpuk ke lokasi memori $0217.

Bait minuend yang lebih tinggi iaitu 00101010 berada dalam lokasi memori $0214, dan bait subtrahend yang lebih tinggi iaitu 00010101 berada di lokasi bait $0216. Opkod untuk 'LDA $0214', iaitu AD 16 untuk LDA (pengalamatan mutlak), berada di lokasi $020A bait. Alamat '$0214' bagi 'LDA $0214' berada di lokasi $020B dan $020C. Arahan 'LDA $0214' memuatkan bait minuend yang lebih tinggi ke penumpuk, memadamkan apa sahaja yang ada dalam penumpuk.

Opcode untuk 'SBC $0216', iaitu ED 16 untuk SBC (pengalamatan mutlak), berada di lokasi bait $020D. Alamat '$0216' bagi 'SBC $0216' berada di lokasi bait $020E dan $020F. Arahan 'SBC $0216' menolak bait yang lebih tinggi subtrahend daripada bait yang lebih tinggi bagi minuend (dua pelengkap) yang sudah ada dalam penumpuk. Hasilnya diletakkan semula ke dalam penumpuk. Jika terdapat pembawaan 1 untuk penolakan kedua ini, pelengkapnya diletakkan dalam sel pembawa daftar status secara automatik. Walaupun pembawaan melebihi bit keenam belas (kiri) tidak diperlukan untuk masalah ini, adalah bagus untuk menyemak sama ada pembawa pelengkap berlaku dengan memeriksa bendera pembawa.

Untuk arahan seterusnya dan terakhir iaitu 'STA $0218', opcode STA, iaitu 8D 16 (pengalamatan mutlak), berada di lokasi $0210 bait. Alamat '$0218' bagi 'STA $0218' berada di lokasi memori $0211 dan $0212. Arahan 'STA $0218' menyalin kandungan lapan bit penumpuk ke lokasi memori $0218. Hasil penolakan dengan dua nombor enam belas bit ialah 0001010101010101 dengan bait yang lebih rendah 01010101 dalam lokasi ingatan $0217 dan bait yang lebih tinggi daripada 00010101 dalam lokasi ingatan $0218 – sedikit endian.

6502 µP mempunyai litar hanya untuk penambahan, dan secara tidak langsung untuk penolakan pelengkap kedua-duanya. Ia tidak mempunyai litar untuk pendaraban dan pembahagian. Untuk melakukan pendaraban dan pembahagian, program bahasa himpunan dengan butiran, termasuk peralihan produk separa dan dividen separa, harus ditulis.

4.4 Operasi Logik

Dalam 6502 µP, mnemonik untuk OR ialah ORA dan mnemonik untuk OR eksklusif ialah EOR. Perhatikan bahawa operasi logik tidak mempunyai pengalamatan tersirat. Pengalamatan tersirat tidak memerlukan operan. Setiap operator logik mesti mengambil dua operan. Yang pertama adalah dalam penumpuk, dan yang kedua adalah dalam ingatan atau dalam arahan. Hasilnya (8-bit) kembali ke penumpuk. Yang pertama dalam penumpuk sama ada diletakkan di sana dengan arahan segera atau disalin dari memori dengan pengalamatan mutlak. Dalam bahagian ini, hanya pengalamatan halaman sifar digunakan untuk ilustrasi. Operator logik ini adalah semua operator Bitwise.

DAN
Jadual berikut menggambarkan Bitwise DAN dalam perduaan, perenambelasan dan perpuluhan:

Semua program dalam bab ini harus bermula pada lokasi bait memori $0200. Walau bagaimanapun, atur cara dalam bahagian ini berada dalam halaman sifar, dengan tujuan untuk menggambarkan penggunaan halaman sifar tanpa bait yang lebih tinggi iaitu 00000000 2 . ANDing sebelumnya boleh dikodkan seperti berikut:

LDA #$9A ; bukan dari ingatan – pengalamatan segera
DAN #$CD ; bukan dari ingatan – pengalamatan segera
STA $30 ; menyimpan $88 pada $0030 berasaskan sifar

ATAU
Jadual berikut menggambarkan Bitwise OR dalam binari, perenambelasan dan perpuluhan:

LDA #$9A ; bukan dari ingatan – pengalamatan segera
ORA #$CD ; bukan dari ingatan – pengalamatan segera
STA $30 ; menyimpan $CF pada $0030 berasaskan sifar

PERCUMA
Jadual berikut menggambarkan Bitwise XOR dalam binari, perenambelasan dan perpuluhan:

LDA #$9A ; bukan dari ingatan – pengalamatan segera
EOR #$CD ; bukan dari ingatan – pengalamatan segera
STA $30 ; menyimpan $57 pada $0030 berasaskan sifar

4.5 Operasi Anjakan dan Putar

Mnemonik dan opcode untuk operator anjakan dan putar ialah:

ASL: Shift kiri satu bit penumpuk atau lokasi memori, masukkan 0 dalam sel paling kanan yang kosong.

LSR: Anjak ke kanan satu bit penumpuk atau lokasi memori, masukkan 0 dalam sel paling kiri yang kosong.
ROL: Putar satu bit ke kiri penumpuk atau lokasi memori, masukkan bit yang tercicir di sebelah kiri ke dalam sel paling kanan yang kosong.
ROR: Putar satu bit ke kanan penumpuk atau lokasi memori, masukkan bit yang tercicir di sebelah kanan ke dalam sel paling kiri yang kosong.

Untuk melakukan anjakan atau putaran dengan penumpuk, arahannya adalah seperti ini:

LSR A

Ini menggunakan mod pengalamatan lain yang dipanggil mod pengalamatan penumpuk.

Untuk melakukan anjakan atau putaran dengan lokasi memori bait, arahannya adalah seperti ini:

ROR $2BCD

Di mana 2BCD ialah lokasi memori.

Ambil perhatian bahawa tiada mod pengalamatan segera atau tersirat untuk beralih atau berputar. Tiada mod pengalamatan segera kerana tiada gunanya mengalih atau memutar nombor yang hanya tinggal dalam arahan. Tiada mod pengalamatan tersirat kerana pereka bentuk 6502 µP hanya mahu kandungan penumpuk (Daftar A) atau lokasi bait memori dialihkan atau diputar.

4.6 Mod Pengalamatan Relatif

Mikropemproses sentiasa menambah (sebanyak 1, 2, atau 3 unit) Pembilang Program (PC) untuk menunjuk ke arahan seterusnya yang akan dilaksanakan. 6502 µP mempunyai arahan yang mnemoniknya ialah BVS yang bermaksud Cawangan pada Set Limpahan. PC terdiri daripada dua bait. Arahan ini menyebabkan PC mempunyai alamat memori yang berbeza untuk arahan seterusnya dilaksanakan bukan hasil daripada kenaikan biasa. Ia berbuat demikian dengan menambah atau menolak nilai, dipanggil offset, kepada kandungan PC. Oleh itu, PC kemudiannya menunjuk ke lokasi memori yang berbeza (bercabang) untuk komputer meneruskan pelaksanaan dari sana. Offset ialah integer dari -128 10 kepada +127 10 (pelengkap dua). Jadi, offset boleh membuat lompatan itu diteruskan dalam ingatan. Jika ia positif atau ketinggalan dalam ingatan, atau jika ia negatif.

Arahan BVS hanya mengambil satu operan iaitu offset. BVS menggunakan pengalamatan relatif. Pertimbangkan arahan berikut:

BVS $7F

Dalam asas dua, 7F H ialah 01111111 2 = 127 10 . Andaikan bahawa kandungan dalam PC untuk arahan seterusnya ialah $0300. Arahan BVS menyebabkan $7F (nombor positif sudah dalam pelengkap dua) ditambah kepada $0300 untuk memberikan $037F. Jadi, bukannya arahan seterusnya yang akan dilaksanakan di lokasi memori $0300, ia adalah di lokasi memori $037F (kira-kira separuh perbezaan halaman).

Terdapat arahan cawangan lain, tetapi BVS adalah arahan yang sangat baik untuk digunakan untuk menggambarkan pengalamatan relatif. Pengalamatan relatif berkaitan dengan arahan cawangan.

4.7 Pengalamatan Berindeks dan Alamat Tidak Langsung Secara Berasingan

Mod pengalamatan ini membolehkan 6502 µP mengendalikan sejumlah besar data dalam tempoh masa yang singkat dengan bilangan arahan yang berkurangan. Terdapat lokasi 64KB untuk keseluruhan memori Comodore-64. Jadi, untuk mengakses mana-mana lokasi bait, sebanyak 16 bit, membuat dua bait diperlukan. Satu-satunya pengecualian kepada keperluan dua bait adalah untuk halaman sifar di mana bait yang lebih tinggi sebanyak $00 ditinggalkan untuk menjimatkan ruang yang diambil oleh arahan dalam ingatan. Dengan mod pengalamatan bukan halaman-sifar, kedua-dua bait yang lebih tinggi dan lebih rendah bagi alamat memori 16-bit kebanyakannya ditunjukkan entah bagaimana.

Pengalamatan Berindeks Asas

Alamat Indeks Mutlak
Ingat bahawa daftar X atau Y dipanggil daftar indeks. Pertimbangkan arahan berikut:

LDA $C453,X

Andaikan bahawa nilai 6 H berada dalam daftar X. Ambil perhatian bahawa 6 tidak ditaip di mana-mana dalam arahan. Arahan ini menambah nilai 6H kepada C453 H yang merupakan sebahagian daripada arahan yang ditaip dalam fail teks yang masih perlu dipasang – C453 H + 6 H = C459 H . LDA bermaksud memuatkan satu bait ke penumpuk. Bait yang akan dimuatkan ke dalam penumpuk berasal dari alamat $C459. $C459 iaitu jumlah $C453 yang ditaip dengan arahan dan 6 H yang terdapat dalam daftar X menjadi alamat berkesan dari mana bait untuk dimuatkan ke dalam penumpuk berasal. Jika 6 H berada dalam daftar Y, Y ditaip menggantikan X dalam arahan.

Dalam pernyataan arahan yang ditaip, $C453 dikenali sebagai alamat asas dan 6 H dalam daftar X atau Y dikenali sebagai bahagian pengiraan atau indeks untuk alamat berkesan. Alamat asas boleh merujuk kepada mana-mana alamat bait dalam memori, dan 256 seterusnya 10 alamat boleh diakses, dengan mengandaikan bahawa indeks mula (atau kiraan) dalam daftar X atau Y ialah 0. Ingat bahawa satu bait boleh memberikan julat berterusan sehingga 256 10 nombor (iaitu 00000000 2 ke 11111111 2 ).

Jadi, pengalamatan mutlak menambah apa sahaja yang telah diletakkan (telah diletakkan oleh arahan lain) dalam daftar X atau Y kepada 16 alamat yang ditaip dengan arahan untuk mendapatkan alamat berkesan. Dalam arahan yang ditaip, dua daftar indeks dibezakan oleh X atau Y yang ditaip selepas koma. Sama ada X atau Y ditaip; bukan kedua-duanya.

Selepas semua program ditaip dalam editor teks dan disimpan dengan nama fail sambungan '.asm', penghimpun, yang merupakan program lain, perlu menterjemah program yang ditaip kepada apa yang (dimuatkan) dalam memori. Arahan sebelumnya, iaitu 'LDA $C453,X', menduduki tiga lokasi bait dalam ingatan, dan bukan lima.

Ingat bahawa mnemonik seperti LDA boleh mempunyai lebih daripada satu opcode (bait yang berbeza). Opcode untuk arahan yang menggunakan daftar X adalah berbeza daripada opcode yang menggunakan daftar Y. Penghimpun mengetahui opcode yang hendak digunakan berdasarkan arahan yang ditaip. Opcode satu bait untuk 'LDA $C453,X' berbeza daripada opcode satu bait untuk 'LDA $C453,Y'. Malah, opcode untuk LDA dalam 'LDA $C453,X' ialah BD dan opcode untuk LDA dalam 'LDA $C453,9' ialah BD.

Jika opcode untuk LDA berada di lokasi $0200 bait. Kemudian, alamat 16-bit $C453 mengambil sebelah lokasi bait dalam memori iaitu $0201 dan $0202. Bait opcode tertentu menunjukkan sama ada daftar X atau daftar Y yang terlibat. Oleh itu, arahan bahasa terhimpun iaitu 'LDA $C453,X' atau 'LDA $C453,Y' menduduki tiga bait berturut-turut dalam ingatan, dan bukan empat atau lima.

Pengalamatan Berindeks Halaman Sifar
Pengalamatan indeks halaman sifar adalah seperti pengalamatan indeks mutlak yang diterangkan sebelum ini, tetapi bait sasaran mestilah hanya pada halaman sifar (dari $0000 hingga $00FF). Sekarang, apabila berurusan dengan halaman sifar, bait yang lebih tinggi yang sentiasa 00 H untuk lokasi memori biasanya dielakkan. Jadi, biasanya disebut bahawa halaman sifar bermula dari $00 hingga FF. Oleh itu, arahan sebelumnya 'LDA $C453,X' ialah:

LDA $53.X

$C4, bait yang lebih tinggi yang merujuk kepada halaman di atas halaman sifar, tidak boleh digunakan dalam arahan ini kerana ia meletakkan bait sasaran yang dijangkakan untuk dimuatkan ke dalam bait terkumpul di luar dan di atas halaman sifar.

Apabila nilai yang ditaip dalam arahan ditambah kepada nilai dalam daftar indeks, jumlah tidak seharusnya memberikan hasil di atas halaman sifar (FF H ). Jadi, adalah di luar persoalan untuk mempunyai arahan seperti 'LDA $FF, X' dan nilai seperti FF H dalam daftar indeks kerana FF H + FF H = 200 H yang merupakan lokasi bait pertama ($0200) halaman 2 (halaman ketiga) dalam ingatan, adalah jauh dari halaman 0. Jadi, dengan pengalamatan berindeks halaman sifar, alamat berkesan mesti terletak pada halaman sifar.

Alamat Tidak Langsung

Lompat Alamat Mutlak
Sebelum membincangkan Pengalamatan Tidak Langsung Mutlak, adalah baik untuk melihat terlebih dahulu pengalamatan mutlak JMP. Andaikan bahawa alamat yang mempunyai nilai faedah (bait sasaran) ialah $8765. Ini adalah 16-bit yang terdiri daripada dua bait: bait yang lebih tinggi iaitu 87 H dan bait bawah iaitu 65 H . Jadi, dua bait untuk $8765 dimasukkan ke dalam PC (kaunter program) untuk arahan seterusnya. Apa yang ditaip dalam program bahasa himpunan (fail) ialah:

JMP $8765

Program pelaksana dalam memori melompat dari mana-mana alamat yang diakses kepada $8765. Mnemonik JMP mempunyai tiga opcode iaitu 4C, 6C dan 7C. Kod op untuk pengalamatan mutlak ini ialah 4C. Opkod untuk pengalamatan tidak langsung mutlak JMP ialah 6C (rujuk ilustrasi berikut).

Alamat Tidak Langsung Mutlak
Ini hanya digunakan dengan arahan lompat (JMP). Andaikan bahawa alamat yang mempunyai bait minat (bait sasaran) ialah $8765. Ini adalah 16-bit yang terdiri daripada dua bait: bait yang lebih tinggi iaitu 87 H dan bait bawah iaitu 65 H . Dengan pengalamatan tidak langsung mutlak, kedua-dua bait ini sebenarnya terletak di dua lokasi bait berturut-turut di tempat lain dalam ingatan.

Andaikan bahawa ia terletak di lokasi memori $0210 dan $0211. Kemudian, bait bawah alamat yang diminati iaitu 65 H berada dalam alamat $0210, dan bait yang lebih tinggi ialah 87 H berada di alamat $0211. Ini bermakna bahawa bait memori yang lebih rendah minat pergi ke alamat yang lebih rendah berturut-turut, dan bait memori yang lebih tinggi minat pergi ke alamat yang lebih tinggi berturut-turut - endianness kecil.

Alamat 16-bit boleh merujuk kepada dua alamat berturut-turut dalam ingatan. Sehubungan itu, alamat $0210 merujuk kepada alamat $0210 dan $0211. Pasangan alamat $0210 dan $0211 memegang alamat muktamad (16-bit dua bait) bait sasaran, dengan bait bawah 65 H dalam $0210 dan bait yang lebih tinggi iaitu 87 H dalam $0211. Jadi, arahan lompat yang ditaip ialah:

JMP ($0210)

Mnemonik JMP mempunyai tiga opcode iaitu 4C, 6C dan 7C. Opkod untuk pengalamatan tidak langsung mutlak ialah 6C. Apa yang ditaip dalam fail teks ialah 'JMP ($0210)'. Kerana kurungan, penghimpun (penterjemah) menggunakan opcode 6C untuk JMP, dan bukan 4C atau 7C.

Dengan pengalamatan tidak langsung mutlak, sebenarnya terdapat tiga kawasan ingatan. Rantau pertama mungkin terdiri daripada lokasi bait $0200, $0201 dan $0202. Ini mempunyai tiga bait untuk arahan 'JMP ($0210)'. Rantau kedua, yang tidak semestinya bersebelahan dengan yang pertama, terdiri daripada dua lokasi bait berturut-turut $0210 dan $0211. Ia ialah bait bawah di sini ($0210) yang ditaip dalam arahan program bahasa himpunan. Jika alamat minat ialah $8765, bait yang lebih rendah ialah 65 H berada di lokasi $0210 bait, dan bait yang lebih tinggi daripada 87 H berada di lokasi $0211 bait. Rantau ketiga terdiri daripada hanya satu lokasi bait. Ia adalah daripada alamat $8765 untuk bait yang disasarkan (bait minat muktamad). Sepasang alamat berturut-turut, $0210 dan $0211, memegang penunjuk $8765 yang merupakan alamat yang diminati. Selepas tafsiran pengkomputeran, ia adalah $8765 yang masuk ke PC (Kaunter Program) untuk mengakses bait sasaran.

Sifar Halaman Alamat Tidak Langsung
Pengalamatan ini adalah sama dengan pengalamatan tidak langsung mutlak, tetapi penunjuk mesti berada dalam halaman sifar. Alamat bait yang lebih rendah bagi kawasan penunjuk ialah apa yang terdapat dalam arahan yang ditaip seperti berikut:

JMP ($50)

Bait penuding yang lebih tinggi berada di lokasi $51 bait. Alamat berkesan (ditunjuk) tidak semestinya dalam halaman sifar.

Jadi, dengan pengalamatan indeks, nilai dalam daftar indeks ditambah pada alamat asas yang diberikan dalam arahan untuk mempunyai alamat berkesan. Pengalamatan tidak langsung menggunakan penunjuk.

4.8 Pengalamatan Tidak Langsung Berindeks

Pengalamatan Tidak Langsung Berindeks Mutlak
Mod pengalamatan ini digunakan dengan arahan JMP sahaja.
Dengan pengalamatan tidak langsung mutlak, terdapat nilai runcing (bait) dengan dua alamat bait berturut-turut sendiri. Kedua-dua alamat berturut-turut ini membentuk penunjuk untuk berada di kawasan penunjuk dua bait berturut-turut dalam ingatan. Bait bawah kawasan penunjuk ialah apa yang ditaip dalam arahan dalam kurungan. Penunjuk ialah alamat nilai yang ditunjuk. Dalam situasi sebelumnya, $8765 ialah alamat nilai yang ditunjuk. $0210 (diikuti dengan $0211) ialah alamat yang kandungannya ialah $8765 yang merupakan penunjuk. Dengan mod pengalamatan tidak langsung mutlak, ia adalah ($0210) yang ditaip dalam program (fail teks), termasuk kurungan.

Sebaliknya, dengan Mod Pengalamatan Tidak Langsung Terindeks Mutlak, bait alamat yang lebih rendah untuk rantau penunjuk dibentuk dengan menambah nilai dalam daftar X ke alamat yang ditaip. Contohnya, jika penunjuk berada di lokasi alamat $0210, arahan yang ditaip mungkin seperti ini:

JMP ($020A,X)

Di mana daftar X mempunyai nilai 6 H . 020A H + 6 H = 0210 H . Daftar Y tidak digunakan dengan mod pengalamatan ini.

Sifar Halaman Berindeks Alamat Tidak Langsung
Mod pengalamatan ini menggunakan daftar X dan bukan daftar Y. Dengan mod pengalamatan ini, masih terdapat nilai runcing dan penuding dalam kawasan penuding alamat dua baitnya. Mesti terdapat dua bait berturut-turut dalam halaman sifar untuk penuding. Alamat yang ditaip dalam arahan ialah alamat satu bait. Nilai ini ditambah kepada nilai dalam daftar X dan sebarang pembawaan dibuang. Hasilnya menghala ke kawasan penuding di halaman 0. Contohnya, jika alamat yang diminati (ditunjuk) ialah $8765 dan ia berada di lokasi bait $50 dan $51 halaman 0, dan nilai dalam daftar X ialah $30, arahan yang ditaip adalah seperti ini:

LDA ($20.X)

Kerana $20 + $30 = $50.

Alamat Terindeks Tidak Langsung
Mod pengalamatan ini menggunakan daftar Y dan bukan daftar X. Dengan mod pengalamatan ini, masih terdapat nilai runcing dan rantau penunjuk, tetapi kandungan rantau penunjuk beroperasi secara berbeza. Mesti terdapat dua bait berturut-turut dalam halaman sifar untuk kawasan penunjuk. Alamat bawah kawasan penunjuk ditaip dalam arahan. Nombor ini (sepasang bait) yang terkandung dalam rantau penunjuk ditambah pada nilai dalam daftar Y untuk mempunyai penunjuk sebenar. Sebagai contoh, biarkan alamat yang diminati (ditunjuk) ialah $8765, nilai 6H berada dalam daftar Y dan nombor (dua bait) berada di alamat 50 H dan 51 H . Dua bait bersama-sama ialah $875F sejak $875F + $6 = $8765. Arahan yang ditaip adalah seperti ini:

LDA ($50),Y

4.9 Arahan Penambahan, Penurunan dan Ujian-BIT

Jadual berikut menunjukkan operasi arahan kenaikan dan pengurangan:

INA dan DEA menambah dan mengurangkan penumpuk, masing-masing. Itu dipanggil pengalamatan penumpuk. INX, DEX, INY dan DEY adalah untuk daftar X dan Y, masing-masing. Mereka tidak mengambil sebarang operan. Jadi, mereka menggunakan mod pengalamatan tersirat. Kenaikan bermakna menambah 1 pada daftar atau bait memori. Penurunan bermaksud menolak 1 daripada daftar atau bait memori.

INC dan DEC menambah dan mengurangkan bait memori, masing-masing (dan bukan daftar). Penggunaan pengalamatan halaman sifar dan bukannya pengalamatan mutlak adalah untuk menjimatkan memori untuk arahan. Pengalamatan halaman sifar adalah kurang satu bait daripada pengalamatan mutlak untuk arahan dalam ingatan. Walau bagaimanapun, mod pengalamatan halaman sifar hanya mempengaruhi sifar halaman.

Arahan BIT menguji bit bait dalam ingatan dengan 8 bit dalam penumpuk, tetapi tidak berubah. Hanya beberapa bendera Daftar Status Pemproses 'P' ditetapkan. Bit lokasi memori yang ditentukan secara logik DAN digabungkan dengan penumpuk. Kemudian, bit status berikut ditetapkan:

  • N iaitu bit 7 dan bit terakhir (kiri) daftar status, menerima bit 7 lokasi memori sebelum ANDing.
  • V iaitu bit 6 daftar status menerima bit 6 lokasi ingatan sebelum ANDing.
  • Bendera Z daftar status ditetapkan (dijadikan 1) jika keputusan DAN adalah sifar (00000000 2 ). Jika tidak, ia dibersihkan (dijadikan 0).

4.10 Bandingkan Arahan

Mnemonik arahan perbandingan untuk 6502 µP ialah CMP, CPX dan CPY. Selepas setiap perbandingan, bendera N, Z dan C bagi daftar status pemproses 'P' terjejas. Bendera N ditetapkan (dijadikan 1) apabila hasilnya adalah nombor negatif. Bendera Z ditetapkan (dijadikan 1) apabila hasilnya adalah sifar (000000002). Bendera C ditetapkan (dijadikan 1) apabila terdapat pembawaan dari bit lapan ke bit kesembilan. Jadual berikut memberikan ilustrasi terperinci

Maksudnya 'lebih besar daripada'. Dengan itu, jadual perbandingan hendaklah jelas.

4.11 Arahan Lompat dan Cabang

Jadual berikut meringkaskan arahan lompat dan cabang:

Arahan JMP menggunakan pengalamatan mutlak dan tidak langsung. Selebihnya arahan dalam jadual adalah arahan cawangan. Mereka hanya menggunakan pengalamatan relatif dengan 6502 µP. Dengan itu, jadual menjadi jelas jika ia dibaca dari kiri ke kanan dan atas ke bawah.

Ambil perhatian bahawa cawangan hanya boleh digunakan untuk alamat dalam lingkungan -128 hingga +127 bait dari alamat yang diberikan. Ini adalah menangani relatif. Untuk arahan JMP dan cawangan, Kaunter Program (PC) terjejas secara langsung. 6502 µP tidak membenarkan cawangan ke alamat mutlak, walaupun lompatan boleh melakukan pengalamatan mutlak. Arahan JMP bukan arahan cawangan.

Catatan: Pengalamatan relatif hanya digunakan dengan arahan cawangan.

4.12 Kawasan Timbunan

Subrutin adalah seperti salah satu program pendek sebelumnya untuk menambah dua nombor atau menolak dua nombor. Kawasan tindanan dalam ingatan bermula dari $0100 hingga $01FF secara inklusif. Kawasan ini hanya dipanggil timbunan. Apabila mikropemproses melaksanakan lompatan ke arahan subrutin (JSR – rujuk perbincangan berikut), ia perlu tahu tempat untuk kembali apabila selesai. 6502 µP menyimpan maklumat ini (alamat pemulangan) dalam ingatan rendah daripada $0100 hingga $01FF (kawasan tindanan) dan menggunakan kandungan daftar penuding tindanan iaitu “S” dalam mikropemproses sebagai penunjuk (9 bit) ke alamat yang dikembalikan terakhir. yang disimpan dalam halaman 1 ($0100 hingga $01FF) memori. Timbunan meningkat daripada $01FF dan memungkinkan untuk menyusun subrutin sehingga 128 tahap dalam.

Satu lagi kegunaan penuding tindanan adalah untuk mengendalikan gangguan. 6502 µP mempunyai pin yang dilabelkan sebagai IRQ dan NMI. Ada kemungkinan untuk beberapa isyarat elektrik kecil digunakan pada pin ini dan menyebabkan 6502 µP berhenti melaksanakan satu program dan menjadikannya mula melaksanakan yang lain. Dalam kes ini, program pertama terganggu. Seperti subrutin, segmen kod gangguan boleh disarangkan. Pemprosesan gangguan dibincangkan dalam bab seterusnya.

Catatan : Penunjuk tindanan mempunyai 8 bit untuk alamat bait yang lebih rendah dalam menangani lokasi dari $0100 hingga $01FF. Bait yang lebih tinggi daripada 00000001 2 diandaikan.

Jadual berikut memberikan arahan yang mengaitkan penuding tindanan “S” dengan daftar A, X, Y dan P ke kawasan tindanan dalam ingatan:

4.13 Panggilan dan Pemulangan Subrutin

Subrutin ialah satu set arahan yang mencapai objektif tertentu. Program penambahan atau penolakan sebelumnya adalah subrutin yang sangat singkat. Subrutin kadangkala hanya dipanggil rutin. Arahan untuk memanggil subrutin ialah:

JSR : Lompat ke SubRutin

Arahan untuk kembali dari subrutin ialah:

RTS : Kembali dari Subrutin

Mikropemproses mempunyai kecenderungan untuk terus melaksanakan arahan dalam ingatan, satu demi satu. Anggapkan bahawa mikropemproses sedang melaksanakan segmen kod dan ia menghadapi arahan lompat (JMP) untuk pergi dan melaksanakan segmen kod yang dikodkan di belakang yang mungkin telah dilaksanakan. Ia melaksanakan segmen kod itu di belakang dan terus melaksanakan semua segmen kod (arahan) mengikut segmen kod di belakang, sehingga ia melaksanakan semula segmen kod semasa sekali lagi dan teruskan di bawah. JMP tidak menolak arahan seterusnya ke timbunan.

Tidak seperti JMP, JSR menolak alamat arahan seterusnya selepas dirinya dari PC (kaunter program) ke tindanan. Kedudukan tindanan alamat ini diletakkan dalam penuding tindanan “S”. Apabila arahan RTS ditemui (dilaksanakan) dalam subrutin, alamat yang ditolak pada timbunan menarik timbunan dan program disambung semula pada alamat yang ditarik keluar itu yang merupakan alamat arahan seterusnya sejurus sebelum panggilan subrutin. Alamat terakhir yang dialih keluar daripada timbunan dihantar ke kaunter program. Jadual berikut memberikan butiran teknikal arahan JSR dan RTS:

Lihat ilustrasi berikut untuk kegunaan JSR dan RTS:

4.14 Contoh Gelung Kira Turun

Subrutin berikut mengira turun daripada $FF hingga $00 (jumlah 256 10 dikira):

mulakan LDX #$FF ; muatkan X dengan $FF = 255
gelung DEX ; X = X – 1
gelung BNE ; jika X bukan sifar maka gelung goto
RTS ; kembali

Setiap baris ada komen. Komen tidak pernah masuk ke dalam ingatan untuk dilaksanakan. Penghimpun (penterjemah) yang menukar atur cara kepada apa yang ada dalam ingatan untuk pelaksanaan (berjalan) sentiasa menanggalkan komen. Komen bermula dengan ';' . 'permulaan' dan 'gelung' dalam program ini dipanggil label. Label mengenal pasti (nama) untuk alamat arahan. Jika arahan adalah arahan bait tunggal (pengalamatan tersirat), label ialah alamat arahan itu. Jika arahan adalah arahan multibait, label mengenal pasti bait pertama untuk arahan multibait. Arahan pertama untuk program ini terdiri daripada dua bait. Dengan mengandaikan bahawa ia bermula pada alamat $0300, alamat $0300 boleh digantikan dengan 'mula' ke bawah dalam program. Arahan kedua (DEX) ialah arahan6 bait tunggal, dan harus berada di alamat $0302. Ini bermakna alamat $0302 boleh digantikan dengan 'gelung', ke bawah dalam program, yang sebenarnya begitu dalam 'gelung BNE'.

“Gelung BNE” bermaksud cawangan ke alamat yang diberikan apabila bendera Z bagi daftar status ialah 0. Apabila nilai dalam daftar A atau X atau Y ialah 00000000 2 , disebabkan oleh operasi terakhir, bendera Z ialah 1 (set). Jadi, walaupun 0 (bukan 1), arahan kedua dan ketiga dalam program diulang dalam susunan itu. Dalam setiap urutan berulang, nilai (nombor bulat) dalam daftar X dikurangkan sebanyak 1. DEX bermaksud X = X – 1. Apabila nilai dalam daftar X ialah $00 = 00000000 2 , Z menjadi 1. Pada ketika itu, tiada lagi pengulangan kedua-dua arahan itu. Arahan RTS terakhir dalam program, yang merupakan arahan bait tunggal (pengalamatan tersirat), kembali daripada subrutin. Kesan arahan ini adalah untuk membuat alamat pembilang program dalam timbunan untuk kod yang akan dilaksanakan sebelum panggilan subrutin dan kembali ke pembilang program (PC). Alamat ini ialah alamat arahan yang akan dilaksanakan sebelum subrutin dipanggil.

Catatan: Apabila menulis atur cara bahasa himpunan untuk 6502 µP, hanya label mesti bermula pada permulaan baris; sebarang kod baris lain mesti dianjakkan sekurang-kurangnya satu ruang ke kanan.

Memanggil Subrutin
Mengabaikan ruang memori yang diambil oleh label sebelumnya, program ini mengambil 6 bait lokasi berturut-turut dalam memori (RAM) daripada $0300 hingga $0305. Dalam kes ini, program ini adalah:

LDX #$FF ; muatkan X dengan $FF = 255
DEX ; X = X – 1
BNE $0302 ; jika X bukan sifar maka gelung goto
RTS ; kembali

Bermula dari alamat $0200 dalam ingatan boleh menjadi panggilan untuk subrutin. Arahan panggilan ialah:

JSR mula ; mula ialah alamat $0300, iaitu, JSR $0300

Subrutin dan panggilannya yang ditulis dengan betul dalam fail editor teks ialah:

mulakan LDX #$FF; muatkan X dengan $FF = 255
gelung DEX ; X = X – 1

gelung BNE ; jika X bukan sifar maka gelung goto
RTS ; kembali

Permulaan JSR : lompat ke rutin bermula pada $0300

Kini, terdapat banyak subrutin dalam satu program yang panjang. Kesemua mereka tidak boleh mempunyai nama 'mula'. Mereka sepatutnya mempunyai nama yang berbeza. Malah, tiada satu pun daripada mereka mungkin mempunyai nama 'mula'. 'Mula' digunakan di sini untuk tujuan pengajaran.

4.15 Menterjemah Program

Menterjemah program atau memasangnya bermaksud perkara yang sama. Pertimbangkan program berikut:

mulakan LDX #$FF : muatkan X dengan $FF = 255
gelung DEX : X = X – 1
Gelung BNE : jika X bukan sifar maka gelung goto
RTS : balik
Permulaan JSR : lompat ke rutin bermula pada $0300

Ini adalah program yang telah ditulis sebelum ini. Ia terdiri daripada subrutin, mula dan panggilan ke subrutin. Program ini mengira mundur dari 255 10 kepada 0 10 . Program ini bermula pada alamat permulaan pengguna $0200 (RAM). Program ini ditaip dalam editor teks dan disimpan dalam cakera. Ia mempunyai nama seperti 'sample.asm' dengan 'sampel' ialah nama pilihan pengaturcara tetapi sambungan '.asm' untuk bahasa himpunan mesti dikaitkan dengan nama fail.

Program yang dipasang dihasilkan oleh atur cara lain yang dipanggil assembler. Penghimpun dibekalkan oleh pengilang 6502 µP atau oleh pihak ketiga. Penghimpun mengeluarkan semula atur cara sedemikian rupa sehingga ia berada dalam ingatan (RAM) semasa ia dilaksanakan (jalankan).

Andaikan bahawa arahan JSR bermula pada alamat $0200 dan subrutin bermula pada alamat $0300. Penghimpun menanggalkan semua komen dan ruang putih. Komen dan ruang kosong membazirkan memori yang sentiasa berkurangan. Garis kosong yang mungkin antara segmen kod subrutin sebelumnya dan panggilan subrutin ialah contoh ruang putih. Fail yang dipasang masih disimpan dalam cakera, dan ia dinamakan seperti 'sample.exe'. 'Sampel' ialah nama pilihan pengaturcara, tetapi sambungan '.exe' harus ada di sana untuk menunjukkan bahawa ia adalah fail boleh laku.

Program yang dipasang boleh didokumentasikan seperti berikut:

Menghasilkan dokumen seperti ini dikatakan memasang dengan tangan. Ambil perhatian bahawa ulasan dalam dokumen ini tidak muncul dalam ingatan (untuk pelaksanaan). Lajur alamat dalam jadual menunjukkan alamat permulaan arahan dalam ingatan. Ambil perhatian bahawa 'permulaan JSR' iaitu 'JSR $0300', yang dijangka akan dikodkan sebagai '20 03 00', sebenarnya dikodkan sebagai '20 00 03' dengan alamat bait memori yang lebih rendah mengambil bait yang lebih rendah dalam memori dan alamat bait memori yang lebih tinggi mengambil bait yang lebih tinggi dalam ingatan – sedikit endian. Kod op untuk JSR ialah 20 16 .

Ambil perhatian bahawa offset kepada arahan cawangan seperti BNE ialah nombor pelengkap dua dalam julat 128 10 kepada + 127 10 . Jadi, 'gelung BNE' bermaksud 'BNE -1 10 ” yang sebenarnya ialah “D0 FF” dalam bentuk kod FF 16 ialah -1 dalam pelengkap dua yang ditulis sebagai = 11111111 dalam asas dua. Program pemasang menggantikan label dan medan kepada nombor perenambelasan sebenar (nombor perenambelasan ialah nombor perduaan yang dikumpulkan dalam empat bit). Alamat sebenar di mana setiap arahan bermula sebenarnya disertakan.

Catatan: Arahan 'permulaan JSR' digantikan dengan arahan yang lebih pendek yang menghantar kandungan semasa (bait tinggi dan rendah) pembilang program ke tindanan dengan penuding tindanan yang dikurangkan dua kali (sekali untuk bait tinggi dan sekali untuk bait rendah) dan kemudian muat semula PC dengan alamat $0300. Penunjuk tindanan kini menunjuk kepada $00FD, dengan mengandaikan bahawa ia dimulakan kepada $01FF.

Juga, arahan RTS digantikan dengan beberapa arahan yang lebih pendek yang menambah penuding tindanan 'S' dua kali (sekali untuk bait rendah dan sekali untuk bait tinggi) dan menarik dua bait alamat yang sepadan daripada penuding tindanan ke PC untuk arahan seterusnya.

Catatan: Teks label tidak boleh mempunyai lebih daripada 8 aksara.

“BNE loop” menggunakan pengalamatan relatif. Ia bermaksud menambah -3 10 ke kandungan kaunter program seterusnya sebanyak $0305. Bait untuk 'gelung BNE' ialah 'D0 FD' di mana FD ialah pelengkap dua bagi -3 10 .

Nota: Bab ini tidak membentangkan semua arahan untuk 6502 µP. Semua arahan dan butirannya boleh didapati dalam dokumen bertajuk 'Keluarga Mikropemproses 8-Bit SY6500'. Terdapat fail PDF dengan nama '6502.pdf' untuk dokumen ini yang tersedia secara percuma di Internet. 6502 µP yang diterangkan dalam dokumen ini ialah 65C02.

4.16 Gangguan

Isyarat mana-mana peranti yang disambungkan ke port luaran (permukaan menegak) Commodore 64 perlu melalui sama ada litar (IC) CIA 1 atau CIA 2 sebelum mencapai mikropemproses 6502. Isyarat daripada bas data 6502 µP perlu melalui sama ada melalui cip CIA 1 atau CIA 2 sebelum mencapai mana-mana peranti luaran. CIA bermaksud Penyesuai Antara Muka Kompleks. Dalam Rajah 4.1 'Diagram Blok Papan Induk Commodore_64', peranti input/output blok mewakili CIA 1 dan CIA 2. Apabila program sedang berjalan, ia boleh diganggu untuk menjalankan beberapa kod lain sebelum meneruskan. Terdapat gangguan perkakasan dan gangguan perisian. Untuk gangguan perkakasan, terdapat dua pin isyarat input pada 6502 µP. Nama-nama pin ini ialah IRQ dan NMI . Ini bukan talian data µP. Talian data untuk µP ialah D7, D6, D5, D4, D3, D2, D1 dan D0; dengan D0 untuk bit paling ketara dan D7 untuk bit paling ketara.

IRQ bermaksud Interrupt ReQuest 'aktif' rendah. Talian input ke µP ini biasanya tinggi, pada kira-kira 5 volt. Apabila ia turun kepada kira-kira 0 volt, itu adalah permintaan gangguan yang menandakan µP. Sebaik sahaja permintaan diberikan, barisan kembali tinggi. Memberi permintaan gangguan bermakna μP bercabang kepada kod (subrutin) yang mengendalikan gangguan.

NMI singkatan kepada Non-Maskable Interrupt 'aktif' rendah. Manakala kod untuk IRQ sedang dilaksanakan NMI boleh turun rendah. Dalam kes ini, NMI dikendalikan (kodnya sendiri dilaksanakan). Selepas itu, kod untuk IRQ berterusan. Selepas kod untuk IRQ tamat, kod program utama diteruskan. Itu dia, NMI mengganggu IRQ pengendali. Isyarat untuk NMI masih boleh diberikan kepada µP walaupun apabila µP melahu dan tidak mengendalikan apa-apa atau tidak menjalankan program utama.

Catatan: Ia sebenarnya adalah peralihan dari tinggi ke rendah, daripada NMI , iaitu NMI isyarat - lebih lanjut mengenainya kemudian. IRQ biasanya datang dari CIA 1 dan NMI biasanya datang dari CIA 2. NMI , yang bermaksud Non-Maskable Interrupt, boleh dianggap sebagai non-stopable interrupt.

Mengendalikan Gangguan
Sama ada permintaan itu daripada IRQ atau NMI , arahan semasa mesti diselesaikan. 6502 hanya mempunyai daftar A, X dan Y. Semasa subrutin beroperasi, ia mungkin menggunakan ketiga-tiga daftar ini bersama-sama. Pengendali gangguan masih merupakan subrutin, walaupun tidak dilihat sedemikian. Selepas arahan semasa selesai, kandungan daftar A, X dan Y untuk 65C02 µP disimpan dalam tindanan. Alamat arahan seterusnya bagi Kaunter Program juga dihantar ke timbunan. µP kemudian bercabang kepada kod untuk gangguan. Selepas itu, kandungan daftar A, X, dan Y kemudiannya dipulihkan daripada timbunan dalam susunan terbalik yang dihantar.

Contoh Pengekodan untuk Gangguan
Untuk kesederhanaan, anggap bahawa rutin untuk µP IRQ interrupt hanyalah untuk menambah nombor $01 dan $02 dan menyimpan hasil $03 pada alamat memori $0400. Kodnya ialah:

ISR PHA
PHX
PHY
;
LDA #$01
ADC #$02
MEREKA BERHARGA $0400
;
PLY
PLX
PLA
RTI

ISR ialah label dan mengenal pasti alamat memori di mana arahan PHA berada. ISR bermaksud Rutin Perkhidmatan Gangguan. PHA, PHX dan PHY menghantar kandungan daftar A, X dan Y ke timbunan dengan harapan bahawa ia akan diperlukan oleh apa-apa kod (program) yang sedang berjalan sebelum gangguan. Tiga arahan seterusnya membentuk teras pengendali gangguan. Arahan PLY, PLX, dan PLA mestilah dalam susunan itu, dan ia membawa kembali kandungan daftar Y, X dan A. Arahan terakhir, iaitu RTI, (tanpa operan) mengembalikan kesinambungan pelaksanaan kepada apa-apa kod (program) yang sedang dilaksanakan sebelum gangguan. RTI menarik alamat arahan seterusnya kod yang sedang dilaksanakan dari timbunan kembali ke kaunter program. RTI bermaksud Pulangan daripada Gangguan. Dengan itu, pengendalian gangguan (subrutin) tamat.

Gangguan Perisian
Cara utama untuk mempunyai gangguan perisian untuk 6502 µP adalah dengan menggunakan arahan alamat tersirat BRK. Andaikan bahawa program utama sedang berjalan dan ia menghadapi arahan BRK. Dari titik itu, alamat arahan seterusnya dalam PC harus dihantar ke timbunan apabila arahan semasa selesai. Subrutin untuk mengendalikan arahan perisian hendaklah dipanggil 'seterusnya'. Subrutin sampukan ini harus menolak kandungan daftar A, X dan Y ke tindanan. Selepas teras subrutin dilaksanakan, kandungan daftar A, X, dan Y harus ditarik balik dari timbunan ke daftarnya dengan subrutin yang melengkapkan. Pernyataan terakhir dalam rutin ialah RTI. Kandungan PC juga ditarik balik dari timbunan ke PC secara automatik kerana RTI.

Membanding dan Membezakan Subrutin dan Rutin Servis Gangguan
Jadual berikut membandingkan dan membezakan Rutin Perkhidmatan Subrutin dan Gangguan:

4.17 Ringkasan 6502 Mod Pengalamatan Utama

Setiap arahan untuk 6502 ialah satu bait, diikuti dengan sifar atau lebih operan.

Mod Pengalamatan Segera
Dengan mod pengalamatan segera, selepas operan, ialah nilai dan bukan alamat memori. Nilai perlu didahului dengan #. Jika nilainya dalam perenambelasan, “#” perlu diikuti dengan “$”. Arahan pengalamatan segera untuk 65C02 ialah: ADC, DAN, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Pembaca harus merujuk dokumentasi untuk 65C02 µP untuk mengetahui cara menggunakan arahan yang disenaraikan di sini yang tidak diterangkan dalam bab ini. Contoh arahan ialah:

LDA #$77

Mod Pengalamatan Mutlak
Dalam mod pengalamatan mutlak, terdapat satu operan. Operan ini ialah alamat nilai dalam ingatan (biasanya dalam perenambelasan atau label). Terdapat 64K 10 = 65,536 10 alamat memori untuk 6502 µP. Biasanya, nilai satu bait berada pada salah satu alamat ini. Arahan pengalamatan mutlak untuk 65C02 ialah: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB. Pembaca harus merujuk dokumentasi untuk 65C02 µP untuk mengetahui cara menggunakan arahan yang disenaraikan di sini, serta untuk mod pengalamatan yang lain yang tidak dijelaskan dalam bab ini. Contoh arahan ialah:

IALAH $1234

Mod Pengalamatan Tersirat
Dalam mod pengalamatan tersirat, tiada operan. Sebarang daftar µP yang terlibat adalah tersirat oleh arahan tersebut. Arahan pengalamatan tersirat untuk 65C02 ialah: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, CUKAI, TAY, TSX, TXA, TXS, TYA. Contoh arahan ialah:

DEX : Kurangkan daftar X sebanyak satu unit.

Mod Pengalamatan Relatif
Mod pengalamatan relatif hanya berurusan dengan arahan cawangan. Dalam mod pengalamatan relatif, hanya terdapat satu operan. Ia adalah nilai dari -128 10 kepada +127 10 . Nilai ini dipanggil offset. Berdasarkan tanda, nilai ini ditambah atau ditolak daripada arahan seterusnya bagi Kaunter Program untuk menghasilkan alamat arahan seterusnya yang dimaksudkan. Arahan mod alamat relatif ialah: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Contoh arahan adalah:

BNE $7F : (cawangan jika Z = 0 dalam daftar status, P)

Yang menambah 127 ke kaunter program semasa (alamat untuk dilaksanakan) dan mula melaksanakan arahan di alamat tersebut. Begitu juga:

BEQ $F9 : (cawangan jika Z = : dalam daftar status, P)

Yang menambah -7 pada kaunter program semasa dan memulakan pelaksanaan di alamat kaunter program baharu. Operan ialah nombor pelengkap dua.

Pengalamatan Terindeks Mutlak
Dalam pengalamatan indeks mutlak, kandungan daftar X atau Y ditambah pada alamat mutlak yang diberikan (di mana-mana dari $0000 hingga $FFFF, iaitu dari 0 10 kepada 65536 10 ) untuk mempunyai alamat sebenar. Alamat mutlak yang diberikan ini dipanggil alamat asas. Jika daftar X digunakan, arahan pemasangan adalah seperti ini:

LDA $C453,X

Jika daftar Y digunakan, ia adalah seperti:

LDA $C453,Y

Nilai untuk daftar X atau Y dipanggil kiraan atau nilai indeks, dan ia boleh berada di mana-mana dari $00 (0 10 ) kepada $FF (250 10 ). Ia tidak dipanggil offset.

Arahan alamat indeks mutlak ialah: ADC, AND, ASL (X sahaja), BIT (dengan penumpuk dan memori, dengan X sahaja), CMP, DEC (memori dan X sahaja), EOR, INC (memori dan X sahaja), LDA , LDX, LDY, LSR (X sahaja), ORA, ROL (X sahaja), ROR (X sahaja), SBC, STA, STZ (X sahaja).

Alamat Tidak Langsung Mutlak
Ini hanya digunakan dengan arahan lompat. Dengan ini, alamat mutlak yang diberikan mempunyai alamat penunjuk. Alamat penuding terdiri daripada dua bait. Penunjuk dua bait menghala ke (adalah alamat) nilai bait destinasi dalam ingatan. Jadi, arahan bahasa himpunan ialah:

JMP ($3456)

Dengan kurungan, dan $13 berada di lokasi alamat $3456 manakala $EB berada di lokasi alamat $3457 (= $3456 + 1). Kemudian, alamat destinasi ialah $13EB dan $13EB ialah penunjuk. $3456 mutlak adalah dalam kurungan dalam arahan di mana 34 adalah bait yang lebih rendah dan 56 adalah bait yang lebih tinggi.

4.18 Mencipta Rentetan dengan Bahasa Himpunan 6502 µP

Seperti yang ditunjukkan dalam bab seterusnya, selepas mencipta fail dalam memori, fail itu boleh disimpan ke dalam cakera. Fail itu perlu diberi nama. Nama adalah contoh rentetan. Terdapat banyak lagi contoh rentetan dalam pengaturcaraan.

Terdapat dua cara utama untuk mencipta rentetan kod ASCII. Dalam kedua-dua cara, semua kod (aksara) ASCII mengambil lokasi bait berturut-turut dalam ingatan. Dalam salah satu cara, jujukan bait ini didahului oleh bait integer iaitu panjang (bilangan aksara) dalam jujukan (rentetan). Dengan cara lain, urutan aksara dijayakan (segera diikuti) oleh bait Null iaitu 00 16 , iaitu $00. Panjang rentetan (bilangan aksara) tidak ditunjukkan dengan cara lain ini. Aksara Null tidak digunakan dengan cara pertama.

Sebagai contoh, pertimbangkan 'Saya sayang awak!' rentetan tanpa petikan. Panjang di sini ialah 11; ruang dikira sebagai satu bait ASCII (karakter). Andaikan bahawa rentetan itu perlu diletakkan dalam memori dengan aksara pertama berada di alamat $0300.

Jadual berikut menunjukkan tetapan memori rentetan apabila bait pertama ialah 11 10 = 0B 16 :

Jadual berikut menunjukkan tetapan memori rentetan apabila bait pertama ialah 'I' dan bait terakhir ialah Null ($00):

Arahan berikut boleh digunakan untuk mula mencipta rentetan:

MEREKA BERHARGA $0300

Andaikan bahawa bait pertama berada dalam penumpuk yang akan dihantar ke lokasi alamat $0300. Arahan ini adalah benar untuk kedua-dua kes (kedua-dua jenis rentetan).

Selepas memasang semua aksara dalam sel memori, satu demi satu, rentetan boleh dibaca menggunakan gelung. Untuk kes pertama, bilangan aksara selepas panjang dibacakan. Untuk kes kedua, aksara dibaca daripada 'I' sehingga aksara Null iaitu 'Null' dipenuhi.

4.19 Mencipta Tatasusunan dengan Bahasa Himpunan 6502 µP

Tatasusunan integer bait tunggal terdiri daripada lokasi bait memori berturut-turut dengan integer. Kemudian, terdapat penunjuk yang menunjuk ke lokasi integer pertama. Jadi, tatasusunan integer terdiri daripada dua bahagian: penunjuk dan siri lokasi.

Untuk tatasusunan rentetan, setiap rentetan boleh berada di tempat yang berbeza dalam ingatan. Kemudian, terdapat lokasi memori berturut-turut dengan penunjuk di mana setiap penuding menghala ke lokasi pertama setiap rentetan. Penunjuk dalam kes ini terdiri daripada dua bait. Jika rentetan bermula dengan panjangnya, penunjuk yang sepadan menunjuk ke lokasi panjang itu. Jika rentetan tidak bermula dengan panjangnya tetapi berakhir dengan aksara nol, penunjuk yang sepadan menghala ke lokasi aksara pertama rentetan. Dan terdapat penuding yang menunjuk ke alamat bait bawah penuding pertama penuding berturut-turut. Jadi, tatasusunan rentetan terdiri daripada tiga bahagian: rentetan di tempat yang berbeza dalam ingatan, penunjuk berturut-turut yang sepadan dan penuding kepada penuding pertama penuding berturut-turut.

4.20 Masalah

Pembaca dinasihatkan untuk menyelesaikan semua masalah dalam bab sebelum beralih ke bab seterusnya.

  1. Tulis program bahasa himpunan yang bermula pada $0200 untuk 6502 µP dan tambahkan nombor yang tidak ditandatangani bagi 2A94 H (tambah) kepada 2ABF H (augend). Biarkan input dan output berada dalam ingatan. Juga, hasilkan dokumen program yang dipasang dengan tangan.
  2. Tulis program bahasa himpunan yang bermula pada $0200 untuk 6502 µP dan tolak nombor tidak bertanda 1569 H (subtrahend) daripada 2ABF H (minuend). Biarkan input dan output berada dalam ingatan. Juga, hasilkan dokumen program yang dipasang dengan tangan.
  3. Tulis program bahasa himpunan untuk 6502 µP yang dikira dari $00 hingga $09 menggunakan gelung. Program ini harus bermula pada $0200. Juga, hasilkan dokumen program yang dipasang dengan tangan.
  4. Tulis program bahasa himpunan yang bermula pada $0200 untuk 6502 µP. Program ini mempunyai dua subrutin. Subrutin pertama menambah nombor yang tidak ditandatangani 0203 H (augend) dan 0102H (tambah). Subrutin kedua menambah jumlah daripada subrutin pertama iaitu 0305H hingga 0006 H (augend). Hasil akhir disimpan dalam ingatan. Panggil subrutin pertama iaitu FSTSUB dan subrutin kedua iaitu SECSUB. Biarkan input dan output berada dalam ingatan. Juga, hasilkan dokumen program yang dipasang untuk keseluruhan program dengan tangan.
  5. Memandangkan an IRQ pengendali menambah $02 kepada $01 pada penumpuk sebagai pengendalian teras manakala NMI dikeluarkan dan pengendalian teras untuk NMI menambah $05 kepada $04 pada penumpuk, tulis bahasa himpunan untuk kedua-dua pengendali termasuk panggilan mereka. Panggilan kepada IRQ pengendali hendaklah berada di alamat $0200. The IRQ pengendali hendaklah bermula pada alamat $0300. The NMI pengendali hendaklah bermula pada alamat $0400. Hasil daripada IRQ pengendali hendaklah diletakkan di alamat $0500, dan hasil daripada NMI pengendali hendaklah diletakkan di alamat $0501.
  6. Terangkan secara ringkas bagaimana arahan BRK digunakan untuk menghasilkan gangguan perisian dalam komputer 65C02.
  7. Hasilkan jadual yang membandingkan dan membezakan subrutin biasa dengan rutin perkhidmatan gangguan.
  8. Terangkan secara ringkas mod pengalamatan utama 65C02 µP diberikan contoh arahan bahasa himpunan.
  9. a) Tulis program bahasa mesin 6502 untuk meletakkan 'Saya sayang kamu!' rentetan kod ASCII dalam ingatan, bermula dari alamat $0300 dengan panjang rentetan. Program ini harus bermula di alamat $0200. Dapatkan setiap aksara daripada penumpuk satu demi satu, dengan mengandaikan bahawa ia dihantar ke sana, oleh beberapa subrutin. Juga, kumpulkan program dengan tangan. (Jika anda perlu mengetahui kod ASCII untuk 'Saya sayang awak!'. Ini adalah: 'Saya':49 16 , ruang : 20 16 , ‘l’: 6C 16 , ‘o’:6F 16 , 'dalam':76 16 , 'e':65, 'y':79 16 , 'dalam':75 16 , dan ‘!’:21 16 (Nota: setiap kod menduduki 1 bait).
    b) Tulis program bahasa mesin 6502 untuk meletakkan 'Saya sayang kamu!' rentetan kod ASCII dalam ingatan, bermula dari alamat $0300 tanpa panjang rentetan tetapi berakhir dengan 00 16 . Program ini harus bermula di alamat $0200. Dapatkan setiap aksara daripada penumpuk, dengan mengandaikan bahawa ia dihantar ke sana, satu demi satu, oleh beberapa subrutin. Juga, kumpulkan program dengan tangan.