Bab 4: Tutorial Bahasa Perakitan Mikroprosesor 6502

Bab 4 Tutorial Bahasa Perakitan Mikroprosesor 6502



Bab 4: Tutorial Bahasa Perakitan Mikroprosesor 6502

4.1 Pendahuluan

Mikroprosesor 6502 dirilis pada tahun 1975. Mikroprosesor ini digunakan sebagai mikroprosesor untuk beberapa komputer pribadi seperti Apple II, Commodore 64, dan BBC Micro.







Mikroprosesor 6502 masih diproduksi dalam jumlah besar hingga saat ini. Ini bukan lagi unit pemrosesan pusat yang digunakan pada komputer pribadi (laptop) saat ini, tetapi masih diproduksi dalam jumlah besar dan digunakan pada peralatan elektronik dan listrik saat ini. Untuk memahami arsitektur komputer yang lebih modern, akan sangat membantu jika kita memeriksa mikroprosesor yang lebih tua namun cukup sukses seperti 6502.



Karena mudah dipahami dan diprogram, ini adalah salah satu mikroprosesor terbaik (jika bukan yang terbaik) yang digunakan untuk mengajar bahasa assembly. Bahasa assembly merupakan bahasa tingkat rendah yang dapat digunakan untuk memprogram komputer. Perhatikan bahwa bahasa rakitan untuk satu mikroprosesor berbeda dengan bahasa rakitan mikroprosesor lainnya. Bahasa rakitan mikroprosesor 6502 diajarkan dalam bab ini. Lebih tepatnya, 65C02lah yang diajarkan, namun hanya disebut sebagai 6502.



Komputer yang terkenal di masa lalu disebut commodore_64. 6502 adalah mikroprosesor dari keluarga 6500. Komputer commodore_64 menggunakan mikroprosesor 6510. Mikroprosesor 6510 memiliki 6500 µP. Set instruksi pada 6502 µP hampir seluruhnya merupakan instruksi pada 6510 µP. Pengetahuan bab ini dan bab selanjutnya didasarkan pada komputer commodore_64. Pengetahuan ini digunakan sebagai dasar untuk menjelaskan arsitektur komputer modern dan sistem operasi modern pada bagian kursus karir online ini.





Arsitektur komputer mengacu pada komponen motherboard komputer dan penjelasan tentang bagaimana data mengalir dalam setiap komponen, terutama mikroprosesor, bagaimana data mengalir antar komponen, dan juga bagaimana data berinteraksi. Bentuk tunggal dari data adalah datum. Cara efektif untuk mempelajari arsitektur komputer suatu komputer adalah dengan mempelajari bahasa rakitan motherboard.

Komputer commodore_64 dikatakan sebagai komputer kata komputer 8-bit. Artinya informasi disimpan, ditransfer, dan dimanipulasi dalam bentuk kode biner delapan bit.



Diagram Blok Motherboard Commodore 64
Diagram blok motherboard Commodore 64 adalah:


Gambar 4.1 Diagram Blok Unit Sistem Commodore_64

Bayangkan mikroprosesor 6510 sebagai mikroprosesor 6502. Total memori adalah serangkaian byte (8-bit per byte). Ada memori akses acak (baca/tulis) dimana byte dapat ditulis atau dihapus. Saat daya komputer dimatikan, semua informasi dalam memori akses acak (RAM) akan terhapus. Ada juga memori read-only (ROM). Ketika daya komputer dimatikan, informasi dalam ROM tetap ada (tidak terhapus).

Ada port input/output (rangkaian) yang disebut sebagai perangkat input/output dalam diagram. Port ini berbeda dengan port yang terlihat pada permukaan vertikal kiri dan kanan atau depan dan belakang unit sistem komputer. Itu adalah dua hal yang berbeda. Koneksi dari port dalam ini ke periferal seperti hard-disk (atau floppy-disk), keyboard, dan monitor tidak ditampilkan dalam diagram.

Ada tiga bus (kelompok konduktor kawat listrik yang sangat kecil) pada diagram. Setiap kabel dapat mentransfer bit 1 atau bit 0. Bus data, untuk transfer byte delapan bit sekaligus (satu pulsa clock) ke RAM dan port input/output (perangkat input/output) bersifat dua arah. Bus data lebarnya delapan bit.

Semua komponen terhubung ke bus alamat. Bus alamat searah dari mikroprosesor. Ada enam belas konduktor untuk bus alamat, dan masing-masing membawa satu bit (1 atau 0). Enam belas bit dikirim dalam satu pulsa clock.

Ada bus kontrol. Beberapa konduktor bus kontrol masing-masing akan mentransfer satu bit dari mikroprosesor ke komponen lainnya. Beberapa jalur kontrol membawa bit dari port input/output (IO) ke mikroprosesor.

Memori Komputer
RAM dan ROM dianggap sebagai satu unit memori. Majelis ini direpresentasikan secara diagram sebagai berikut di mana bilangan heksadesimal memiliki awalan “$”:


Gambar 4.11 Tata Letak Memori untuk Komputer Commodore 64

RAMnya dari 0000 16 ke DFFF 16 yang ditulis mulai dari $0000 hingga $DFFF. Dengan bahasa assembly 6502 µP, bilangan heksadesimal diawali dengan “$” dan tidak diberi akhiran (berlangganan) dengan 16 atau H atau hex. Informasi apa pun di RAM akan hilang saat komputer dimatikan. ROM mulai dari $E000 hingga $FFFF. Ia memiliki subrutin yang tidak berbunyi ketika komputer dimatikan. Subrutin ini adalah rutinitas yang umum digunakan untuk membantu dalam pemrograman. Program pengguna memanggilnya (lihat bab berikutnya).

Spasi (byte) dari $0200 hingga $D000 adalah untuk program pengguna. Spasi dari $D000 hingga $DFFF ditujukan untuk informasi yang berhubungan langsung dengan periferal (perangkat input/output). Ini adalah bagian dari sistem operasi. Jadi, sistem operasi komputer commodore-64 ada dalam dua bagian utama: bagian di ROM yang tidak pernah mati dan bagian dari $D000 hingga $DFFF yang mati saat listrik dimatikan. Data IO (input/output) ini harus dimuat dari disk setiap kali komputer dihidupkan. Saat ini, data tersebut disebut driver periferal. Periferal dimulai dari port Perangkat Input/Output melalui koneksi pada motherboard ke port yang dapat diidentifikasi pada permukaan vertikal komputer tempat monitor, keyboard, dll. terhubung ke dan ke periferal itu sendiri (monitor, keyboard, dll. .).

Memori terdiri dari 2 16 = 65.536 byte lokasi. Dalam bentuk heksadesimal, jumlahnya adalah 10.000 16 = 10.000 H = 10.000 heksa = $10.000 lokasi. Dalam komputasi, penghitungan basis dua, basis sepuluh, basis enam belas, dan seterusnya dimulai dari 0 dan bukan dari 1. Jadi, lokasi pertama sebenarnya adalah bilangan lokasi 0000000000000000 2 = 0 10 = 0000 16 = $0000. Dalam bahasa rakitan 6502 µP, identifikasi lokasi alamat diawali dengan $ dan tidak ada akhiran atau subskrip. Lokasi terakhir adalah nomor lokasi 1111111111111111 2 = 65.535 10 = FFFF 16 = $FFFF dan bukan 10000000000000000 2 , atau 65.536 10 , atau 10.000 16 , atau $10.000. 10000000000000000 2 , 65.536 10 , 10.000 16 , atau $10000 memberikan jumlah total lokasi byte.

Di sini, 2 16 = 65.536 = 64 x 1024 = 64 x 2 10 = 64 Kbyte (Kilobyte). Akhiran 64 pada nama Commodore-64 berarti total memori (RAM dan ROM) 64KB. Satu byte adalah 8 bit, dan 8 bit tersebut akan dimasukkan ke dalam satu lokasi byte di memori.

Memori 64 Kbytes dibagi menjadi beberapa halaman. Setiap halaman memiliki 0100 16 = 256 10 lokasi byte. Yang pertama 256 10 = 0100 pertama 16 lokasi adalah halaman 0. Yang kedua adalah halaman 1, yang ketiga adalah halaman 2, dan seterusnya.

Untuk mengalamatkan 65.536 lokasi, diperlukan 16 bit untuk setiap lokasi (alamat). Jadi bus alamat dari mikroprosesor ke memori terdiri dari 16 baris; satu baris untuk satu bit. Sedikit adalah 1 atau 0.

Register 6502 µP
Register seperti sel byte untuk lokasi memori byte. 6502 µP memiliki enam register: lima register 8-bit dan satu register 16-bit. Register 16-bit disebut Program Counter yang disingkat PC. Ini menyimpan alamat memori untuk instruksi selanjutnya. Program bahasa assembly terdiri dari instruksi-instruksi yang ditempatkan di memori. Enam belas (16) bit berbeda diperlukan untuk mengalamatkan lokasi byte tertentu dalam memori. Pada pulsa clock tertentu, bit-bit ini dikirim ke baris alamat 16-bit pada bus alamat untuk pembacaan instruksi. Semua register untuk 6502 µP digambarkan sebagai berikut:


Gambar 4.12 6502 µP Register

Penghitung Program atau PC dapat dilihat sebagai register 16-bit pada diagram. Delapan bit penting yang lebih rendah diberi label sebagai PCL untuk Program Counter Low. Delapan bit signifikan lebih tinggi diberi label sebagai PCH untuk Program Counter High. Instruksi dalam memori untuk Commodore-64 dapat terdiri dari satu, dua, atau tiga byte. 16 bit di PC menunjuk ke instruksi berikutnya yang akan dieksekusi, di memori. Di antara rangkaian-rangkaian yang ada pada mikroprosesor, dua di antaranya disebut Unit Logika Aritmatika dan Dekoder Instruksi. Jika instruksi saat ini yang sedang diproses dalam µP (mikroprosesor) panjangnya satu byte, kedua sirkuit ini menambah PC untuk instruksi berikutnya sebesar 1 unit. Jika instruksi saat ini yang sedang diproses dalam µP panjangnya dua byte, artinya instruksi tersebut menempati dua byte berturut-turut di memori, kedua sirkuit ini menambah PC untuk instruksi berikutnya sebanyak 2 unit. Jika instruksi saat ini yang sedang diproses dalam µP panjangnya tiga byte, artinya instruksi tersebut menempati tiga byte berturut-turut dalam memori, kedua sirkuit ini meningkatkan PC untuk instruksi berikutnya sebanyak 3 unit.

Akumulator “A” adalah register tujuan umum delapan bit yang menyimpan hasil sebagian besar operasi aritmatika dan logika.

Register “X” dan “Y” masing-masing digunakan untuk menghitung langkah program. Penghitungan dalam pemrograman dimulai dari 0. Jadi disebut register indeks. Mereka memiliki beberapa tujuan lain.

Meskipun register Stack Pointer, “S” memiliki 9 bit yang dianggap sebagai register delapan bit. Isinya menunjuk ke lokasi byte di halaman 1 Random Access Memory (RAM). Halaman 1 dimulai dari byte $0100 (256 10 ) ke byte $01FF (511 10 ). Ketika suatu program sedang berjalan, program tersebut berpindah dari satu instruksi ke instruksi berikutnya yang berurutan dalam memori. Namun, hal ini tidak selalu terjadi. Ada kalanya ia melompat dari satu area memori ke area memori lain untuk terus menjalankan instruksi di sana secara berurutan. Halaman 1 dalam RAM digunakan sebagai tumpukan. Stack adalah area memori RAM besar yang memiliki alamat selanjutnya untuk kelanjutan kode dari mana terjadi lompatan. Kode dengan instruksi melompat tidak ada di tumpukan; mereka ada di tempat lain dalam memori. Namun, setelah instruksi lompat ke dijalankan, alamat kelanjutan (bukan segmen kode) ada di tumpukan. Mereka didorong ke sana sebagai akibat dari instruksi lompatan atau cabang.

Register Status Prosesor delapan-bit dari P adalah jenis register khusus. Bit-bit individual tidak berhubungan atau terhubung satu sama lain. Setiap bagian di sana disebut bendera dan dihargai secara independen satu sama lain. Arti dari bendera diberikan sebagai berikut sesuai kebutuhan.

Indeks bit pertama dan terakhir untuk setiap register ditunjukkan di atas setiap register pada diagram sebelumnya. Penghitungan indeks bit (posisi) dalam register dimulai dari 0 di sebelah kanan.

Halaman Memori dalam Biner, Heksadesimal, dan Desimal
Tabel berikut memperlihatkan awal halaman memori dalam biner, heksadesimal, dan desimal:

Setiap halaman memiliki 1.0000.0000 2 jumlah byte yang sama dengan 100 H jumlah byte yang sama dengan 256 10 jumlah byte. Pada diagram memori sebelumnya, halaman ditunjukkan naik dari halaman 0 dan tidak turun seperti yang ditunjukkan pada tabel.

