Bölüm 4: 6502 Mikroişlemci Düzeneği Dili Eğitimi

Bolum 4 6502 Mikroislemci Duzenegi Dili Egitimi



Bölüm 4: 6502 Mikroişlemci Düzeneği Dili Eğitimi

4.1 Giriş

6502 mikroişlemcisi 1975 yılında piyasaya sürüldü. Daha sonra Apple II, Commodore 64 ve BBC Micro gibi bazı kişisel bilgisayarlarda mikroişlemci olarak kullanıldı.







6502 mikroişlemci günümüzde hala çok sayıda üretilmektedir. Günümüzde kişisel bilgisayarlarda (dizüstü bilgisayarlar) kullanılan merkezi bir işlem birimi olmaktan çıkmış, günümüzde hala çok sayıda üretilip elektronik ve elektrikli aletlerde kullanılmaktadır. Daha modern bilgisayar mimarilerini anlamak için 6502 gibi daha eski fakat oldukça başarılı bir mikroişlemciyi incelemek oldukça faydalı olacaktır.



Anlaşılması ve programlanması basit olduğundan, montaj dilini öğretmek için kullanılabilecek (en iyisi olmasa da) en iyi mikroişlemcilerden biridir. Assembly dili, bir bilgisayarı programlamak için kullanılabilecek düşük seviyeli bir dildir. Bir mikroişlemcinin montaj dilinin başka bir mikroişlemcinin montaj dilinden farklı olduğunu unutmayın. Bu bölümde 6502 mikroişlemci montaj dili öğretilmektedir. Daha doğrusu, öğretilen ancak basitçe 6502 olarak anılan 65C02'dir.



Geçmişte ünlü bir bilgisayara commodore_64 adı verildi. 6502, 6500 ailesinin bir mikroişlemcisidir. Commodore_64 bilgisayarı 6510 mikroişlemcisini kullanır. 6510 mikroişlemci 6500 µP'dir. 6502 µP'nin talimat seti neredeyse 6510 µP'nin talimatlarının tamamıdır. Bu ve sonraki bölümdeki bilgiler commodore_64 bilgisayarına dayanmaktadır. Bu bilgi, çevrimiçi kariyer kursunun bu bölümünde modern bilgisayar mimarilerini ve modern işletim sistemlerini açıklamak için temel olarak kullanılır.





Bilgisayar mimarisi, bilgisayarın anakartının bileşenlerini ve her bir bileşen, özellikle de mikroişlemci içinde verilerin nasıl aktığını, bileşenler arasında verilerin nasıl aktığını ve ayrıca verilerin nasıl etkileşime girdiğini açıklayan bir açıklamayı ifade eder. Verinin tekili datumdur. Bir bilgisayarın bilgisayar mimarisini incelemenin etkili bir yolu, anakartın montaj dilini incelemektir.

Commodore_64 bilgisayarının 8 bit bilgisayar kelimesinden oluşan bir bilgisayar olduğu söyleniyor. Bu, bilginin sekiz bitlik ikili kodlar biçiminde saklandığı, aktarıldığı ve değiştirildiği anlamına gelir.



Commodore 64 Anakartın Blok Şeması
Commodore 64 anakartının blok şeması şu şekildedir:


Şekil 4.1 Commodore_64 Sistem Ünitesinin Blok Şeması

6510 mikroişlemcisini 6502 mikroişlemci olarak düşünün. Toplam bellek bir bayt dizisidir (bayt başına 8 bit). Baytların yazılabildiği veya silinebildiği rastgele erişimli (okuma/yazma) hafıza vardır. Bilgisayarın gücü kapatıldığında, rastgele erişim belleğindeki (RAM) tüm bilgiler silinir. Ayrıca salt okunur bellek (ROM) de vardır. Bilgisayarın gücü kapatıldığında ROM'daki bilgiler kalır (silinmez).

Diyagramda giriş/çıkış cihazları olarak adlandırılan giriş/çıkış portu (devre) bulunmaktadır. Bu bağlantı noktası, bilgisayar sistem biriminin sol ve sağ veya ön ve arka dikey yüzeylerinde görünen bağlantı noktalarıyla karıştırılmamalıdır. Bunlar iki farklı şey. Bu iç bağlantı noktasından sabit disk (veya disket), klavye ve monitör gibi çevre birimlerine olan bağlantılar şemada gösterilmemiştir.

Diyagramda üç veri yolu (çok küçük elektriksel iletken iletken grupları) bulunmaktadır. Her kablo bir bit 1 veya bit 0'ı aktarabilir. Bir seferde sekiz bitlik baytın (bir saat darbesi) RAM'e ve giriş/çıkış bağlantı noktasına (giriş/çıkış aygıtları) aktarımı için veri yolu çift yönlüdür. Veri yolu sekiz bit genişliğindedir.

Tüm bileşenler adres veriyoluna bağlanır. Adres veri yolu mikroişlemciden tek yönlüdür. Adres veri yolu için on altı iletken vardır ve her biri bir bit (1 veya 0) taşır. Bir saat darbesinde on altı bit gönderilir.

Kontrol otobüsü var. Kontrol veriyolunun iletkenlerinden bazıları, mikroişlemciden diğer bileşenlere birer bit aktaracaktır. Birkaç kontrol hattı, bitleri giriş/çıkış (IO) bağlantı noktasından mikroişlemciye taşır.

Bilgisayar hafızası
RAM ve ROM tek bir bellek düzeneği olarak kabul edilir. Bu derleme, onaltılık sayıların “$” önekine sahip olduğu şekilde şematik olarak aşağıdaki şekilde temsil edilir:


Şekil 4.11 Commodore 64 Bilgisayarı için Bellek Düzeni

RAM 0000'dan itibaren 16 DFFF'ye 16 $0000 ile $DFFF arasında yazılır. 6502 µP montaj dilinde, onaltılık sayının önüne '$' eklenir ve 16 veya H veya hex eklenmez (abone edilmez). Bilgisayar kapatıldığında RAM'deki tüm bilgiler kaybolur. ROM $E000 ile $FFFF arasında başlar. Bilgisayar kapatıldığında kapanmayan alt programlara sahiptir. Bu alt rutinler programlamaya yardımcı olan yaygın olarak kullanılan rutinlerdir. Kullanıcı programı bunları çağırır (sonraki bölüme bakın).

$0200 ila $D000 arasındaki alan (bayt) kullanıcı programları içindir. $D000 ile $DFFF arasındaki alan, doğrudan çevre birimleriyle (giriş/çıkış aygıtları) ilgili bilgiler içindir. Bu işletim sisteminin bir parçasıdır. Yani Commodore-64 bilgisayarının işletim sistemi iki ana bölümden oluşuyor: ROM'daki hiç sönmeyen bölüm ve güç kapatıldığında $D000'den $DFFF'ye kadar sönen bölüm. Bu IO (giriş/çıkış) verilerinin bilgisayar her açıldığında bir diskten yüklenmesi gerekir. Günümüzde bu tür verilere çevresel sürücüler adı verilmektedir. Çevre birimleri, Giriş/Çıkış Aygıtı bağlantı noktasından başlayarak anakart üzerindeki bağlantılar aracılığıyla monitörün, klavyenin vb. çevre birimlerine (monitör, klavye vb.) bağlandığı bilgisayarın dikey yüzeylerindeki tanımlanabilir bağlantı noktalarına kadar başlar. .).

Bellek 2'den oluşur 16 = 65.536 bayt konum. Onaltılık biçimde bunlar 10000'dir 16 = 10000 H = 10000 altıgen = 10.000$'lık konumlar. Hesaplamada, iki tabanında, on tabanında, on altı tabanında vb. sayma 1'den değil 0'dan başlar. Yani, ilk konum aslında 0000000000000000 konum numarasıdır. 2 = 0 10 = 0000 16 = 0000$. 6502 µP montaj dilinde, bir adres konumunun tanımlanmasına $ ön eki eklenir ve herhangi bir son ek veya alt simge yoktur. Son konum 1111111111111111 konum numarasıdır. 2 = 65.535 10 = FFFF 16 = $FFFF ve 100000000000000000 değil 2 veya 65.536 10 veya 10000 16 veya 10000$. 100000000000000000 2 , 65.536 10 , 10000 16 veya $10000 bayt konumlarının toplam sayısını verir.

Burada, 2 16 = 65,536 = 64x1024 = 64x2 10 = 64 Kbayt (Kilobayt). Commodore-64 ismindeki 64 son eki 64KB toplam hafıza (RAM ve ROM) anlamına gelmektedir. Bir bayt 8 bittir ve 8 bit, bellekte bir bayt konumuna gider.

64 Kbyte'lık hafıza sayfalara bölünmüştür. Her sayfada 0100 var 16 = 256 10 bayt konumları. İlk 256 10 = ilk 0100 16 konumlar sayfa 0'dır. İkincisi sayfa 1, üçüncüsü sayfa 2 vb.

65.536 lokasyonu adreslemek için her lokasyon (adres) için 16 bit gereklidir. Yani mikroişlemciden belleğe giden adres veri yolu 16 satırdan oluşur; bir bit için bir satır. Bir bit ya 1 ya da 0'dır.

6502 µP Kayıtları
Bir kayıt, bir bayt hafıza konumu için bayt hücreleri gibidir. 6502 µP'nin altı kaydı vardır: beş adet 8 bitlik kayıt ve bir adet 16 bitlik kayıt. 16 bitlik kayıt, PC olarak kısaltılan Program Sayacı olarak adlandırılır. Bir sonraki talimatın hafıza adresini tutar. Bir montaj dili programı belleğe yerleştirilen talimatlardan oluşur. Bellekteki belirli bir bayt konumunu adreslemek için on altı (16) farklı bit gerekir. Belirli bir saat darbesinde bu bitler, bir talimatın okunması için adres veriyolunun 16 bitlik adres hatlarına gönderilir. 6502 µP'nin tüm kayıtları aşağıdaki gibi gösterilmektedir:


Şekil 4.12 6502 µP Kayıtları

Program Sayacı veya PC şemada 16 bitlik bir kayıt olarak görülebilir. Düşük anlamlı sekiz bit, Program Sayacı Düşük için PCL olarak etiketlenir. Daha yüksek anlamlı sekiz bit, Program Sayacı Yüksek için PCH olarak etiketlenir. Commodore-64'ün hafızasındaki bir talimat bir, iki veya üç bayttan oluşabilir. PC'deki 16 bit, bellekte yürütülecek bir sonraki talimata işaret eder. Mikroişlemcide bulunan devrelerden iki tanesi Aritmetik Mantık Birimi ve Komut Çözücü olarak adlandırılmaktadır. µP'de (mikroişlemci) işlenen mevcut talimat bir byte uzunluğunda ise bu iki devre bir sonraki talimat için PC'yi 1 birim artırır. µP'de işlenen mevcut talimat iki bayt uzunluğundaysa, yani bellekte ardışık iki bayt yer kaplıyorsa, bu iki devre bir sonraki talimat için PC'yi 2 birim artırır. µP'de işlenen mevcut talimat üç byte uzunluğundaysa, yani hafızada ardışık üç byte yer kaplıyorsa, bu iki devre bir sonraki talimat için PC'yi 3 birim artırır.

Akümülatör “A” çoğu aritmetik ve mantık işleminin sonucunu saklayan sekiz bitlik genel amaçlı bir kayıttır.

“X” ve “Y” kayıtlarının her biri program adımlarını saymak için kullanılır. Programlamada sayma işlemi 0'dan başlar. Bu nedenle indeks yazmaçları olarak adlandırılırlar. Birkaç amaçları daha var.

Yığın İşaretçisi kaydı olmasına rağmen, “S” sekiz bitlik bir kayıt olarak kabul edilen 9 bitten oluşur. İçeriği, Rastgele Erişim Belleğinin (RAM) 1. sayfasındaki bir bayt konumuna işaret eder. Sayfa 1 bayttan başlar $0100 (256 10 ) $01FF (511) baytına 10 ). Bir program çalışırken, hafızadaki bir talimattan sonraki ardışık talimata geçer. Ancak bu her zaman böyle değildir. Talimatları ardı ardına çalıştırmaya devam etmek için bir hafıza alanından başka bir hafıza alanına atladığı zamanlar vardır. RAM'deki Sayfa 1 yığın olarak kullanılır. Yığın, bir atlamanın olduğu yerden kodun devamı için sonraki adreslerin bulunduğu geniş bir RAM bellek alanıdır. Atlama talimatlarını içeren kodlar yığında değildir; hafızanın başka bir yerindeler. Ancak atlama talimatları yürütüldükten sonra devam adresleri (kod bölümleri değil) yığında bulunur. Atlama veya dallanma talimatları sonucu oraya itildiler.

P'nin sekiz bitlik İşlemci Durumu kaydı özel bir kayıt türüdür. Bireysel bitler birbiriyle ilişkili veya bağlantılı değildir. Buradaki her bit bayrak olarak adlandırılır ve diğerlerinden bağımsız olarak takdir edilir. İhtiyaç duyuldukça bayrakların anlamları aşağıda verilmiştir.

Her kayıt için ilk ve son bit indeksi, önceki diyagramda her kaydın üzerinde belirtilmiştir. Bir kayıttaki bit indeksi (konum) sayımı sağdaki 0'dan başlar.

İkili, Onaltılı ve Ondalık Sistemde Bellek Sayfaları
Aşağıdaki tablo, bellek sayfalarının başlangıcını ikili, onaltılık ve ondalık olarak gösterir:

Her sayfada 1.0000.0000 var 2 100 ile aynı olan bayt sayısı H 256 ile aynı olan bayt sayısı 10 bayt sayısı. Önceki hafıza şemasında sayfalar, tabloda belirtildiği gibi sayfa 0'dan yukarıya doğru gidiyor ve aşağı inmiyor olarak gösteriliyor.

Bu tablonun ikili, onaltılı ve ondalık sütunları, bellek bayt konum adreslerini farklı tabanlarında verir. Kodlama sırasında sayfa sıfır için yalnızca alt bayta ait bitlerin yazılmasının gerekli olduğuna dikkat edin. Daha yüksek bayta ait bitler, her zaman sıfır olduğundan (sayfa sıfır için) atlanabilir. Geri kalan sayfalar için daha yüksek bayta ait bitler kullanılmalıdır.

Bu bölümün geri kalanında önceki bilgilerin tümünü kullanarak 6502 µP Assembly Dili açıklanmaktadır. Dili hızlı bir şekilde anlamak için okuyucunun onluk taban yerine onaltılık tabanda toplama ve çıkarma yapması gerekir. Aslında ikinci taban olması gerekiyor, ancak ikinci tabanda hesaplama yapmak zahmetlidir. İki tabanındaki iki sayıyı toplarken, elde edilen sayının on tabanında olduğu gibi hala 1 olduğunu unutmayın. Ancak iki tabanındaki iki sayıyı çıkarırken, ödünç alınan şey on tabanındaki gibi on değil iki olur. On altı tabanındaki iki sayıyı toplarken, on tabanında olduğu gibi elde etme yine 1 olur. Ancak on altı tabanındaki iki sayıyı çıkarırken, ödünç alınan sayı on tabanında olduğu gibi on değil on altı olur.

4.2 Veri Aktarım Talimatları

6502 µP için montaj dili veri aktarımı talimatlarının aşağıdaki tablosunu göz önünde bulundurun:

Bir bayt (8 bit), bir bellek bayt konumundan Akümülatör Kaydına, X Kaydına veya Y Kaydına kopyalandığında, bu yüklemedir. Bu kayıtların herhangi birinden bir bayt, hafızadaki bir bayt konumuna kopyalandığında, bu aktarımdır. Bir bayt bir kayıttan diğerine kopyalandığında bu hala aktarılıyor demektir. Tablonun ikinci sütununda ok, bir bayt için kopyanın yönünü gösterir. Dört sütunun geri kalanı farklı adresleme modlarını gösterir.

Adresleme modu sütunundaki bir giriş, talimatın karşılık gelen anımsatıcı kısmının onaltılı olarak gerçek bayt kodudur. Örneğin AE, AE gibi mutlak adresleme modunda bellekten X kaydına bir bayt yükleyecek olan LDX'in gerçek bayt kodudur. 16 = 10101110 2 . Yani, bir bellek bayt konumundaki LDX'in bitleri 10101110'dur.

Talimatın LDX anımsatıcı kısmı için A2, AE ve A6 olmak üzere üç olası bayt olduğuna ve her birinin belirli bir adresleme modu için olduğuna dikkat edin. X kaydına yüklenen bayt, bir bellek bayt konumundan kopyalanmayacaksa, değerin, talimattaki LDX anımsatıcısıyla (hemen sonra) onaltılık veya ondalık olarak yazılması gerekir. Bu bölümde bu tür değerler onaltılık sistemde yazılır. Bu anında adreslemedir, dolayısıyla bellekteki LDX'i temsil eden gerçek bayt A2'dir. 16 = 10100010 2 ve AE değil 16 bu da 10101110'a eşittir 2 .

Tabloda, adresleme modu başlıkları altındaki tüm baytlara, işlem kodları olarak kısaltılan İşlem Kodları adı verilmektedir. Adresleme moduna bağlı olarak bir anımsatıcı için birden fazla işlem kodu olabilir.

Not: Bilgisayar sistem birimindeki 'load' kelimesinin iki anlamı olabilir: bir dosyanın diskten bilgisayarın belleğine yüklenmesini ifade edebilir veya bir baytın bellek bayt konumundan bir mikroişlemci kaydına aktarılmasını ifade edebilir. .

6502 µP için tablodaki dörtten daha fazla adresleme modu vardır.

Aksi belirtilmedikçe, bu bölümdeki tüm kullanıcı programlama kodları 0200 adresinden başlar. 16 bellekteki kullanıcı alanının başlangıcıdır.

Bellek M ve Akümülatör A

Akümülatöre Bellek

Anında Adresleme
Aşağıdaki talimat FF sayısını saklar 16 = 255 10 akümülatöre:

LDA #$FF

“$” yalnızca bir bellek adresini tanımlamak için kullanılmaz. Genel olarak kendisinden sonraki sayının onaltılı olduğunu belirtmek için kullanılır. Bu durumda $FF herhangi bir bellek bayt konumunun adresi değildir. 255 numarası 10 onaltılık olarak. 16 tabanı veya buna eşdeğer herhangi bir alt simge, montaj dili talimatında yazılmamalıdır. “#” bundan sonra gelen şeyin akümülatör kaydına konulacak değer olduğunu belirtir. Değer on bazında da yazılabilir ancak bu bölümde bu yapılmayacaktır. “#” anında adresleme anlamına gelir.

Bir anımsatıcının, karşılık gelen İngilizce ifadeyle bazı benzerlikleri vardır. “LDA #$FF” 255 sayısını yüklemek anlamına gelir 10 A akümülatörüne A. Bu, önceki tablodaki doğrudan adresleme olduğundan, LDA, AD veya A5 değil, A9'dur. İkili sistemde A9 101010001'dir. Yani, eğer LDA için A9 bellekteki $0200 adresindeyse, $FF $0301 = 0300 + 1 adresindedir. #$FF tam olarak LDA anımsatıcısının işlenenidir.

Mutlak Adresleme
Eğer $FF değeri hafızada $0333 konumunda ise önceki komut şöyledir:

LDA 0333 ABD Doları

#'in yokluğuna dikkat edin. Bu durumda, #'in yokluğu, takip edenin ilgilenilen değer (akümülatöre konulacak değer değil) değil, bir bellek adresi olduğu anlamına gelir. Yani LDA'nın işlem kodu bu kez A9 veya A5 değil AD'dir. Buradaki LDA işleneni $FF değeri değil, $0333 adresidir. $FF, oldukça uzakta olan 0333 $ konumundadır. “LDA $0333” talimatı, önceki çizimde olduğu gibi bellekte iki değil, ardışık üç konumu kaplar. LDA için “AD” 0200$ konumundadır. 0333'ün alt baytı olan 33 $0301 konumundadır. 0333 $'ın yüksek baytı olan 03, 0302 $ konumundadır. Bu, 6502 montaj dili tarafından kullanılan küçük endianness'tır. Farklı mikroişlemcilerin montaj dilleri farklıdır.

Bu mutlak adreslemeye bir örnektir. $0333, $FF'nin bulunduğu konumun adresidir. Talimat üç ardışık bayttan oluşur ve $FF'yi veya onun gerçek bayt konumunu içermez.

Sıfır Sayfa Adresleme

$FF değerinin sıfır sayfasındaki 0050 $ bellek konumunda olduğunu varsayalım. Sıfır sayfanın bayt konumları 0000 $'dan başlar ve 00 $FF'de biter. Bunlar 256 10 Toplamda yerler. Commodore-64 hafızasının her sayfası 256 adettir. 10 uzun. Bellekteki sıfır sayfa alanındaki tüm olası konumlar için yüksek baytın sıfır olduğuna dikkat edin. Sıfır sayfa adresleme modu mutlak adresleme moduyla aynıdır ancak 00'ın daha yüksek baytı talimata yazılmaz. Dolayısıyla, $FF'yi $0050 konumundan akümülatöre yüklemek için sıfır sayfa adresleme modu talimatı şöyledir:

LDA 50$

LDA'nın A9 veya AD değil A5 olması durumunda, A5 16 = 10100101 2 . Bellekteki her baytın 8 hücreden oluştuğunu ve her hücrenin bir parçayı barındırdığını unutmayın. Buradaki talimat birbirini takip eden iki bayttan oluşur. LDA için A5, 0200 $ bellek konumundadır ve 50 $ adresi, daha yüksek bayt olan 00 olmadan, 0301 $ konumundadır. Toplam 64K bellekte bir bayt tüketecek olan 00'ın yokluğu, bellek alanından tasarruf sağlar.

Akümülatörden Belleğe

Mutlak Adresleme
Aşağıdaki talimat, her ne ise, bir bayt değerini akümülatörden 1444 $'lık hafıza konumuna kopyalar:

1444$

Bunun akümülatörden belleğe aktarıldığı söyleniyor. Yüklenmiyor. Yükleme ise tam tersidir. STA için işlem kodu baytı 8D'dir 16 = 10001101 2 . Bu talimat hafızadaki ardışık üç bayttan oluşur. 8D 16 0200$ konumunda. 44 16 1444$ adresinin tamamı 0201$ konumundadır. ve 14 16 0202 $ konumunda – küçük endianness. Kopyalanan gerçek bayt, talimatın bir parçası değildir. Burada STA için sıfır sayfa adresleme için (tabloda) 85 değil 8D kullanılır.

Sıfır Sayfa Adresleme
Aşağıdaki talimat, her ne ise, bir bayt değerini akümülatörden sayfa sıfırdaki 0050 $'lık hafıza konumuna kopyalar:

STA $0050

Buradaki STA için işlem kodu baytı 85'tir 16 = 10000101 2 . Bu talimat hafızadaki iki ardışık bayttan oluşur. 85 16 0200$ konumunda. 50 16 0050 $ adresinin tamamı 0201 $ konumundadır. Endianness sorunu burada ortaya çıkmaz çünkü adresin yalnızca bir baytı vardır, bu da alt bayttır. Kopyalanan gerçek bayt, talimatın bir parçası değildir. Burada STA için sıfır sayfa adresleme için 8D değil 85 kullanılır.

Bir baytı akümülatörden bellekteki bir konuma aktarmak için anında adreslemeyi kullanmak mantıklı değildir. Bunun nedeni, anında adreslemede talimatta $FF gibi gerçek değerin belirtilmesinin gerekmesidir. Dolayısıyla µP'deki bir kayıttan herhangi bir hafıza konumuna bir bayt değerinin aktarılması için anında adresleme mümkün değildir.

LDX, STX, LDY ve STY Anımsatıcıları
LDX ve STX sırasıyla LDA ve STA'ya benzer. Ancak burada A (akümülatör) kaydı değil, X kaydı kullanılır. LDY ve STY sırasıyla LDA ve STA'ya benzer. Ancak burada A kaydı değil Y kaydı kullanılır. Belirli bir anımsatıcıya ve belirli bir adresleme moduna karşılık gelen onaltılık her bir işlem kodu için Tablo 4.21'e bakın.

Kayıttan Kayıta Transferler
Tablo 4.21'deki önceki iki talimat dizisi, bellek/mikroişlemci-kayıt kopyalama (aktarım) ve kayıt/kayıt kopyalama (aktarma) ile ilgilidir. TAX, TXA, TAY, TYA, TSX ve TXS komutları mikroişlemcideki yazmaçtan aynı mikroişlemcinin başka bir yazmacına kopyalama (transfer) işlemini gerçekleştirir.

Baytı A'dan X'e kopyalamak için talimat şöyledir:

VERGİ

Baytı X'ten A'ya kopyalamak için talimat şöyledir:

Teksas

Baytı A'dan Y'ye kopyalamak için talimat şöyledir:

EL

Baytı Y'den A'ya kopyalamak için talimat şöyledir:

TYA

Commodore 64 bilgisayarı için yığın, bellekteki 0. sayfadan hemen sonra 1. sayfadadır. Her sayfa gibi bu da 25610'dan oluşuyor 10 bayt konumları, 0100$ ila 01FF arası. Normalde bir program, hafızadaki bir talimattan sonraki ardışık talimata kadar yürütülür. Zaman zaman başka bir hafıza kodu (talimatlar dizisi) bölümüne geçiş olur. Bellekteki (RAM) yığın alanı, programın devamı için atlamaların (veya dalların) bırakıldığı yerden sonraki talimat adreslerine sahiptir.

Yığın işaretçisi “S”, 6502 µP'deki 9 bitlik bir kayıttır. İlk bit (en soldaki) her zaman 1'dir. Birinci sayfadaki tüm bayt konum adresleri 1 ile başlar ve ardından 256 için 8 farklı bit gelir. 10 yerler. Yığın işaretçisi, programın geçerli (atlanan) kod bölümünü yürüttükten sonra geri dönmesi ve devam etmesi gereken bir sonraki talimatın adresini içeren sayfa 1'deki konumun adresine sahiptir. Yığındaki tüm adreslerin ilk biti (birinci sayfa) 1 ile başladığından, yığın işaretçisi yazmacının yalnızca kalan sekiz biti tutması gerekir. Sonuçta, en soldaki bit olan ilk biti (sağdan sayılan dokuzuncu bit) her zaman 1'dir.

Baytı S'den X'e kopyalamak için talimat şöyledir:

TSX

Baytı X'ten S'ye kopyalamak için talimat şöyledir:

TXT

Kayıt için kayıt talimatları herhangi bir işlenen almaz. Sadece anımsatıcılardan oluşuyorlar. Her anımsatıcının onaltılık sistemde kendi işlem kodu vardır. Bu örtülü adresleme modundadır çünkü işlenen yoktur (hafıza adresi yok, değer yok).

Not: X'ten Y'ye veya Y'den X'e aktarım (kopyalama) yoktur.

4.3 Aritmetik İşlemler

6502 µP'deki Aritmetik Mantık Birimi adlı devre, aynı anda yalnızca iki adet sekiz bitlik sayı ekleyebiliyor. Çıkarmaz, çarpmaz ve bölmez. Aşağıdaki tabloda aritmetik işlemler için işlem kodları ve adresleme modları gösterilmektedir:

Not: Aritmetik işlemlere ve diğer işlem türlerine yönelik tüm anımsatıcılar (yani 6502 anımsatıcıların tümü) bir baytlık işlem (op) kodunu alır. Anımsatıcı için birden fazla adresleme modu varsa, aynı anımsatıcı için farklı işlem kodları olacaktır: her adresleme modu için bir tane. Tablodaki C, D ve V durum kaydının bayraklarıdır. İhtiyaç duyuldukça anlamları daha sonra verilecektir.

İmzasız Numaraların Eklenmesi
6502 µP'de işaretli sayılar ikinin tamamlayıcı sayılarıdır. İşaretsiz sayılar sıfırdan başlayan sıradan pozitif sayılardır. Yani sekiz bitlik bir bayt için en küçük işaretsiz sayı 00000000'dır. 2 = 0 10 = 00 16 ve işaretsiz en büyük sayı 11111111 2 = 255 10 = FF 16 . İki imzasız sayının toplamı şu şekildedir:

A+M+C→A

Bu, akümülatörün 8 bitlik içeriğinin aritmetik mantık ünitesi tarafından hafızadaki bir bayta (8 bit) eklenmesi anlamına gelir. A ve M'nin eklenmesinden sonra dokuzuncu bit'e kadar olan taşıma durum kaydındaki taşıma bayrak hücresine gider. Halen durum kaydındaki taşıma bayrağı hücresinde bulunan önceki bir eklemeden elde edilen herhangi bir önceki elde biti de A ve M'nin toplamına eklenir ve A+M+C→A olur. Sonuç akümülatöre geri konur.

Faiz ilavesi ise:

A + M

Ve önceki herhangi bir taşımayı eklemeye gerek yoktur, 0 yapılan taşıma bayrağının temizlenmesi gerekir, böylece ekleme şöyle olur:

A+M+0→A, A+M→A ile aynı

Not: M, A'ya eklenirse ve sonuç 255'ten büyük olduğundan 1 elde edilirse 10 = 11111111 2 = FF 16 , bu yeni bir taşıma. Bu yeni 1 eldesi, bir sonraki sekiz bit çiftinin (başka bir A + M) toplanmasına ihtiyaç duyulması durumunda otomatik olarak taşıma bayrak hücresine gönderilir.

İki İmzasız Sekiz Bit Ekleme Kodu
00111111 2 +00010101 2 3F ile aynıdır 16 + 15 16 bu 63 ile aynı 10 +21 10 . Sonuç 010101002 2 bu 54 ile aynı 16 ve 84 10 . Sonuç, sekiz bit için maksimum sayı olan 255'in ötesinde değil 10 = 11111111 2 = FF 16 . Yani 1'in elde edilmesi yoktur. Başka bir deyişle elde edilen elde 0'dır. Toplamadan önce 1'in önceki eldesi yoktur. Yani önceki elde 0'dır. Bu toplamayı yapacak kod olabilir:

CLC
LDA #3F$
ADC#15$

Not: Assembly dilini yazarken her talimatın sonunda klavyenin “Enter” tuşuna basılır. Bu kodda üç talimat var. İlk komut (CLC), önceki eklemenin 1 olması durumunda taşıma bayrağını temizler. CLC yalnızca örtülü adresleme modunda yapılabilir. Örtük adresleme modunun anımsatıcısı hiçbir işleneni almaz. Bu, P'nin durum kaydının taşıma hücresini temizler. Temizleme, taşıma bayrak hücresine 0 bitinin verilmesi anlamına gelir. Koddaki sonraki iki talimat anında adresleme modunu kullanır. Anında adreslemede, anımsatıcı için yalnızca bir işlenen vardır, o da bir sayıdır (ve ne bir bellek ne de kayıt adresi). Bu nedenle sayının önüne “#” konulmalıdır. “$”, takip eden sayının onaltılık olduğu anlamına gelir.

İkinci talimat 3F sayısını yükler 16 akümülatöre yerleştirin. Üçüncü talimat için, µP'nin aritmetik mantık ünitesi devresi, durum yazmacının taşıma bayrak hücresinin (0'a zorlanmış) önceki (temizlenmiş) taşımasını alır ve bunu 15'e ekler. 16 ve halihazırda 3F'de bulunan değere 16 akümülatöre gider ve sonucun tamamını akümülatöre geri koyar. Bu durumda sonuçta 0 elde edilir. ALU (Aritmetik Mantık Birimi), durum kaydının elde bayrak hücresine 0 gönderir (koyar). İşlemci durum kaydı ve durum kaydı aynı anlama gelir. Eğer taşıma 1 ile sonuçlanırsa, ALU durum kaydının taşıma bayrağına 1 gönderir.

Önceki kodun üç satırının yürütülmeden önce hafızada olması gerekir. CLC (ima edilen adresleme) için 1816 işlem kodu 0200 $ bayt konumundadır. İşlem kodu A9 16 LDA (anında adresleme) için 0201 $ bayt konumundadır. 3F sayısı 10 $0202 bayt konumundadır. işlem kodu 69 16 LDA için (anında adresleme) 0203 $ bayt konumundadır. 15 numara 10 $0204 bayt konumundadır.

Not: LDA bir transfer (yükleme) talimatıdır ve bir aritmetik talimat (anımsatıcı) değildir.

İki İmzasız On Altı Bit Ekleme Kodu
6502 µP'deki tüm kayıtlar, 16 bitlik PC (Program Sayacı) hariç, aslında sekiz bitlik kayıtlardır. Durum kaydı bile 8 bit genişliğindedir, ancak sekiz biti birlikte çalışmaz. Bu bölümde, ilk sekiz bitlik çiftten ikinci sekiz bitlik çifte taşıma ile iki adet 16 işaretsiz bitin eklenmesi ele alınmaktadır. Burada ilgi konusu olan taşıma, sekizinci bit konumundan dokuzuncu bit konumuna taşımadır.

Sayılar 0010101010111111 olsun 2 = 2ABF16 16 = 10.943 10 ve 0010101010010101 2 = 2A95 16 = 10,901 10 . Toplam 0101010101010100 2 = 5554 16 = 21.844 10 .

Bu iki işaretsiz sayının ikinci tabana eklenmesi aşağıdaki gibidir:

Aşağıdaki tabloda, sağdan başlayarak sekizinci bitten dokuzuncu bit konumuna 1'in taşınmasıyla aynı toplama işlemi gösterilmektedir:

Bunu kodlarken, önce iki alt bayt eklenir. Daha sonra ALU (Aritmetik Mantık Birimi), 1'in elde edilmesini sekizinci bit konumundan dokuzuncu bit konumuna, durum yazmacındaki elde bayrak hücresine gönderir. Taşıma olmadan 0 1 0 1 0 1 0 0'ın sonucu akümülatöre gider. Daha sonra ikinci bayt çifti taşıma ile birlikte eklenir. ADC anımsatıcısı, önceki taşıma işlemine otomatik olarak ekleme yapmak anlamına gelir. Bu durumda önceki taşıma olan 1'in ikinci eklemeden önce değiştirilmemesi gerekir. İlk ekleme için, önceki herhangi bir taşıma bu tam eklemenin parçası olmadığından, silinmesi gerekir (0 yapılır).

İki bayt çiftinin tamamen eklenmesi için ilk ekleme:

A + M + 0 -> A

İkinci ekleme ise şu:

A + M + 1 -> A

Bu nedenle, ilk eklemeden hemen önce taşıma bayrağının (0 değeri verildiğinde) temizlenmesi gerekir. Okuyucunun aşağıdaki açıklamayı okuması gereken aşağıdaki program, bu toplama için mutlak adresleme modunu kullanır:

CLC
LDA 0213 ABD Doları
ADC 0215$
; taşıma bayrağı değeri gerekli olduğundan temizleme yok
STA $0217
LDA 0214 ABD doları
ADC 0216$
STA $0218

6502 derleme dilinde noktalı virgülün yorumun başladığını unutmayın. Bu, programın yürütülmesi sırasında noktalı virgülün ve sağındaki her şeyin göz ardı edildiği anlamına gelir. Daha önce yazılan program bir metin dosyası içerisinde programcının seçeceği isimle ve “.asm” uzantısıyla kaydedilir. Önceki program, yürütülmek üzere belleğe giden programın aynısı değildir. Bellekteki karşılık gelen programa, anımsatıcıların işlem kodlarıyla (baytlar) değiştirildiği çevrilmiş program adı verilir. Herhangi bir yorum, derleme dili metin dosyasında kalır ve çevrilen program belleğe ulaşmadan önce çıkarılır. Aslında bugün diskte kayıtlı iki dosya vardır: “.asm” dosyası ve “.exe” dosyası. “.asm” dosyası önceki çizimdeki dosyadır. '.exe' dosyası, tüm yorumların çıkarıldığı ve tüm anımsatıcıların işlem kodlarıyla değiştirildiği '.asm' dosyasıdır. Bir metin düzenleyicide açıldığında “.exe” dosyası tanınmaz hale gelir. Aksi belirtilmedikçe, bu bölümün amacına uygun olarak “.exe” dosyası, 0200 $ konumundan başlayarak belleğe kopyalanır. Yüklemenin diğer anlamı da budur.

Eklenecek iki 16 bitlik sayı, mutlak adresleme için bellekte dört bayt kaplar: sayı başına iki bayt (bellek bir bayt dizisidir). Mutlak adreslemede işlem kodunun işleneni bellekte bulunur. Toplama sonucu iki bayt genişliğindedir ve ayrıca belleğe yerleştirilmesi gerekir. Bu toplam 6 verir 10 = 6 16 giriş ve çıkış için bayt. Girişler klavyeden değildir ve çıkış monitörden veya yazıcıdan değildir. Bu durumda girişler bellekte (RAM) bulunur ve çıkış (toplama sonucu) belleğe (RAM) geri döner.

Bir program çalıştırılmadan önce çevrilmiş versiyonun ilk olarak hafızada olması gerekir. Önceki program koduna bakıldığında yorumsuz talimatların 19'u oluşturduğu görülmektedir. 10 = 13 16 bayt. Yani, program bellekteki 0200 $ bayt konumundan 0200 $ + 13 $ – 1 = 0212 $ bayt konumlarına (0200 $'dan başlar ve 0201 $'dan değil, yani – 1 $ anlamına gelir) alır. Giriş ve çıkış numaraları için 6 baytın eklenmesi, tüm programın 0212 $ + 6 $ = 0218 $ ile bitmesini sağlar. Programın toplam süresi 19 16 = 25 10 .

Arttırıcının düşük baytı 0213$ adresinde olmalı ve aynı artırıcının yüksek baytı 0214$ adresinde olmalıdır – küçük endianness. Benzer şekilde, eklentinin düşük baytı 0215 $ adresinde olmalı ve aynı eklentinin yüksek baytı 0216 $ adresinde olmalıdır - küçük endianness. Sonucun (toplamın) düşük baytı 0217 $ adresinde olmalı ve aynı sonucun yüksek baytı 0218 $ adresinde olmalıdır - küçük endianness.

işlem kodu 18 16 CLC için (ima edilen adresleme), 0200$ bayt konumundadır. “LDA $0213” işlem kodu, yani AD 16 LDA (mutlak adresleme) için, 0201 $ bayt konumundadır. Arttırıcının alt baytı olan 10111111, 0213 $ hafıza bayt konumundadır. Her işlem kodunun bir bayt kapladığını unutmayın. “LDA $0213”ün “$0213” adresi $0202 ve $0203 bayt konumlarındadır. “LDA $0213” komutu, artırımın alt baytını akümülatöre yükler.

“ADC $0215” için işlem kodu, yani 6D 16 ADC için (mutlak adresleme), 0204 $ bayt konumundadır. Toplamanın alt baytı olan 10010101, $0215 bayt konumundadır. “ADC $0215”in “$0215” adresi $0205 ve $0206 bayt konumlarındadır. “ADC $0215” komutu, toplayıcının alt baytını, zaten akümülatörde bulunan artırıcının alt baytına ekler. Sonuç akümülatöre geri yerleştirilir. Sekizinci bitten sonraki herhangi bir taşıma, durum kaydının taşıma bayrağına gönderilir. Taşıma bayrak hücresi, daha yüksek baytların ikinci kez eklenmesinden önce temizlenmemelidir. Bu taşıma, daha yüksek baytların toplamına otomatik olarak eklenir. Aslında, CLC nedeniyle başlangıçta düşük baytların toplamına otomatik olarak bir taşıma 0 eklenir (taşıma eklenmemesine eşdeğerdir).

Yorum sonraki 48'i alır 10 = 30 16 bayt. Ancak bu yalnızca “.asm” metin dosyasında kalır. Belleğe ulaşmaz. Çevirici (bir program) tarafından yapılan çeviri ile kaldırılır.