Kolom biner, heksadesimal, dan desimal pada tabel ini memberikan alamat lokasi byte memori di basisnya yang berbeda. Perhatikan bahwa untuk halaman nol, hanya bit untuk byte bawah yang perlu diketik saat pengkodean. Bit untuk byte yang lebih tinggi dapat dihilangkan karena selalu nol (untuk halaman nol). Untuk halaman selanjutnya, bit untuk byte yang lebih tinggi harus digunakan.

Sisa bab ini menjelaskan Bahasa Majelis 6502 µP menggunakan semua informasi sebelumnya. Untuk memahami bahasanya dengan cepat, pembaca harus menambah dan mengurangi basis enam belas, bukan basis sepuluh. Ini sebenarnya seharusnya menjadi basis dua, tetapi menghitung dalam basis dua itu rumit. Ingatlah bahwa ketika menjumlahkan dua angka pada basis dua, carry tetaplah 1 seperti pada basis sepuluh. Namun ketika mengurangkan dua bilangan pada basis dua, yang dipinjam adalah dua dan bukan sepuluh seperti pada basis sepuluh. Saat menjumlahkan dua angka di basis enam belas, carry tetap 1 seperti pada basis sepuluh. Namun ketika mengurangkan dua bilangan pada basis enam belas, yang dipinjam adalah enam belas dan bukan sepuluh seperti pada basis sepuluh.

4.2 Petunjuk Transfer Data

Perhatikan tabel instruksi transfer data bahasa rakitan berikut untuk 6502 µP:

Ketika sebuah byte (8-bit) disalin dari lokasi byte memori ke Register Akumulator, Register X, atau Register Y, maka sedang dimuat. Ketika sebuah byte disalin dari salah satu register ini ke lokasi byte memori, itulah yang sedang ditransfer. Ketika satu byte disalin dari satu register ke register lainnya, itu masih ditransfer. Di kolom kedua tabel, panah menunjukkan arah penyalinan untuk satu byte. Empat kolom lainnya menunjukkan mode pengalamatan yang berbeda.

Entri di kolom mode pengalamatan adalah kode byte sebenarnya untuk bagian mnemonik yang sesuai dari instruksi dalam heksadesimal. AE, misalnya, adalah kode byte sebenarnya untuk LDX yang memuat byte dari memori ke register X dalam mode pengalamatan absolut seperti AE 16 = 10101110 2 . Jadi, bit untuk LDX di lokasi byte memori adalah 10101110.

Perhatikan bahwa untuk bagian mnemonik LDX dari instruksi, ada tiga kemungkinan byte yaitu A2, AE, dan A6, dan masing-masing untuk mode pengalamatan tertentu. Ketika byte yang dimuat ke dalam register X tidak akan disalin dari lokasi byte memori, nilainya harus diketik dengan (tepat setelah) mnemonik LDX dalam instruksi dalam heksadesimal atau desimal. Dalam bab ini, nilai-nilai tersebut diketik dalam heksadesimal. Ini adalah pengalamatan langsung, sehingga byte sebenarnya dalam memori untuk mewakili LDX adalah A2 16 = 10100010 2 dan bukan AE 16 yang sama dengan 10101110 2 .

Dalam tabel, semua byte di bawah judul mode pengalamatan disebut Kode Operasi yang disingkat opcode. Mungkin terdapat lebih dari satu opcode untuk satu mnemonik, bergantung pada mode pengalamatan.

Catatan: Kata “beban” dalam unit sistem komputer dapat memiliki dua arti: dapat merujuk pada pemuatan file dari disk ke memori komputer atau dapat merujuk pada transfer byte dari lokasi byte memori ke register mikroprosesor. .

Terdapat lebih banyak mode pengalamatan dibandingkan empat pada tabel untuk 6502 µP.

Kecuali dinyatakan lain, semua kode pemrograman pengguna dalam bab ini dimulai dari alamat 0200 16 yang merupakan awal dari area pengguna di memori.

Memori M dan Akumulator A

Memori ke Akumulator

Mengatasi Segera
Instruksi berikut menyimpan nomor FF 16 = 255 10 ke dalam akumulator:

LDA #$FF

“$” tidak hanya digunakan untuk mengidentifikasi alamat memori. Secara umum digunakan untuk menunjukkan bahwa bilangan berikutnya adalah heksadesimal. Dalam hal ini, $FF bukanlah alamat lokasi byte memori mana pun. Itu adalah angka 255 10 dalam heksadesimal. Basis 16 atau subskrip lain yang setara tidak boleh ditulis dalam instruksi bahasa rakitan. Tanda “#” menunjukkan bahwa nilai berikutnya adalah nilai yang akan dimasukkan ke dalam register akumulator. Nilainya juga dapat ditulis dalam basis sepuluh, namun hal tersebut tidak dilakukan pada bab ini. Tanda “#” berarti pengalamatan segera.

Sebuah mnemonik memiliki beberapa kemiripan dengan frasa bahasa Inggris yang terkait. “LDA #$FF” artinya memuat nomor 255 10 ke dalam akumulator A. Karena ini merupakan pengalamatan langsung dari tabel sebelumnya, LDA adalah A9 dan bukan AD atau A5. A9 dalam biner adalah 101010001. Jadi, jika A9 untuk LDA ada di alamat $0200 di memori, $FF ada di $0301 = 0300 + 1 alamat. #$FF tepatnya merupakan operan untuk mnemonik LDA.

Mengatasi Mutlak
Jika nilai $FF berada di lokasi $0333 di memori, instruksi sebelumnya adalah:

LDA $0333

Perhatikan tidak adanya #. Dalam hal ini, tidak adanya # berarti yang berikut ini adalah alamat memori dan bukan nilai yang diinginkan (bukan nilai yang akan dimasukkan ke akumulator). Jadi, opcode untuk LDA kali ini adalah AD dan bukan A9 atau A5. Operan untuk LDA di sini adalah alamat $0333 dan bukan nilai $FF. $FF berada di lokasi $0333 yang agak jauh. Instruksi “LDA $0333” menempati tiga lokasi berturut-turut dalam memori, dan bukan dua, seperti ilustrasi sebelumnya. “AD” untuk LDA ada di lokasi $0200. Byte yang lebih rendah dari 0333 yaitu 33 berada di lokasi $0301. Byte yang lebih tinggi dari $0333 yaitu 03 berada di lokasi $0302. Ini adalah little endianness yang digunakan oleh bahasa assembly 6502. Bahasa rakitan mikroprosesor berbeda-beda.

Ini adalah contoh pengalamatan absolut. $0333 adalah alamat lokasi yang memiliki $FF. Instruksi terdiri dari tiga byte berturut-turut dan tidak menyertakan $FF atau lokasi byte sebenarnya.

Pengalamatan Nol Halaman

Asumsikan bahwa nilai $FF berada di lokasi memori $0050 di halaman nol. Lokasi byte untuk halaman nol dimulai dari $0000 dan berakhir pada $00FF. Ini adalah 256 10 lokasi secara total. Setiap halaman memori Commodore-64 adalah 256 10 panjang. Perhatikan bahwa byte yang lebih tinggi adalah nol untuk semua kemungkinan lokasi di ruang halaman nol di memori. Mode pengalamatan halaman nol sama dengan mode pengalamatan absolut, namun byte yang lebih tinggi yaitu 00 tidak diketikkan ke dalam instruksi. Jadi, untuk memuat $FF dari lokasi $0050 ke akumulator, instruksi mode pengalamatan halaman nol adalah:

LDA $50

Dengan LDA menjadi A5 dan bukan A9 atau AD, A5 16 = 10100101 2 . Ingatlah bahwa setiap byte dalam memori terdiri dari 8 sel, dan setiap sel menampung sedikit. Instruksi di sini terdiri dari dua byte berturut-turut. A5 untuk LDA berada di lokasi memori $0200 dan alamat $50, tanpa byte lebih tinggi dari 00, berada di lokasi $0301. Tidak adanya 00, yang akan menghabiskan satu byte dari total 64K memori, menghemat ruang memori.

Akumulator ke Memori

Mengatasi Mutlak
Instruksi berikut menyalin nilai byte, apa pun itu, dari akumulator ke lokasi memori $1444:

MEREKA $1444

Hal ini dikatakan sebagai transfer dari akumulator ke memori. Itu tidak memuat. Memuat adalah kebalikannya. Byte opcode untuk STA adalah 8D 16 = 10001101 2 . Instruksi ini terdiri dari tiga byte berturut-turut dalam memori. 8D 16 berada di lokasi $0200. 44 16 dari alamat $1444 ada di lokasi $0201. Dan 14 16 berada di lokasi $0202 – little endianness. Byte sebenarnya yang disalin bukan bagian dari instruksi. 8D dan bukan 85 untuk pengalamatan halaman nol (dalam tabel) digunakan di sini untuk STA.

Pengalamatan Halaman Nol
Instruksi berikut menyalin nilai byte, apa pun itu, dari akumulator ke lokasi memori $0050 di halaman nol:

STA $0050

Opcode byte untuk STA di sini adalah 85 16 = 10000101 2 . Instruksi ini terdiri dari dua byte berturut-turut dalam memori. 85 16 berada di lokasi $0200. 50 16 dari alamat $0050 ada di lokasi $0201. Masalah endianness tidak muncul di sini karena alamat hanya memiliki satu byte yaitu byte bawah. Byte sebenarnya yang disalin bukan bagian dari instruksi. 85 dan bukan 8D untuk pengalamatan halaman nol digunakan di sini untuk STA.

Tidak masuk akal menggunakan pengalamatan langsung untuk mentransfer satu byte dari akumulator ke suatu lokasi di memori. Hal ini karena nilai sebenarnya seperti $FF harus dikutip dalam instruksi dalam pengalamatan langsung. Jadi, pengalamatan langsung tidak mungkin dilakukan untuk transfer nilai byte dari register di µP ke lokasi memori mana pun.

Mnemonik LDX, STX, LDY, dan STY
LDX dan STX masing-masing mirip dengan LDA dan STA. Namun disini yang digunakan adalah register X dan bukan register A (akumulator). LDY dan STY masing-masing mirip dengan LDA dan STA. Namun disini yang digunakan adalah register Y dan bukan register A. Lihat Tabel 4.21 untuk setiap opcode dalam heksadesimal yang berhubungan dengan mnemonik tertentu dan mode pengalamatan tertentu.

Transfer Daftar-ke-Daftar
Dua set instruksi sebelumnya pada Tabel 4.21 berhubungan dengan penyalinan register/mikroprosesor (transfer) dan penyalinan register/register (transfer). Instruksi TAX, TXA, TAY, TYA, TSX dan TXS melakukan penyalinan (transfer) dari register di mikroprosesor ke register lain di mikroprosesor yang sama.

Untuk menyalin byte dari A ke X, instruksinya adalah:

PAJAK

Untuk menyalin byte dari X ke A, instruksinya adalah:

terima kasih

Untuk menyalin byte dari A ke Y, instruksinya adalah:

TANGAN

Untuk menyalin byte dari Y ke A, instruksinya adalah:

TYA

Untuk komputer Commodore 64, tumpukannya adalah halaman 1 tepat setelah halaman 0 di memori. Seperti halaman lainnya, halaman ini terdiri dari 25610 10 lokasi byte, dari $0100 hingga $01FF. Biasanya, suatu program dieksekusi dari satu instruksi ke instruksi berikutnya yang berurutan dalam memori. Dari waktu ke waktu, ada lompatan ke segmen kode memori (kumpulan instruksi) yang lain. Area tumpukan di memori (RAM) memiliki alamat instruksi berikutnya dari mana lompatan (atau cabang) ditinggalkan untuk kelanjutan program.

Penunjuk tumpukan “S” adalah register 9-bit pada 6502 µP. Bit pertama (paling kiri) selalu 1. Semua alamat lokasi byte di halaman satu dimulai dengan 1 diikuti oleh 8 bit berbeda untuk 256 10 lokasi. Penunjuk tumpukan memiliki alamat lokasi di halaman 1 yang memiliki alamat instruksi berikutnya yang harus dikembalikan dan dilanjutkan oleh program setelah mengeksekusi segmen kode saat ini (melompat ke). Karena bit pertama dari semua alamat tumpukan (halaman pertama) dimulai dengan 1, register penunjuk tumpukan hanya perlu menampung delapan bit sisanya. Lagi pula, bit pertamanya, yang merupakan bit paling kiri (bit kesembilan dihitung dari kanannya), selalu 1.

Untuk menyalin byte dari S ke X, instruksinya adalah:

TSX

Untuk menyalin byte dari X ke S, instruksinya adalah:

txt

Instruksi register-to-register tidak memerlukan operan apa pun. Mereka hanya terdiri dari mnemonik. Setiap mnemonik memiliki opcode dalam heksadesimal. Ini adalah mode pengalamatan tersirat karena tidak ada operan (tidak ada alamat memori, tidak ada nilai).

Catatan: Tidak ada transfer X ke Y atau Y ke X (penyalinan).

4.3 Operasi Aritmatika

Rangkaiannya, Unit Logika Aritmatika pada 6502 µP, hanya dapat menambahkan dua angka delapan bit dalam satu waktu. Tidak mengurangi, tidak mengalikan, dan tidak membagi. Tabel berikut menunjukkan opcode dan mode pengalamatan untuk operasi aritmatika:

Catatan: Semua mnemonik untuk operasi aritmatika dan jenis operasi lainnya (yaitu semua mnemonik 6502) memerlukan satu byte kode operasi (op). Jika terdapat lebih dari satu mode pengalamatan untuk mnemonik, maka akan terdapat opcode berbeda untuk mnemonik yang sama: satu untuk setiap mode pengalamatan. C, D, dan V pada tabel adalah flag dari register status. Maknanya akan diberikan kemudian ketika diperlukan.

Penambahan Nomor Tak Bertanda Tangan
Dengan 6502 µP, bilangan bertanda adalah bilangan komplemen dua. Bilangan tak bertanda adalah bilangan positif biasa yang dimulai dari nol. Jadi, untuk satu byte delapan-bit, bilangan terkecil yang tidak ditandatangani adalah 00000000 2 = 0 10 = 00 16 dan bilangan unsigned terbesar adalah 11111111 2 = 255 10 = FF 16 . Untuk dua bilangan tak bertanda, penjumlahannya adalah:

A+M+C→A

Artinya, isi akumulator 8-bit ditambahkan oleh unit logika aritmatika ke satu byte (8-bit) dari memori. Setelah penambahan A dan M, carry ke bit kesembilan masuk ke sel carry flag di register status. Bit carry sebelumnya dari penambahan sebelumnya yang masih berada dalam sel flag carry di register status juga ditambahkan ke jumlah A dan M, sehingga menghasilkan A+M+C→A. Hasilnya dimasukkan kembali ke akumulator.

Jika penambahan bunganya adalah:

A + M

Dan tidak perlu menambahkan carry sebelumnya, flag carry harus dikosongkan yang dijadikan 0, sehingga penambahannya adalah:

A+M+0→A sama dengan A+M→A

Catatan: Jika M ditambahkan ke A, dan terjadi carry 1 karena hasilnya lebih besar dari 255 10 = 11111111 2 = FF 16 , ini barang bawaan baru. Carry baru sebesar 1 ini secara otomatis dikirim ke sel carry flag jika diperlukan oleh pasangan delapan bit berikutnya untuk dijumlahkan (A+M lainnya).

Kode untuk Menambahkan Dua Delapan-Bit yang Tidak Ditandatangani
00111111 2 +00010101 2 sama dengan 3F 16 + 15 16 yang sama dengan 63 10 +21 10 . Hasilnya adalah 010101002 2 yang sama dengan 54 16 dan 84 10 . Hasilnya tidak melampaui angka maksimal delapan bit yaitu 255 10 = 11111111 2 = FF 16 . Jadi, tidak ada carry yang dihasilkan sebesar 1. Dengan kata lain, carry yang dihasilkan adalah 0. Sebelum penjumlahan, tidak ada carry sebelumnya sebesar 1. Dengan kata lain, carry sebelumnya adalah 0. Kode untuk melakukan penambahan ini dapat:

CLC
LDA #$3F
ADC #$15

Catatan: Saat mengetik bahasa assembly, tombol “Enter” pada keyboard ditekan di akhir setiap instruksi. Ada tiga instruksi dalam kode ini. Instruksi pertama (CLC) menghapus carry flag jika penambahan sebelumnya memiliki 1. CLC hanya dapat dilakukan dalam mode pengalamatan tersirat. Mnemonik untuk mode pengalamatan tersirat tidak memerlukan operan. Ini membersihkan sel carry dari register status P. Kliring berarti memberikan bit 0 ke sel carry flag. Dua instruksi berikutnya dalam kode menggunakan mode pengalamatan langsung. Dengan pengalamatan langsung, hanya ada satu operan untuk mnemonik yaitu angka (dan bukan alamat memori atau register). Jadi, nomor tersebut harus diawali dengan “#”. Tanda “$” berarti angka berikutnya adalah heksadesimal.

Instruksi kedua memuat nomor 3F 16 ke dalam akumulator. Untuk instruksi ketiga, rangkaian unit logika aritmatika dari µP mengambil carry sebelumnya (yang telah dibersihkan) sebesar 0 (dipaksa ke 0) dari sel flag carry, dari register status dan menambahkannya ke 15 16 serta dengan nilai yang sudah ada di 3F 16 akumulator dan mengembalikan hasil lengkapnya ke akumulator. Dalam hal ini, terdapat carry yang dihasilkan sebesar 0. ALU (Unit Logika Aritmatika) mengirimkan (meletakkan) 0 ke dalam sel flag carry pada register status. Register status prosesor dan register status memiliki arti yang sama. Jika carry bernilai 1, ALU mengirimkan 1 ke carry flag pada register status.

Tiga baris kode sebelumnya harus ada di memori sebelum dieksekusi. Opcode 1816 untuk CLC (pengalamatan tersirat) berada di lokasi $0200 byte. Kode op A9 16 untuk LDA (pengalamatan langsung) berada di lokasi $0201 byte. Nomor 3F 10 berada di lokasi $0202 byte. Kode op 69 16 untuk LDA (pengalamatan langsung) berada di lokasi byte $0203. Nomor 15 10 berada di lokasi $0204 byte.

Catatan: LDA merupakan instruksi transfer (memuat) dan bukan instruksi aritmatika (mnemonik).

Kode untuk Menambahkan Dua Enam Belas-Bits yang Tidak Ditandatangani
Semua register pada 6502 µP pada dasarnya adalah register delapan bit, kecuali PC (Program Counter) yang 16-bit. Bahkan register status mempunyai lebar 8-bit, meskipun delapan bitnya tidak beroperasi bersama-sama. Pada bagian ini, penambahan dua 16 bit yang tidak ditandatangani, dengan perpindahan dari pasangan delapan bit pertama ke pasangan delapan bit kedua, dipertimbangkan. Carry yang dimaksud disini adalah carry dari posisi bit kedelapan ke posisi bit kesembilan.

Misalkan angkanya adalah 0010101010111111 2 = 2ABF16 16 = 10.943 10 dan 0010101010010101 2 = 2A95 16 = 10.901 10 . Jumlahnya adalah 0101010101010100 2 = 5554 16 = 21.844 10 .

Menjumlahkan dua bilangan tak bertanda ini ke basis dua adalah sebagai berikut:

Tabel berikut menunjukkan penambahan yang sama dengan carry 1 dari posisi bit kedelapan ke posisi bit kesembilan, dimulai dari kanan:

Dalam pengkodean ini, dua byte yang lebih rendah ditambahkan terlebih dahulu. Kemudian, ALU (Arithmetic Logic Unit) mengirimkan carry 1 dari posisi bit kedelapan ke posisi bit kesembilan, ke sel carry flag di status register. Hasil 0 1 0 1 0 1 0 0 tanpa carry masuk ke akumulator. Kemudian, pasangan byte kedua ditambahkan dengan carry. Mnemonik ADC berarti menambahkan carry sebelumnya secara otomatis. Dalam hal ini carry sebelumnya yaitu 1 tidak boleh diubah sebelum penambahan kedua. Untuk penambahan pertama, karena carry sebelumnya bukan bagian dari penambahan lengkap ini, maka harus diselesaikan (dibuat 0).

Untuk penjumlahan dua pasang byte secara lengkap, penjumlahan pertama adalah:

SEBUAH + M + 0 -> SEBUAH

Penambahan kedua adalah:

SEBUAH + M + 1 -> SEBUAH

Jadi, bendera carry harus dihapus (diberi nilai 0) sesaat sebelum penambahan pertama. Program berikut yang pembaca harus membaca penjelasan berikut ini menggunakan mode pengalamatan absolut untuk penjumlahan ini:

CLC
LDA $0213
ADC $0215
; tidak ada kliring karena nilai carry flag diperlukan
STA $0217
LDA $0214
ADC $0216
STA $0218

Perhatikan bahwa dengan bahasa assembly 6502, tanda titik koma memulai komentar. Artinya dalam pelaksanaan program, titik koma dan semua yang ada di sebelah kanannya diabaikan. Program yang ditulis sebelumnya dalam file teks disimpan dengan nama pilihan pemrogram dan dengan ekstensi “.asm”. Program sebelumnya bukanlah program persis yang masuk ke memori untuk dieksekusi. Program yang sesuai di memori disebut program terjemahan dimana mnemonik diganti dengan opcode (byte). Komentar apa pun tetap berada dalam file teks bahasa rakitan, dan dihapus sebelum program yang diterjemahkan mencapai memori. Faktanya, ada dua file yang disimpan di disk saat ini: file “.asm” dan file “.exe”. File “.asm” adalah yang ada pada ilustrasi sebelumnya. File “.exe” adalah file “.asm” dengan semua komentar dihilangkan, dan semua mnemonik diganti dengan opcode-nya. Saat dibuka di editor teks, file “.exe” tidak dapat dikenali. Kecuali dinyatakan lain, untuk tujuan bab ini, file “.exe” disalin ke memori mulai dari lokasi $0200. Berikut arti lain dari memuat.

Dua angka 16-bit yang akan ditambahkan menempati empat byte dalam memori untuk pengalamatan absolut: dua byte per angka (memori adalah urutan byte). Dengan pengalamatan absolut, operan ke opcode ada di memori. Hasil penjumlahannya lebarnya dua byte dan juga harus ditempatkan di memori. Ini memberi total 6 10 = 6 16 byte untuk input dan output. Inputnya bukan dari keyboard dan outputnya bukan dari monitor atau printer. Masukan ada di memori (RAM) dan keluaran (hasil penjumlahan) kembali ke memori (RAM) dalam situasi ini.

Sebelum suatu program dijalankan, versi terjemahannya harus disimpan terlebih dahulu di memori. Melihat kode program sebelumnya, terlihat instruksi tanpa komentar berjumlah 19 10 = 13 16 byte. Jadi, program mengambil dari $0200 lokasi byte di memori ke $0200 + $13 – $1 = $0212 lokasi byte (dimulai dari $0200 dan bukan $0201 yang berarti – $1). Menambahkan 6 byte untuk nomor input dan output membuat semua program berakhir pada $0212 + $6 = $0218. Total durasi program adalah 19 16 = 25 10 .

Byte yang lebih rendah dari augend harus berada di alamat $0213, dan byte yang lebih tinggi dari augend yang sama harus berada di alamat $0214 – little endianness. Demikian pula, byte yang lebih rendah dari tambahan harus berada di alamat $0215, dan byte yang lebih tinggi dari tambahan yang sama harus berada di alamat $0216 – little endianness. Byte yang lebih rendah dari hasil (jumlah) harus berada di alamat $0217, dan byte yang lebih tinggi dari hasil yang sama harus berada di alamat $0218 – little endianness.

Kode op 18 16 untuk CLC (pengalamatan tersirat) berada di lokasi byte $0200. Opcode untuk “LDA $0213”, yaitu AD 16 untuk LDA (pengalamatan absolut), berada di lokasi byte $0201. Byte yang lebih rendah dari augend yaitu 10111111 berada di lokasi byte memori $0213. Ingatlah bahwa setiap opcode menempati satu byte. Alamat “$0213” dari “LDA $0213” berada di lokasi byte $0202 dan $0203. Instruksi “LDA $0213” memuat byte bawah dari tambahan ke akumulator.

Opcode untuk “ADC $0215”, yaitu 6D 16 untuk ADC (pengalamatan absolut), berada di lokasi byte $0204. Byte yang lebih rendah dari tambahan yaitu 10010101 berada di lokasi byte $0215. Alamat “$0215” dari “ADC $0215” berada di lokasi byte $0205 dan $0206. Instruksi “ADC $0215” menambahkan byte bawah dari tambahan ke byte bawah dari tambahan yang sudah ada di akumulator. Hasilnya ditempatkan kembali di akumulator. Setiap carry setelah bit kedelapan dikirim ke carry flag pada register status. Sel flag carry tidak boleh dihapus sebelum penambahan kedua byte yang lebih tinggi. Carry ini ditambahkan ke jumlah byte yang lebih tinggi secara otomatis. Faktanya, carry sebesar 0 ditambahkan ke jumlah byte yang lebih rendah secara otomatis di awal (setara dengan tidak ada carry yang ditambahkan) karena CLC.

Komentar tersebut mengambil 48 berikutnya 10 = 30 16 byte. Namun, ini hanya tersisa di file teks “.asm”. Itu tidak mencapai memori. Itu dihapus dengan terjemahan yang dilakukan oleh assembler (sebuah program).

Untuk instruksi selanjutnya yaitu “STA $0217”, opcode STA yaitu 8D 16 (pengalamatan absolut) berada di lokasi byte $0207. Alamat “$0217” dari “STA $0217” berada di lokasi memori $0208 dan $0209. Instruksi “STA $0217” menyalin konten delapan-bit akumulator ke lokasi memori $0217.