Bir sonraki talimat olan “STA $0217” için STA'nın işlem kodu 8D'dir. 16 (mutlak adresleme) 0207 $ bayt konumundadır. “STA $0217”nin “$0217” adresi $0208 ve $0209 hafıza konumlarındadır. “STA $0217” komutu, akümülatörün sekiz bitlik içeriğini $0217 hafıza konumuna kopyalar.

İlavenin daha yüksek baytı olan 00101010, 0214$'ın bellek konumundadır ve ilavenin daha yüksek baytı olan 00101010, $02'nin bayt konumundadır. 16 . LDA (mutlak adresleme) için AD16 olan “LDA $0214” işlem kodu, $020A bayt konumundadır. “LDA $0214”ün “$0214” adresi 020B $ ve 020C $ konumlarındadır. “LDA $0214” talimatı, artırımın daha yüksek baytını akümülatöre yükler ve akümülatörde ne varsa onu siler.

6D olan “ADC $0216” işlem kodu 16 ADC için (mutlak adresleme), $020D bayt konumundadır. “ADC 0216”nın “$0216” adresi $020E ve $020F bayt konumlarındadır. “ADC $0216” komutu, toplayıcının daha yüksek baytını, zaten akümülatörde bulunan artırıcının daha yüksek baytına ekler. Sonuç akümülatöre geri yerleştirilir. Eğer elde 1 ise bu ikinci ekleme için otomatik olarak durum kaydının taşıma hücresine yerleştirilir. Her ne kadar bu problem için on altıncı bitin (solda) ötesine taşıma gerekli olmasa da, taşıma bayrağının 1 olup olmadığını kontrol ederek 1 taşımanın gerçekleşip gerçekleşmediğini kontrol etmek güzel olur.

Sonraki ve son talimat olan “STA $0218” için STA'nın 8D16 (mutlak adresleme) işlem kodu $0210 bayt konumundadır. “STA $0218”in “$0218” adresi $0211 ve $0212 hafıza konumlarındadır. “STA $0218” talimatı, akümülatörün sekiz bitlik içeriğini 0218 $ hafıza konumuna kopyalar. On altı bitlik iki sayının eklenmesinin sonucu 0101010101010100'dür; 01010100'ün alt baytı 0217 $'lık bellek konumunda ve 01010101'in yüksek baytı 0218 $'lık bellek konumundadır - küçük endianness.

Çıkarma
6502 µP'de işaretli sayılar ikinin tamamlayıcı sayılarıdır. İkinin tamamlayıcı sayısı sekiz bit, on altı bit veya sekiz bitin herhangi bir katı olabilir. İkinin tümleyeninde soldan ilk bit işaret bitidir. Pozitif bir sayı için bu ilk bit, işareti belirtmek üzere 0'dır. Bitlerin geri kalanı sayıyı normal şekilde oluşturur. Negatif bir sayının ikinin tamamlayıcısını elde etmek için, karşılık gelen pozitif sayının tüm bitlerini ters çevirin ve ardından sonuca sağ uçtan 1 ekleyin.

Bir pozitif sayıyı başka bir pozitif sayıdan çıkarmak için, çıkan sonuç ikinin tümleyeni negatif sayıya dönüştürülür. Daha sonra eksilen ve yeni negatif sayı normal şekilde eklenir. Böylece sekiz bitlik çıkarma işlemi şu şekilde olur:

Elde edilen değerin 1 olduğu varsayılır. Akümülatördeki sonuç, ikinin tamamlayıcısındaki farktır. Bu nedenle, iki sayıyı çıkarmak için taşıma bayrağı ayarlanmalıdır (1'e yapılmalıdır).

On altı bitlik iki sayıyı çıkarırken, çıkarma işlemi iki on altı bitlik sayının eklenmesiyle olduğu gibi iki kez yapılır. Çıkarma, 6502 µP'de bir toplama şekli olduğundan, on altı bitlik iki sayı çıkarıldığında, taşıma bayrağı ilk çıkarma için yalnızca bir kez ayarlanır. İkinci çıkarma işleminde taşıma bayrağının herhangi bir ayarı otomatik olarak yapılır.

Sekiz bitlik sayılar veya on altı bitlik sayılar için çıkarma işleminin programlanması, toplama işleminin programlanmasına benzer şekilde yapılır. Ancak taşıma bayrağının en başta ayarlanması gerekir. Bunu yapmanın anımsatıcısı şudur:

On Altı Bitlik Pozitif Sayılarla Çıkarma
Aşağıdaki sayılarla çıkarma işlemini düşünün:

Bu çıkarma işlemi ikinin tümleyenini içermez. 6502 µP'deki çıkarma işlemi ikinin tümleyeni şeklinde yapıldığından, iki tabanındaki çıkarma işlemi şu şekilde yapılır:

İkinin tümleyeni sonucu, sıradan çıkarma işleminden elde edilen sonuçla aynıdır. Ancak sağdan on yedinci bit konumuna giden 1'in dikkate alınmadığını unutmayın. Çıkarılan ve çıkan her biri iki sekiz bit'e bölünür. Çıkarılanın alt baytının 10010110'unun ikinin tamamlayıcısı, yüksek bayttan ve herhangi bir taşımadan bağımsız olarak belirlenir. Çıkarılanın yüksek baytının 11101011'inin ikinin tamamlayıcısı, alt bayttan ve herhangi bir taşımadan bağımsız olarak belirlenir.

Eksilenin 16 biti zaten soldan 0'dan başlayarak ikinin tümleyenindedir. Yani bit olarak herhangi bir ayarlamaya ihtiyaç duymaz. 6502 µP ile eksilenin alt baytı herhangi bir değişiklik yapılmadan çıkarılanın ikinin tamamlayıcısının alt baytına eklenir. Eksilenin alt baytı ikinin tümleyenine dönüştürülmez çünkü tüm eksilin on altı bitinin zaten ikinin tümleyeninde olması gerekir (soldaki ilk bit 0 ile). Bu ilk eklemede, 1=0 SEC komutundan dolayı 1 zorunlu taşıması eklenir.

Mevcut etkili çıkarmada, sekizinci bitten dokuzuncu bit'e (sağdan) 1 (toplama) taşıması vardır. Bu etkili bir çıkarma olduğundan, durum kaydındaki taşıma bayrağında olması gereken bit tamamlanır (tersine çevrilir). Yani C bayrağında 1'in eldesi 0 olur. İkinci işlemde, eksilen tarafın yüksek baytı, çıkarılan tarafın yüksek ikinin tamamlayıcı baytına eklenir. Durum kaydının otomatik olarak tamamlanan taşıma bayrağı biti (bu durumda 0'dır) da eklenir (daha yüksek baytlara). Sağdan on altıncı bitin ötesine geçen herhangi bir 1 dikkate alınmaz.

Bir sonraki şey, tüm bu şemayı aşağıdaki gibi kodlamaktır:

SEC
LDA 0213 ABD Doları
SBC 0215$
; ters çevrilmiş taşıma bayrağı değerine ihtiyaç duyulduğundan temizleme yok
STA $0217
LDA 0214 ABD doları
SBC$0216
STA $0218

6502 montaj dilinde, bellekte çevrilmiş program sürümünde yer almayan bir açıklamanın noktalı virgülle başladığını unutmayın. Çıkarma için 16 bitlik iki sayı, mutlak adreslemeyle dört baytlık bellek kaplar; sayı başına iki (bellek bir bayt dizisidir). Bu girişler klavyeden değildir. Toplama sonucu iki bayttır ve ayrıca hafızada farklı bir yere yerleştirilmesi gerekir. Bu çıktı monitöre veya yazıcıya gitmez; hafızaya gider. Bu toplam 6 verir 10 = 6 16 Giriş ve çıkış için baytların belleğe (RAM) yerleştirilmesi.

Bir programın çalıştırılmadan önce hafızada yer alması gerekir. Program koduna bakıldığında yorumsuz talimatların 19'u oluşturduğu görülmektedir. 10 = 13 16 bayt. Bu bölümdeki tüm programlar 0200 $ hafıza konumundan başladığından, program hafızadaki 0200 $ bayt konumundan 0200 + $13 – $1 = 0212 $ bayt konumuna (0200 $'dan başlar ve 0201 $'dan başlar) gider. Bu aralık, giriş ve çıkış baytlarına ilişkin bölgeyi içermez. İki giriş numarası 4 bayt alır ve bir çıkış numarası 2 bayt alır. Giriş ve çıkış numaraları için 6 baytın eklenmesi, program için 0212 $ + 6 $ = 0218 $ ile biten aralığı oluşturur. Programın toplam süresi 19 16 = 25 10 .

Eksilerin düşük baytı 0213 $ adresinde olmalı ve aynı eksilerin yüksek baytı 0214 $ adresinde olmalıdır - küçük endianness. Benzer şekilde, çıkarılanın düşük baytı 0215 $ adresinde olmalı ve aynı çıkarılanın daha yüksek baytı 0216 $ adresinde olmalıdır - küçük endianness. Sonucun düşük baytı (fark) 0217 $ adresinde olmalı ve aynı sonucun yüksek baytı 0218 $ adresinde olmalıdır - küçük endianness.

38'in işlem kodu 16 SEC için (örtülü adresleme) 0200$ adresindedir. Bu bölümdeki tüm programların 0200 $'lık bellek konumunda başladığı ve orada olabilecek tüm programları iptal ettiği varsayılmaktadır; aksi belirtilmedikçe. “LDA $0213” işlem kodu, yani AD 16 LDA (mutlak adresleme) için 0201 $ bayt konumundadır. 10111111 olan eksilenin alt baytı, 0213 $ hafıza bayt konumundadır. Her işlem kodunun bir bayt kapladığını unutmayın. “LDA $0213”ün “$0213” adresi $0202 ve $0203 bayt konumlarındadır. “LDA $0213” komutu eksilenin alt baytını akümülatöre yükler.

“SBC $0215” işlem kodu, yani ED 16 SBC için (mutlak adresleme) 0204 $ bayt konumundadır. Çıkarılanın alt baytı olan 01101010 $0215 bayt konumundadır. “ADC $0215”in “$0215” adresi $0205 ve $0206 bayt konumlarındadır. “SBC $0215” talimatı, akümülatörde zaten bulunan eksilenin alt baytından, çıkarılanın alt baytını çıkarır. Bu ikinin tümleyeni çıkarma işlemidir. Sonuç akümülatöre geri yerleştirilir. Sekizinci bitten sonraki herhangi bir taşımanın tamamlayıcısı (tersine çevrilmesi), durum kaydının taşıma bayrağına gönderilir. Bu taşıma bayrağı, daha yüksek baytlarla ikinci çıkarma işleminden önce temizlenmemelidir. Bu taşıma, daha yüksek baytların çıkarılmasına otomatik olarak eklenir.

Yorum sonraki 57'yi alır 10 = 3916 16 bayt. Ancak bu yalnızca “.asm” metin dosyasında kalır. Belleğe ulaşmaz. Çevirici (bir program) tarafından yapılan çeviri ile kaldırılır.

“STA $0217” olan bir sonraki talimat için STA'nın işlem kodu, yani 8D 16 (mutlak adresleme), 0207 $ bayt konumundadır. “STA $0217”nin “$0217” adresi $0208 ve $0209 hafıza konumlarındadır. “STA $0217” talimatı, akümülatörün sekiz bitlik içeriğini $0217 hafıza konumuna kopyalar.

Eksiltinin yüksek baytı olan 00101010 $0214 hafıza konumundadır ve çıkarılan ucun yüksek baytı olan 00010101 $0216 bayt konumundadır. “LDA $0214” işlem kodu, yani AD 16 LDA (mutlak adresleme) için, 020A bayt konumundadır. “LDA $0214”ün “$0214” adresi 020B $ ve 020C $ konumlarındadır. “LDA $0214” talimatı, eksilenin daha yüksek baytını akümülatöre yükler ve akümülatörde ne varsa onu siler.

“SBC $0216” işlem kodu, yani ED 16 SBC (mutlak adresleme) için 020D bayt konumundadır. “SBC $0216”nın “$0216” adresi $020E ve $020F bayt konumlarındadır. “SBC $0216” talimatı, akümülatörde zaten bulunan eksilenin daha yüksek baytından (ikinin tamamlayıcısı) çıkarmanın daha yüksek baytını çıkarır. Sonuç akümülatöre geri yerleştirilir. Bu ikinci çıkarma için elde 1 varsa, bunun tamamlayıcısı otomatik olarak durum kaydının elde hücresine yerleştirilir. Her ne kadar bu problem için on altıncı bitin (solda) ötesine taşıma gerekli olmasa da, taşıma bayrağını kontrol ederek tamamlayıcı taşımanın gerçekleşip gerçekleşmediğini kontrol etmek güzeldir.

Bir sonraki ve son talimat olan “STA $0218” için STA'nın işlem kodu, yani 8D 16 (mutlak adresleme), 0210 $ bayt konumundadır. “STA $0218”in “$0218” adresi $0211 ve $0212 hafıza konumlarındadır. “STA $0218” talimatı, akümülatörün sekiz bitlik içeriğini 0218 $ hafıza konumuna kopyalar. On altı bitlik iki sayıyla çıkarma işleminin sonucu 0001010101010101'dir ve bellek konumunda 0217 $'lık alt bayt 01010101 ve 0218 $'lık bellek konumunda 00010101'in yüksek baytı - küçük endianness.

6502 µP'de yalnızca toplama ve dolaylı olarak ikisinin tümleyeninin çıkarılması için devre bulunur. Çarpma ve bölme devreleri yoktur. Çarpma ve bölme işlemini yapabilmek için kısmi çarpımların ve kısmi temettülerin kaydırılması da dahil olmak üzere ayrıntıları içeren bir montaj dili programı yazılmalıdır.

4.4 Mantıksal İşlemler

6502 µP'de OR'nin anımsatıcısı ORA'dır ve özel OR'nin anımsatıcısı EOR'dur. Mantıksal işlemlerin ima edilen adreslemeye sahip olmadığına dikkat edin. Örtük adresleme işleneni almaz. Mantıksal operatörlerin her biri iki işlenen almalıdır. Birincisi akümülatörde, ikincisi ise hafızada veya talimattadır. Sonuç (8 bit) akümülatöre geri döner. Akümülatördeki ilki ya anında bir talimatla oraya konur ya da mutlak adresleme ile hafızadan kopyalanır. Bu bölümde örnek olarak yalnızca sıfır sayfa adreslemesi kullanılmıştır. Bu mantıksal operatörlerin tümü Bitsel operatörlerdir.

VE
Aşağıdaki tabloda Bitsel VE ikili, onaltılı ve ondalık sistemde gösterilmektedir:

Bu bölümdeki tüm programlar 0200$ hafıza bayt konumunda başlamalıdır. Bununla birlikte, bu bölümdeki programlar, 00000000'in yüksek baytı olmadan sıfır sayfanın kullanımını göstermek amacıyla sıfır sayfadadır. 2 . Önceki ANDing aşağıdaki gibi kodlanabilir:

LDA #$9A; hafızadan değil – anında adresleme
VE #$CD ; hafızadan değil – anında adresleme
STA $30; 88 $'ı sıfır bazlı 0030 $'da saklar

VEYA
Aşağıdaki tablo Bitsel VEYA'yı ikili, onaltılı ve ondalık sistemde göstermektedir:

LDA #$9A; hafızadan değil – anında adresleme
ORA #$CD ; hafızadan değil – anında adresleme
STA $30; $CF'yi sıfır tabanlı $0030'da saklar

ÖZGÜR
Aşağıdaki tabloda Bitsel XOR ikili, onaltılı ve ondalık olarak gösterilmektedir:

LDA #$9A; hafızadan değil – anında adresleme
EOR #$CD ; hafızadan değil – anında adresleme
STA $30; sıfır bazlı 0030 $'da 57 $ depolar

4.5 Kaydırma ve Döndürme İşlemleri

Kaydırma ve döndürme operatörlerine ilişkin anımsatıcılar ve işlem kodları şunlardır:

ASL: En sağdaki boş hücreye 0 ekleyerek akümülatör veya hafıza konumunun bir bitini sola kaydırın.

LSR: En soldaki boş hücreye 0 ekleyerek akümülatör veya hafıza konumunu bir bit sağa kaydırın.
ROL: Akümülatör veya hafıza konumunun bir bitini sola döndürün, solda bırakılan biti en sağdaki boş hücreye yerleştirin.
ROR: Akümülatör veya hafıza konumunun bir bitini sağa döndürün, sağda bırakılan biti en soldaki boş hücreye yerleştirin.

Akümülatörle bir kaydırma veya dönüş yapmak için talimat şuna benzer:

LSR A

Bu, akümülatör adresleme modu adı verilen başka bir adresleme modunu kullanır.

Bayt hafıza konumuyla bir kaydırma veya döndürme yapmak için talimat şuna benzer:

2BCD tutarında ROR

2BCD hafıza konumudur.

Kaydırma veya döndürme için anında veya örtülü adresleme modunun olmadığını unutmayın. Anında adresleme modu yoktur çünkü yalnızca talimatta kalan bir sayıyı kaydırmanın veya döndürmenin bir anlamı yoktur. 6502 µP'nin tasarımcıları yalnızca akümülatörün (A kaydı) içeriğinin veya bir bellek bayt konumunun kaydırılmasını veya döndürülmesini istediklerinden, örtülü bir adresleme modu yoktur.

4.6 Göreceli Adresleme Modu

Mikroişlemci, yürütülecek bir sonraki talimata işaret etmek için Program Sayacı'nı (PC) her zaman (1, 2 veya 3 birim) artırır. 6502 µP, anımsatıcısı BVS olan ve Taşma Setinde Dallanma anlamına gelen bir talimata sahiptir. PC iki bayttan oluşur. Bu komut, bilgisayarın normal bir artıştan kaynaklanmayan bir sonraki komutun yürütülmesi için farklı bir bellek adresine sahip olmasına neden olur. Bunu, bilgisayarın içeriğine ofset adı verilen bir değer ekleyerek veya çıkararak yapar. Ve böylece PC, bilgisayarın oradan çalışmaya devam etmesi için farklı (dallanmış) bir bellek konumunu işaret eder. Ofset -128'den bir tam sayıdır 10 +127'ye kadar 10 (Ikisinin tamamlayıcısı). Böylece ofset, atlamanın hafızada ilerlemesini sağlayabilir. Olumlu mu, hafızada geri mi, yoksa olumsuz mu?

BVS komutu yalnızca bir işleneni alır, o da ofsettir. BVS göreceli adreslemeyi kullanır. Aşağıdaki talimatı göz önünde bulundurun:

BVS 7F $

İkinci tabanda, 7F H 01111111 2 = 127 10 . Bir sonraki talimat için bilgisayardaki içeriğin 0300$ olduğunu varsayalım. BVS talimatı, 7F $'ın (zaten ikinin tümleyeninde bulunan pozitif bir sayı) 0300 $'a eklenmesine ve 037F $'a eklenmesine neden olur. Yani, bir sonraki talimatın 0300$ hafıza konumunda yürütülmesi yerine, 037F $ hafıza lokasyonunda (yaklaşık olarak yarım sayfa farkı) olacaktır.

Başka dallanma talimatları da vardır, ancak BVS göreceli adreslemeyi göstermek için kullanılabilecek çok iyi bir komuttur. Göreceli adresleme şube talimatlarıyla ilgilenir.

4.7 İndekslenmiş Adresleme ve Dolaylı Adresleme Ayrı Ayrı

Bu adresleme modları, 6502 µP'nin çok büyük miktarlardaki verileri kısa sürede, azaltılmış talimat sayısıyla işlemesini sağlar. Comodore-64 belleğinin tamamı için 64KB'lık konumlar vardır. Bu nedenle, 16 bitlik herhangi bir bayt konumuna erişmek için iki bayta ihtiyaç vardır. İki bayta ihtiyaç duymanın tek istisnası, bellekteki talimatın kapladığı alandan tasarruf etmek için 00$'lık daha yüksek baytın çıkarıldığı sıfır sayfadır. Sıfır sayfa olmayan adresleme modunda, 16 bitlik bellek adresinin hem yüksek hem de alt baytları çoğunlukla bir şekilde gösterilir.

Temel İndekslenmiş Adresleme

Mutlak Dizin Adresleme
X veya Y kaydının indeks kaydı olarak adlandırıldığını unutmayın. Aşağıdaki talimatı göz önünde bulundurun:

LDA $C453,X

6 değerinin olduğunu varsayalım H X kaydında yer alır. Talimatın hiçbir yerinde 6'nın yazılmadığına dikkat edin. Bu komut 6H değerini C453'e ekler. H hala birleştirilecek olan metin dosyasındaki yazılı talimatın bir parçası olan – C453 H + 6 H = C459 H . LDA, akümülatöre bir bayt yüklemek anlamına gelir. Akümülatöre yüklenecek byte $C459 adresinden gelir. Talimatla yazılan $C453 ve 6'nın toplamı olan $C459 H X kaydında bulunan adres, akümülatöre yüklenecek baytın geldiği etkin adres olur. 6 ise H Y kaydındaysa, talimatta X'in yerine Y yazılır.

Yazılan talimat ifadesinde, $C453 temel adres olarak bilinir ve 6 H X veya Y kaydındaki, etkin adresin sayma veya indeks kısmı olarak bilinir. Baz adresi bellekteki herhangi bir bayt adresine başvurabilir ve sonraki 256 bayt adresi 10 X veya Y kaydında başlatılan indeksin (veya sayının) 0 olduğu varsayılarak adreslere erişilebilir. Bir baytın 256'ya kadar sürekli bir aralık verebileceğini unutmayın. 10 sayılar (ör. 00000000 2 11111111'e 2 ).

Dolayısıyla, mutlak adresleme, X veya Y kaydına halihazırda konmuş olan (başka bir talimat tarafından konulmuş olan) her şeyi, etkili adresi elde etmek için talimatla yazılan 16 adrese ekler. Yazılan talimatta, iki indeks kaydı virgülden sonra yazılan X veya Y ile ayırt edilir. X veya Y yazılır; ikiside değil.

Tüm program bir metin düzenleyicide yazıp “.asm” uzantılı dosya adı ile kaydedildikten sonra, başka bir program olan assembler'ın, yazılan programı bellekte (yüklenen) olana çevirmesi gerekir. “LDA $C453,X” olan önceki talimat, bellekte beş değil üç baytlık yer kaplar.

LDA gibi bir anımsatıcının birden fazla işlem koduna (farklı baytlar) sahip olabileceğini unutmayın. X kaydını kullanan talimatın işlem kodu, Y kaydını kullanan işlem kodundan farklıdır. Çevirici, yazılan talimata göre hangi işlem kodunun kullanılacağını bilir. “LDA $C453,X” için bir baytlık işlem kodu, “LDA $C453,Y” için bir baytlık işlem kodundan farklıdır. Aslında, 'LDA $C453,X' içindeki LDA'nın işlem kodu BD'dir ve 'LDA $C453,9' içindeki LDA'nın işlem kodu BD'dir.

LDA'nın işlem kodu 0200 $ bayt konumundaysa. Daha sonra, $C453'ün 16 bitlik adresi, bellekteki bir sonraki bayt konumu olan $0201 ve $0202'yi alır. Belirli işlem kodu baytı, ilgili olanın X kaydı mı yoksa Y kaydı mı olduğunu gösterir. Ve böylece, 'LDA $C453,X' veya 'LDA $C453,Y' olan birleştirilmiş dil talimatı, bellekte dört veya beş değil, ardışık üç bayt işgal eder.

Sıfır Sayfa Dizinli Adresleme
Sıfır sayfalı dizin adreslemesi, daha önce açıklanan mutlak dizin adreslemesine benzer, ancak hedef bayt yalnızca sıfır sayfada olmalıdır (0000 $ ila 00FF arası). Şimdi, sıfır sayfayla uğraşırken, her zaman 00 olan yüksek bayt H bellek konumlarından genellikle kaçınılır. Yani normalde sıfırıncı sayfanın 00$'dan FF'ye kadar başladığı söylenir. Ve böylece, “LDA $C453,X”in önceki talimatı şöyledir:

LDA $53,X

Sıfırıncı sayfanın üzerindeki bir sayfayı ifade eden daha yüksek bir bayt olan $C4, bu talimatta kullanılamaz çünkü yüklenecek beklenen hedef baytı, sayfa sıfırın dışındaki ve üzerindeki birikmiş bayta koyar.

Komutta yazılan değer indeks kaydındaki değere eklendiğinde toplamın sayfa sıfırın üzerinde sonuç vermemesi gerekir (FF H ). Yani “LDA $FF, X” gibi bir talimat ve FF gibi bir değerin olması söz konusu değildir. H indeks kaydında çünkü FF H + FF H = 200 H bellekteki sayfa 2'nin (üçüncü sayfa) ilk bayt (0200 $) konumu olan sayfa 0'dan büyük bir mesafedir. Dolayısıyla, sıfır sayfa indeksli adreslemede etkin adresin sıfır sayfada yer alması gerekir.

Dolaylı Adresleme

Mutlak Adreslemeyi Atla
Mutlak Dolaylı Adreslemeyi tartışmadan önce ilk olarak JMP mutlak adreslemeye bakmak iyi olur. İlgilenilen değere (hedef bayt) sahip olan adresin 8765$ olduğunu varsayalım. Bu, iki bayttan oluşan 16 bittir: yüksek bayt olan 87 H ve 65 olan alt bayt H . Böylece, 8765 $'lık iki bayt bir sonraki talimat için PC'ye (program sayacı) konur. Montaj dili programına (dosyaya) yazılanlar şunlardır:

JMP 8.765$

Bellekte çalışan program, eriştiği adresten 8765$'a atlar. JMP anımsatıcısının 4C, 6C ve 7C olmak üzere üç işlem kodu vardır. Bu mutlak adreslemenin işlem kodu 4C'dir. JMP mutlak dolaylı adreslemenin işlem kodu 6C'dir (aşağıdaki resimlere bakın).

Mutlak Dolaylı Adresleme
Bu yalnızca atlama (JMP) komutuyla kullanılır. İlgilenilen baytın (hedef bayt) bulunduğu adresin 8765$ olduğunu varsayalım. Bu, iki bayttan oluşan 16 bittir: yüksek bayt olan 87 H ve 65 olan alt bayt H . Mutlak dolaylı adreslemede, bu iki bayt aslında hafızanın başka bir yerinde ardışık iki bayt konumunda bulunur.

Bunların 0210$ ve 0211$ hafıza konumlarında bulunduğunu varsayalım. Daha sonra ilgilenilen adresin alt baytı olan 65 H $0210 adresinde ve daha yüksek bayt olan 87 H $0211 adresindedir. Bu, ilgili düşük bellek baytının daha düşük ardışık adrese gittiği ve daha yüksek ilgili bellek baytının daha yüksek ardışık adrese (küçük endianness) gittiği anlamına gelir.

16 bitlik adres, bellekteki ardışık iki adresi ifade edebilir. Bu açıdan bakıldığında, 0210 $ adresi, 0210 $ ve 0211 $ adreslerini ifade eder. 0210 $ ve 0211 $ adres çifti, hedef baytın nihai adresini (iki baytlık 16 bit) tutar ve alt bayt 65'tir. H 0210 $ ve 87'nin daha yüksek baytı H 0211 dolar. Yani, yazılan atlama talimatı şöyledir:

JMP (0210$)

JMP anımsatıcısının 4C, 6C ve 7C olmak üzere üç işlem kodu vardır. Mutlak dolaylı adreslemenin işlem kodu 6C'dir. Metin dosyasına yazılan şey “JMP ($0210)”dır. Parantezlerden dolayı, çevirici (çevirmen) JMP için 4C veya 7C değil 6C işlem kodunu kullanır.

Mutlak dolaylı adreslemede aslında üç bellek bölgesi vardır. İlk bölge 0200$, 0201$ ve 0202$ bayt konumlarından oluşabilir. Bu, “JMP ($0210)” talimatı için üç bayta sahiptir. Birinci bölgenin mutlaka yanında olması gerekmeyen ikinci bölge, 0210$ ve 0211$'lık iki ardışık bayt konumundan oluşur. Montaj dili program talimatında yazılan, buradaki alt bayttır (0210 $). İlgilenilen adres 8765 $ ise, 65'in düşük baytı H 0210 $ bayt konumunda ve 87'nin daha yüksek baytı H 0211 $ bayt konumundadır. Üçüncü bölge yalnızca bir baytlık konumdan oluşur. Hedeflenen bayt (nihai ilgilenilen bayt) için 8765 $ adresindedir. Ardışık adres çifti, 0210 $ ve 0211 $, ilgilenilen adres olan 8765 $ işaretçisini tutar. Hesaplama yorumlamasından sonra, hedef bayta erişmek için PC'ye (Program Sayacı) giden $8765'tir.

Sıfır Sayfa Dolaylı Adresleme
Bu adresleme mutlak dolaylı adreslemeyle aynıdır ancak işaretçinin sıfır sayfada olması gerekir. İşaretçi bölgesinin alt bayt adresi, yazılan talimatta aşağıdaki gibidir:

JMP (50$)

İşaretçinin yüksek baytı 51 $ bayt konumundadır. Etkin adresin (işaretli) sıfır sayfada olması gerekmez.

Dolayısıyla indeks adreslemede indeks kaydındaki değer, etkin adresin elde edilmesi için talimatta verilen temel adrese eklenir. Dolaylı adresleme bir işaretçi kullanır.

4.8 İndekslenmiş Dolaylı Adresleme

Mutlak İndekslenmiş Dolaylı Adresleme
Bu adresleme modu yalnızca JMP talimatıyla kullanılır.
Mutlak dolaylı adreslemede, ardışık iki bayt adresi olan sivri değer (bayt) vardır. Bu iki ardışık adres, işaretçinin bellekteki ardışık iki baytın işaretçi bölgesinde olmasını sağlar. İşaretçi bölgesinin alt baytı, talimatta parantez içinde yazılan bayttır. İşaretçi işaret edilen değerin adresidir. Önceki durumda 8765 dolar sivri değerin adresidir. 0210 $ (ardından 0211 $ gelir), içeriği 8765 $ olan ve işaretçi olan adrestir. Mutlak dolaylı adresleme modunda, parantez dahil olmak üzere programa (metin dosyasına) yazılan değer ($0210)'dir.

Mutlak İndeksli Dolaylı Adresleme Modunda ise X kaydındaki değerin yazılan adrese eklenmesiyle işaretçi bölgesi için alt adres baytı oluşturulur. Örneğin, işaretçi $0210 adres konumundaysa, yazılan talimat şunun gibi olabilir:

JMP ($020A,X)

X kaydının 6 değerine sahip olduğu yer H . 020A H + 6 H = 0210 H . Y kaydı bu adresleme modunda kullanılmaz.

Sıfır Sayfa Dizinli Dolaylı Adresleme
Bu adresleme modu Y kaydını değil X kaydını kullanır. Bu adresleme modunda, iki baytlık adres işaretçisi bölgesinde sivri değer ve işaretçi hala mevcuttur. İşaretçi için sıfır sayfasında iki ardışık bayt bulunmalıdır. Talimatta yazılan adres bir baytlık bir adrestir. Bu değer X kaydındaki değere eklenir ve herhangi bir taşıma atılır. Sonuç, sayfa 0'daki işaretçi bölgesine işaret eder. Örneğin, ilgilenilen adres (işaretli) 8765 $ ise ve sayfa 0'ın 50 $ ve 51 $ bayt konumlarındaysa ve X kaydındaki değer 30 $ ise, yazılan talimat şunun gibi bir şeydir:

LDA (20,X$)

Çünkü 20$ + 30$ = 50$.

Dolaylı İndekslenmiş Adresleme
Bu adresleme modu X kaydını değil Y kaydını kullanır. Bu adresleme modunda hala sivri değer ve işaretçi bölgesi vardır ancak işaretçi bölgesinin içeriği farklı şekilde çalışır. İşaretçi bölgesi için sıfır sayfasında iki ardışık bayt bulunmalıdır. İşaretçi bölgesinin alt adresi talimata yazılır. Gerçek işaretçiyi elde etmek için işaretçi bölgesinde bulunan bu sayı (bayt çifti) Y kaydındaki değere eklenir. Örneğin ilgilenilen adres (işaretli) 8765$ olsun, 6H değeri Y kaydında olsun ve sayı (iki bayt) 50 adresinde olsun. H ve 51 H . İki baytın toplamı 875F $ olduğundan 875F + 6$ = 8765$ olur. Yazılan talimat şuna benzer:

LDA (50$),Y

4.9 Arttırma, Azaltma ve Test-BIT Talimatları

Aşağıdaki tabloda artırma ve eksiltme talimatlarının işlemleri gösterilmektedir:

INA ve DEA sırasıyla akümülatörü artırır ve azaltır. Buna akümülatör adresleme denir. INX, DEX, INY ve DEY sırasıyla X ve Y kayıtları içindir. Herhangi bir işlenen almazlar. Bu nedenle örtülü adresleme modunu kullanırlar. Artış, kayıt veya hafıza baytına 1 eklemek anlamına gelir. Azaltma, kayıttan veya bellek baytından 1 çıkarmak anlamına gelir.

INC ve DEC sırasıyla bir bellek baytını artırır ve azaltır (bir kaydı değil). Mutlak adresleme yerine sıfır sayfa adreslemenin kullanılması, komut için hafızadan tasarruf sağlamaktır. Sıfır sayfa adreslemesi, bellekteki talimatın mutlak adreslemesinden bir bayt daha azdır. Ancak sıfır sayfa adresleme modu yalnızca sıfır sayfayı etkiler.

BIT komutu, hafızadaki bir baytın bitlerini akümülatördeki 8 bit ile test eder, ancak ikisini de değiştirmez. Yalnızca İşlemci Durum Kaydı “P”nin bazı bayrakları ayarlandı. Belirtilen bellek konumunun bitleri, akümülatörünkilerle mantıksal olarak AND'lenir. Daha sonra aşağıdaki durum bitleri ayarlanır:

  • Durum kaydının 7. biti ve son biti (sol) olan N, AND'den önce hafıza konumunun 7. bitini alır.
  • Durum kaydının 6. biti olan V, AND'den önce hafıza konumunun 6. bitini alır.
  • AND sonucunun sıfır olması durumunda durum kaydının Z bayrağı ayarlanır (1 yapılır) (00000000) 2 ). Aksi takdirde temizlenir (0 yapılır).