Byte tambahan yang lebih tinggi yaitu 00101010 berada di lokasi memori $0214, dan byte tambahan yang lebih tinggi yaitu 00101010 berada di lokasi byte $02 16 . Opcode untuk “LDA $0214” yaitu AD16 untuk LDA (pengalamatan absolut) berada di lokasi byte $020A. Alamat “$0214” dari “LDA $0214” berada di lokasi $020B dan $020C. Instruksi “LDA $0214” memuat byte tambahan yang lebih tinggi ke akumulator, menghapus apa pun yang ada di akumulator.

Opcode untuk “ADC $0216” yaitu 6D 16 untuk ADC (pengalamatan absolut) berada di lokasi byte $020D. Alamat “$0216” dari “ADC 0216” berada di lokasi byte $020E dan $020F. Instruksi “ADC $0216” menambahkan byte yang lebih tinggi dari tambahan ke byte yang lebih tinggi dari tambahan yang sudah ada di akumulator. Hasilnya ditempatkan kembali ke akumulator. Jika ada carry 1, untuk penambahan kedua ini otomatis ditempatkan di sel carry register status. Meskipun carry melebihi bit keenam belas (kiri) tidak diperlukan untuk masalah ini, ada baiknya untuk memeriksa apakah carry 1 memang terjadi dengan memeriksa apakah flag carry menjadi 1.

Untuk instruksi berikutnya dan terakhir yaitu “STA $0218”, opcode STA yaitu 8D16 (pengalamatan absolut) berada di lokasi byte $0210. Alamat “$0218” dari “STA $0218” berada di lokasi memori $0211 dan $0212. Instruksi “STA $0218” menyalin konten delapan-bit akumulator ke lokasi memori $0218. Hasil penjumlahan kedua bilangan enam belas bit tersebut adalah 0101010101010100, dengan byte bawah 01010100 di lokasi memori $0217 dan byte tinggi 01010101 di lokasi memori $0218 – little endianness.

Pengurangan
Dengan 6502 µP, bilangan bertanda adalah bilangan komplemen dua. Nomor komplemen dua bisa berupa delapan bit, enam belas bit, atau kelipatan delapan bit. Dengan komplemen dua, bit pertama dari kiri adalah bit tanda. Untuk bilangan positif, bit pertama ini adalah 0 untuk menunjukkan tandanya. Bit-bit lainnya membentuk angka dengan cara biasa. Untuk mendapatkan komplemen dua bilangan negatif, balikkan semua bit bilangan positif yang bersesuaian, lalu tambahkan 1 pada hasil di ujung kanan.

Untuk mengurangkan suatu bilangan positif dari bilangan positif lainnya, pengurangnya diubah menjadi bilangan negatif komplemen dua. Kemudian, minuend dan bilangan negatif baru dijumlahkan seperti biasa. Jadi, pengurangan delapan bit menjadi:

Dimana carry diasumsikan 1. Hasil di akumulator adalah selisih komplemen dua. Jadi, untuk mengurangkan dua angka, carry flag harus diset (dibuat menjadi 1).

Saat mengurangkan dua bilangan enam belas bit, pengurangan dilakukan dua kali seperti pada penjumlahan dua bilangan enam belas bit. Karena pengurangan adalah bentuk penjumlahan dengan 6502 µP, saat mengurangkan dua bilangan enam belas bit, flag carry disetel hanya sekali untuk pengurangan pertama. Untuk pengurangan kedua, pengaturan apa pun pada bendera carry dilakukan secara otomatis.

Pemrograman pengurangan bilangan delapan bit atau bilangan enam belas bit dilakukan dengan cara yang sama seperti pemrograman penjumlahan. Namun, carry flag harus dipasang di awal. Mnemonik untuk melakukan ini adalah:

Pengurangan dengan Bilangan Positif Enam Belas-bit
Perhatikan pengurangan dengan bilangan berikut:

Pengurangan ini tidak melibatkan komplemen dua. Karena pengurangan pada 6502 µP dilakukan pada komplemen dua, maka pengurangan pada basis dua dilakukan sebagai berikut:

Hasil komplemen keduanya sama dengan hasil pengurangan biasa. Namun, perhatikan bahwa angka 1 yang berada pada posisi bit ketujuh belas dari kanan diabaikan. Minuend dan pengurang masing-masing dibagi menjadi dua delapan bit. Komplemen keduanya sebesar 10010110 dari byte yang lebih rendah dari pengurang ditentukan secara independen dari byte yang lebih tinggi dan dari setiap carry. Komplemen keduanya dari 11101011 dari byte pengurang yang lebih tinggi ditentukan secara independen dari byte yang lebih rendah dan dari setiap carry.

Minuend 16-bit sudah dalam komplemen dua, dimulai dengan 0 dari kiri. Jadi, tidak perlu penyesuaian sedikit pun. Dengan 6502 µP, byte bawah dari minuend tanpa modifikasi apa pun ditambahkan ke byte bawah dari komplemen keduanya dari pengurang. Byte yang lebih rendah dari minuend tidak diubah menjadi komplemen dua karena enam belas bit dari keseluruhan minuend harus sudah dalam komplemen dua (dengan 0 sebagai bit pertama di sebelah kiri). Pada penambahan pertama ini, carry wajib sebesar 1 ditambahkan karena instruksi 1=0 SEC.

Pada pengurangan efektif saat ini, terdapat perpindahan 1 (penjumlahan) dari bit kedelapan ke bit kesembilan (dari kanan). Karena ini adalah pengurangan yang efektif, bit apa pun yang seharusnya ada dalam flag carry di register status akan dilengkapi (dibalik). Jadi, carry dari 1 menjadi 0 di bendera C. Dalam operasi kedua, byte yang lebih tinggi dari minuend ditambahkan ke byte komplemen dua yang lebih tinggi dari pengurang. Bit carry flag yang dilengkapi secara otomatis dari register status (dalam hal ini adalah 0) juga ditambahkan (ke byte yang lebih tinggi). Setiap angka 1 yang melampaui bit keenambelas dari kanan akan diabaikan.

Hal berikutnya adalah mengkodekan semua skema itu sebagai berikut:

DETIK
LDA $0213
SBC $0215
; tidak ada kliring karena nilai carry flag terbalik diperlukan
STA $0217
LDA $0214
SBC $0216
STA $0218

Ingatlah bahwa dengan bahasa rakitan 6502, titik koma memulai komentar yang tidak disertakan dalam versi program terjemahan di memori. Dua angka 16-bit untuk pengurangan menempati empat byte memori dengan pengalamatan absolut; dua per nomor (memori adalah serangkaian byte). Input ini bukan dari keyboard. Hasil penjumlahannya adalah dua byte dan juga harus ditempatkan di memori di tempat yang berbeda. Output ini tidak masuk ke monitor atau printer; itu masuk ke memori. Ini memberi total 6 10 = 6 16 byte untuk input dan output untuk ditempatkan di memori (RAM).

Sebelum suatu program dijalankan, program tersebut harus berada di memori terlebih dahulu. Dilihat dari kode programnya, terlihat bahwa instruksi tanpa komentar adalah 19 10 = 13 16 byte. Karena semua program dalam bab ini dimulai dari lokasi memori $0200, program mengambil dari lokasi byte $0200 di memori ke lokasi byte $0200 + $13 – $1 = $0212 (dimulai dari $0200 dan bukan $0201). Rentang ini tidak termasuk wilayah untuk byte masukan dan keluaran. Dua nomor masukan membutuhkan 4 byte dan satu nomor keluaran membutuhkan 2 byte. Menambahkan 6 byte untuk nomor masukan dan keluaran membuat kisaran program berakhir pada $0212 + $6 = $0218. Total durasi program adalah 19 16 = 25 10 .

Byte yang lebih rendah dari minuend harus berada di alamat $0213, dan byte yang lebih tinggi dari minuend yang sama harus berada di alamat $0214 – little endianness. Demikian pula, byte yang lebih rendah dari pengurang harus berada di alamat $0215, dan byte yang lebih tinggi dari pengurang yang sama harus berada di alamat $0216 – little endianness. Byte yang lebih rendah dari hasil (perbedaan) harus berada di alamat $0217, dan byte yang lebih tinggi dari hasil yang sama harus berada di alamat $0218 – little endianness.

Opcode dari 38 16 untuk SEC (pengalamatan tersirat) ada di alamat $0200. Semua program dalam bab ini diasumsikan dimulai pada lokasi memori $0200, membatalkan program apa pun yang seharusnya ada di sana; kecuali dinyatakan lain. Opcode untuk “LDA $0213”, yaitu AD 16 , untuk LDA (pengalamatan absolut) berada di lokasi byte $0201. Byte bawah dari minuend yaitu 10111111 berada di lokasi byte memori $0213. Ingatlah bahwa setiap opcode menempati satu byte. Alamat “$0213” dari “LDA $0213” berada di lokasi byte $0202 dan $0203. Instruksi “LDA $0213” memuat byte bawah dari minuend ke akumulator.

Opcode untuk “SBC $0215”, yaitu ED 16 , untuk SBC (pengalamatan absolut) berada di lokasi byte $0204. Byte yang lebih rendah dari pengurang yaitu 01101010 berada di lokasi byte $0215. Alamat “$0215” dari “ADC $0215” berada di lokasi byte $0205 dan $0206. Instruksi “SBC $0215” mengurangi byte bawah pengurang dari byte bawah minuend yang sudah ada di akumulator. Ini adalah pengurangan komplemen dua. Hasilnya ditempatkan kembali di akumulator. Komplemen (inversi) dari setiap carry setelah bit kedelapan dikirim ke carry flag dari register status. Bendera carry ini tidak boleh dihapus sebelum pengurangan kedua dengan byte yang lebih tinggi. Carry ini ditambahkan ke pengurangan byte yang lebih tinggi secara otomatis.

Komentar tersebut mengambil 57 berikutnya 10 = 3916 16 byte. Namun, ini hanya tersisa di file teks “.asm”. Itu tidak mencapai memori. Itu dihapus dengan terjemahan yang dilakukan oleh assembler (sebuah program).

Untuk instruksi selanjutnya yaitu “STA $0217”, opcode dari STA, yaitu 8D 16 (pengalamatan absolut), berada di lokasi byte $0207. Alamat “$0217” dari “STA $0217” berada di lokasi memori $0208 dan $0209. Instruksi “STA $0217” menyalin konten delapan-bit akumulator ke lokasi memori $0217.

Byte yang lebih tinggi dari minuend yaitu 00101010 berada di lokasi memori $0214, dan byte yang lebih tinggi dari pengurang yaitu 00010101 berada di lokasi byte $0216. Opcode untuk “LDA $0214”, yaitu AD 16 untuk LDA (pengalamatan absolut), berada di lokasi byte $020A. Alamat “$0214” dari “LDA $0214” berada di lokasi $020B dan $020C. Instruksi “LDA $0214” memuat byte yang lebih tinggi dari minuend ke akumulator, menghapus apa pun yang ada di akumulator.

Opcode untuk “SBC $0216”, yaitu ED 16 untuk SBC (pengalamatan absolut), berada di lokasi byte $020D. Alamat “$0216” dari “SBC $0216” berada di lokasi byte $020E dan $020F. Instruksi “SBC $0216” mengurangi byte yang lebih tinggi dari pengurang dari byte yang lebih tinggi dari minuend (komplemen dua) yang sudah ada di akumulator. Hasilnya ditempatkan kembali ke akumulator. Jika ada carry 1 untuk pengurangan kedua ini, komplemennya ditempatkan di sel carry pada register status secara otomatis. Meskipun carry melebihi bit keenam belas (kiri) tidak diperlukan untuk masalah ini, ada baiknya untuk memeriksa apakah carry komplemen terjadi dengan memeriksa flag carry.

Untuk instruksi berikutnya dan terakhir yaitu “STA $0218”, opcode dari STA, yaitu 8D 16 (pengalamatan absolut), berada di lokasi byte $0210. Alamat “$0218” dari “STA $0218” berada di lokasi memori $0211 dan $0212. Instruksi “STA $0218” menyalin konten delapan-bit akumulator ke lokasi memori $0218. Hasil pengurangan kedua bilangan enam belas bit tersebut adalah 0001010101010101 dengan byte bawah 01010101 di lokasi memori $0217 dan byte tinggi 00010101 di lokasi memori $0218 – little endianness.

6502 µP mempunyai sirkuit hanya untuk penjumlahan, dan secara tidak langsung untuk pengurangan komplemen keduanya. Ia tidak memiliki sirkuit untuk perkalian dan pembagian. Untuk melakukan perkalian dan pembagian, harus ditulis program bahasa assembly yang memuat rincian, termasuk pergeseran hasil kali parsial dan pembagian parsial.

4.4 Operasi Logis

Pada 6502 µP, mnemonik untuk OR adalah ORA dan mnemonik untuk OR eksklusif adalah EOR. Perhatikan bahwa operasi logis tidak memiliki pengalamatan tersirat. Pengalamatan tersirat tidak memerlukan operan. Masing-masing operator logika harus mengambil dua operan. Yang pertama ada di akumulator, dan yang kedua ada di memori atau instruksi. Hasilnya (8-bit) dikembalikan ke akumulator. Yang pertama di akumulator ditempatkan di sana melalui instruksi langsung atau disalin dari memori dengan pengalamatan absolut. Pada bagian ini, hanya pengalamatan halaman nol yang digunakan sebagai ilustrasi. Semua operator logika ini adalah operator Bitwise.

DAN
Tabel berikut mengilustrasikan Bitwise AND dalam biner, heksadesimal, dan desimal:

Semua program dalam bab ini harus dimulai pada lokasi byte memori $0200. Namun, program di bagian ini berada di halaman nol, dengan tujuan untuk mengilustrasikan penggunaan halaman nol tanpa byte yang lebih tinggi yaitu 00000000 2 . ANDing sebelumnya dapat dikodekan sebagai berikut:

LDA #$9A ; bukan dari memori – pengalamatan langsung
DAN #$CD ; bukan dari memori – pengalamatan langsung
STA $30 ; menyimpan $88 dengan basis nol $0030

ATAU
Tabel berikut mengilustrasikan Bitwise OR dalam biner, heksadesimal, dan desimal:

LDA #$9A ; bukan dari memori – pengalamatan langsung
ORA #$CD ; bukan dari memori – pengalamatan langsung
STA $30 ; menyimpan $CF dengan basis nol $0030

BEBAS
Tabel berikut mengilustrasikan Bitwise XOR dalam biner, heksadesimal, dan desimal:

LDA #$9A ; bukan dari memori – pengalamatan langsung
EOR #$CD ; bukan dari memori – pengalamatan langsung
STA $30 ; menyimpan $57 dengan basis nol $0030

4.5 Operasi Pergeseran dan Putar

Mnemonik dan opcode untuk operator shift dan rotasi adalah:

ASL: Geser ke kiri satu bit akumulator atau lokasi memori, masukkan 0 di sel paling kanan yang dikosongkan.

LSR: Geser ke kanan satu bit akumulator atau lokasi memori, masukkan 0 di sel paling kiri yang kosong.
ROL: Putar satu bit ke kiri dari akumulator atau lokasi memori, masukkan bit yang dikeluarkan di sebelah kiri ke dalam sel paling kanan yang kosong.
ROR: Putar satu bit ke kanan akumulator atau lokasi memori, masukkan bit yang dikeluarkan di sebelah kanan ke dalam sel paling kiri yang kosong.

Untuk melakukan perpindahan atau rotasi pada akumulator, petunjuknya kira-kira seperti ini:

LSR A

Ini menggunakan mode pengalamatan lain yang disebut mode pengalamatan akumulator.

Untuk melakukan pergeseran atau rotasi dengan lokasi memori byte, instruksinya kira-kira seperti ini:

ROR $2BCD

Dimana 2BCD adalah lokasi memori.

Perhatikan bahwa tidak ada mode pengalamatan langsung atau tersirat untuk perpindahan atau rotasi. Tidak ada mode pengalamatan langsung karena tidak ada gunanya menggeser atau memutar nomor yang hanya tersisa dalam instruksi. Tidak ada mode pengalamatan tersirat karena perancang 6502 µP hanya menginginkan isi akumulator (register A) atau lokasi byte memori yang digeser atau diputar.

4.6 Mode Pengalamatan Relatif

Mikroprosesor selalu menambah (1, 2, atau 3 unit) Program Counter (PC) untuk menunjuk ke instruksi berikutnya yang akan dieksekusi. 6502 µP memiliki instruksi yang mnemoniknya adalah BVS yang artinya Branch on Overflow Set. PC terdiri dari dua byte. Instruksi ini menyebabkan PC memiliki alamat memori yang berbeda untuk instruksi selanjutnya yang akan dieksekusi bukan karena kenaikan normal. Ia melakukannya dengan menambahkan atau mengurangi suatu nilai, yang disebut offset, pada konten PC. Jadi, PC kemudian menunjuk ke lokasi memori yang berbeda (bercabang) agar komputer dapat melanjutkan eksekusi dari sana. Offsetnya adalah bilangan bulat dari -128 10 ke +127 10 (pelengkap dua). Jadi, offset dapat membuat lompatan maju dalam memori. Jika positif atau tertinggal dalam ingatan, atau negatif.

Instruksi BVS hanya membutuhkan satu operan yang merupakan offset. BVS menggunakan pengalamatan relatif. Perhatikan instruksi berikut:

BVS $7F

Di basis dua, 7F H adalah 01111111 2 = 127 10 . Asumsikan bahwa konten di PC untuk instruksi selanjutnya adalah $0300. Instruksi BVS menyebabkan $7F (bilangan positif yang sudah ada dalam komplemen dua) ditambahkan ke $0300 menghasilkan $037F. Jadi, alih-alih instruksi berikutnya dieksekusi di lokasi memori $0300, instruksi tersebut berada di lokasi memori $037F (perbedaan kira-kira setengah halaman).

Ada instruksi cabang lainnya, tapi BVS adalah instruksi yang sangat bagus untuk digunakan untuk mengilustrasikan pengalamatan relatif. Pengalamatan relatif berkaitan dengan instruksi cabang.

4.7 Pengalamatan Terindeks dan Pengalamatan Tidak Langsung Secara Terpisah

Mode pengalamatan ini memungkinkan 6502 µP menangani data dalam jumlah besar dalam waktu singkat dengan jumlah instruksi yang lebih sedikit. Ada lokasi 64KB untuk seluruh memori Comodore-64. Jadi, untuk mengakses lokasi byte mana pun, dari 16 bit, diperlukan dua byte. Satu-satunya pengecualian untuk kebutuhan dua byte adalah untuk halaman nol di mana byte yang lebih tinggi $00 dihilangkan untuk menghemat ruang yang digunakan oleh instruksi di memori. Dengan mode pengalamatan non-halaman-nol, byte yang lebih tinggi dan lebih rendah dari alamat memori 16-bit sebagian besar ditunjukkan.

Pengalamatan Terindeks Dasar

Pengalamatan Indeks Absolut
Ingatlah bahwa register X atau Y disebut register indeks. Perhatikan instruksi berikut:

LDA $C453,X

Asumsikan nilai 6 H ada di register X. Perhatikan bahwa 6 tidak diketik di mana pun dalam instruksi. Instruksi ini menambahkan nilai 6H ke C453 H yang merupakan bagian dari instruksi yang diketik dalam file teks yang masih harus dirakit – C453 H + 6 H = C459 H . LDA berarti memuat satu byte ke akumulator. Byte yang akan dimuat ke akumulator berasal dari alamat $C459. $C459 yang merupakan penjumlahan dari $C453 yang diketik dengan instruksi dan 6 H yang terdapat pada register X menjadi alamat efektif asal byte yang akan dimuat ke akumulator. Jika 6 H berada di register Y, Y diketik sebagai pengganti X dalam instruksi.

Dalam pernyataan instruksi yang diketik, $C453 dikenal sebagai alamat dasar dan 6 H dalam register X atau Y dikenal sebagai bagian penghitungan atau indeks untuk alamat efektif. Alamat dasar dapat merujuk ke alamat byte mana pun di memori, dan 256 berikutnya 10 alamat dapat diakses, dengan asumsi bahwa indeks awal (atau hitungan) dalam register X atau Y adalah 0. Ingatlah bahwa satu byte dapat memberikan rentang kontinu hingga 256 10 angka (yaitu 00000000 2 ke 11111111 2 ).

Jadi, pengalamatan absolut menambahkan apapun yang sudah dimasukkan (telah dimasukkan oleh instruksi lain) ke dalam register X atau Y ke 16 alamat yang diketikkan dengan instruksi untuk mendapatkan alamat efektif. Pada instruksi yang diketik, kedua register indeks dibedakan dengan X atau Y yang diketik setelah koma. Baik X atau Y diketik; tidak keduanya.

Setelah semua program diketik dalam editor teks dan disimpan dengan nama file berekstensi “.asm”, maka assembler yang merupakan program lain harus menerjemahkan program yang diketik tersebut ke dalam apa yang (dimuat) di memori. Instruksi sebelumnya, yaitu “LDA $C453,X”, menempati tiga lokasi byte dalam memori, dan bukan lima.

Ingatlah bahwa mnemonik seperti LDA dapat memiliki lebih dari satu opcode (byte berbeda). Opcode untuk instruksi yang menggunakan register X berbeda dengan opcode yang menggunakan register Y. Assembler mengetahui opcode apa yang akan digunakan berdasarkan instruksi yang diketik. Opcode satu byte untuk “LDA $C453,X” berbeda dengan opcode satu byte untuk “LDA $C453,Y”. Faktanya, opcode untuk LDA di “LDA $C453,X” adalah BD, dan opcode untuk LDA di “LDA $C453,9” adalah BD.

Jika opcode untuk LDA berada di lokasi byte $0200. Kemudian, alamat 16-bit $C453 mengambil lokasi byte berikutnya di memori yaitu $0201 dan $0202. Opcode byte tertentu menunjukkan apakah register X atau register Y yang terlibat. Jadi, instruksi bahasa rakitan yaitu “LDA $C453,X” atau “LDA $C453,Y” menempati tiga byte berturut-turut dalam memori, dan bukan empat atau lima.

Pengalamatan Terindeks Halaman Nol
Pengalamatan indeks halaman nol sama seperti pengalamatan indeks absolut yang telah dijelaskan sebelumnya, namun byte target harus hanya berada pada halaman nol (dari $0000 hingga $00FF). Sekarang, ketika berhadapan dengan halaman nol, byte yang lebih tinggi selalu 00 H untuk lokasi memori biasanya dihindari. Jadi biasanya disebutkan bahwa halaman nol dimulai dari $00 hingga FF. Jadi, instruksi sebelumnya dari “LDA $C453,X” adalah:

LDA $53.X

$C4, byte lebih tinggi yang mengacu pada halaman di atas halaman nol, tidak dapat digunakan dalam instruksi ini karena menempatkan byte target yang diharapkan untuk dimuat ke dalam akumulasi byte di luar dan di atas halaman nol.

Ketika nilai yang diketik dalam instruksi ditambahkan ke nilai dalam register indeks, penjumlahannya tidak boleh memberikan hasil di atas halaman nol (FF H ). Jadi, tidak mungkin memiliki instruksi seperti “LDA $FF, X” dan nilai seperti FF H di register indeks karena FF H + FF H = 200 H yang merupakan lokasi byte pertama ($0200) dari halaman 2 (halaman ketiga) dalam memori, sangat jauh dari halaman 0. Jadi, dengan pengalamatan terindeks halaman nol, alamat efektif harus berada di halaman nol.

Pengalamatan Tidak Langsung

Lompat Pengalamatan Absolut
Sebelum membahas mengenai Absolute Indirect Addressing, ada baiknya kita melihat terlebih dahulu mengenai pengalamatan JMP. Asumsikan alamat yang memiliki nilai yang diinginkan (byte target) adalah $8765. Ini adalah 16-bit yang terdiri dari dua byte: byte yang lebih tinggi yaitu 87 H dan byte bawah yaitu 65 H . Jadi, dua byte sebesar $8765 dimasukkan ke dalam PC (penghitung program) untuk instruksi selanjutnya. Yang diketikkan pada program (file) bahasa assembly adalah:

JMP $8765

Program yang dijalankan di memori melompat dari alamat apa pun yang diaksesnya ke $8765. Mnemonik JMP memiliki tiga opcode yaitu 4C, 6C, dan 7C. Opcode untuk pengalamatan absolut ini adalah 4C. Opcode untuk pengalamatan tidak langsung absolut JMP adalah 6C (lihat ilustrasi berikut).

Pengalamatan Tidak Langsung Mutlak
Ini hanya digunakan dengan instruksi lompat (JMP). Asumsikan alamat yang memiliki byte yang diinginkan (byte target) adalah $8765. Ini adalah 16-bit yang terdiri dari dua byte: byte yang lebih tinggi yaitu 87 H dan byte bawah yaitu 65 H . Dengan pengalamatan tidak langsung absolut, kedua byte ini sebenarnya terletak di dua lokasi byte berturut-turut di tempat lain dalam memori.

Asumsikan bahwa mereka berada di lokasi memori $0210 dan $0211. Kemudian, byte bawah dari alamat yang diinginkan yaitu 65 H ada di alamat $0210, dan byte yang lebih tinggi yaitu 87 H ada di alamat $0211. Artinya, byte memori yang lebih rendah akan menuju ke alamat berurutan yang lebih rendah, dan byte memori yang lebih tinggi akan menuju ke alamat berurutan yang lebih tinggi – little endianness.

Alamat 16-bit dapat merujuk pada dua alamat berturut-turut dalam memori. Dalam hal ini, alamat $0210 mengacu pada alamat $0210 dan $0211. Pasangan alamat $0210 dan $0211 menyimpan alamat akhir (16-bit dari dua byte) dari byte target, dengan byte bawah 65 H dalam $0210 dan byte yang lebih tinggi dari 87 H dalam $0211. Jadi, instruksi lompat yang diketikkan adalah:

JMP ($0210)

Mnemonik JMP memiliki tiga opcode yaitu 4C, 6C, dan 7C. Opcode untuk pengalamatan tidak langsung absolut adalah 6C. Yang diketik pada file teks tersebut adalah “JMP ($0210)”. Karena tanda kurung, assembler (penerjemah) menggunakan opcode 6C untuk JMP, dan bukan 4C atau 7C.

Dengan pengalamatan tidak langsung absolut, sebenarnya ada tiga wilayah memori. Wilayah pertama dapat terdiri dari lokasi byte $0200, $0201, dan $0202. Ini memiliki tiga byte untuk instruksi “JMP ($0210)”. Wilayah kedua, yang belum tentu berada di sebelah wilayah pertama, terdiri dari dua lokasi byte berturut-turut yaitu $0210 dan $0211. Ini adalah byte yang lebih rendah di sini ($0210) yang diketik dalam instruksi program bahasa assembly. Jika alamat yang diinginkan adalah $8765, byte bawah 65 H berada di lokasi byte $0210, dan byte yang lebih tinggi dari 87 H berada di lokasi byte $0211. Wilayah ketiga hanya terdiri dari satu lokasi byte. Ini adalah alamat $8765 untuk byte yang ditargetkan (byte utama yang diminati). Sepasang alamat yang berurutan, $0210 dan $0211, menyimpan penunjuk $8765 yang merupakan alamat yang diinginkan. Setelah interpretasi komputasi, $8765 masuk ke PC (Program Counter) untuk mengakses byte target.

Pengalamatan Tidak Langsung Halaman Nol
Pengalamatan ini sama dengan pengalamatan tidak langsung absolut, namun penunjuknya harus berada di halaman nol. Alamat byte yang lebih rendah dari wilayah penunjuk adalah apa yang ada dalam instruksi yang diketik sebagai berikut:

JMP ($50)

Byte yang lebih tinggi dari penunjuk berada di lokasi $51 byte. Alamat efektif (menunjuk) tidak harus di halaman nol.

Jadi, dengan pengalamatan indeks, nilai dalam register indeks ditambahkan ke alamat dasar yang diberikan dalam instruksi untuk mendapatkan alamat efektif. Pengalamatan tidak langsung menggunakan pointer.

4.8 Pengalamatan Tidak Langsung Terindeks

Pengalamatan Tidak Langsung Terindeks Absolut
Mode pengalamatan ini hanya digunakan dengan instruksi JMP saja.
Dengan pengalamatan tidak langsung absolut, terdapat nilai runcing (byte) dengan dua alamat byte berturut-turut. Dua alamat berturut-turut ini membentuk penunjuk berada di wilayah penunjuk dua byte berturut-turut dalam memori. Byte yang lebih rendah dari wilayah penunjuk adalah apa yang diketik dalam instruksi dalam tanda kurung. Pointer adalah alamat dari nilai yang ditunjuk. Dalam situasi sebelumnya, $8765 adalah alamat dari nilai yang ditunjuk. $0210 (diikuti $0211) adalah alamat yang isinya $8765 yang menjadi penunjuknya. Dengan mode pengalamatan tidak langsung absolut, ($0210) yang diketik dalam program (file teks), termasuk tanda kurung.

Di sisi lain, dengan Mode Pengalamatan Tidak Langsung Terindeks Absolut, byte alamat yang lebih rendah untuk wilayah penunjuk dibentuk dengan menambahkan nilai dalam register X ke alamat yang diketik. Misalnya, jika penunjuk berada di lokasi alamat $0210, instruksi yang diketik mungkin seperti ini:

JMP ($020A,X)

Dimana register X bernilai 6 H . 020A H + 6 H = 0210 H . Register Y tidak digunakan dengan mode pengalamatan ini.

Pengalamatan Tidak Langsung Terindeks Halaman Nol
Mode pengalamatan ini menggunakan register X dan bukan register Y. Dengan mode pengalamatan ini, masih ada nilai runcing dan penunjuk di wilayah penunjuk alamat dua byte. Harus ada dua byte berturut-turut di halaman nol untuk penunjuk. Alamat yang diketikkan dalam instruksi adalah alamat satu byte. Nilai ini ditambahkan ke nilai dalam register X dan semua barang bawaan dibuang. Hasilnya menunjuk ke wilayah penunjuk di halaman 0. Misalnya, jika alamat yang diinginkan (menunjuk) adalah $8765 dan berada di lokasi byte $50 dan $51 di halaman 0, dan nilai dalam register X adalah $30, maka instruksi yang diketik adalah seperti ini:

LDA ($20,X)

Karena $20 + $30 = $50.

Pengalamatan Terindeks Tidak Langsung
Mode pengalamatan ini menggunakan register Y dan bukan register X. Dengan mode pengalamatan ini, masih ada nilai runcing dan wilayah penunjuk, namun konten wilayah penunjuk beroperasi secara berbeda. Harus ada dua byte berturut-turut di halaman nol untuk wilayah penunjuk. Alamat yang lebih rendah dari wilayah penunjuk diketik dalam instruksi. Angka ini (sepasang byte) yang terkandung dalam wilayah penunjuk ditambahkan ke nilai dalam register Y untuk mendapatkan penunjuk sebenarnya. Misalnya, alamat yang diinginkan (menunjuk) adalah $8765, nilai 6H berada di register Y, dan nomor (dua byte) berada di alamat 50 H dan 51 H . Dua byte bersama-sama adalah $875F karena $875F + $6 = $8765. Instruksi yang diketik kira-kira seperti ini:

LDA ($50),Y

4.9 Instruksi Kenaikan, Penurunan, dan Uji BIT

Tabel berikut menunjukkan operasi instruksi kenaikan dan penurunan:

INA dan DEA masing-masing menambah dan mengurangi akumulator. Itu disebut pengalamatan akumulator. INX, DEX, INY, dan DEY masing-masing untuk register X dan Y. Mereka tidak mengambil operan apa pun. Jadi, mereka menggunakan mode pengalamatan tersirat. Kenaikan berarti menambahkan 1 ke register atau byte memori. Penurunan berarti mengurangi 1 dari register atau byte memori.

INC dan DEC masing-masing menambah dan mengurangi satu byte memori (dan bukan register). Penggunaan pengalamatan halaman nol dibandingkan pengalamatan absolut adalah untuk menghemat memori untuk instruksi. Pengalamatan halaman nol adalah satu byte kurang dari pengalamatan absolut untuk instruksi dalam memori. Namun, mode pengalamatan halaman nol hanya mempengaruhi halaman nol.

Instruksi BIT menguji bit-bit satu byte di memori dengan 8 bit di akumulator, tetapi tidak mengubah keduanya. Hanya beberapa tanda pada Daftar Status Prosesor “P” yang disetel. Bit-bit dari lokasi memori yang ditentukan secara logis di-AND-kan dengan bit-bit dari akumulator. Kemudian, bit status berikut disetel:

  • N yang merupakan bit 7 dan bit terakhir (kiri) dari register status, menerima bit 7 dari lokasi memori sebelum ANDing.
  • V yang merupakan bit 6 dari register status menerima bit 6 dari lokasi memori sebelum ANDing.
  • Bendera Z dari register status diatur (dibuat 1) jika hasil AND adalah nol (00000000 2 ). Jika tidak, maka akan dihapus (dibuat 0).

4.10 Bandingkan Instruksi

Mnemonik instruksi perbandingan untuk 6502 µP adalah CMP, CPX, dan CPY. Setelah setiap perbandingan, flag N, Z, dan C dari register status prosesor “P” terpengaruh. Bendera N disetel (dibuat 1) bila hasilnya berupa bilangan negatif. Bendera Z disetel (dibuat 1) ketika hasilnya nol (000000002). Flag C diset (dibuat 1) ketika ada carry dari bit kedelapan ke bit kesembilan. Tabel berikut memberikan ilustrasi rinci

Artinya “lebih besar dari”. Oleh karena itu, tabel perbandingan seharusnya sudah cukup jelas.

4.11 Petunjuk Lompat dan Cabang

Tabel berikut merangkum instruksi lompat dan percabangan:

Instruksi JMP menggunakan pengalamatan absolut dan tidak langsung. Instruksi lainnya dalam tabel adalah instruksi cabang. Mereka hanya menggunakan pengalamatan relatif dengan 6502 µP. Dengan demikian tabel menjadi cukup jelas jika dibaca dari kiri ke kanan dan atas ke bawah.

Perhatikan bahwa cabang hanya dapat diterapkan ke alamat dalam -128 hingga +127 byte dari alamat yang diberikan. Ini adalah pengalamatan relatif. Baik untuk instruksi JMP maupun cabang, Program Counter (PC) terpengaruh secara langsung. 6502 µP tidak mengizinkan cabang ke alamat absolut, meskipun lompatan dapat melakukan pengalamatan absolut. Instruksi JMP bukanlah instruksi cabang.

Catatan: Pengalamatan relatif hanya digunakan dengan instruksi cabang.

4.12 Area Tumpukan

Subrutin seperti salah satu program singkat sebelumnya untuk menjumlahkan dua angka atau mengurangi dua angka. Area tumpukan di memori dimulai dari $0100 hingga $01FF secara inklusif. Area ini disebut tumpukan. Ketika mikroprosesor menjalankan lompatan ke instruksi subrutin (JSR – lihat pembahasan berikut), mikroprosesor perlu mengetahui ke mana harus kembali setelah selesai. 6502 µP menyimpan informasi ini (alamat pengirim) dalam memori rendah dari $0100 hingga $01FF (area tumpukan) dan menggunakan konten register penunjuk tumpukan yaitu “S” di mikroprosesor sebagai penunjuk (9 bit) ke alamat terakhir yang dikembalikan yang disimpan di halaman 1 ($0100 hingga $01FF) memori. Tumpukannya bertambah dari $01FF dan memungkinkan untuk menyarangkan subrutin hingga kedalaman 128 level.

Kegunaan lain dari penunjuk tumpukan adalah untuk menangani interupsi. 6502 µP memiliki pin berlabel IRQ dan NMI. Ada kemungkinan beberapa sinyal listrik kecil diterapkan pada pin ini dan menyebabkan 6502 µP berhenti menjalankan satu program dan membuatnya mulai menjalankan program lain. Dalam hal ini, program pertama terhenti. Seperti subrutin, segmen kode interupsi dapat disarangkan. Pemrosesan interupsi dibahas pada bab berikutnya.

Catatan : Penunjuk tumpukan memiliki 8 bit untuk alamat byte yang lebih rendah dalam mengalamatkan lokasi dari $0100 hingga $01FF. Byte yang lebih tinggi dari 00000001 2 diasumsikan.

Tabel berikut memberikan instruksi yang menghubungkan penunjuk tumpukan “S” dengan register A, X, Y, dan P ke area tumpukan di memori:

4.13 Panggilan Subrutin dan Pengembalian

Subrutin adalah sekumpulan instruksi yang mencapai tujuan tertentu. Program penjumlahan atau pengurangan sebelumnya merupakan subrutin yang sangat singkat. Subrutin terkadang hanya disebut rutinitas. Instruksi untuk memanggil subrutin adalah:

JSR : Lompat ke SubRutin

Instruksi untuk kembali dari subrutin adalah:

RTS : Kembali dari Subrutin

Mikroprosesor mempunyai kecenderungan untuk terus menerus mengeksekusi instruksi-instruksi di dalam memori, satu demi satu. Asumsikan mikroprosesor sedang mengeksekusi segmen kode dan menemukan instruksi jump (JMP) untuk pergi dan mengeksekusi segmen kode yang dikodekan di belakangnya yang mungkin sudah dieksekusi. Ia mengeksekusi segmen kode di belakang dan terus mengeksekusi semua segmen kode (instruksi) yang mengikuti segmen kode di belakang, hingga ia mengeksekusi kembali segmen kode saat ini dan melanjutkan di bawah. JMP tidak memasukkan instruksi berikutnya ke tumpukan.

Tidak seperti JMP, JSR mendorong alamat instruksi berikutnya dari PC (penghitung program) ke dalam stack. Posisi tumpukan alamat ini ditempatkan di penunjuk tumpukan “S”. Ketika instruksi RTS ditemui (dieksekusi) dalam subrutin, alamat yang dimasukkan pada tumpukan akan keluar dari tumpukan dan program dilanjutkan pada alamat yang ditarik tersebut yang merupakan alamat instruksi berikutnya tepat sebelum panggilan subrutin. Alamat terakhir yang dihapus dari tumpukan dikirim ke penghitung program. Tabel berikut memberikan rincian teknis instruksi JSR dan RTS:

Lihat ilustrasi penggunaan JSR dan RTS berikut ini:

4.14 Contoh Perulangan Hitung Mundur

Subrutin berikut menghitung mundur dari $FF ke $00 (total 256 10 penting):

mulai LDX #$FF ; memuat X dengan $FF = 255
lingkaran DEX; X = X – 1
putaran BNE; jika X bukan nol maka goto loop
RTS; kembali