4.10 Talimatları Karşılaştırın

6502 µP için karşılaştırma talimatı anımsatıcıları CMP, CPX ve CPY'dir. Her karşılaştırmadan sonra işlemci durum kaydı 'P'nin N, Z ve C bayrakları etkilenir. Sonuç negatif bir sayı olduğunda N bayrağı ayarlanır (1 yapılır). Sonuç sıfır (000000002) olduğunda Z bayrağı ayarlanır (1 yapılır). C bayrağı, sekiz bitten dokuzuncu bit'e bir taşıma olduğunda ayarlanır (1 yapılır). Aşağıdaki tabloda ayrıntılı bir açıklama verilmektedir

'Daha büyük' anlamına gelir. Bununla birlikte, karşılaştırma tablosu kendi kendini açıklayıcı olmalıdır.

4.11 Atlama ve Dallanma Talimatları

Aşağıdaki tabloda atlama ve dallanma talimatları özetlenmektedir:

JMP talimatı mutlak ve dolaylı adreslemeyi kullanır. Tablodaki talimatların geri kalanı dallanma talimatlarıdır. Yalnızca 6502 µP ile ilgili adreslemeyi kullanırlar. Bununla birlikte soldan sağa ve yukarıdan aşağıya okunduğunda tablo kendini açıklayıcı hale gelir.

Dalların yalnızca verilen adresten -128 ile +127 bayt arasındaki adreslere uygulanabileceğini unutmayın. Bu göreceli adreslemedir. Hem JMP hem de dal talimatları için Program Sayacı (PC) doğrudan etkilenir. 6502 µP, dalların mutlak adrese gitmesine izin vermez, ancak atlama mutlak adreslemeyi yapabilir. JMP talimatı bir dallanma talimatı değildir.

Not: Göreli adresleme yalnızca şube talimatlarıyla kullanılır.

4.12 Yığın Alanı

Bir alt program, iki sayıyı toplamak veya iki sayıyı çıkarmak için kullanılan önceki kısa programlardan birine benzer. Bellekteki yığın alanı 0100$'dan 01FF'ye kadar başlar. Bu alana kısaca yığın denir. Mikroişlemci alt program talimatına (JSR - aşağıdaki açıklamaya bakın) bir atlama gerçekleştirdiğinde, bittiğinde nereye geri döneceğini bilmesi gerekir. 6502 µP, bu bilgiyi (dönüş adresi) $0100 ila $01FF (yığın alanı) arasındaki düşük bellekte tutar ve mikroişlemcide 'S' olan yığın işaretçisi yazmaç içeriğini, son döndürülen adrese bir işaretçi (9 bit) olarak kullanır. belleğin 1. sayfasında ($0100 ila $01FF) saklanır. Yığın 01FF'den aşağı doğru büyür ve alt rutinlerin 128 seviyeye kadar derinliğe yerleştirilmesini mümkün kılar.

Yığın işaretçisinin başka bir kullanımı da kesintileri ele almaktır. 6502 µP, IRQ ve NMI olarak etiketlenmiş pinlere sahiptir. Bu pinlere bazı küçük elektrik sinyallerinin uygulanması ve 6502 µP'nin bir programı yürütmeyi bırakıp başka bir programı yürütmeye başlamasına neden olması mümkündür. Bu durumda ilk program kesintiye uğrar. Alt rutinler gibi kesme kodu bölümleri de iç içe yerleştirilebilir. Kesinti işleme bir sonraki bölümde tartışılacaktır.

Not : Yığın işaretçisi, $0100 ila $01FF arasındaki konumları adreslemede düşük bayt adresi için 8 bit içerir. 00000001'in daha yüksek baytı 2 varsayılmaktadır.

Aşağıdaki tablo, “S” yığın işaretçisini A, X, Y ve P kayıtlarıyla bellekteki yığın alanıyla ilişkilendiren talimatları verir:

4.13 Alt Program Çağrısı ve Geri Dönüş

Altprogram, belirli bir hedefe ulaşmayı sağlayan bir dizi talimattır. Önceki toplama veya çıkarma programı çok kısa bir alt programdır. Altprogramlara bazen sadece rutinler denir. Bir altprogram çağırma talimatı şöyledir:

JSR: Alt Rutine Atla

Bir altprogramdan geri dönme talimatı şöyledir:

RTS : Alt Programdan Dönüş

Mikroişlemci, bellekteki talimatları birbiri ardına sürekli olarak yürütme eğilimindedir. Mikroişlemcinin şu anda bir kod segmentini yürüttüğünü ve zaten yürütülmüş olabileceği arkasında kodlanmış bir kod segmentini yürütmek için bir atlama (JMP) talimatıyla karşılaştığını varsayalım. Arkadaki kod segmentini çalıştırır ve mevcut kod segmentini tekrar çalıştırıp aşağıdan devam edene kadar, arkadaki kod segmentini takip eden tüm kod segmentlerini (talimatları) yürütmeye devam eder. JMP bir sonraki talimatı yığına itmez.

JMP'den farklı olarak JSR, kendisinden sonraki komutun adresini PC'den (program sayacı) yığına iter. Bu adresin yığın konumu “S” yığın işaretçisine yerleştirilir. Alt programda bir RTS talimatıyla karşılaşıldığında (yürütüldüğünde), yığına itilen adres yığından çıkar ve program, alt program çağrısından hemen önceki bir sonraki talimat adresi olan çekilen adresten devam eder. Yığından silinen son adres program sayacına gönderilir. Aşağıdaki tabloda JSR ve RTS talimatlarının teknik ayrıntıları verilmektedir:

JSR ve RTS kullanımları için aşağıdaki resme bakın:

4.14 Geri Sayım Döngüsü Örneği

Aşağıdaki alt program $FF'den $00'a doğru geri sayım yapar (toplam 256 adet) 10 sayılır):

LDX'i başlat #$FF ; X'i $FF = 255 ile yükle
döngü DEX; X = X – 1
BNE döngüsü; X sıfır değilse döngüye gidin
RTS; geri dönmek

Her satırın bir yorumu var. Yorumlar hiçbir zaman yürütülmek üzere belleğe gitmez. Bir programı yürütme (çalıştırma) için bellekteki haline dönüştüren çevirici (çevirmen), her zaman yorumları çıkarır. Bir yorum “;” ile başlar. . Bu programdaki “başlangıç” ve “döngü”ye etiket denir. Bir etiket talimatın adresini (adını) tanımlar. Talimat tek baytlık bir talimatsa (örtülü adresleme), etiket bu talimatın adresidir. Talimat çok baytlı bir talimat ise, etiket çok baytlı talimatın ilk baytını tanımlar. Bu programın ilk talimatı iki bayttan oluşur. 0300$ adresinden başladığını varsayarsak, 0300$ adresi programda 'start' ile değiştirilebilir. İkinci talimat (DEX) tek baytlık bir talimat6iondur ve $0302 adresinde olmalıdır. Bu, programda $0302 adresinin 'döngü' ile değiştirilebileceği anlamına gelir; bu aslında 'BNE döngüsünde' de böyledir.

“BNE döngüsü”, durum kaydının Z bayrağı 0 olduğunda verilen adrese dallanma anlamına gelir. A veya X veya Y kaydındaki değer 00000000 olduğunda 2 , son işlem nedeniyle Z bayrağı 1'dir (set). Yani 0 (1 değil) iken programdaki ikinci ve üçüncü komutlar bu sırayla tekrarlanır. Tekrarlanan her dizide X kaydındaki değer (tam sayı) 1 azalır. DEX, X = X – 1 anlamına gelir. X kaydındaki değer $00 = 00000000 olduğunda 2 , Z 1 olur. Bu noktada artık iki talimatın tekrarı yoktur. Tek baytlık bir talimat olan (örtük adresleme) programdaki son RTS talimatı, alt programdan geri döner. Bu komutun etkisi, alt program çağrısından önce yürütülecek kod için yığındaki program sayacı adresini yapmak ve program sayacına (PC) geri dönmektir. Bu adres, altprogram çağrılmadan önce yürütülecek talimatın adresidir.

Not: 6502 µP için bir montaj dili programı yazarken, satırın başında yalnızca bir etiket başlamalıdır; diğer satır kodları en az bir boşluk sağa kaydırılmalıdır.

Bir Alt Programın Çağrılması
Önceki etiketlerin kapladığı bellek alanını göz ardı eden program, bellekte (RAM) 0300$'dan 0305$'a kadar 6 baytlık ardışık konumları alır. Bu durumda program:

LDX #$FF ; X'i $FF = 255 ile yükle
DEX; X = X – 1
BNE 0302$; X sıfır değilse döngüye gidin
RTS; geri dönmek

Bellekteki $0200 adresinden başlayarak altprogram çağrısı yapılabilir. Çağrı talimatı şöyledir:

JSR'yi başlat; başlangıç ​​adresi $0300, yani JSR $0300

Metin düzenleyici dosyasına düzgün bir şekilde yazılan alt program ve çağrısı şöyledir:

LDX'i başlat #$FF; X'i $FF = 255 ile yükle
döngü DEX; X = X – 1

BNE döngüsü; X sıfır değilse döngüye gidin
RTS; geri dönmek

JSR başlangıcı: 0300$'dan başlayan rutine atla

Artık tek bir uzun programda birçok alt program olabilir. Hepsine “başlangıç” adı verilemez. Farklı isimleri olmalı. Aslında hiçbirinin adı “başlangıç” olmayabilir. Burada “Başlat” öğretim amaçlı olarak kullanılmıştır.

4.15 Bir Programın Çevirisi

Bir programı çevirmek ya da derlemek aynı anlama gelir. Aşağıdaki programı göz önünde bulundurun:

LDX'i başlat #$FF : X'i $FF = 255 ile yükleyin
döngü DEX : X = X – 1
BNE döngüsü: X sıfır değilse döngüye gidin
RTS: dönüş
JSR başlangıcı: 0300$'dan başlayan rutine atla

Bu daha önce yazılan programdır. Alt program, başlangıç ​​ve alt programa çağrıdan oluşur. Program 255'ten geri sayıyor 10 0'a 10 . Program kullanıcının başlangıç ​​adresi olan 0200$ (RAM) ile başlar. Program bir metin düzenleyicisine yazılır ve diske kaydedilir. 'sample.asm' gibi bir adı vardır; burada 'sample', programcının tercih ettiği addır ancak montaj dilinin '.asm' uzantısının dosya adıyla ilişkilendirilmesi gerekir.

Birleştirilmiş program, çevirici adı verilen başka bir program tarafından üretilir. Birleştirici, 6502 µP'nin üreticisi veya üçüncü bir taraf tarafından sağlanır. Çevirici, programı yürütülürken (çalıştırılırken) bellekte (RAM) olacak şekilde yeniden üretir.

JSR komutunun 0200$ adresinden başladığını ve altprogramın 0300$ adresinden başladığını varsayalım. Montajcı tüm yorumları ve beyaz boşlukları çıkarır. Yorumlar ve beyaz boşluklar, her zaman kıt olan hafızayı boşa harcar. Önceki alt program kod bölümü ile alt program çağrısı arasındaki olası boş satır, boşluklara bir örnektir. Birleştirilen dosya hâlâ diskte kayıtlıdır ve 'sample.exe' gibi bir adla adlandırılır. 'Örnek', programcının tercih ettiği addır, ancak bunun yürütülebilir bir dosya olduğunu belirtmek için '.exe' uzantısının orada olması gerekir.

Birleştirilmiş program aşağıdaki gibi belgelenebilir:

Bunun gibi bir belge üretmenin elle birleştirme olduğu söyleniyor. Bu belgedeki yorumların bellekte (yürütme için) görünmediğini unutmayın. Tablodaki adres sütunu, bellekteki talimatların başlangıç ​​adreslerini gösterir. “20 03 00” olarak kodlanması beklenen “JSR $0300” olan “JSR start”ın aslında “20 00 03” olarak kodlandığını ve alt bellek bayt adresinin bellekteki alt baytı aldığını ve daha yüksek bellek bayt adresi, bellekteki daha yüksek baytı alır - daha az endianness. JSR'nin işlem kodu 20'dir 16 .

BNE gibi bir dallanma talimatının ofsetinin 128 aralığında ikinin tümleyeni sayısı olduğuna dikkat edin. 10 + 127'ye kadar 10 . Yani “BNE döngüsü”, “BNE -1” anlamına gelir. 10 FF kod biçimindeki aslında “D0 FF” 16 ikinin tümleyeninde -1 olup, iki tabanında = 11111111 şeklinde yazılır. Birleştirici programı, etiketleri ve alanları gerçek onaltılık sayılarla değiştirir (onaltılık sayılar, dört bit halinde gruplandırılmış ikili sayılardır). Her talimatın başladığı gerçek adresler aslında dahil edilmiştir.

Not: “JSR start” komutunun yerini, program sayacının mevcut içeriğini (yüksek ve düşük baytlar) yığın işaretçisi iki kez azaltılan (bir kez yüksek bayt için ve bir kez düşük bayt için) yığına gönderen daha kısa komutlar alır ve daha sonra bilgisayarı 0300 $ adresiyle yeniden yükler. Yığın işaretçisi artık $01FF olarak başlatıldığı varsayılarak $00FD'yi işaret eder.

Ayrıca, RTS komutunun yerini, 'S' yığın işaretçisini iki kez artıran (düşük bayt için bir kez ve yüksek bayt için bir kez) ve karşılık gelen iki baytlık adresi yığın işaretçisinden PC'ye çeken bir dizi daha kısa komut alır. sonraki talimat.

Not: Bir etiket metni 8 karakterden fazla olmamalıdır.

“BNE döngüsü” göreceli adreslemeyi kullanır. -3 eklemek anlamına gelir 10 0305 $'lık sonraki program sayacı içeriğine. “BNE döngüsü” için baytlar “D0 FD”dir; burada FD, -3'ün ikinin tamamlayıcısıdır 10 .

Not: Bu bölüm 6502 µP'ye ilişkin tüm talimatları sunmamaktadır. Tüm talimatlar ve detayları “SY6500 8-Bit Mikroişlemci Ailesi” başlıklı belgede bulunabilir. Bu belgeye ait internette ücretsiz olarak erişilebilen “6502.pdf” isimli PDF dosyası bulunmaktadır. Bu belgede açıklanan 6502 µP, 65C02'dir.

4.16 Kesintiler

Commodore 64'ün harici (dikey yüzey) bağlantı noktalarına bağlanan herhangi bir cihazın sinyalleri, 6502 mikroişlemcisine ulaşmadan önce CIA 1 veya CIA 2 devrelerinden (IC'ler) geçmek zorundadır. 6502 µP'nin veri yolundan gelen sinyallerin herhangi bir harici cihaza ulaşmadan önce ya CIA 1 ya da CIA 2 çipinden geçmesi gerekiyor. CIA, Karmaşık Arayüz Adaptörü anlamına gelir. Şekil 4.1 'Commodore_64 Anakartının Blok Diyagramı'nda, blok giriş/çıkış cihazları CIA 1 ve CIA 2'yi temsil eder. Bir program çalışırken, devam etmeden önce başka bir kod parçasını çalıştırmak için kesintiye uğratılabilir. Donanım kesintisi ve yazılım kesintisi var. Donanım kesintisi için 6502 µP'ye iki giriş sinyali pini vardır. Bu pinlerin isimleri IRQ Ve NMI . Bunlar µP veri hatları değildir. µP için veri hatları D7, D6, D5, D4, D3, D2, D1 ve D0'dır; en az anlamlı bit için D0 ve en anlamlı bit için D7 ile.

IRQ Interrupt ReQuest 'aktif' düşük anlamına gelir. µP'ye giden bu giriş hattı normalde yaklaşık 5 voltta yüksektir. Yaklaşık 0 volta düştüğünde bu µP'ye sinyal gönderen bir kesme isteğidir. Talep kabul edilir edilmez çizgi tekrar yükselir. Kesme isteğinin kabul edilmesi, µP'nin kesmeyi işleyen koda (alt programa) dallanması anlamına gelir.

NMI Maskelenemeyen Kesinti 'aktif' düşük anlamına gelir. için kod iken IRQ idam ediliyor NMI düşük gidebilir. Bu durumda, NMI işlenir (kendi kodu yürütülür). Bundan sonra, kod IRQ devam ediyor. Kodun ardından IRQ biter, ana program kodu devam eder. Yani, NMI kesintiye uğrar IRQ işleyici. için sinyal NMI µP boştayken ve hiçbir şeyi işlemediğinde veya bir ana programı çalıştırmadığında bile µP'ye hala verilebilir.

Not: Bu aslında yüksekten alçağa geçiştir. NMI , işte bu NMI sinyal – buna daha sonra değineceğim. IRQ normalde CIA 1'den gelir ve NMI normalde CIA 2'den gelir. NMI Maskelenemeyen Kesinti anlamına gelen , durdurulamayan kesinti olarak kabul edilebilir.

Kesintileri Yönetme
Talebin nereden gelip gelmediği IRQ veya NMI mevcut talimatın tamamlanması gerekir. 6502'de yalnızca A, X ve Y kayıtları bulunur. Bir alt program çalışırken bu üç kaydı birlikte kullanıyor olabilir. Bir kesme işleyicisi, bu şekilde görülmese de hala bir alt programdır. Geçerli talimat tamamlandıktan sonra 65C02 µP'ye ait A, X ve Y kayıtlarının içerikleri yığına kaydedilir. Program Sayacı'nın bir sonraki komutunun adresi de yığına gönderilir. µP daha sonra kesinti koduna dallanır. Bundan sonra A, X ve Y yazmaçlarının içerikleri gönderildikleri sıranın tersi sırayla yığından geri yüklenir.

Bir Kesinti için Örnek Kodlama
Basitlik açısından, µP için rutinin olduğunu varsayalım. IRQ kesme sadece $01 ve $02 sayılarını toplamak ve $03 sonucunu $0400 hafıza adresine kaydetmektir. Kod:

ISR PHA
PHX
FİZ
;
LDA#01$
ADC#02$
MALİYETİ 0400$
;
KAT
PLX
PLA
RTI

ISR bir etikettir ve PHA komutunun bulunduğu hafıza adresini tanımlar. ISR, Kesinti Hizmeti Rutini anlamına gelir. PHA, PHX ve PHY, kesintiden hemen önce çalışan kod (program) tarafından ihtiyaç duyulacağı umuduyla A, X ve Y kayıtlarının içeriğini yığına gönderir. Sonraki üç talimat kesme işleyicisinin çekirdeğini oluşturur. PLY, PLX ve PLA komutları bu sırada olmalıdır ve Y, X ve A kayıtlarının içeriğini geri getirirler. RTI olan son talimat (işlenen olmadan), kesintiden önce yürütülen koda (programa) yürütmenin devamını döndürür. RTI, yığından yürütülen kodun bir sonraki talimatının adresini program sayacına geri çeker. RTI, Kesintiden Geri Dönüş anlamına gelir. Böylece kesme yönetimi (altprogram) sona erer.