Setiap baris memiliki komentar. Komentar tidak pernah masuk ke memori untuk dieksekusi. Assembler (penerjemah) yang mengubah suatu program menjadi apa yang ada di memori untuk dieksekusi (berjalan) selalu menghapus komentar. Komentar dimulai dengan “;” . “Start” dan “loop” dalam program ini disebut label. Label mengidentifikasi (nama) alamat instruksi. Jika instruksinya adalah instruksi byte tunggal (pengalamatan tersirat), labelnya adalah alamat instruksi tersebut. Jika instruksinya adalah instruksi multibyte, label mengidentifikasi byte pertama untuk instruksi multibyte tersebut. Instruksi pertama untuk program ini terdiri dari dua byte. Dengan asumsi bahwa ini dimulai pada alamat $0300, alamat $0300 dapat diganti dengan “start” down dalam program. Instruksi kedua (DEX) adalah instruksi byte tunggal, dan harus berada di alamat $0302. Ini berarti bahwa alamat $0302 dapat diganti dengan “loop”, di bawah dalam program, yang sebenarnya demikian dalam “BNE loop”.

“BNE loop” berarti cabang ke alamat yang diberikan ketika flag Z dari register status adalah 0. Ketika nilai dalam register A atau X atau Y adalah 00000000 2 , karena operasi terakhir, bendera Z adalah 1 (set). Jadi, ketika nilainya 0 (bukan 1), instruksi kedua dan ketiga dalam program diulangi dalam urutan itu. Pada setiap barisan yang berulang, nilai (bilangan bulat) pada register X berkurang 1. DEX artinya X = X – 1. Bila nilai pada register X adalah $00 = 00000000 2 , Z menjadi 1. Pada titik tersebut, tidak ada lagi pengulangan kedua instruksi tersebut. Instruksi RTS terakhir dalam program, yang merupakan instruksi byte tunggal (pengalamatan tersirat), kembali dari subrutin. Efek dari instruksi ini adalah membuat alamat penghitung program di tumpukan untuk kode yang akan dieksekusi sebelum panggilan subrutin dan kembali ke penghitung program (PC). Alamat ini adalah alamat instruksi yang akan dieksekusi sebelum subrutin dipanggil.

Catatan: Saat menulis program bahasa rakitan untuk 6502 µP, hanya label yang harus dimulai di awal baris; kode baris lainnya harus digeser setidaknya satu spasi ke kanan.

Memanggil Subrutin
Mengabaikan ruang memori yang digunakan oleh label sebelumnya, program ini mengambil 6 byte lokasi berturut-turut dalam memori (RAM) dari $0300 hingga $0305. Dalam hal ini, programnya adalah:

LDX #$FF ; memuat X dengan $FF = 255
DEX; X = X – 1
BNE $0302 ; jika X bukan nol maka goto loop
RTS; kembali

Dimulai dari alamat $0200 di memori dapat menjadi panggilan untuk subrutin. Instruksi panggilannya adalah:

JSR mulai; start adalah alamat $0300, yaitu JSR $0300

Subrutin dan pemanggilannya yang ditulis dengan benar di file editor teks adalah:

mulai LDX #$FF; memuat X dengan $FF = 255
lingkaran DEX; X = X – 1

putaran BNE; jika X bukan nol maka goto loop
RTS; kembali

JSR start : beralih ke rutinitas mulai dari $0300

Sekarang, terdapat banyak subrutin dalam satu program yang panjang. Semuanya tidak bisa diberi nama “mulai”. Mereka harus memiliki nama yang berbeda. Faktanya, tidak satupun dari mereka mungkin memiliki nama “mulai”. “Mulai” digunakan di sini untuk alasan pengajaran.

4.15 Menerjemahkan Program

Menerjemahkan suatu program atau merakitnya artinya sama saja. Perhatikan program berikut ini:

mulai LDX #$FF : memuat X dengan $FF = 255
putaran DEX : X = X – 1
BNE loop : jika X bukan nol maka goto loop
RTS : kembali
JSR start : beralih ke rutinitas mulai dari $0300

Ini adalah program yang telah ditulis sebelumnya. Ini terdiri dari subrutin, permulaan, dan panggilan ke subrutin. Program ini menghitung mundur dari 255 10 ke 0 10 . Program dimulai pada alamat awal pengguna $0200 (RAM). Program ini diketik dalam editor teks dan disimpan dalam disk. Ini memiliki nama seperti “sample.asm” di mana “sample” adalah nama pilihan programmer tetapi ekstensi “.asm” untuk bahasa assembly harus dikaitkan dengan nama file.

Program yang telah dirakit dihasilkan oleh program lain yang disebut assembler. Perakit dipasok oleh produsen 6502 µP atau oleh pihak ketiga. Assembler mereproduksi program sedemikian rupa sehingga berada di memori (RAM) saat dijalankan (dijalankan).

Asumsikan bahwa instruksi JSR dimulai pada alamat $0200 dan subrutin dimulai pada alamat $0300. Assembler menghapus semua komentar dan spasi. Komentar dan spasi menyia-nyiakan memori yang selalu langka. Kemungkinan baris kosong antara segmen kode subrutin sebelumnya dan panggilan subrutin adalah contoh spasi. File yang dirakit masih disimpan di disk, dan diberi nama seperti 'sample.exe'. 'Sampel' adalah nama pilihan pemrogram, tetapi ekstensi '.exe' harus ada di sana untuk menunjukkan bahwa itu adalah file yang dapat dieksekusi.

Program yang dirakit dapat didokumentasikan sebagai berikut:

Pembuatan dokumen seperti ini konon dilakukan perakitan dengan tangan. Perhatikan bahwa komentar dalam dokumen ini tidak muncul di memori (untuk dieksekusi). Kolom alamat pada tabel menunjukkan alamat awal instruksi dalam memori. Perhatikan bahwa 'JSR start' yaitu 'JSR $0300', yang diharapkan diberi kode sebagai '20 03 00', sebenarnya dikodekan sebagai '20 00 03' dengan alamat byte memori yang lebih rendah mengambil byte yang lebih rendah dalam memori dan alamat byte memori yang lebih tinggi mengambil byte yang lebih tinggi dalam memori – little endianness. Opcode untuk JSR adalah 20 16 .

Perhatikan bahwa offset pada instruksi cabang seperti BNE adalah bilangan komplemen dua dalam kisaran 128 10 ke + 127 10 . Jadi, “BNE loop” berarti “BNE -1 10 yang sebenarnya adalah “D0 FF” dalam bentuk kode FF 16 adalah -1 pada komplemen dua yang dituliskan = 11111111 pada basis dua. Program assembler mengganti label dan field menjadi bilangan heksadesimal sebenarnya (bilangan heksadesimal adalah bilangan biner yang dikelompokkan dalam empat bit). Alamat sebenarnya tempat setiap instruksi dimulai sebenarnya disertakan.

Catatan: Instruksi 'JSR start' diganti dengan instruksi yang lebih pendek yang mengirimkan konten saat ini (byte tinggi dan rendah) dari penghitung program ke tumpukan dengan penunjuk tumpukan yang dikurangi dua kali (sekali untuk byte tinggi dan satu kali untuk byte rendah) dan lalu muat ulang PC dengan alamat $0300. Penunjuk tumpukan sekarang menunjuk ke $00FD, dengan asumsi bahwa itu diinisialisasi ke $01FF.

Selain itu, instruksi RTS diganti dengan sejumlah instruksi yang lebih pendek yang menambah penunjuk tumpukan “S” dua kali (sekali untuk byte rendah dan sekali untuk byte tinggi) dan menarik dua byte alamat yang sesuai dari penunjuk tumpukan ke PC untuk instruksi berikutnya.

Catatan: Teks label tidak boleh lebih dari 8 karakter.

“BNE loop” menggunakan pengalamatan relatif. Artinya menambah -3 10 ke konten penghitung program berikutnya sebesar $0305. Byte untuk “BNE loop” adalah “D0 FD” dimana FD adalah komplemen keduanya dari -3 10 .

Catatan: Bab ini tidak menyajikan semua instruksi untuk 6502 µP. Semua instruksi dan rinciannya dapat ditemukan dalam dokumen berjudul “Keluarga Mikroprosesor SY6500 8-Bit”. Ada file PDF dengan nama “6502.pdf” untuk dokumen ini yang tersedia secara gratis di Internet. 6502 µP yang dijelaskan dalam dokumen ini adalah 65C02.

4.16 Interupsi

Sinyal perangkat apa pun yang terhubung ke port eksternal (permukaan vertikal) Commodore 64 harus melewati sirkuit (IC) CIA 1 atau CIA 2 sebelum mencapai mikroprosesor 6502. Sinyal dari bus data 6502 µP harus melewati chip CIA 1 atau CIA 2 sebelum mencapai perangkat eksternal apa pun. CIA adalah singkatan dari Complex Interface Adapter. Pada Gambar 4.1 “Diagram Blok Motherboard Commodore_64”, perangkat input/output blok mewakili CIA 1 dan CIA 2. Ketika sebuah program sedang berjalan, program tersebut dapat diinterupsi untuk menjalankan beberapa bagian kode lain sebelum melanjutkan. Ada gangguan perangkat keras dan gangguan perangkat lunak. Untuk interupsi perangkat keras, ada dua pin sinyal input ke 6502 µP. Nama-nama pin tersebut adalah IRQ Dan NMI . Ini bukan jalur data µP. Jalur data untuk µP adalah D7, D6, D5, D4, D3, D2, D1 dan D0; dengan D0 untuk bit paling tidak signifikan dan D7 untuk bit paling signifikan.

IRQ singkatan dari Interrupt ReQuest 'aktif' rendah. Jalur masukan ke µP ini biasanya tinggi, sekitar 5 volt. Ketika turun menjadi sekitar 0 volt, itu adalah permintaan interupsi yang memberi sinyal µP. Segera setelah permintaan dikabulkan, antrean kembali tinggi. Mengabulkan permintaan interupsi berarti µP bercabang ke kode (subrutin) yang menangani interupsi.

NMI singkatan dari Non-Maskable Interrupt “aktif” rendah. Sedangkan kode untuk IRQ sedang dieksekusi NMI bisa menjadi rendah. Pada kasus ini, NMI ditangani (kodenya sendiri dieksekusi). Setelah itu, kode untuk IRQ berlanjut. Setelah kode untuk IRQ berakhir, kode program utama berlanjut. Itu adalah, NMI menyela IRQ penangan. Sinyal untuk NMI masih dapat diberikan kepada µP meskipun µP sedang idle dan tidak menangani apa pun atau tidak menjalankan program utama.

Catatan: Ini sebenarnya adalah transisi dari tinggi ke rendah NMI , itu adalah NMI sinyal – lebih lanjut tentang itu nanti. IRQ biasanya berasal dari CIA 1 dan NMI biasanya berasal dari CIA 2. NMI , yang merupakan singkatan dari Non-Maskable Interrupt, dapat dianggap sebagai interupsi yang tidak dapat dihentikan.

Menangani Interupsi
Apakah permintaan itu berasal IRQ atau NMI , instruksi saat ini harus selesai. 6502 hanya mempunyai register A, X, dan Y. Saat subrutin sedang beroperasi, subrutin tersebut mungkin menggunakan ketiga register ini secara bersamaan. Penangan interupsi masih merupakan subrutin, meskipun tidak terlihat seperti itu. Setelah instruksi saat ini diselesaikan, isi register A, X, dan Y untuk 65C02 µP disimpan dalam tumpukan. Alamat instruksi selanjutnya dari Program Counter juga dikirim ke stack. µP kemudian bercabang ke kode interupsi. Setelah itu, isi register A, X, dan Y kemudian dikembalikan dari tumpukan dengan urutan kebalikan dari pengirimannya.

Contoh Pengkodean untuk Interupsi
Untuk mempermudah, asumsikan bahwa rutinitas untuk µP IRQ interupsi hanya dengan menambahkan angka $01 dan $02 dan menyimpan hasil $03 pada alamat memori $0400. Kodenya adalah:

ISR PHA
PHX
PHY
;
LDA #$01
ADC #$02
BIAYANYA $0400
;
LAPIS
tolong
TPR
RTI

ISR adalah label dan mengidentifikasi alamat memori tempat instruksi PHA berada. ISR berarti Interupsi Layanan Rutin. PHA, PHX, dan PHY mengirimkan isi register A, X, dan Y ke stack dengan harapan akan dibutuhkan oleh kode (program) apa pun yang sedang berjalan sesaat sebelum interupsi. Tiga instruksi berikutnya membentuk inti dari pengendali interupsi. Instruksi PLY, PLX, dan PLA harus berada dalam urutan tersebut, dan instruksi tersebut mengembalikan isi register Y, X, dan A. Instruksi terakhir, yaitu RTI, (tanpa operan) mengembalikan kelanjutan eksekusi ke kode (program) apa pun yang dijalankan sebelum interupsi. RTI menarik alamat instruksi berikutnya dari kode yang dieksekusi dari tumpukan kembali ke penghitung program. RTI berarti Kembali dari Interupsi. Dengan demikian, penanganan interupsi (subrutin) selesai.

Interupsi Perangkat Lunak
Cara utama untuk melakukan interupsi perangkat lunak untuk 6502 µP adalah dengan menggunakan instruksi alamat tersirat BRK. Asumsikan program utama sedang berjalan dan menemui instruksi BRK. Sejak saat itu, alamat instruksi selanjutnya di PC harus dikirim ke tumpukan saat instruksi saat ini selesai. Subrutin untuk menangani instruksi perangkat lunak harus disebut “berikutnya”. Subrutin interupsi ini harus mendorong isi register A, X, dan Y ke tumpukan. Setelah inti subrutin dieksekusi, isi register A, X, dan Y harus ditarik kembali dari tumpukan ke registernya dengan menyelesaikan subrutin. Pernyataan terakhir dalam rutinitas adalah RTI. Konten PC juga ditarik kembali dari tumpukan ke PC secara otomatis karena RTI.

Membandingkan dan Membandingkan Rutinitas Layanan Subrutin dan Interupsi
Tabel berikut membandingkan dan membedakan Subrutin dan Rutin Layanan Interupsi:

4.17 Ringkasan Mode Pengalamatan Utama 6502

Setiap instruksi untuk 6502 berukuran satu byte, diikuti oleh nol atau lebih operan.

Mode Pengalamatan Segera
Dengan mode pengalamatan langsung, setelah operan, adalah nilai dan bukan alamat memori. Nilainya harus diawali dengan #. Jika nilainya dalam heksadesimal, “#” harus diikuti dengan “$”. Instruksi pengalamatan langsung untuk 65C02 adalah: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Pembaca harus membaca dokumentasi 65C02 µP untuk mengetahui cara menggunakan instruksi yang tercantum di sini yang tidak dijelaskan dalam bab ini. Contoh instruksinya adalah:

LDA #$77

Mode Pengalamatan Absolut
Dalam mode pengalamatan absolut, ada satu operan. Operan ini adalah alamat nilai di memori (biasanya dalam heksadesimal atau label). Ada 64K 10 = 65.536 10 alamat memori untuk 6502 µP. Biasanya, nilai satu byte ada di salah satu alamat ini. Instruksi pengalamatan absolut untuk 65C02 adalah: 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 membaca dokumentasi 65C02 µP untuk mengetahui cara menggunakan instruksi yang tercantum di sini, serta mode pengalamatan lainnya yang tidak dijelaskan dalam bab ini. Contoh instruksinya adalah:

MEREKA $1234

Mode Pengalamatan Tersirat
Dalam mode pengalamatan tersirat, tidak ada operan. Setiap register µP yang terlibat tersirat dalam instruksi. Instruksi pengalamatan tersirat untuk 65C02 adalah: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, PAJAK, TAY, TSX, TXA, TXS, TYA. Contoh instruksinya adalah:

DEX : Mengurangi register X sebanyak satu unit.

Mode Pengalamatan Relatif
Mode pengalamatan relatif hanya berhubungan dengan instruksi cabang. Dalam mode pengalamatan relatif, hanya ada satu operan. Ini adalah nilai dari -128 10 ke +127 10 . Nilai ini disebut offset. Berdasarkan tandanya, nilai ini ditambahkan atau dikurangi dari instruksi selanjutnya dari Program Counter sehingga menghasilkan alamat instruksi selanjutnya yang dimaksud. Instruksi mode alamat relatif adalah: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Contoh instruksinya adalah:

BNE $7F : (cabang jika Z = 0 di status register, P)

Yang menambahkan 127 ke penghitung program saat ini (alamat untuk dieksekusi) dan mulai mengeksekusi instruksi di alamat tersebut. Demikian pula:

BEQ $F9 : (cabang jika Z = : dalam status register, P)

Yang menambahkan -7 ke penghitung program saat ini dan memulai eksekusi di alamat penghitung program baru. Operan adalah bilangan komplemen dua.

Pengalamatan Terindeks Absolut
Dalam pengalamatan indeks absolut, isi register X atau Y ditambahkan ke alamat absolut yang diberikan (mulai dari $0000 hingga $FFFF, yaitu dari 0 10 ke 65536 10 ) untuk mendapatkan alamat sebenarnya. Alamat absolut yang diberikan ini disebut alamat dasar. Jika register X digunakan, instruksi perakitannya kira-kira seperti ini:

LDA $C453,X

Jika register Y digunakan maka hasilnya seperti ini:

LDA $C453,Y

Nilai untuk register X atau Y disebut nilai hitungan atau indeks, dan dapat berkisar antara $00 (0 10 ) hingga $FF (250 10 ). Itu tidak disebut offset.

Instruksi pengalamatan indeks absolut adalah: ADC, AND, ASL (hanya X), BIT (dengan akumulator dan memori, dengan X saja), CMP, DEC (memori dan X saja), EOR, INC (memori dan X saja), LDA , LDX, LDY, LSR (hanya X), ORA, ROL (hanya X), ROR (hanya X), SBC, STA, STZ (hanya X).

Pengalamatan Tidak Langsung Mutlak
Ini hanya digunakan dengan instruksi lompat. Dengan ini, alamat absolut yang diberikan memiliki alamat penunjuk. Alamat penunjuk terdiri dari dua byte. Penunjuk dua byte menunjuk ke (adalah alamat) nilai byte tujuan dalam memori. Jadi, instruksi bahasa assembly adalah:

JMP ($3456)

Dengan tanda kurung, dan $13 di lokasi alamat $3456 sedangkan $EB di lokasi alamat $3457 (= $3456 + 1). Kemudian, alamat tujuan adalah $13EB dan $13EB adalah penunjuknya. $3456 absolut ada dalam tanda kurung dalam instruksi di mana 34 adalah byte yang lebih rendah dan 56 adalah byte yang lebih tinggi.

4.18 Membuat String dengan Bahasa Majelis 6502 µP

Seperti yang ditunjukkan pada bab berikutnya, setelah membuat file di memori, file tersebut dapat disimpan ke dalam disk. File tersebut perlu diberi nama. Nama adalah contoh string. Masih banyak lagi contoh string dalam pemrograman.

Ada dua cara utama untuk membuat rangkaian kode ASCII. Dalam kedua cara tersebut, semua kode ASCII (karakter) mengambil lokasi byte berturut-turut di memori. Dalam salah satu cara, urutan byte ini didahului oleh byte integer yang merupakan panjang (jumlah karakter) dalam urutan (string). Dengan cara lain, urutan karakter digantikan (segera diikuti) oleh byte Null yaitu 00 16 , yaitu $00. Panjang string (jumlah karakter) tidak ditunjukkan dengan cara lain. Karakter Null tidak digunakan pada cara pertama.

Misalnya, pertimbangkan kalimat “Aku cinta kamu!” string tanpa tanda kutip. Panjangnya di sini adalah 11; spasi dihitung sebagai satu byte ASCII (karakter). Asumsikan bahwa string harus ditempatkan di memori dengan karakter pertama berada di alamat $0300.

Tabel berikut menunjukkan pengaturan memori string ketika byte pertama adalah 11 10 = 0B 16 :

Tabel berikut menunjukkan pengaturan memori string ketika byte pertama adalah “I” dan byte terakhir adalah Null ($00):

Instruksi berikut dapat digunakan untuk mulai membuat string:

BIAYANYA $0.300

Asumsikan byte pertama ada di akumulator yang akan dikirim ke lokasi alamat $0300. Instruksi ini berlaku untuk kedua kasus (kedua jenis string).

Setelah memasukkan semua karakter ke dalam sel memori, satu per satu, string dapat dibaca menggunakan loop. Untuk kasus pertama, jumlah karakter setelah panjangnya dibacakan. Untuk kasus kedua, karakter dibaca dari “I” hingga karakter Null yaitu “Null” terpenuhi.

4.19 Membuat Array dengan Bahasa Majelis 6502 µP

Array bilangan bulat byte tunggal terdiri dari lokasi byte memori yang berurutan dengan bilangan bulat. Lalu, ada penunjuk yang menunjuk ke lokasi bilangan bulat pertama. Jadi, array bilangan bulat terdiri dari dua bagian: penunjuk dan rangkaian lokasi.

Untuk array string, setiap string dapat berada di tempat berbeda di memori. Lalu, ada lokasi memori yang berurutan dengan penunjuk di mana setiap penunjuk menunjuk ke lokasi pertama setiap string. Sebuah pointer dalam hal ini terdiri dari dua byte. Jika suatu string dimulai dengan panjangnya, penunjuk yang bersesuaian akan menunjuk ke lokasi panjangnya. Jika sebuah string tidak dimulai dengan panjangnya tetapi diakhiri dengan karakter nol, penunjuk yang bersangkutan menunjuk ke lokasi karakter pertama dari string tersebut. Dan ada sebuah pointer yang menunjuk ke alamat byte yang lebih rendah dari pointer pertama dari pointer yang berurutan. Jadi, array string terdiri dari tiga bagian: string di tempat berbeda dalam memori, penunjuk berurutan yang sesuai, dan penunjuk ke penunjuk pertama dari penunjuk berurutan.

4.20 Masalah

Pembaca disarankan untuk menyelesaikan semua permasalahan dalam satu bab sebelum melanjutkan ke bab berikutnya.

  1. Tulis program bahasa rakitan yang dimulai dari $0200 untuk 6502 µP dan tambahkan nomor 2A94 yang tidak ditandatangani H (tambahkan) ke 2ABF H (Agustus). Biarkan input dan output berada dalam memori. Juga, buatlah dokumen program yang telah dirakit dengan tangan.
  2. Tulis program bahasa assembly yang dimulai dari $0200 untuk 6502 µP dan kurangi angka 1569 yang tidak ditandatangani H (kurangi) dari 2ABF H (Angka yang dikurangi). Biarkan input dan output berada dalam memori. Juga, buatlah dokumen program yang telah dirakit dengan tangan.
  3. Tulis program bahasa assembly untuk 6502 µP yang menghitung dari $00 hingga $09 menggunakan loop. Program ini harus dimulai pada $0200. Juga, buatlah dokumen program yang telah dirakit dengan tangan.
  4. Tulis program bahasa assembly yang dimulai pada $0200 untuk 6502 µP. Program ini memiliki dua subrutin. Subrutin pertama menambahkan angka 0203 yang tidak ditandatangani H (tambahan) dan 0102H (tambahan). Subrutin kedua menambahkan jumlah dari subrutin pertama yaitu 0305H menjadi 0006 H (Agustus). Hasil akhirnya disimpan dalam memori. Panggil subrutin pertama yaitu FSTSUB dan subrutin kedua yaitu SECSUB. Biarkan input dan output berada dalam memori. Juga, buatlah dokumen program yang telah dirakit untuk keseluruhan program dengan tangan.
  5. Mengingat bahwa sebuah IRQ handler menambahkan $02 ke $01 di akumulator sebagai penanganan inti sementara NMI diterbitkan dan inti penanganannya NMI menambahkan $05 hingga $04 di akumulator, tulis bahasa rakitan untuk kedua penangan termasuk panggilan mereka. Panggilan ke IRQ handler harus berada di alamat $0200. Itu IRQ handler harus dimulai pada alamat $0300. Itu NMI handler harus dimulai pada alamat $0400. Hasil dari IRQ handler harus diletakkan di alamat $0500, dan hasilnya NMI handler harus diletakkan di alamat $0501.
  6. Jelaskan secara singkat bagaimana instruksi BRK digunakan untuk menghasilkan interupsi perangkat lunak di komputer 65C02.
  7. Menghasilkan tabel yang membandingkan dan membedakan subrutin normal dengan rutin layanan interupsi.
  8. Jelaskan secara singkat mode pengalamatan utama 65C02 µP dengan memberikan contoh instruksi bahasa assembly.
  9. a) Tulis program bahasa mesin 6502 untuk menuliskan pesan “Aku cinta kamu!” string kode ASCII di memori, dimulai dari alamat $0300 dengan panjang string. Program harus dimulai pada alamat $0200. Dapatkan setiap karakter dari akumulator satu per satu, dengan asumsi bahwa karakter tersebut dikirim ke sana, melalui subrutin tertentu. Juga, rakit program dengan tangan. (Jika Anda perlu mengetahui kode ASCII untuk “Aku cinta kamu!”. Ini dia: 'I':49 16 , spasi : 20 16 , 'aku': 6C 16 , 'o':6F 16 , 'dalam':76 16 , 'e':65, 'y':79 16 , 'dalam':75 16 , dan '!':21 16 (Catatan: setiap kode menempati 1 byte).
    b) Tulis program bahasa mesin 6502 untuk menuliskan pesan “Aku cinta kamu!” string kode ASCII di memori, dimulai dari alamat $0300 tanpa panjang string tetapi diakhiri dengan 00 16 . Program harus dimulai pada alamat $0200. Dapatkan setiap karakter dari akumulator, dengan asumsi bahwa karakter tersebut dikirim ke sana, satu per satu, oleh suatu subrutin. Juga, rakit program dengan tangan.