Yazılım Kesintisi
6502 µP için bir yazılım kesintisine sahip olmanın ana yolu, BRK'nın ima ettiği adres komutunun kullanılmasıdır. Ana programın çalıştığını ve BRK komutuyla karşılaştığını varsayalım. Bu noktadan itibaren, mevcut talimat tamamlanırken PC'deki bir sonraki talimatın adresi yığına gönderilmelidir. Yazılım talimatını idare edecek bir alt programa 'sonraki' adı verilmelidir. Bu kesme altyordamı A, X ve Y kayıt içeriğini yığına itmelidir. Altprogramın çekirdeği yürütüldükten sonra, A, X ve Y yazmaçlarının içerikleri, tamamlama altyordamı tarafından yığından kendi yazmaçlarına geri çekilmelidir. Rutinteki son ifade RTI'dır. PC içeriği de RTI nedeniyle yığından PC'ye otomatik olarak geri çekilir.

Alt Program ve Kesinti Hizmet Rutininin Karşılaştırılması ve Karşılaştırılması
Aşağıdaki tablo Alt Program ve Kesinti Hizmeti Rutinini karşılaştırır ve karşılaştırır:

4.17 6502 Ana Adresleme Modlarının Özeti

6502'nin her talimatı bir bayttır ve ardından sıfır veya daha fazla işlenen gelir.

Anında Adresleme Modu
Anında adresleme modunda işlenenden sonra bellek adresi değil değer gelir. Değerin önünde # işareti bulunmalıdır. Değer onaltılık sayı ise “#” işaretinden sonra “$” gelmelidir. 65C02 için acil adresleme talimatları şunlardır: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Okuyucu, bu bölümde açıklanmayan, burada listelenen talimatların nasıl kullanılacağını öğrenmek için 65C02 µP belgelerine başvurmalıdır. Örnek bir talimat şöyledir:

LDA#77$

Mutlak Adresleme Modu
Mutlak adresleme modunda bir işlenen vardır. Bu işlenen, bellekteki değerin adresidir (genellikle onaltılık veya etiket halinde). 64K var 10 = 65.536 10 6502 µP için bellek adresleri. Tipik olarak, bir baytlık değer bu adreslerden birindedir. 65C02 için mutlak adresleme talimatları şunlardır: 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. Okuyucunun burada listelenen talimatların nasıl kullanılacağını ve bu bölümde açıklanmayan diğer adresleme modlarını nasıl kullanacağını öğrenmek için 65C02 µP belgelerine bakması gerekir. Örnek bir talimat şöyledir:

1234$

Örtülü Adresleme Modu
Örtülü adresleme modunda işlenen yoktur. İlgili herhangi bir µP kaydı talimat tarafından ima edilir. 65C02 için zımni adresleme talimatları şunlardır: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, VERGİ, TAY, TSX, TXA, TXS, TYA. Örnek bir talimat şöyledir:

DEX : X kaydını bir birim azaltın.

Göreceli Adresleme Modu
Göreli adresleme modu yalnızca dal talimatlarıyla ilgilenir. Göreceli adresleme modunda yalnızca bir işlenen vardır. -128 arası bir değerdir 10 +127'ye kadar 10 . Bu değere ofset adı verilir. İşarete bağlı olarak, bu değer Program Sayacı'nın bir sonraki talimatına eklenir veya çıkarılır ve amaçlanan bir sonraki talimatın adresi elde edilir. Göreli adres modu talimatları şunlardır: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Talimat örnekleri şunlardır:

BNE $7F : (durum kaydında Z = 0 ise dallanma, P)

Bu, mevcut program sayacına (yürütülecek adres) 127 ekler ve talimatı bu adreste yürütmeye başlar. Benzer şekilde:

BEQ $F9 : (Z = : durum kaydında ise dal, P)

Bu, mevcut program sayacına -7 ekler ve yeni program sayacı adresinde yürütmeyi başlatır. İşlenen ikinin tamamlayıcı sayısıdır.

Mutlak İndekslenmiş Adresleme
Mutlak indeks adreslemede, X veya Y kaydının içeriği verilen mutlak adrese eklenir (0000 $'dan $FFFF'ye kadar herhangi bir yerde, yani 0'dan 10 65536'ya 10 ) gerçek adrese sahip olmak için. Verilen bu mutlak adrese temel adres denir. X kaydı kullanılıyorsa montaj talimatı şuna benzer:

LDA $C453,X

Y kaydı kullanılıyorsa, şöyle bir şeydir:

LDA $C453,Y

X veya Y kaydının değerine sayım veya indeks değeri adı verilir ve 00$ (0) arasında herhangi bir yerde olabilir. 10 ) ila $FF (250) 10 ). Buna ofset denmez.

Mutlak indeks adresleme talimatları şunlardır: ADC, AND, ASL (yalnızca X), BIT (akümülatör ve bellekle, yalnızca X ile), CMP, DEC (yalnızca bellek ve X), EOR, INC (yalnızca bellek ve X), LDA , LDX, LDY, LSR (yalnızca X), ORA, ROL (yalnızca X), ROR (yalnızca X), SBC, STA, STZ (yalnızca X).

Mutlak Dolaylı Adresleme
Bu yalnızca atlama komutuyla birlikte kullanılır. Bununla verilen mutlak adresin bir işaretçi adresi vardır. İşaretçi adresi iki bayttan oluşur. İki baytlık işaretçi, bellekteki hedef bayt değerini işaret eder (adresidir). Yani, montaj dili talimatı şöyledir:

JMP (3456$)

Parantezlerle birlikte, $13 $3456 adres konumunda iken $EB $3457 (= $3456 + 1) adres konumundadır. Daha sonra hedef adres $13EB ve $13EB işaretçidir. Mutlak $3456, talimatta parantez içindedir; burada 34, düşük bayt ve 56, yüksek bayttır.

4.18 6502 µP Assembly Dili ile Dizi Oluşturma

Bir sonraki bölümde gösterildiği gibi, bellekte bir dosya oluşturulduktan sonra dosya diske kaydedilebilir. Dosyaya bir isim verilmesi gerekiyor. Ad bir dize örneğidir. Programlamada dizelerin başka birçok örneği vardır.

Bir dizi ASCII kodu oluşturmanın iki ana yolu vardır. Her iki durumda da, tüm ASCII kodları (karakterler) bellekte ardışık bayt konumlarını alır. Yollardan birinde, bu bayt dizisinin önünde, dizideki (string) uzunluk (karakter sayısı) olan bir tamsayı bayt gelir. Diğer şekilde, karakter dizisinin ardından 00 olan Null baytı gelir (hemen takip edilir). 16 yani 00$. Dizenin uzunluğu (karakter sayısı) bu şekilde belirtilmez. Null karakteri ilk şekilde kullanılmaz.

Örneğin, “Seni seviyorum!” tırnak işaretleri olmadan dize. Buradaki uzunluk 11'dir; boşluk bir ASCII bayt (karakter) olarak sayılır. Dizinin belleğe ilk karakteri $0300 adresinde olacak şekilde yerleştirilmesi gerektiğini varsayalım.

Aşağıdaki tablo, ilk bayt 11 olduğunda dize belleği ayarını gösterir 10 = 0B 16 :

Aşağıdaki tablo, ilk bayt “I” ve son bayt Null ($00) olduğunda dize belleği ayarını gösterir:

Dizeyi oluşturmaya başlamak için aşağıdaki talimat kullanılabilir:

MALİYETİ 0300$

İlk baytın 0300 $ adres konumuna gönderilecek akümülatörde olduğunu varsayalım. Bu talimat her iki durum için de geçerlidir (her iki dize türü).

Tüm karakterleri hafıza hücrelerine tek tek yerleştirdikten sonra, dize bir döngü kullanılarak okunabilir. İlk durumda uzunluktan sonraki karakter sayısı okunur. İkinci durumda karakterler “I”den “Null” olan Null karakteri karşılanıncaya kadar okunur.

4.19 6502 µP Assembly Dili ile Dizi Oluşturma

Tek baytlık tamsayılardan oluşan bir dizi, tamsayılarla birlikte ardışık bellek bayt konumlarından oluşur. Daha sonra ilk tam sayının konumunu gösteren bir işaretçi vardır. Yani bir tamsayı dizisi iki bölümden oluşur: işaretçi ve konum serisi.

Bir dizi dizi için her dize bellekte farklı bir yerde olabilir. Daha sonra, her işaretçinin her dizenin ilk konumunu işaret ettiği işaretçilere sahip ardışık bellek konumları vardır. Bu durumda bir işaretçi iki bayttan oluşur. Bir dize uzunluğuyla başlıyorsa karşılık gelen işaretçi bu uzunluğun konumunu işaret eder. Bir dize uzunluğuyla başlamıyor ancak boş bir karakterle bitiyorsa, karşılık gelen işaretçi dizenin ilk karakterinin konumunu işaret eder. Ve ardışık işaretçilerin ilk işaretçisinin alt bayt adresine işaret eden bir işaretçi vardır. Yani, bir dizi dizisi üç bölümden oluşur: hafızanın farklı yerlerindeki dizeler, karşılık gelen ardışık işaretçiler ve ardışık işaretçilerin ilk işaretçisini gösteren işaretçi.

4.20 Sorunlar

Okuyucunun bir sonraki bölüme geçmeden önce bir bölümdeki tüm sorunları çözmesi tavsiye edilir.

  1. 6502 µP için 0200$'dan başlayan ve işaretsiz 2A94 sayılarını toplayan bir montaj dili programı yazın H (ekleyin) 2ABF'ye H (artı). Giriş ve çıkışların hafızada olmasına izin verin. Ayrıca, birleştirilmiş program belgesini elle oluşturun.
  2. 6502 µP için 0200$'dan başlayan ve 1569'un işaretsiz sayılarını çıkaran bir montaj dili programı yazınız. H (çıkarılan) 2ABF'den H (eksi). Giriş ve çıkışlar hafızada olsun. Ayrıca, birleştirilmiş program belgesini elle oluşturun.
  3. 6502 µP için bir döngü kullanarak $00'dan $09'a kadar sayan bir montaj dili programı yazın. Program 0200 dolardan başlamalıdır. Ayrıca, birleştirilmiş program belgesini elle oluşturun.
  4. 6502 µP için 0200$'dan başlayan bir montaj dili programı yazın. Programın iki alt programı bulunmaktadır. İlk alt program 0203'ün işaretsiz sayılarını toplar H (ekleme) ve 0102H (ekleme). İkinci alt program, birinci alt programdaki 0305H'den 0006'ya kadar olan toplamı toplar. H (artı). Nihai sonuç hafızada saklanır. İlk altprogram olan FSTSUB'u ve ikinci altprogram olan SECSUB'u çağırın. Giriş ve çıkışlar hafızada olsun. Ayrıca tüm programın birleştirilmiş program belgesini elle oluşturun.
  5. göz önüne alındığında bir IRQ işleyici, çekirdek işleme olarak akümülatöre 02 ila 01 ABD Doları eklerken NMI verilir ve temel işleme NMI akümülatöre 05 ila 04 ABD Doları eklerseniz, her iki işleyici için çağrıları da dahil olmak üzere bir montaj dili yazın. Çağrı IRQ işleyicinin 0200$ adresinde olması gerekir. IRQ işleyicinin 0300$ adresinden başlaması gerekir. NMI işleyicinin 0400$ adresinden başlaması gerekir. Sonuç IRQ işleyicinin 0500$ adresine yerleştirilmesi gerekir ve sonuç NMI işleyicinin $0501 adresine yerleştirilmesi gerekir.
  6. 65C02 bilgisayarında yazılım kesmesini oluşturmak için BRK komutunun nasıl kullanıldığını kısaca açıklayın.
  7. Normal bir alt yordamı bir kesme hizmeti yordamı ile karşılaştıran ve karşılaştıran bir tablo oluşturun.
  8. Montaj dili talimat örneklerini vererek 65C02 µP'nin ana adresleme modlarını kısaca açıklayın.
  9. a) “Seni seviyorum!” ifadesini koyacak bir 6502 makine dili programı yazın. 0300 $ adresinden başlayarak dizenin uzunluğuyla birlikte bellekteki ASCII kodları dizesi. Program 0200$ adresinden başlamalıdır. Her karakteri, bir alt program tarafından oraya gönderildiklerini varsayarak, akümülatörden tek tek alın. Ayrıca programı elle birleştirin. (“Seni seviyorum!”ın ASCII kodlarını bilmeniz gerekiyorsa. İşte bunlar: ‘Ben’:49 16 , boşluk: 20 16 , 'ben': 6C 16 , 'o':6F 16 , 'içinde':76 16 , 'e':65, 'y':79 16 , 'içinde':75 16 , ve '!':21 16 (Not: her kod 1 byte yer kaplar).
    b) “Seni seviyorum!” ifadesini içeren bir 6502 makine dili programı yazın. bellekteki ASCII kodları dizisi, dizenin uzunluğu olmadan 0300 $ adresinden başlayıp 00 ile biten 16 . Program 0200$ adresinden başlamalıdır. Her karakteri akümülatörden alın, bunların birer birer alt program tarafından oraya gönderildiklerini varsayalım. Ayrıca programı elle birleştirin.