Bölüm 5: Assembly Dilinde Commodore-64 İşletim Sistemi

Bolum 5 Assembly Dilinde Commodore 64 Isletim Sistemi



5.1 Giriş

Commodore-64 bilgisayarının işletim sistemi, bilgisayarla birlikte Salt Okunur Bellekte (ROM) gelir. Commodore-64 için bellek bayt konumlarının sayısı 0000 $ ila $FFFF arasında değişir (yani 000016 ila FFFF16, yani 010 ila 65,53510). İşletim sistemi $E000 ila $FFFF arasındadır (yani 57,34410 ila 65,53610).

Neden Commodore-64 İşletim Sistemini İncelemelisiniz?
1982'de piyasaya sürülen bir bilgisayarın işletim sistemi olan Commodore-64 İşletim Sistemini neden bugün inceleyelim ki? Commodore-64 bilgisayarı, 6502 µP'nin bir yükseltmesi olan (büyük bir yükseltme olmasa da) Merkezi İşlem Birimi 6510'u kullanıyor.







6502 µP bugün hala çok sayıda üretiliyor; artık ev veya ofis bilgisayarları için değil, elektrikli ve elektronik aletler (cihazlar) içindir. 6502 µP'nin anlaşılması ve çalıştırılması da zamanının diğer mikroişlemcileriyle karşılaştırıldığında kolaydır. Bunların bir sonucu olarak, montaj dilini öğretmek için kullanılabilecek (en iyisi olmasa da) en iyi mikroişlemcilerden biridir.



Hala 6502 mikroişlemci sınıfından olan 65C02 µP, tamamı ezbere bile öğrenilebilen 66 montaj dili talimatına sahiptir. Modern mikroişlemciler birçok montaj dili talimatına sahiptir ve ezberlenerek öğrenilemezler. Her µP'nin kendine ait bir montaj dili vardır. İster yeni ister eski olsun, herhangi bir işletim sistemi montaj diline sahiptir. Bununla birlikte, 6502 montaj dilinin yeni başlayanlara işletim sistemini öğretmek için kullanılması iyidir. Commodore-64 gibi bir işletim sistemini öğrendikten sonra, bunu temel alarak modern bir işletim sistemi kolaylıkla öğrenilebilir.



Bu sadece yazarın (benim) görüşü değil. Dünyada giderek büyüyen bir trend. Commodore-64 işletim sisteminin modern bir işletim sistemi gibi görünmesi için internette giderek daha fazla makale yazılıyor. Modern işletim sistemleri bir sonraki bölümde anlatılmaktadır.





Not : Commodore-64 İşletim Sistemi (Kernal) hala modern giriş ve çıkış cihazlarıyla (hepsiyle değil) iyi çalışıyor.

Sekiz Bit Bilgisayar
Commodore 64 gibi sekiz bitlik bir mikro bilgisayarda, bilgi sekiz bitlik ikili kodlar biçiminde saklanır, aktarılır ve işlenir.



Bellek Haritası
Bellek haritası, tüm bellek aralığını farklı boyutlardaki daha küçük aralıklara bölen ve neyin (altprogram ve/veya değişken) hangi aralığa ait olduğunu gösteren bir ölçektir. Değişken, değeri olan belirli bir hafıza adresine karşılık gelen bir etikettir. Etiketler ayrıca alt programların başlangıcını tanımlamak için de kullanılır. Ancak bu durumda alt programların adları olarak bilinirler. Bir alt programa basitçe rutin adı verilebilir.

Önceki bölümdeki hafıza haritası (düzen) yeterince ayrıntılı değil. Oldukça basit. Commodore-64 bilgisayarının hafıza haritası üç düzeyde ayrıntıyla gösterilebilir. Orta seviyede gösterildiğinde Commodore-64 bilgisayarı farklı hafıza haritalarına sahiptir. Commodore-64 bilgisayarının orta seviyedeki varsayılan hafıza haritası şöyledir:


Şekil 5.11 Commodore-64 Bellek Haritası

O günlerde BASIC adında popüler bir bilgisayar dili vardı. Birçok bilgisayar kullanıcısının, disketten (disk) belleğe bir program yüklemek, bellekteki bir programı çalıştırmak (yürütmek) ve programdan çıkmak (kapatmak) gibi bazı minimum BASIC dil komutlarını bilmesi gerekiyordu. BASIC programı çalışırken, kullanıcının verileri satır satır beslemesi gerekir. Bir uygulamanın (bir uygulama oluşturan bir dizi program) pencerelerle üst düzey bir dilde yazıldığı ve kullanıcının farklı verileri bir penceredeki özel yerlere sığdırmak zorunda olduğu günümüz gibi değildir. Bazı durumlarda, önceden sipariş edilen verileri seçmek için fareyi kullanırız. BASIC o zamanlar yüksek seviyeli bir dildi ancak montaj diline oldukça yakındı.

Belleğin büyük bir kısmının varsayılan bellek haritasında BASIC tarafından kaplandığına dikkat edin. BASIC, BASIC Interpreter olarak bilinen şey tarafından yürütülen komutlara (talimatlara) sahiptir. Aslında, BASIC yorumlayıcısı ROM'da A000 $ konumundan, sözde bir RAM alanı olan $BFFF'ye (dahil) kadardır. Bu 8 Kbyte, o zamanlar oldukça büyük bir rakamdı! Aslında tüm hafızanın o yerinde ROM'dadır. $E000 ile $FFFF (dahil) arasında işletim sistemiyle aynı boyuta sahiptir. BASIC'te yazılan programlar da 0200 $ ile $BFFF aralığına yerleştirilir.

Kullanıcı derleme dili programının RAM'i $C000 ila $CFFF arasındadır, yani 64 Kbayttan yalnızca 4 Kbayttır. Peki neden montaj dilini kullanıyoruz veya öğreniyoruz? Yeni ve eski işletim sistemleri montaj dillerindendir. Commodore-64'ün işletim sistemi ROM'da olup, $E000 ile $FFFF arasındadır. 65C02 µP (6510 µP) montaj dilinde yazılmıştır. Alt programlardan oluşur. Assembly dilindeki kullanıcı programının çevre birimleriyle (giriş ve çıkış aygıtları) etkileşim kurabilmesi için bu alt yordamları çağırması gerekir. Commodore-64 işletim sistemini Assembly dilinde anlamak, öğrencinin işletim sistemlerini çok daha az sıkıcı bir şekilde hızlı bir şekilde anlamasını sağlar. Yine o günlerde Commodore-64 için birçok kullanıcı programı montaj dilinde değil BASIC dilinde yazılmıştı. O günlerde montaj dilleri daha çok programcılar tarafından teknik amaçlarla kullanılıyordu.

K-e-r-n-a-l olarak yazılan Kernal, Commodore-64'ün işletim sistemidir. Commodore-64 bilgisayarıyla birlikte bir diskte (veya diskette) değil, ROM'da gelir. Kernal altprogramlardan oluşur. Çevre birimlerine erişmek için, montaj dilindeki (makine dilinde) kullanıcı programının bu alt rutinleri kullanması gerekir. Kernal, modern işletim sistemlerinde K-e-r-n-e-l olarak yazılan çekirdek ile karıştırılmamalıdır, ancak bunlar neredeyse aynı şeydir.

Belleğin 4 Kbytes10'unun $C000 (49,15210) ile $CFFF (6324810) arasındaki bellek alanı RAM veya ROM'dur. RAM olduğunda çevre birimlerine erişmek için kullanılır. ROM olduğunda karakterlerin ekrana (monitöre) yazdırılması için kullanılır. Bu, ya karakterlerin ekrana yazdırıldığı ya da belleğin bu kısmı kullanılarak çevre birimlerine erişildiği anlamına gelir. Bunu başarmak için sistem biriminde (anakart) tüm bellek alanına açılıp kapatılan bir ROM bankası (karakter ROM) vardır. Kullanıcı geçişi fark etmeyebilir.

Bellek alanı 0100$'dan (256 10 ) ila $01FF (511) 10 ) yığındır. Hem işletim sistemi hem de kullanıcı programları tarafından kullanılır. Yığının rolü bu çevrimiçi kariyer kursunun önceki bölümünde açıklanmıştı. Belleğin alanı 0000$'dan (0 10 ) ila 00$FF (255) 10 ) işletim sistemi tarafından kullanılır. Orada birçok işaretçi atanmıştır.

Çekirdek Atlama Tablosu
Kernal'ın kullanıcı programı tarafından çağrılan rutinleri vardır. İşletim sisteminin yeni sürümleri çıktıkça bu rutinlerin adresleri değişti. Bu, kullanıcı programlarının artık yeni işletim sistemi sürümleriyle çalışamayacağı anlamına gelir. Commodore-64'ün bir atlama tablosu sağlaması nedeniyle bu gerçekleşmedi. Atlama tablosu 39 girişten oluşan bir listedir. Tablodaki her giriş, işletim sisteminin sürüm değişikliğine rağmen asla değişmeyen üç adrese (son 6 bayt hariç) sahiptir.

Bir girişin ilk adresi bir JSR talimatına sahiptir. Sonraki iki adres iki baytlık bir işaretçiden oluşur. Bu iki baytlık işaretçi, hala OS ROM'da bulunan gerçek bir rutinin adresidir (veya yeni adresidir). İşaretçi içeriği yeni işletim sistemi sürümleriyle değişebilir, ancak her atlama tablosu girişinin üç adresi asla değişmez. Örneğin, $FF81, $FF82 ve $FF83 adreslerini düşünün. Bu üç adres, rutinin anakartın ekranını ve klavye devrelerini (kayıtlarını) başlatması içindir. $FF81 adresi her zaman JSR'nin işlem koduna (bir bayt) sahiptir. $FF82 ve $FF83 adresleri, başlatmayı gerçekleştirmek için altyordamın eski veya yeni adresine sahiptir (hala OS ROM'dadır). Bir zamanlar $FF82 ve $FF83 adresleri, sonraki işletim sistemi sürümüyle değişebilecek $FF5B içeriğine (adresine) sahipti. Ancak atlama tablosunun $FF81, $FF82 ve $FF83 adresleri hiçbir zaman değişmez.

Üç adresin her girişi için, JSR'li ilk adresin bir etiketi (isim) vardır. $FF81'in etiketi PCINT'tir. PCINT asla değişmez. Böylece, ekran ve klavye kayıtlarını başlatmak için programcı, Commodore-64 işletim sisteminin tüm sürümlerinde çalışan 'JSR PCINT' yazabilir. Gerçek altyordamın konumu (başlangıç ​​adresi), örneğin $FF5B, farklı işletim sistemleriyle zaman içinde değişebilir. Evet, ROM işletim sistemini kullanan kullanıcı programında en az iki JSR talimatı bulunmaktadır. Kullanıcı programında atlama tablosundaki bir girişe atlayan bir JSR talimatı vardır. Atlama tablosundaki son altı adres haricinde, atlama tablosundaki bir girişin ilk adresi bir JSR talimatına sahiptir. Kernal'da bazı altprogramlar diğer altprogramları çağırabilir.

Kernal atlama tablosu, daha düşük bayt adreslerine sahip üç işaretçi olan son altı bayt hariç, üçlü gruplar halinde yukarı doğru $FF81 (dahil) ile başlar: $FFFA, $FFFC ve $FFFE. Tüm ROM işletim sistemi rutinleri yeniden kullanılabilir kodlardır. Böylece kullanıcının bunları yeniden yazmasına gerek kalmaz.

Commodore-64 Sistem Biriminin Blok Şeması
Aşağıdaki şema önceki bölümdeki şemadan daha ayrıntılıdır:


Şekil 5.12 Commodore_64 Sistem Ünitesinin Blok Şeması

ROM ve RAM burada tek blok olarak gösterilmektedir. Önceki bölümde gösterilmeyen, bilgileri ekrana işlemek için kullanılan Video Arayüzü Çipi (IC) burada gösterilmektedir. Önceki bölümde gösterilen giriş/çıkış aygıtlarına yönelik tek blok burada iki blok halinde gösterilmektedir: CIA #1 ve CIA #2. CIA, Karmaşık Arayüz Adaptörü anlamına gelir. Her birinde port A ve port B olarak adlandırılan iki paralel sekiz bitlik port bulunur (sistem ünitesinin dikey yüzeyindeki harici portlarla karıştırılmamalıdır). CIA'ler bu durumda beş harici cihaza bağlanır. Aygıtlar klavye, joystick, disk sürücüsü/yazıcı ve modemdir. Yazıcı disk sürücüsünün arkasına bağlanır. Ayrıca gösterilmeyen bir Ses Arayüzü Cihaz Devresi ve Programlanabilir Mantık Dizisi Devresi de bulunmaktadır.

Yine de ekrana bir karakter gönderildiğinde her iki CIA ile değiştirilebilen bir Karakter ROM'u var ve blok diyagramda gösterilmiyor.

Karakter ROM'unun yokluğunda giriş/çıkış devreleri için $D000'den $DFFF'ye kadar olan RAM adresleri aşağıdaki ayrıntılı hafıza haritasına sahiptir:

Tablo 5.11
$D000'den $DFFF'ye Detaylı Bellek Haritası
Alt Adres Aralığı Devre Boyut (Bayt)
D000 – D3FF VIC (Video Arayüzü Denetleyicisi (Çip)) 1K
D400 – D7FF SID (Ses Devresi) 1K
D800 – DBFF Renkli RAM 1K Nibble
DC00 – DCFF CIA #1 (Klavye, Kumanda Kolu) 256
DD00 – DDFF CIA #2 (Seri Veri Yolu, Kullanıcı Bağlantı Noktası/RS-232) 256
DE00 – DEF G/Ç Yuvası #1'i açın 256
DF00 – DFFF G/Ç Yuvası #2'yi açın 256

5.2 İki Karmaşık Arayüz Adaptörü

Commodore-64 sistem biriminde iki özel Tümleşik Devre (IC) vardır ve bunların her birine Karmaşık Arayüz Adaptörü adı verilir. Bu iki yonga, klavyeyi ve diğer çevre birimlerini mikroişlemciye bağlamak için kullanılır. VIC ve ekran haricinde, mikroişlemci ile çevre birimleri arasındaki tüm giriş/çıkış sinyalleri bu iki entegreden geçer. Commodore-64'te bellek ile herhangi bir çevre birimi arasında doğrudan iletişim yoktur. Bellek ile herhangi bir çevre birimi arasındaki iletişim mikroişlemcili akümülatörden geçer ve bunlardan biri de CIA adaptörleridir (IC'ler). IC'ler CIA #1 ve CIA #2 olarak anılır. CIA, Karmaşık Arayüz Adaptörü anlamına gelir.

Her CIA'nın 16 kaydı vardır. CIA'deki zamanlayıcı/sayaç kayıtları hariç, her kayıt 8 bit genişliğindedir ve bir hafıza adresine sahiptir. CIA #1'in bellek kayıt adresleri $DC00'den (56320) 10 ) $ DC0F'ye (56335) 10 ). CIA #2 için bellek kayıt adresleri $DD00 (56576) tutarındadır. 10 ) $DD0F'ye (56591) 10 ). Bu kayıtlar IC'nin hafızasında olmasa da hafızanın bir parçasıdır. Ara bellek haritasında, $D000 ila $DFFF arasındaki I/O alanı, $DC00 ila $DC0F ve $DD00 ila $DD0F arasındaki CIA adreslerini içerir. $D000 ila $DFFF arasındaki RAM I/O bellek alanının çoğu, ekran karakterleri için karakter ROM'unun bellek bankasıyla değiştirilebilir. Bu nedenle karakterler ekrana gönderildiğinde çevre birimleri çalışamıyor; ancak ileri geri geçiş hızlı olduğundan kullanıcı bunu fark etmeyebilir.

CIA #1'de Port A ve Port B olarak adlandırılan iki kayıt vardır. Adresleri sırasıyla $DC00 ve $DC01'dir. Ayrıca CIA #2'de Port A ve Port B adında iki kayıt bulunmaktadır. Elbette adresleri farklıdır; sırasıyla DD00$ ve DD01$'dır.

Her iki CIA'daki Bağlantı Noktası A veya Bağlantı Noktası B paralel bir bağlantı noktasıdır. Bu, çevre birimine aynı anda sekiz bitlik veri gönderebileceği veya mikroişlemciden aynı anda sekiz bitlik veri alabileceği anlamına gelir.

Bağlantı noktası A veya bağlantı noktası B ile ilişkili bir Veri Yön Kaydı (DDR) bulunur. CIA #1'in (DDRA1) A bağlantı noktası için veri yönü kaydı, $DC02'nin bellek bayt konumundadır. CIA #1'in (DDRB1) B bağlantı noktası için veri yönü kaydı, $DC03 bellek bayt konumundadır. CIA #2'nin (DDRA2) A bağlantı noktası için veri yönü kaydı, $DD02 bellek bayt konumundadır. CIA #2'nin (DDRB2) B bağlantı noktası için veri yönü kaydı, $DD03 bellek bayt konumundadır.

Artık A portu veya B portu için her bir bit, karşılık gelen veri yönü kaydı tarafından giriş veya çıkış olarak ayarlanabilir. Giriş, bilginin bir CIA aracılığıyla çevre birimden mikroişlemciye gitmesi anlamına gelir. Çıktı, bilginin mikroişlemciden çevre birimine bir CIA aracılığıyla gittiği anlamına gelir.

Bir portun (kayıt) hücresi girilecekse, veri yönü kaydındaki karşılık gelen bit 0'dır. Bir portun (kayıt) hücresinin çıkışı verilecekse, veri yönü kaydındaki karşılık gelen bit 1'dir. Çoğu durumda, bir bağlantı noktasının 8 bitinin tamamı giriş veya çıkış olacak şekilde programlanır. Bilgisayar açıldığında, bağlantı noktası A çıkış için, bağlantı noktası B ise giriş için programlanır. Aşağıdaki kod, CIA #1 bağlantı noktası A'yı çıkış ve CIA #1 bağlantı noktası B'yi giriş olarak yapar:

LDA #$FF
STA DDRA1; $DC00, $DC02 tarafından yönetilmektedir
LDA#00$
STA DDRB1; $DC01, $DC03 tarafından yönetilmektedir

DDRA1, $DC02'nin bellek bayt konumunun etiketidir (değişken adı) ve DDRB1, $DC03'ün bellek bayt konumunun etiketidir (değişken adı). İlk talimat µP'nin akümülatörüne 11111111'i yükler. İkinci talimat bunu CIA no. 2'nin A portunun veri yönü kaydına kopyalar. 1. Üçüncü talimat µP'nin akümülatörüne 00000000'ı yükler. Dördüncü talimat bunu CIA no. 2'nin B portunun veri yönü kaydına kopyalar. 1. Bu kod, bilgisayar açıldığında bu başlatma işlemini gerçekleştiren işletim sistemindeki alt programlardan biridir.

Her CIA'nın mikroişlemciye giden bir kesme hizmeti talep hattı vardır. CIA #1'den olan şuna gidiyor: IRQ µP'nin pini. CIA #2'den olan şuraya gidiyor: NMI µP'nin pini. Bunu hatırla NMI göre daha önceliklidir IRQ .

5.3 Klavye Düzeneği Dili Programlaması

Commodore-64 için yalnızca üç olası kesinti vardır: IRQ , BRK ve NMI . Atlama tablosu işaretçisi IRQ ROM'daki (işletim sistemi) $FFFE ve $FFFF adreslerindedir ve bu, hala işletim sistemindeki (ROM) bir alt programa karşılık gelir. BRK için atlama tablosu işaretçisi, işletim sistemindeki $FFFC ve $FFFD adreslerindedir ve bu, hâlâ işletim sisteminde (ROM) bulunan bir alt programa karşılık gelir. Atlama tablosu işaretçisi NMI İşletim sistemindeki $FFFA ve $FFFB adreslerindedir ve bu, hâlâ işletim sisteminde (ROM) bulunan bir alt programa karşılık gelir. İçin IRQ Aslında iki altprogram var. Yani, BRK yazılım kesmesinin (talimatının) kendi atlama tablosu işaretçisi vardır. Atlama tablosu işaretçisi IRQ donanım kesintisi mi yoksa yazılım kesintisi mi olduğuna karar veren koda yol açar. Eğer donanım kesintisi ise, rutin IRQ denir. Yazılım kesintisi (BRK) ise, BRK için rutin çağrılır. İşletim sistemi versiyonlarından birinde, alt program IRQ EA31 Dolardır ve BRK için alt program FE66 Dolardır. Bu adresler FF81 $'ın altındadır, dolayısıyla atlama tablosu girişleri değildirler ve işletim sistemi sürümüne göre değişebilirler. Bu konuyla ilgilenen üç rutin vardır: basılan tuşa mı yoksa BRK'ya mı basıldığını kontrol eden rutin, FE43 $ değerindeki rutin ve işletim sistemi sürümüne göre değişebilen rutin.

Commodore-64 bilgisayarı, görünüş olarak, yazdırma bölümü (kafa ve kağıt) olmayan devasa bir daktiloya (yukarı doğru) benzer. Klavye CIA #1'e bağlı. CIA #1, varsayılan olarak herhangi bir programlama müdahalesi olmaksızın klavyeyi saniyenin her 1/60'ında bir kendi başına tarar. Yani her saniyenin 1/60'ında CIA #1 bir mesaj gönderiyor. IRQ µP'ye. Sadece bir tane var IRQ Yalnızca CIA #1'den gelen µP'deki pin. Tek giriş pini NMI µP'den farklı olan IRQ , yalnızca CIA #2'den gelir (aşağıdaki resme bakın). BRK aslında bir kullanıcı programında kodlanmış bir montaj dili talimatıdır.

Yani her 1/60 saniyede bir IRQ $FFFE ve $FFFF tarafından işaret edilen rutin çağrılır. Rutin bir tuşa basılıp basılmadığını veya BRK talimatıyla karşılaşılıp karşılaşılmadığını kontrol eder. Bir tuşa basıldığında, tuşa basmayı gerçekleştirecek rutin çağrılır. Eğer bu bir BRK talimatı ise, BRK'yı yönetecek rutin çağrılır. İkisi de değilse hiçbir şey olmaz. Her ikisi de gerçekleşmeyebilir, ancak CIA #1 şunu gönderir: IRQ µP'ye her 1/60 saniyede bir.

Klavye arabelleği olarak da bilinen klavye kuyruğu, 0277 ABD Doları ile 0280 ABD Doları arasında bir RAM bayt konumu aralığıdır; Toplam 1010 bayt. Bu bir İlk Giren İlk Çıkar arabelleğidir. Bu, ilk gelen karakterin ilk ayrılan olduğu anlamına gelir. Batı Avrupa karakteri bir bayt alır.

Yani program bir tuşa basıldığında herhangi bir karakter tüketmezken, tuş kodu bu tampona (kuyruğa) gider. Tampon on karakter kalana kadar dolmaya devam eder. Onuncu karakterden sonra basılan karakterler kaydedilmez. Kuyruktan en az bir karakter alınana (tüketilene) kadar göz ardı edilir. Atlama tablosunun, kuyruktan mikroişlemciye ilk karakteri alan bir alt program için bir girişi vardır. Bu, kuyruğa giren ilk karakteri alıp µP'nin toplayıcısına koyduğu anlamına gelir. Bunu yapmak için kullanılan atlama tablosu alt yordamına GETIN (Get-In için) adı verilir. Atlama tablosundaki üç baytlık girişin ilk baytı GETIN (adres $FFE4) olarak etiketlenir. Sonraki iki bayt, ROM'daki (OS) gerçek rutini işaret eden işaretçidir (adres). Bu rutini çağırmak programcının sorumluluğundadır. Aksi takdirde klavye arabelleği dolu kalacak ve yakın zamanda basılan tuşların tümü dikkate alınmayacaktır. Akümülatöre giren değer, karşılık gelen anahtar ASCII değeridir.

Anahtar kodları ilk etapta sıraya nasıl giriyor? SCNKEY (tarama anahtarı için) adı verilen bir atlama tablosu rutini vardır. Bu rutin hem yazılım hem de donanım tarafından çağrılabilir. Bu durumda elektrik sinyali geldiğinde mikroişlemcideki bir elektronik (fizik) devre tarafından çağrılır. IRQ düşük. Bunun tam olarak nasıl yapıldığı bu çevrimiçi kariyer kursunda ele alınmamaktadır.

İlk tuş kodunu klavye arabelleğinden akümülatör A'ya alma kodu yalnızca bir satırdır:

ALIN

Klavye arabelleği boşsa akümülatöre 00$ konur. Sıfırın ASCII kodunun 00 $ olmadığını unutmayın; 30 dolar. 00 $ Boş anlamına gelir. Bir programda programın bir tuşa basılmasını beklemek zorunda kalacağı bir nokta olabilir. Bunun kodu:

JSR GETIN'İ BEKLEYİN
CMP #00$
KURBAĞA BEKLE

İlk satırdaki “WAIT”, JSR komutunun konulduğu (yazıldığı) RAM adresini tanımlayan bir etikettir. GETIN aynı zamanda bir adrestir. Atlama tablosundaki karşılık gelen üç bayttan ilkinin adresidir. GETIN girişi ve atlama tablosundaki tüm girişler (son üçü hariç) üç bayttan oluşur. Girişin ilk baytı JSR talimatıdır. Sonraki iki bayt, hala ROM'da (OS) bulunan ancak atlama tablosunun altında bulunan gerçek GETIN altyordamının gövdesinin adresidir. Yani giriş GETIN altyordamına atlamayı söylüyor. Klavye kuyruğu boş değilse GETIN, İlk Giren İlk Çıkar kuyruğunun ASCII anahtar kodunu akümülatöre koyar. Kuyruk boşsa akümülatöre Null (00$) konur.

İkinci talimat akümülatör değerini 00$ ile karşılaştırır. Eğer $00 ise, bu, klavye sırasının boş olduğu anlamına gelir ve CMP talimatı, işlemci durum kaydının (basitçe durum kaydı olarak adlandırılır) Z bayrağına 1 gönderir. A'daki değer $00 değilse, CMP talimatı durum kaydının Z bayrağına 0 gönderir.

Üçüncü komut olan “BEQ WAIT”, eğer durum yazmacının Z bayrağı 1 ise, programı ilk talimata geri gönderir. Birinci, ikinci ve üçüncü komutlar, klavyede bir tuşa basılana kadar sırayla tekrar tekrar yürütülür. . Bir tuşa hiç basılmazsa döngü süresiz olarak tekrarlanır. Bunun gibi bir kod bölümü normalde, bir tuşa hiç basılmaması durumunda bir süre sonra döngüden çıkan bir zamanlama kodu bölümüyle yazılır (aşağıdaki tartışmaya bakın).

Not : Klavye varsayılan giriş aygıtıdır ve ekran varsayılan çıkış aygıtıdır.

5.4 Kanal, Cihaz Numarası ve Mantıksal Dosya Numarası

Bu bölümde Commodore-64 işletim sistemini açıklamak için kullanılan çevre birimleri klavye, ekran (monitör), disketli disk sürücüsü, yazıcı ve RS-232C arayüzü üzerinden bağlanan modemdir. Bu cihazlar ile sistem birimi (mikroişlemci ve bellek) arasında iletişimin gerçekleşebilmesi için bir kanalın kurulması gerekmektedir.

Bir kanal, bir arabellek, cihaz numarası, mantıksal dosya numarası ve isteğe bağlı olarak ikincil bir adresten oluşur. Bu terimlerin açıklamaları şu şekildedir:

Bir tampon
Önceki bölümde, bir tuşa basıldığında, kodunun RAM'de ardışık on konumluk bir dizi bayt konumuna gitmesi gerektiğine dikkat edin. Bu on konum dizisi klavye arabelleğidir. Her giriş veya çıkış cihazı (çevresel), RAM'de arabellek adı verilen bir dizi ardışık konuma sahiptir.

Cihaz numarası
Commodore-64'te her türlü çevre birimine bir cihaz numarası verilir. Aşağıdaki tabloda farklı cihazlar ve sayıları gösterilmektedir:

Tablo 5.41
Commodore 64 Cihaz Numaraları ve Cihazları
Sayı Cihaz
0 Tuş takımı
1 Teyp Sürücüsü
2 RS 232C arayüzü örn. bir modem
3 Ekran
4 Yazıcı #1
5 Yazıcı #2
6 Çizici #1
7 Çizici #2
8 Disk sürücüsü
9
¦
¦
¦
30
8'den (dahil) 22'ye kadar depolama cihazı daha

Bir bilgisayar için iki tür bağlantı noktası vardır. Bir tip, sistem biriminin dikey yüzeyinde haricidir. Diğer tip ise dahilidir. Bu dahili port bir kayıttır. Commodore-64'ün dört dahili bağlantı noktası vardır: CIA 1 için bağlantı noktası A ve bağlantı noktası B ve CIA 2 için bağlantı noktası A ve Bağlantı Noktası B. Commodore-64 için Seri Bağlantı Noktası adı verilen bir harici bağlantı noktası vardır. 3 numarası yukarı doğru olan cihazlar seri porta bağlanır. Her biri cihaz numarasıyla tanımlanabilen, papatya zinciri şeklinde bağlanırlar (biri diğerinin arkasına bağlanır). 8 rakamı yukarı doğru olan cihazlar genel olarak depolama cihazlarıdır.

Not : Varsayılan giriş aygıtı, aygıt numarası 0 olan klavyedir. Varsayılan çıkış aygıtı, aygıt numarası 3 olan ekrandır.

Mantıksal Dosya Numarası
Mantıksal dosya numarası, bir cihaza (çevre birimi) erişim için açılma sırasına göre verilen bir sayıdır. 010 ila 255 arasında değişirler 10 .

İkincil Adres
Diskte iki dosyanın (veya birden fazla dosyanın) açıldığını düşünün. Bu iki dosya arasında ayrım yapmak için ikincil adresler kullanılır. İkincil adresler cihazdan cihaza değişen sayılardır. Bir yazıcı için ikincil adres olarak 3'ün anlamı, bir disk sürücüsü için ikincil adres olarak 3'ün anlamından farklıdır. Anlamı, bir dosyanın okumak için ne zaman açıldığı veya bir dosyanın yazmak için ne zaman açıldığı gibi özelliklere bağlıdır. Olası ikincil sayılar 0'dan itibarendir 10 15'e kadar 10 her cihaz için. Birçok cihazda komut göndermek için 15 sayısı kullanılır.

Not : Cihaz numarası aynı zamanda cihaz adresi olarak da bilinir ve ikincil numara da ikincil adres olarak bilinir.

Çevresel Hedef Belirleme
Varsayılan Commodore bellek haritası için, $0200 ile $02FF arasındaki bellek adresleri (sayfa 2), işletim sistemi artı BASIC dili tarafından değil, yalnızca ROM'daki (Kernal) işletim sistemi tarafından kullanılır. BASIC yine de konumları ROM işletim sistemi aracılığıyla kullanabilir.

Modem ve yazıcı iki farklı çevre birimi hedefidir. Diskten iki dosya açılırsa bunlar iki farklı hedeftir. Varsayılan hafıza haritasında, tek bir büyük tablo olarak görülebilecek ardışık üç tablo (liste) bulunmaktadır. Bu üç tablo Mantıksal Dosya Numaraları, Cihaz Numaraları ve İkincil Adresler arasındaki ilişkiyi tutar. Bununla belirli bir kanal veya giriş/çıkış hedefi tanımlanabilir hale gelir. Üç tabloya Dosya Tabloları adı verilir. RAM adresleri ve sahip oldukları şeyler şunlardır:

$0259 — $0262: En fazla on aktif mantıksal dosya numarasından oluşan, LAT etiketli tablo.
$0263 — $026C: En fazla on adet karşılık gelen cihaz numarasından oluşan Etiketli, FAT Tablosu.
$026D – $0276: Karşılık gelen on ikincil adresin Etiketli Tablosu, SAT.

Burada “—“, “için” anlamına gelir ve sayı bir bayt alır.

Okuyucu şu soruyu sorabilir: 'Neden her cihazın arabelleği bir kanalın tanımlanmasına dahil edilmiyor?' Bunun cevabı Commodore-64'te her harici cihazın (çevresel) RAM'de (bellek haritası) sabit bir bayt serisine sahip olmasıdır. Herhangi bir açık kanal olmadığından konumları hala hafızadadır. Örneğin klavyenin arabelleği, varsayılan bellek haritası için 0277 ABD Doları ile 0280 ABD Doları (dahil) arasında sabitlenmiştir.

Kernal SETLFS ve SETPAM Alt Programları
SETLFS ve SETPAM Kernal rutinleridir. Bir kanal mantıksal bir dosya olarak görülebilir. Açılacak bir kanal için mantıksal dosya numarası, cihaz numarası ve isteğe bağlı bir ikincil adresin üretilmesi gerekir. İsteğe bağlı bir dosya adı (metin) de gerekli olabilir. SETLFS rutini mantıksal dosya numarasını, cihaz numarasını ve isteğe bağlı ikincil adresi ayarlar. Bu sayılar ilgili tablolarda yer almaktadır. SETNAM rutini, dosya için bir kanal için zorunlu ve başka bir kanal için isteğe bağlı olabilecek bir dizi adı ayarlar. Bu, bellekteki bir işaretçiden (iki baytlık adres) oluşur. İşaretçi, bellekte başka bir yerde olabilecek dizenin (isim) başlangıcını işaret eder. Dize adı, dizenin uzunluğuna sahip bir bayt ile başlar ve ardından metin (ad) gelir. Ad maksimum on altı bayttır (uzun).

SETLFS rutinini çağırmak için kullanıcı programının, varsayılan bellek haritası için ROM'daki işletim sisteminin atlama tablosunun $FFBA adresine atlaması (JSR) gerekir. Atlama tablosunun son altı baytı hariç her girişin üç bayttan oluştuğunu unutmayın. İlk bayt, daha sonra alt programa atlayan ve sonraki iki bayttaki adreste başlayan JSR talimatıdır. SETPAM rutinini çağırmak için kullanıcı programının ROM'daki işletim sisteminin atlama tablosunun $FFBD adresine atlaması (JSR) gerekir. Bu iki rutinin kullanımı aşağıdaki tartışmada gösterilmektedir.

5.5 Kanal Açma, Mantıksal Dosya Açma, Mantıksal Dosyayı Kapatma ve Tüm I/O Kanallarını Kapatma

Bir kanal, bir bellek arabelleğinden, bir mantıksal dosya numarasından, cihaz numarasından (cihaz adresi) ve isteğe bağlı bir ikincil adresten (bir sayı) oluşur. Mantıksal bir dosya numarasıyla tanımlanan mantıksal bir dosya (soyutlama), yazıcı, modem, disk sürücüsü vb. gibi bir çevre birimine atıfta bulunabilir. Bu farklı aygıtların her biri, farklı mantıksal dosya numaralarına sahip olmalıdır. Diskte çok sayıda dosya var. Mantıksal bir dosya aynı zamanda diskteki belirli bir dosyaya da başvurabilir. Söz konusu dosya aynı zamanda yazıcı veya modem gibi çevre birimlerininkinden farklı bir mantıksal dosya numarasına da sahiptir. Mantıksal dosya numarası programcı tarafından verilir. 010 (00$) ila 25510 ($FF) arasında herhangi bir sayı olabilir.

İşletim Sistemi SETLFS Rutini
$FFBA'daki OS ROM atlama tablosuna atlayarak (JSR) erişilen OS SETLFS Rutini kanalı ayarlar. Mantıksal dosya numarasını dosya tablosuna LAT (0259 $ - 0262 $) koyması gerekir. Karşılık gelen cihaz numarasını FAT ($0263 — $026C) olan dosya tablosuna koyması gerekir. Dosya (cihaz) erişiminin ikincil bir numaraya ihtiyacı varsa, ilgili ikincil adresi (numarayı) SAT ($026D — $0276) olan dosya tablosuna koyması gerekir.

Çalıştırmak için SETLFS alt yordamının µP toplayıcıdan mantıksal dosya numarasını alması gerekir; µP X kaydından cihaz numarasını alması gerekir. Kanalın ihtiyaç duyması halinde µP Y kaydından ikincil adresi alması gerekir.

Mantıksal dosya numarasına programcı tarafından karar verilir. Farklı cihazlara atıfta bulunan mantıksal dosya numaraları farklıdır. Şimdi, SETLFS rutinini çağırmadan önce programcı mantıksal dosyanın numarasını µP akümülatörüne koymalıdır. Cihaz numarası Tablo 5.41'deki gibi bir tablodan (belgeden) okunur. Programcının ayrıca cihaz numarasını µP X kaydına koyması gerekir. Yazıcı, disk sürücüsü vb. gibi bir aygıtın tedarikçisi, aygıta ilişkin olası ikincil adresleri ve bunların anlamlarını sağlar. Kanalın ikincil bir adrese ihtiyacı varsa, programcının bunu cihazla (çevre birimi) birlikte verilen belgeden alması gerekir. İkincil adres (sayı) gerekliyse, programcının SETLFS alt yordamını çağırmadan önce bunu µP Y kaydına koyması gerekir. İkincil bir adrese gerek yoksa, programcının SETLFS alt yordamını çağırmadan önce $FF numarasını µP Y kaydına koyması gerekir.

SETLFS altyordamı herhangi bir argüman olmadan çağrılır. Argümanları zaten 6502 µP'nin üç kaydında yer alıyor. Uygun sayıları kayıtlara yerleştirdikten sonra, rutin programda ayrı bir satırda aşağıdaki ifadeyle çağrılır:

JSR SETLFS'leri

Rutin, farklı sayıları uygun şekilde dosya tablolarına yerleştirir.

İşletim Sistemi SETPAM Rutini
OS SETPAM Rutinine, $FFBD'deki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Tüm hedeflerin dosya adları yoktur. Hedefleri olanlar için (diskteki dosyalar gibi) dosya adı ayarlanmalıdır. Dosya adının tırnak işaretleri olmadan 7 bayttan oluşan “mydocum” olduğunu varsayalım. Bu adın $C101 ila $C107 konumlarında (dahil) olduğunu ve $07 uzunluğunun $C100 konumunda olduğunu varsayalım. Dize karakterlerinin başlangıç ​​adresi $C101'dir. Başlangıç ​​adresinin düşük baytı $01 ve yüksek baytı $C1'dir.

SETPAM rutinini çağırmadan önce programcının $07 (dizinin uzunluğu) sayısını µP akümülatörüne koyması gerekir. $01 dizisinin başlangıç ​​adresinin alt baytı µP X kaydına konur. $C1 dizisinin başlangıç ​​adresinin yüksek baytı µP Y kaydına konur. Alt program basitçe aşağıdaki şekilde çağrılır:

JSR SETNAM

SETNAM rutini, üç kayıttan gelen değerleri kanalla ilişkilendirir. Bundan sonra değerlerin kayıtlarda kalmasına gerek yoktur. Kanalın bir dosya adına ihtiyacı yoksa programcının µP akümülatörüne 00$ koyması gerekir. Bu durumda X ve Y kayıtlarındaki değerler dikkate alınmaz.

İşletim Sistemi AÇIK Rutini
OS OPEN Rutine, $FFC0'daki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Bu rutin, ortak bilgisayar ile harici cihazdaki dosya veya harici cihazın kendisi arasında bir bağlantı sağlamak için mantıksal dosya numarasını, cihaz numarasını (ve arabelleği), olası bir ikincil adresi ve olası bir dosya adını kullanır.

Bu rutin, diğer tüm Commodore OS ROM rutinleri gibi hiçbir tartışmaya dayanmaz. µP kayıtlarını kullanmasına rağmen, kayıtların hiçbirinin bunun için argümanlar (değerler) ile önceden yüklenmesi gerekmiyordu. Kodlamak için SETLFS ve SETPAM çağrıldıktan sonra aşağıdakini yazmanız yeterlidir:

JSR AÇIK

OPEN rutininde hatalar meydana gelebilir. Örneğin, dosya okumak için bulunamayabilir. Bir hata oluştuğunda, rutin başarısız olur ve karşılık gelen hata numarasını µP akümülatörüne koyar ve µP durum kaydının taşıma bayrağını (1'e) ayarlar. Aşağıdaki tabloda hata numaraları ve anlamları verilmektedir:

Tablo 5.51
OS ROM OPEN Rutini İçin Çekirdek Hata Numaraları ve Anlamları
Yanlış numara Tanım Örnek
1 ÇOK FAZLA DOSYA On dosya zaten açıldığında AÇIK
2 DOSYA AÇ AÇIK 1,3: AÇIK 1,4
3 DOSYA AÇILMADI OPEN olmadan PRINT#5
4 DOSYA BULUNAMADI YÜK “YOK”,8
5 CİHAZ MEVCUT DEĞİL AÇ 11,11: BASKI#11
6 DOSYA GİRİLMEDİ AÇ “SIRA,S,W”: GET#8,X$
7 DOSYASI ÇIKTI DEĞİL AÇ 1,0: YAZDIR#1
8 EKSİK DOSYA ADI YÜK “”,8
9 YASA DIŞI CİHAZ NO. “PROGRAMI” YÜKLE,3

Bu tablo okuyucunun pek çok yerde görebileceği şekilde sunulmuştur.

OS CHKIN Rutini
OS CHKIN Rutinine, $FFC6'daki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Bir dosyayı (mantıksal dosya) açtıktan sonra, açılışın giriş için mi yoksa çıkış için mi olduğuna karar verilmesi gerekir. CHKIN rutini, açılışı bir giriş kanalı haline getirir. Bu rutinin mantıksal dosya numarasını µP X kaydından okuması gerekir. Dolayısıyla programcının bu rutini çağırmadan önce mantıksal dosya numarasını X kaydına koyması gerekir. Basitçe şöyle denir:

JSR CHKIN

OS CHKOUT Rutini
OS CHKOUT Rutinine, $FFC9'daki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Bir dosyayı (mantıksal dosya) açtıktan sonra, açılışın giriş için mi yoksa çıkış için mi olduğuna karar verilmesi gerekir. CHKOUT rutini, açılışı bir çıkış kanalı haline getirir. Bu rutinin mantıksal dosya numarasını µP X kaydından okuması gerekir. Dolayısıyla programcının bu rutini çağırmadan önce mantıksal dosya numarasını X kaydına koyması gerekir. Basitçe şöyle denir:

JSR CHKOUT

OS KAPATMA Rutini
OS CLOSE Rutinine, $FFC3'teki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Mantıksal bir dosya açıldıktan ve baytlar aktarıldıktan sonra mantıksal dosyanın kapatılması gerekir. Mantıksal dosyayı kapatmak, sistem birimindeki arabelleği, henüz açılacak olan başka bir mantıksal dosya tarafından kullanılmak üzere serbest bırakır. Üç dosya tablosundaki karşılık gelen parametreler de silinir. Açık dosya sayısı için RAM konumu 1 azaltılır.

Bilgisayara enerji verildiğinde, ana kart üzerindeki mikroişlemci ve diğer ana yongalar (tümleşik devreler) için donanım sıfırlaması yapılır. Bunu, bazı RAM bellek konumlarının ve anakart üzerindeki bazı yongalardaki bazı kayıtların başlatılması takip eder. Başlatma işleminde, sıfır sayfadaki $0098 adresinin bayt hafızasındaki konumu, işletim sisteminin sürümüne bağlı olarak NFILES veya LDTND etiketiyle verilir. Bilgisayar çalışırken, 8 bitlik bu bir baytlık konum, açılan mantıksal dosyaların sayısını ve ardışık üç dosya tablosunun başlangıç ​​adresi dizinini tutar. Başka bir deyişle, bu bayt, mantıksal dosya kapatıldığında 1 azaltılan açık dosya sayısına sahiptir. Mantıksal dosya kapatıldığında, terminal (hedef) cihazına veya diskteki gerçek dosyaya erişim artık mümkün değildir.

Mantıksal bir dosyayı kapatmak için programcının mantıksal dosya numarasını µP akümülatörüne koyması gerekir. Bu, dosyayı açarken kullanılanla aynı mantıksal dosya numarasıdır. Belirli bir dosyayı kapatmak için CLOSE rutininin buna ihtiyacı vardır. Diğer OS ROM rutinleri gibi CLOSE rutini de bir argüman almaz, ancak akümülatörden kullanılan değer bir nevi argümandır. Montaj dili talimat satırı basitçe şöyledir:

JSR KAPAT

Özel veya önceden tanımlanmış 6502 derleme dili alt yordamları (rutinleri) bağımsız değişken almaz. Ancak argümanlar, altprogramın kullanacağı değerlerin mikroişlemci kayıtlarına yerleştirilmesiyle gayri resmi olarak gelir.

CLRCHN Rutini
OS CLRCHN Rutinine, $FFCC'deki OS ROM atlama tablosuna (JSR) atlanarak erişilir. CLRCHN, CLeaR CHANNEL anlamına gelir. Mantıksal bir dosya kapatıldığında mantıksal dosya numarası, cihaz numarası ve olası ikincil adres parametreleri silinir. Böylece mantıksal dosyanın kanalı temizlenir.

Kılavuz, OS CLRCHN rutininin tüm açık kanalları sildiğini ve varsayılan cihaz numaralarını ve diğer varsayılanları geri yüklediğini söylüyor. Bu, çevre biriminin cihaz numarasının değiştirilebileceği anlamına mı geliyor? Pek iyi değil. İşletim sisteminin başlatılması sırasında, bilgisayar çalışırken geçerli giriş cihazı numarasını tutmak için 0099 $ adresinin bayt konumu DFLTI etiketiyle birlikte verilir. Commodore-64 aynı anda yalnızca bir çevre birimine erişebilir. İşletim sisteminin başlatılması sırasında, bilgisayar çalışırken mevcut çıkış aygıtı numarasını tutmak için $009A adresinin bayt konumu DFLTO etiketiyle birlikte verilir.

CLRCHN altyordamı çağrıldığında, DFLTI değişkenini varsayılan giriş cihazı numarası (klavye) olan 0'a ($00) ayarlar. DFLTO değişkenini, varsayılan çıkış cihazı numarası (ekran) olan 3'e (03 $) ayarlar. Diğer cihaz numarası değişkenleri de benzer şekilde sıfırlanır. Giriş/çıkış aygıtlarını normale (varsayılan değerlere) sıfırlamanın (veya geri yüklemenin) anlamı budur.

Commodore-64 kılavuzu, CLRCHN rutini çağrıldıktan sonra açılan mantıksal dosyaların açık kaldığını ve baytları (verileri) iletmeye devam edebileceğini söylüyor. Bu, CLRCHN rutininin dosya tablolarındaki karşılık gelen girişleri silmediği anlamına gelir. CLRCHN adı, anlamı açısından oldukça belirsizdir.

5.6 Karakterin Ekrana Gönderilmesi

Karakterlerin ve grafiklerin ekrana görüntülenmesini sağlayan ana entegre devre (IC), Commodore-64'te (aslında VIC sürüm 2 için VIC II) VIC olarak kısaltılan Video Arayüzü Denetleyicisi (çip) olarak adlandırılır. Bir bilginin (değerin) ekrana ulaşabilmesi için ekrana ulaşmadan önce VIC II'den geçmesi gerekmektedir.

Ekran 25 satır ve 40 sütun karakter hücresinden oluşur. Bu, ekranda görüntülenebilecek 40 x 25 = 1000 karakter anlamına gelir. VIC II, karakterler için karşılık gelen 1000 bellek RAM ardışık bayt konumunu okur. Bu 1000 konumun tümüne ekran belleği denir. Bu 1000 konuma giren şey karakter kodlarıdır. Commodore-64 için karakter kodları ASCII kodlarından farklıdır.

Karakter kodu bir karakter deseni değildir. Karakter ROM'u olarak bilinen bir şey de var. Karakter ROM'u, bazıları klavyedeki karakter desenlerine karşılık gelen her türlü karakter deseninden oluşur. Karakter ROM'u ekran belleğinden farklıdır. Ekranda bir karakter görüntüleneceği zaman, karakter kodu ekran belleğindeki 1000 konum arasında bir konuma gönderilir. Buradan, ekranda görüntülenecek karakter ROM'undan ilgili desen seçilir. Karakter kodundan karakter ROM'undaki doğru desenin seçilmesi VIC II (donanım) tarafından yapılır.

$D000 ile $DFFF arasındaki birçok bellek konumunun iki amacı vardır: ekran dışındaki giriş/çıkış işlemlerini gerçekleştirmek için kullanılırlar veya ekran için karakter ROM'u olarak kullanılırlar. İki bellek bloğu söz konusudur. Biri RAM, diğeri karakter ROM'u için ROM. Giriş/çıkış veya karakter desenlerini (karakter ROM) işlemek için bankaların değiştirilmesi yazılım tarafından yapılır (ROM'daki işletim sisteminin rutini $F000'den $FFFF'ye).

Not : VIC, $D000 ve $DFFF aralığındaki bellek alanı adresleriyle adreslenen kayıtlara sahiptir.

CHROUT Rutini
OS CHROUT Rutinine $FFD2 konumundaki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Bu rutin çağrıldığında programcının µP akümülatörüne koyduğu baytı alır ve imlecin bulunduğu ekrana yazdırır. Örneğin “E” karakterini yazdırmak için kullanılan kod bölümü şöyledir:

LDA#05$
CHROUT

0516, “E”nin ASCII kodu değildir. Commodore-64'ün ekran için kendi karakter kodları vardır; burada 05 $, 'E' anlamına gelir. #$05 numarası, VIC ekrana göndermeden önce ekran belleğine yerleştirilir. Bu iki kodlama satırı, kanal kurulduktan, mantıksal dosya açıldıktan ve çıkış için CHKOUT rutini çağrıldıktan sonra gelmelidir. Kodun tamamı şöyledir:

; Kurulum kanalı
LDA#40$; mantıksal dosya numarası
LDX #03$; ekran için cihaz numarası 03$
LDY #$FF ; ikincil adres yok
JSR SETLFS; kanalı uygun şekilde ayarla
; ekranın bir isme ihtiyacı olmadığından SERNAM yok
;
; Mantıksal dosyayı aç
JSR AÇIK
; Çıkış için kanalı ayarla
LDX#40$; mantıksal dosya numarası
JSR CHKOUT
;
; Karakteri ekrana aktar
LDA#05$
JSR CHROUT
; Mantıksal dosyayı kapat
LDA#40$
JSR KAPAT

Başka bir program çalıştırılmadan önce açıklığın kapatılması gerekir. Bilgisayar kullanıcısının beklendiği anda klavyeye bir karakter yazdığını varsayalım. Aşağıdaki program klavyeden ekrana bir karakter yazdırır:

; Kurulum kanalı
LDA#40$; mantıksal dosya numarası
LDX #03$; ekran için cihaz numarası 03$
LDY #$FF ; ikincil adres yok
JSR SETLFS; kanalı uygun şekilde ayarla
; ekranın bir isme ihtiyacı olmadığından SERNAM yok
;
; Mantıksal dosyayı aç
JSR AÇIK
; Çıkış için kanalı ayarla
LDX#40$; mantıksal dosya numarası
JSR CHKOUT
;
; Klavyeden karakter girişi
JSR GETIN'İ BEKLEYİN; klavye sırası boşsa A'ya 00 $ koyar
CMP #$00 ; Eğer 00$ A'ya gittiyse, karşılaştırmada Z 1'dir
BEQ BEKLEYİN; 0 akümülatöre giderse tekrar kuyruktan GETIN
BNE PRNSCRN; Z 0 ise PRNSCRN'ye gidin çünkü A'nın artık 00$'ı yoktur
; Karakteri ekrana aktar
PRNSCRN JSR CHROUT; A'daki karakteri ekrana gönder
; Mantıksal dosyayı kapat
LDA#40$
JSR KAPAT

Not : WAIT ve PRNSCRN adresleri tanımlayan etiketlerdir. µP akümülatörüne klavyeden gelen bayt bir ASCII kodudur. Commodore-64'ün ekrana göndereceği ilgili kodun farklı olması gerekmektedir. Basitlik açısından önceki programda bu dikkate alınmamıştır.

5.7 Disk Sürücüsü için Bayt Gönderme ve Alma

Commodore-64'ün sistem biriminde (anakart) VIA #1 ve CIA #2 olarak adlandırılan iki Karmaşık Arayüz Adaptörü bulunmaktadır. Her CIA'in Port A ve Port B olarak adlandırılan iki paralel portu bulunmaktadır. Commodre-64 sistem ünitesinin arka kısmında dikey yüzeyde seri port olarak adlandırılan harici bir port bulunmaktadır. Bu portta biri veri için olmak üzere 6 pin bulunmaktadır. Veriler sistem birimine seri olarak, her defasında bir bit olarak girer veya çıkar.

Örneğin, CIA #2'nin dahili Port A'sından gelen sekiz paralel bit, CIA'daki bir kaydırma yazmacı tarafından seri verilere dönüştürüldükten sonra harici seri port aracılığıyla sistem ünitesinin dışına çıkabilir. Harici seri bağlantı noktasından gelen sekiz bitlik seri veriler, CIA'deki bir kaydırma yazmacı tarafından paralel verilere dönüştürüldükten sonra CIA #2'nin dahili Bağlantı Noktası A'ya gidebilir.

Commodore-64 sistem birimi (ana birim), disketli bir harici disk sürücüsü kullanır. Bu disk sürücüsüne bir yazıcı, papatya zinciri şeklinde bağlanabilir (aygıtları bir dizi halinde seri olarak bağlamak). Disk sürücüsünün veri kablosu Commodore-64 sistem biriminin harici seri bağlantı noktasına bağlanır. Bu, zincirleme bağlanmış bir yazıcının da aynı seri bağlantı noktasına bağlı olduğu anlamına gelir. Bu iki cihaz, iki farklı cihaz numarasıyla tanımlanır (tipik olarak sırasıyla 8 ve 4).

Disk sürücüsüne veri göndermek veya almak, daha önce açıklanan prosedürün aynısını takip eder. Yani:

  • SETPAM rutinini kullanarak gerçek disk dosyasıyla aynı olan mantıksal dosya adının (sayısının) ayarlanması.
  • OPEN rutinini kullanarak mantıksal dosyayı açma.
  • CHKOUT veya CHKIN rutinini kullanarak girdi mi yoksa çıktı mı olduğuna karar vermek.
  • STA ve/veya LDA komutunu kullanarak verileri gönderme veya alma.
  • CLOSE rutinini kullanarak mantıksal dosyayı kapatma.

Mantıksal dosya kapatılmalıdır. Mantıksal dosyanın kapatılması söz konusu kanalı etkili bir şekilde kapatır. Disk sürücüsü için kanal ayarlanırken mantıksal dosya numarasına programcı tarafından karar verilir. 00 $ ile $FF (dahil) arasında bir sayıdır. Başka bir cihaz (veya gerçek dosya) için önceden seçilmiş bir sayı olmamalıdır. Yalnızca bir disk sürücüsü varsa aygıt numarası 8'dir. İkincil adres (numara) disk sürücüsünün kılavuzundan alınır. Aşağıdaki program 2'yi kullanmaktadır. Program, diskteki “mydoc.doc” adlı dosyaya “E” harfini (ASCII) yazar. Bu ismin $C101 hafıza adresinden başladığı varsayılır. Bu nedenle, SETNAM rutini çağrılmadan önce $01'in düşük baytı X kaydında olmalı ve $C1'in yüksek baytı Y kaydında olmalıdır. A kaydı aynı zamanda SETNAM rutini çağrılmadan önce $09 numarasına da sahip olmalıdır.

; Kurulum kanalı
LDA#40$; mantıksal dosya numarası
LDX #08$; ilk disk sürücüsü için cihaz numarası
LDY#02$; ikincil adres
JSR SETLFS; kanalı uygun şekilde ayarla
;
; Disk sürücüsündeki dosyanın bir adı olması gerekiyor (halihazırda bellekte)
LDA#09$
LDX#01$
LDY#$C1
JSR SETNAM
; Mantıksal dosyayı aç
JSR AÇIK
; Çıkış için kanalı ayarla
LDX#40$; mantıksal dosya numarası
JSR CHKOUT;yazmak için
;
; Karakteri diske aktar
LDA#45$
JSR CHROUT
; Mantıksal dosyayı kapat
LDA#40$
JSR KAPAT

Diskten bir baytı µP Y kaydına okumak için önceki programı aşağıdaki değişikliklerle tekrarlayın: “JSR CHKOUT ; yazmak için”, “JSR CHKIN; okumak için'. “; için kod bölümünü değiştirin; Karakteri diske çıkar” komutunu aşağıdakilerle birlikte verin:

; Diskten karakter girişi
JSR CHRIS

OS CHRIN rutinine $FFCF adresindeki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Bu rutin çağrıldığında, halihazırda giriş kanalı olarak ayarlanmış bir kanaldan bir bayt alır ve bunu µP A kaydına koyar. GETIN ROM OS rutini CHRIN yerine de kullanılabilir.

Yazıcıya Bayt Gönderme
Yazıcıya bayt göndermek, diskteki bir dosyaya bayt göndermeye benzer şekilde yapılır.

5.8 İşletim Sistemi Kaydetme Rutini

OS SAVE Rutinine, $FFD8'deki OS ROM atlama tablosuna (JSR) atlanarak erişilir. ROM'daki OS SAVE rutini, belleğin bir bölümünü bir dosya olarak (bir adla) diske kaydeder (döker). Bellekteki bölümün başlangıç ​​adresinin bilinmesi gerekmektedir. Bölümün bitiş adresinin de bilinmesi gerekir. Başlangıç ​​adresinin alt baytı, RAM'de 002 milyar $ adresindeki sıfır sayfasına yerleştirilir. Başlangıç ​​adresinin yüksek baytı, $002C adresindeki bir sonraki bayt hafıza konumuna yerleştirilir. Sıfır sayfada, TXTTAB etiketi bu iki adresi ifade ediyor, ancak TXTTAB aslında 002 milyar dolarlık adres anlamına geliyor. Bitiş adresinin alt baytı µP X kaydına yerleştirilir. Bitiş adresinin yüksek baytı artı 1 µP Y kaydına yerleştirilir. µP A kaydı TXTTAB için 2 milyar $ (002 milyar $) değerini alır. Bununla SAVE rutini aşağıdakilerle çağrılabilir:

JSR KAYDET

Belleğin kaydedilecek bölümü bir montaj dili programı veya bir belge olabilir. Bir belgenin örneği bir mektup veya bir makale olabilir. Kaydetme rutinini kullanmak için aşağıdaki prosedür izlenmelidir:

  • SETLFS rutinini kullanarak kanalı ayarlayın.
  • SETPAM rutinini kullanarak gerçek disk dosyasınınkiyle aynı olan mantıksal dosyanın adını (sayısını) ayarlayın.
  • OPEN rutinini kullanarak mantıksal dosyayı açın.
  • CHKOUT kullanarak çıktı için dosya yapın.
  • Dosyayı kaydetme kodu buraya gelecek ve “JSR SAVE” ile bitecektir.
  • CLOSE rutinini kullanarak mantıksal dosyayı kapatın.

Aşağıdaki program, $C101 ile $C200 arasındaki bellek konumlarından başlayan bir dosyayı kaydeder:

; Kurulum kanalı
LDA#40$; mantıksal dosya numarası
LDX #08$; ilk disk sürücüsü için cihaz numarası
LDY#02$; ikincil adres
JSR SETLFS; kanalı uygun şekilde ayarla
;
; Disk sürücüsündeki dosyanın adı (halihazırda $C301 adresindeki bellekte)
LDA#09$; dosya adının uzunluğu
LDX#01$
LDY#$C3
JSR SETNAM
; Mantıksal dosyayı aç
JSR AÇIK
; Çıkış için kanalı ayarla
LDX#40$; mantıksal dosya numarası
JSR CHKOUT; yazmak için
;
; Dosyayı diske aktar
LDA#01$
STA $2 milyar; TXTTAB
LDA #$C1
STA 2 milyon dolar
LDX#00$
LDY#$C2
LDA #2 Milyar Dolar
JSR KAYDET
; Mantıksal dosyayı kapat
LDA#40$
JSR KAPAT

Bunun, belleğin başka bir bölümünü (program bölümünü değil) diske (Commodore-64 disketi) kaydeden bir program olduğunu unutmayın.

5.9 İşletim Sistemi YÜKLEME Rutini

OS LOAD Rutinine $FFD5 konumundaki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Belleğin bir bölümü (geniş alanı) diske kaydedildiğinde, bölümün başlangıç ​​adresini içeren bir başlık ile bellekte kaydedilir. OS LOAD alt yordamı bir dosyanın baytlarını belleğe yükler. Bu YÜKLEME işlemiyle akümülatörün değeri 010 (00$) olmalıdır. LOAD işleminin diskteki dosya başlığındaki başlangıç ​​adresini okuyup bu adresten başlayarak dosya baytlarını RAM'e yerleştirmesi için kanalın ikincil adresinin 1 veya 2 olması gerekir (aşağıdaki program 2'yi kullanır). Bu rutin, yüklenen en yüksek RAM konumunun adresi artı 1'ini döndürür. Bu, RAM artı 1'deki dosyanın son adresinin düşük baytının µP X kaydına konulduğu ve RAM artı 1'deki dosyanın son adresinin yüksek baytının µP Y kaydına konulduğu anlamına gelir.

Yükleme başarısız olursa µP A kaydı hata numarasını (muhtemelen 4, 5, 8 veya 9) tutar. Mikroişlemci durum kaydının C bayrağı da ayarlanır (1 yapılır). Yükleme başarılı olursa A kaydının son değeri önemli değildir.

Şimdi, bu çevrimiçi kariyer kursunun bir önceki bölümünde, Assembly dili programının ilk talimatı, programın başladığı RAM'deki adrestedir. Böyle olmak zorunda değil. Bu, bir programın ilk komutunun RAM'deki programın başında olması gerekmediği anlamına gelir. Bir programın başlatma talimatı RAM'deki dosyanın herhangi bir yerinde olabilir. Programcıya, montaj dili talimatını başlatacak olan komutu START ile etiketlemesi tavsiye edilir. Bununla birlikte, program yüklendikten sonra aşağıdaki montaj dili talimatıyla yeniden çalışır (yürütülür):

JSR BAŞLANGIÇ

Çalıştırılacak programı yükleyen montaj dili programında “JSR START” bulunmaktadır. Başka bir derleme dili dosyasını yükleyen ve yüklenen dosyayı çalıştıran bir derleme dili aşağıdaki kod prosedürüne sahiptir:

  • SETLFS rutinini kullanarak kanalı ayarlayın.
  • SETPAM rutinini kullanarak gerçek disk dosyasınınkiyle aynı olan mantıksal dosyanın adını (sayısını) ayarlayın.
  • OPEN rutinini kullanarak mantıksal dosyayı açın.
  • CHKIN'i kullanarak giriş dosyasını yapın.
  • Dosyayı yükleme kodu buraya gelir ve “JSR LOAD” ile biter.
  • CLOSE rutinini kullanarak mantıksal dosyayı kapatın.

Aşağıdaki program diskten bir dosya yükler ve çalıştırır:

; Kurulum kanalı
LDA#40$; mantıksal dosya numarası
LDX #08$; ilk disk sürücüsü için cihaz numarası
LDY#02$; ikincil adres
JSR SETLFS; kanalı uygun şekilde ayarla
;
; Disk sürücüsündeki dosyanın adı (halihazırda $C301 adresindeki bellekte)
LDA#09$; dosya adının uzunluğu
LDX#01$
LDY#$C3
JSR SETNAM
; Mantıksal dosyayı aç
JSR AÇIK
; Giriş için kanalı ayarlayın
LDX#40$; mantıksal dosya numarası
JSR CHKIN; okumak için
;
; Diskten dosya girişi
LDA#00$
JSR YÜKÜ
; Mantıksal dosyayı kapat
LDA#40$
JSR KAPAT
; Yüklenen programı başlat
JSR BAŞLANGIÇ

5.10 Modem ve RS-232 Standardı

Modem, bilgisayardan gelen bitleri telefon hattı üzerinden iletilecek ilgili elektrik ses sinyallerine dönüştüren bir cihazdır (çevre birimi). Alıcı tarafta, alıcı bilgisayardan önce bir modem bulunur. Bu ikinci modem, elektrik ses sinyallerini alıcı bilgisayar için bitlere dönüştürür.

Modemin bilgisayara harici bir bağlantı noktasından (bilgisayarın dikey yüzeyinde) bağlanması gerekir. RS-232 standardı, bir modemi bilgisayara bağlayan (geçmişte) belirli bir konektör tipini ifade eder. Başka bir deyişle, geçmişte birçok bilgisayarda RS-232 konektörü veya RS-232 uyumlu konektör olan harici bir bağlantı noktası vardı.

Commodore-64 Sistem Biriminin (bilgisayarın) arka dikey yüzeyinde kullanıcı portu adı verilen harici bir port bulunmaktadır. Bu kullanıcı portu RS-232 uyumludur. Buraya bir modem cihazı bağlanabilir. Commodore-64 bu kullanıcı portu üzerinden modemle iletişim kurar. Commodore-64'ün ROM işletim sistemi, RS-232 rutinleri adı verilen bir modemle iletişim kurmak için alt rutinlere sahiptir. Bu rutinlerin atlama tablosunda girişleri vardır.

Baud Hızı
Bilgisayardan gelen sekiz bitlik bayt, modeme gönderilmeden önce sekiz bitlik bir diziye dönüştürülür. Bunun tersi modemden bilgisayara yapılır. Baud hızı, seri olarak saniyede iletilen bit sayısıdır.

Belleğin Alt Kısmı
“Belleğin Alt Kısmı” terimi, 0000 $ adresinin hafıza bayt konumunu ifade etmez. Kullanıcının veri ve programlarını yerleştirmeye başlayabileceği en düşük RAM konumunu ifade eder. Varsayılan olarak 0800$'dır. Önceki tartışmadan, 0800 $ ile $BFFF arasındaki konumların çoğunun BASIC bilgisayar dili ve programcıları (kullanıcıları) tarafından kullanıldığını hatırlayın. Montaj dili programları ve verileri için yalnızca $C000 ile $CFFF arasındaki adres konumları kalmıştır; bu, belleğin 64 Kbyte'ının 4 Kbyte'ıdır.

Belleğin Üstü
Müşterilerin Commodore-64 bilgisayarlarını satın aldığı o günlerde, bazıları tüm bellek konumlarıyla birlikte gelmiyordu. Bu tür bilgisayarların işletim sistemi $E000 ile $FFFF arasında değişen ROM'ları vardı. 0000 $'dan E000 $'ın yanında $DFFF olmayan bir limite kadar RAM'leri vardı. Limit $DFFF'nin altındaydı ve bu limite 'Belleğin Üstü' adı veriliyor. Bu nedenle, belleğin üstü $FFFF konumunu ifade etmez.

RS-232 İletişimi için Commodore-64 Tamponları
Aktarım Tamponu
RS-232 aktarımı (çıkış) için arabellek, belleğin üst kısmından aşağıya doğru 256 bayt alır. Bu iletim arabelleğinin işaretçisi ROBUF olarak etiketlenmiştir. Bu işaretçi, $00F9 adresleri ve ardından $00FA ile sıfır sayfadadır. ROBUF aslında $00F9'u tanımlar. Dolayısıyla, arabelleğin başlangıç ​​adresi $BE00 ise, $BE00'in alt baytı, yani $00, $00F9 konumundadır ve $BE00'ün yüksek baytı, yani $BE, $00FA'dadır. konum.

Tampon Alma
RS-232 baytlarını (giriş) alacak arabellek, iletim arabelleğinin altından 256 bayt alır. Bu alma arabelleğinin işaretçisi RIBUF olarak etiketlenir. Bu işaretçi, $00F7 adresleri ve ardından $00F8 ile sıfır sayfadadır. RIBUF aslında $00F7'yi tanımlar. Dolayısıyla, arabelleğin başlangıç ​​adresi $BF00 ise, $BF00'ın alt baytı, yani $00, $00F7 konumundadır ve $BF00'ın yüksek baytı, yani $BF, $00F8 konumundadır. konum. Böylece belleğin üst kısmından 512 bayt, toplam RS-232 RAM arabelleği olarak kullanılır.

RS-232 Kanalı
(Harici) kullanıcı bağlantı noktasına bir modem bağlandığında, modemle iletişim yalnızca RS-232 iletişimidir. Tam bir RS-232 kanalına sahip olma prosedürü, önceki tartışmadakiyle hemen hemen aynıdır, ancak önemli bir farkla: dosya adı, bellekteki bir dize değil, bir koddur. 0610$ kodu iyi bir seçimdir. Bu, 300 bit/sn'lik baud hızı ve diğer bazı teknik parametreler anlamına gelir. Ayrıca ikincil adres yoktur. Cihaz numarasının 2 olduğunu unutmayın. Tam bir RS-232 kanalı kurma prosedürü şöyledir:

  • SETLFS rutinini kullanarak kanalı ayarlama.
  • Mantıksal dosyanın adının ayarlanması, $0610.
  • OPEN rutinini kullanarak mantıksal dosyayı açma.
  • Bunu CHKOUT kullanarak çıktı için dosya veya CHKIN kullanarak girdi için dosya haline getiriyoruz.
  • Tek baytları CHROUT ile göndermek veya tek baytları GETIN ile almak.
  • CLOSE rutinini kullanarak mantıksal dosyayı kapatma.

OS GETIN Rutinine $FFE4 adresindeki OS ROM atlama tablosuna (JSR) atlanarak erişilir. Bu rutin, çağrıldığında, alıcı arabelleğine gönderilen baytı alır ve onu µP akümülatörüne koyar (geri döndürür).

Aşağıdaki program, kullanıcının RS-232 uyumlu bağlantı noktasına bağlı olan modeme “E” (ASCII) baytını göndermektedir:

; Kurulum kanalı
LDA#40$; mantıksal dosya numarası
LDX #$02; RS-232 için cihaz numarası
LDY #$FF ; ikincil adres yok
JSR SETLFS; kanalı uygun şekilde ayarla
;
; RS-232'nin adı bir koddur; 0610$
LDA#02$; kodun uzunluğu 2 bayttır
LDX#10$
LDY#06$
JSR SETNAM
;
; Mantıksal dosyayı aç
JSR AÇIK
; Çıkış için kanalı ayarla
LDX#40$; mantıksal dosya numarası
JSR CHKOUT
;
; Karakterin RS-232'ye çıkışı örn. modem
LDA#45$
JSR CHROUT
; Mantıksal dosyayı kapat
LDA#40$
JSR KAPAT

Bayt almak için kod çok benzer, ancak 'JSR CHKOUT' yerine 'JSR CHKIN' kullanılır ve:

LDA#45$
JSR CHROUT

sonuç A kaydına yerleştirilecek şekilde “JSR GETIN” ile değiştirilir.

Baytların sürekli gönderilmesi veya alınması, sırasıyla kod bölümünün gönderilmesi veya alınması için bir döngü tarafından yapılır.

Bazı rutinlerin programcı tarafından çağrılmadığı ancak işletim sistemi tarafından çağrıldığı klavye dışında, Commodore'un giriş ve çıkışının çoğu durumda benzer olduğunu unutmayın.

5.11 Sayma ve Zamanlama

Geri sayım sırasını düşünün:

2, 1, 0

Bu 2'den 0'a doğru geri sayımdır. Şimdi tekrarlanan geri sayım dizisini düşünün:

2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0

Bu, aynı dizinin tekrar tekrar geri sayılmasıdır. Sıra dört kez tekrarlanır. Dört kez, zamanlamanın 4 olduğu anlamına gelir. Bir sıra içinde sayma yapılır. Aynı sıranın tekrarlanması zamanlamadır.

Commodore-64'ün sistem biriminde iki adet Kompleks Arayüz Adaptörü bulunmaktadır. Her CIA'nın Zamanlayıcı A (TA) ve Zamanlayıcı B (TB) adında iki sayaç/zamanlayıcı devresi vardır. Sayma devresi zamanlama devresinden farklı değildir. Commodore-64'teki sayaç veya zamanlayıcı da aynı şeyi ifade eder. Aslında her ikisi de esasen sistem saati darbelerinde her zaman 0'a kadar geri sayan 16 bitlik bir kaydı ifade eder. 16 bitlik kayıt defterine farklı değerler ayarlanabilir. Değer ne kadar büyük olursa sıfıra kadar geri saymanın süresi de o kadar uzun olur. Zamanlayıcılardan biri sıfırı geçtiğinde, IRQ kesme sinyali mikroişlemciye gönderilir. Sayım sıfırın altına düştüğünde buna yetersiz akış denir.

Zamanlayıcı devresinin nasıl programlandığına bağlı olarak bir zamanlayıcı tek seferlik modda veya sürekli modda çalışabilir. Önceki çizimde tek seferlik mod '2, 1, 0 yap' ve saat darbeleri devam ederken durma anlamına gelir. Sürekli mod '2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0 vb.' gibidir. bu saat darbeleriyle devam eder. Bu, sıfırı geçtiğinde herhangi bir talimat verilmediği takdirde geri sayım dizisinin tekrarlanacağı anlamına gelir. En büyük sayı genellikle 2'den çok daha büyüktür.

CIA #1'in Zamanlayıcısı A (TA) şunu üretir: IRQ Klavyenin bakımını yapmak için düzenli aralıklarla (sürelerle) bakım yapın. Aslında bu, varsayılan olarak her saniyenin 1/60'ında birdir. IRQ Saniyenin 1/60'ında bir mikroişlemciye gönderilir. Sadece ne zaman IRQ bir programın klavye kuyruğundan (arabellek) bir anahtar değeri okuyabileceği gönderilir. Mikroişlemcinin yalnızca bir pini olduğunu unutmayın. IRQ sinyal. Mikroişlemcinin ayrıca yalnızca bir pini vardır. NMI sinyal. Mikroişlemciye giden ¯NMI sinyali her zaman CIA #2'den gelir.

16 bitlik zamanlayıcı kaydının iki bellek adresi vardır: biri düşük bayt için, diğeri yüksek bayt için. Her CIA'nın iki zamanlayıcı devresi vardır. İki CIA birbirinin aynısı. CIA #1 için, iki zamanlayıcının adresleri şunlardır: TA için DC04 ve DC05 ve TB için DC06 ve DC07. CIA #2 için, iki zamanlayıcının adresleri şunlardır: TA için DD04 ve DD05 ve TB için DD06 ve DD07.

25510 sayısının geri sayım için CIA #2'nin TA zamanlayıcısına gönderileceğini varsayalım. 25510 = 00000000111111112 on altı bitten oluşur. 00000000111111112 = $000FFF onaltılık tabandadır. Bu durumda $FF, $DD04 adresindeki kayda gönderilir ve $00, $DD05 adresindeki kayda gönderilir - çok az endianness. Aşağıdaki kod bölümü numarayı kayda gönderir:

LDA #$FF
DEVLET $DD04 $
LDA#00$
DEVLET $DD05 $

Bir CIA'daki kayıtların RAM adresleri olmasına rağmen fiziksel olarak CIA'dadırlar ve CIA, RAM veya ROM'dan ayrı bir IC'dir.

Hepsi bu degil! Önceki kodda olduğu gibi zamanlayıcıya geri sayım için bir sayı verildiğinde geri sayım başlamaz. Geri sayım, zamanlayıcı için ilgili kontrol kaydına sekiz bitlik bir bayt gönderildiğinde başlar. Kontrol kaydı için bu baytın ilk biti geri sayımın başlayıp başlamayacağını gösterir. Bu ilk bit için 0 değeri geri sayımın durdurulması, 1 değeri ise geri sayımın başlatılması anlamına gelir. Ayrıca bayt, geri sayımın tek atış (tek seferlik) modunda mı yoksa serbest çalışma modunda mı (sürekli mod) olduğunu belirtmelidir. Tek atış modu geri sayım yapar ve zamanlayıcı kaydının değeri sıfır olduğunda durur. Serbest çalışma modunda, geri sayım 0'a ulaştıktan sonra tekrarlanır. Kontrol kaydına gönderilen baytın dördüncü (indeks 3) biti modu belirtir: 0, serbest çalışma modunu ve 1, tek atım modunu belirtir.

Tek atış modunda saymaya başlamak için uygun bir sayı onaltılık olarak 000010012 = 09 $'dır. Serbest çalışma modunda saymaya başlamak için uygun bir sayı onaltılık sistemde 000000012 = 01 $'dır. Her zamanlayıcı kaydının kendi kontrol kaydı vardır. CIA #1'de, A zamanlayıcısının kontrol kaydı DC0E16 RAM adresine sahiptir ve B zamanlayıcısının kontrol kaydı DC0F16 RAM adresine sahiptir. CIA #2'de, A zamanlayıcısının kontrol kaydı DD0E16 RAM adresine sahiptir ve B zamanlayıcısının kontrol kaydı DD0F16 RAM adresine sahiptir. Tek atış modunda CIA #2'nin TA'sındaki on altı bitlik sayıyı geri saymaya başlamak için aşağıdaki kodu kullanın:

LDA#09$
STA $DD0E

Serbest çalışma modunda CIA #2'nin TA'sındaki on altı bitlik sayıyı geri saymaya başlamak için aşağıdaki kodu kullanın:

LDA#01$
STA $DD0E

5.12 IRQ Ve NMI İstekler

6502 mikroişlemcisinde şu özellikler bulunur: IRQ Ve NMI çizgiler (pimler). Hem CIA #1 hem de CIA #2'nin her biri aşağıdaki özelliklere sahiptir: IRQ Mikroişlemci için pin. IRQ CIA #2 pini şuraya bağlı: NMI µP'nin pini. IRQ CIA #1'in pini şuraya bağlı: IRQ µP'nin pini. Bunlar mikroişlemciyi birbirine bağlayan yegâne iki kesme hattıdır. Böylece IRQ CIA #2'nin pini NMI kaynaktır ve aynı zamanda ¯NMI satırı olarak da görülebilir.

CIA #1'in, verileri oluşturmak için beş olası acil kaynağı vardır: IRQ µP için sinyal. CIA #2, yapı olarak CIA #1 ile aynıdır. Yani, CIA #2, bu sefer kesme sinyalini üretmek için aynı beş olası acil kaynağa sahiptir; NMI sinyal. µP'nin bu sinyali aldığında şunu unutmayın: NMI sinyali yönetiyorsa IRQ istek, bunu askıya alır ve NMI rica etmek. İşlemeyi bitirdiğinde NMI talebin ardından işleme devam eder IRQ rica etmek.

CIA #1 normalde harici olarak klavyeye ve joystick gibi bir oyun cihazına bağlanır. Klavye, B bağlantı noktasından daha fazla CIA #1 bağlantı noktası A'yı kullanır. Oyun cihazı, A bağlantı noktasından daha fazla CIA #1 bağlantı noktası B'yi kullanır. CIA #2 normalde harici olarak disk sürücüsüne bağlanır (yazıcıya zincirleme bağlanır) ve modem. Disk sürücüsü, B bağlantı noktasından daha fazla CIA #2 bağlantı noktası A'yı (harici seri bağlantı noktası aracılığıyla olsa da) kullanır. Modem (RS-232), bağlantı noktası A'dan daha fazla CIA #2 bağlantı noktası B'yi kullanır.

Bütün bunlarla birlikte, sistem birimi neyin sebep olduğunu nasıl biliyor? IRQ veya NMI yarıda kesmek? CIA #1 ve CIA #2'nin beş acil kesinti kaynağı var. Eğer µP'ye giden kesme sinyali NMI Kaynak, CIA #2'nin doğrudan beş kaynağından biridir. Eğer µP'ye giden kesme sinyali IRQ Kaynak, CIA #1'in doğrudan beş kaynağından biridir.

Bir sonraki soru şu: 'Sistem birimi her CIA'in beş acil kaynağı arasında nasıl ayrım yapıyor?' Her CIA'nın, Kesinti Kontrol Kaydı (ICR) olarak adlandırılan sekiz bitlik bir kaydı vardır. ICR, CIA'in her iki limanına da hizmet vermektedir. Aşağıdaki tablo, bit 0'dan başlayarak kesme kontrol kaydının sekiz bitinin anlamlarını gösterir:

Tablo 5.13
Kesinti Kontrol Kaydı
Bit Dizini Anlam
0 A zamanlayıcısının yetersiz akışıyla ayarlandı (1 yapıldı)
1 Zamanlayıcı B'nin yetersiz akışıyla ayarlanır
2 Günün Saati saatinin alarma eşit olduğu zamanı ayarlayın
3 Seri port dolduğunda ayarlayın
4 Harici cihaz tarafından ayarla
5 Kullanılmadı (0 yapıldı)
6 Kullanılmadı (0 yapıldı)
7 İlk beş bitten herhangi biri ayarlandığında ayarlayın

Tablodan da görülebileceği gibi, doğrudan kaynakların her biri ilk beş bitten biri tarafından temsil edilmektedir. Bu nedenle, µP'de kesme sinyali alındığında, kesmenin tam kaynağını bilmek amacıyla kesme kontrol kaydının içeriğini okumak için kodun çalıştırılması gerekir. CIA #1'in ICR'sinin RAM adresi DC0D16'dır. CIA #2'nin ICR'sinin RAM adresi DD0D16'dır. CIA #1'in ICR içeriğini µP akümülatörüne okumak (geri döndürmek) için aşağıdaki talimatı yazın:

LDA$DC0D

CIA #2'nin ICR içeriğini µP akümülatörüne okumak (geri döndürmek) için aşağıdaki talimatı yazın:

LDA $DD0D

5.13 Kesintiye Dayalı Arka Plan Programı

Klavye normalde mikroişlemciyi saniyenin 1/60'ında bir keser. Bir programın çalıştığını ve aşağıdaki kod bölümlerine devam etmeden önce klavyeden bir tuş bekleyecek konuma geldiğini düşünün. Klavyeden herhangi bir tuşa basılmadığında programın yalnızca küçük bir döngü yaparak bir tuşu beklediğini varsayalım. Programın çalıştığını ve klavye kesintisinin hemen ardından klavyeden bir tuş beklediğini hayal edin. Bu noktada tüm bilgisayar dolaylı olarak durur ve bekleme döngüsü döngüsü dışında hiçbir şey yapmaz. Bir sonraki klavye kesintisinin bir sonraki sayısından hemen önce bir klavye tuşuna basıldığını düşünün. Bu, bilgisayarın saniyenin altmışta biri kadar bir süre boyunca hiçbir şey yapmadığı anlamına gelir! Bu, Commodore-64 günlerinde bile bir bilgisayarın hiçbir şey yapmaması için uzun bir süre. Bilgisayar bu sürede (süre) başka bir şey yapıyor olabilir. Bir programda buna benzer pek çok süre vardır.

Bu tür “boş” sürelerde çalışacak şekilde ikinci bir program yazılabilir. Böyle bir programın ana (veya ilk) programın arka planında çalıştığı söylenir. Bunu yapmanın kolay bir yolu, klavyeden bir tuş beklendiğinde değiştirilmiş bir BRK kesme işlemini zorlamaktır.

BRK Talimatı İşaretçisi
0316 $ ve 0317 $ adreslerinin RAM ardışık konumlarında, gerçek BRK talimat rutininin işaretçisi (vektörü) bulunur. Bilgisayar ROM'daki işletim sistemi tarafından açıldığında varsayılan işaretçi buraya konur. Bu varsayılan işaretçi, OS ROM'daki varsayılan BRK talimat işleyicisine işaret eden bir adrestir. İşaretçi 16 bitlik bir adrestir. İşaretçinin düşük baytı, 0306 $ adresinin bayt konumuna yerleştirilir ve işaretçinin yüksek baytı, 0317 $ bayt konumuna yerleştirilir.

Sistem boşta iken ikinci programın bazı kodlarının sistem tarafından çalıştırılmasını sağlayacak şekilde ikinci bir program yazılabilir. Bu, ikinci programın alt programlardan oluşması gerektiği anlamına gelir. Sistem klavyeden bir tuş bekleyen 'boşta' olduğunda, ikinci program için bir sonraki alt program yürütülür. Bilgisayarla insan etkileşimi, sistem biriminin çalışmasına kıyasla yavaştır.

Bu sorunu çözmek kolaydır: Bilgisayarın klavyeden bir tuş beklemesi gerektiğinde, koda bir BRK talimatı ekleyin ve 0316 $ (ve 0317 $) işaretçisini ikincinin bir sonraki alt yordamının işaretçisiyle değiştirin ( özel) program. Bu şekilde, her iki program da tek başına çalışan ana programın süresinden çok daha uzun olmayan bir sürede çalışacaktır.

5.14 Montaj ve Derleme

Montajcı tüm etiketleri adreslerle değiştirir. Bir montaj dili programı normalde belirli bir adresten başlamak üzere yazılır. Birleştiriciden (birleştirmeden sonra) elde edilen sonuca, her şeyin ikili kodda olduğu 'nesne kodu' adı verilir. Dosya bir belge değil de bir programsa, bu sonuç yürütülebilir dosyadır. Bir belge yürütülebilir değil.

Bir uygulama birden fazla (derleme dili) programdan oluşur. Genellikle bir ana program vardır. Buradaki durumu Kesintiye Dayalı Arka Plan Programlarının durumuyla karıştırmamak gerekir. Buradaki programların tümü ön plan programlarıdır ancak bir ilk veya ana program vardır.

Birden fazla ön plan programı olduğunda derleyici yerine derleyiciye ihtiyaç vardır. Derleyici, programların her birini bir nesne koduna birleştirir. Ancak bir sorun olacaktır: Programların muhtemelen farklı kişiler tarafından yazılmış olması nedeniyle bazı kod bölümleri çakışacaktır. Derleyicinin çözümü, programların çakışmaması için bellek alanındaki ilk program dışındaki tüm çakışan programları kaydırmaktır. Şimdi, değişkenlerin saklanması söz konusu olduğunda, bazı değişken adresleri hala çakışacaktır. Buradaki çözüm, çakışan adresleri yeni adreslerle (ilk program hariç) değiştirerek artık çakışmamalarını sağlamaktır. Bu şekilde farklı programlar hafızanın farklı bölümlerine (alanlarına) uyacaktır.

Bütün bunlarla birlikte, bir programdaki bir rutinin başka bir programdaki bir rutini çağırması mümkündür. Yani derleyici bağlantıyı yapar. Bağlama, bir altyordamın başlangıç ​​adresinin bir programda bulunması ve daha sonra başka bir programda çağrılması anlamına gelir; her ikisi de uygulamanın bir parçasıdır. Bunun için her iki programın da aynı adresi kullanması gerekir. Sonuçta her şeyin ikili (bit) olduğu büyük bir nesne kodu ortaya çıkar.

5.15 Bir Programı Kaydetmek, Yüklemek ve Çalıştırmak

Bir montaj dili normalde bazı editör programlarında yazılır (bu, montajcı programıyla birlikte sağlanabilir). Editör programı, programın hafızada (RAM) nerede başlayıp nerede bittiğini gösterir. Commodore-64'ün OS ROM'unun Kernal SAVE rutini, bellekteki bir programı diske kaydedebilir. Sadece belleğin talimat çağrısını içerebilecek bölümünü (blok) diske atar. SAVE çağrısı komutunun, kaydedilen programdan ayrı tutulması tavsiye edilir, böylece program diskten belleğe yüklendiğinde, çalıştırıldığında kendini tekrar kaydetmez. Bir derleme dili programını diskten yüklemek farklı bir zorluktur çünkü program kendi kendini yükleyemez.

Bir program kendisini diskten RAM'de başlayıp bittiği yere yükleyemez. O günlerde Commodore-64'e normalde BASIC dil programlarını çalıştırmak için bir BASIC tercümanı sağlanıyordu. Makine (bilgisayar) açıldığında komut istemi ile düzelir: HAZIR. Buradan BASIC komutları veya talimatları yazdıktan sonra “Enter” tuşuna basılarak yazılabilir. Bir dosyayı yüklemek için BASIC komutu (talimat) şöyledir:

LOAD “dosya adı”,8,1

Komut, BASIC'e ayrılmış sözcük olan LOAD ile başlar. Bunu bir boşluk ve ardından çift tırnak içinde dosya adı takip eder. Başına virgül gelen 8 cihaz numarası gelir. Diskin ikincil adresi olan 1'den sonra virgül gelir. Böyle bir dosyayla, montaj dili programının başlangıç ​​adresi diskteki dosyanın başlığındadır. BASIC programı yüklemeyi bitirdiğinde, son RAM adresi artı programın 1'i döndürülür. Buradaki 'döndürülen' kelimesi, son adresin alt baytının artı 1'inin µP X kaydına konulduğu ve son adresin yüksek baytının artı 1'inin µP Y kaydına konulduğu anlamına gelir.

Programı yükledikten sonra çalıştırılması (yürütülmesi) gerekir. Programın kullanıcısının bellekteki yürütmenin başlangıç ​​adresini bilmesi gerekir. Yine burada başka bir BASIC programına ihtiyaç var. SYS komutudur. SYS komutunu çalıştırdıktan sonra, montaj dili programı çalışacak (ve duracaktır). Çalıştırma sırasında klavyeden herhangi bir giriş yapılması gerekiyorsa, montaj dili programı bunu kullanıcıya belirtmelidir. Kullanıcı klavyedeki verileri yazıp 'Enter' tuşuna bastıktan sonra, montaj dili programı BASIC yorumlayıcısının müdahalesi olmadan klavye girişini kullanarak çalışmaya devam edecektir.

Assembly Dil Programının çalıştırma (çalışma) başlangıç ​​RAM adresinin C12316 olduğunu varsayarsak, C123, SYS komutuyla kullanılmadan önce on tabanına dönüştürülür. C12316'yı on tabanına dönüştürmek aşağıdaki gibidir:

Yani BASIC SYS komutu şöyledir:

SYS 49443

5.16 Commodore-64 için Önyükleme

Commodore-64'ün önyüklemesi iki aşamadan oluşur: donanım sıfırlama aşaması ve işletim sistemi başlatma aşaması. İşletim sistemi ROM'daki Kernal'dır (diskteki değil). Bir sıfırlama hattı var (aslında RES ) 6502 µP'deki bir pin'e ve CIA 1, CIA 2 ve VIC II gibi tüm özel gemilerde aynı pin adına bağlanan. Sıfırlama aşamasında bu hat sayesinde µP ve özel çiplerdeki tüm kayıtlar 0'a sıfırlanır (her bit için sıfırlanır). Daha sonra mikroişlemci donanımı tarafından yığın işaretçisi ve işlemci durum kaydı, mikroişlemcideki başlangıç ​​değerleri ile verilir. Daha sonra program sayacına $FFFC ve $FFFD konumlarındaki değer (adres) verilir. Program sayacının bir sonraki talimatın adresini tuttuğunu hatırlayın. Burada tutulan içerik (adres), yazılımın başlatılmasını başlatan alt program içindir. Şu ana kadar her şey mikroişlemci donanımı tarafından yapılıyor. Bu aşamada hafızanın tamamına dokunulmaz. Başlatmanın bir sonraki aşaması daha sonra başlar.

Başlatma, ROM işletim sistemindeki bazı rutinler tarafından yapılır. Başlatma, özel çiplerdeki bazı kayıtlara başlangıç ​​veya varsayılan değerlerin verilmesi anlamına gelir. Başlatma, özel çiplerdeki bazı kayıtlara başlangıç ​​veya varsayılan değerlerin verilmesiyle başlar. IRQ örneğin her saniyenin 1/60'ında bir yayınlanmaya başlaması gerekir. Dolayısıyla CIA #1'deki ilgili zamanlayıcının varsayılan değerine ayarlanması gerekir.

Daha sonra Kernal bir RAM testi gerçekleştirir. Her konumu, konuma bir bayt göndererek ve onu geri okuyarak test eder. Bir fark varsa en azından o konum kötüdür. Kernal ayrıca belleğin üstünü ve altını tanımlar ve sayfa 2'de ilgili işaretçileri ayarlar. Belleğin üst kısmı $DFFF ise, $FF $0283 konumuna ve $DF $0284 bayt konumuna konur. Hem 0283 $ hem de 0284 $ HIRAM etiketine sahiptir. Belleğin alt kısmı 0800$ ise, 0281$ konumuna 00$, 0282$ konumuna 08$ konur. Hem 0281 $ hem de 0282 $ LORAM etiketine sahiptir. RAM testi aslında 0300 dolardan belleğin tepesine (RAM) kadar başlar.

Son olarak giriş/çıkış vektörleri (işaretçiler) varsayılan değerlerine ayarlanır. RAM testi aslında 0300 dolardan belleğin tepesine (RAM) kadar başlar. Bu, sayfa 0, sayfa 1 ve sayfa 2'nin başlatıldığı anlamına gelir. Özellikle Sayfa 0'da çok sayıda OS ROM işaretçisi bulunur ve sayfa 2'de çok sayıda BASIC işaretçisi bulunur. Bu işaretçilere değişkenler denir. Sayfa 1'in yığın olduğunu unutmayın. İşaretçilere değişken adı verilir çünkü adları (etiketleri) vardır. Bu aşamada ekran (monitör) için ekran hafızası temizlenir. Bu, 1000 RAM ekran konumlarına alan için 20 ABD Doları tutarındaki kodun (bu, ASCII 20 ABD Doları ile aynı olacaktır) gönderilmesi anlamına gelir. Son olarak, Kernal, monitörün (ekranın) üst kısmında HAZIR olan BASIC komut istemini görüntülemek için BASIC yorumlayıcısını başlatır.

5.17 Sorunlar

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

  1. CIA #2 bağlantı noktası A'nın tüm bitlerini çıkış ve CIA #2 bağlantı noktası B'yi giriş olarak yapan bir montaj dili kodu yazın.
  2. Bir klavye tuşuna basılana kadar bekleyen 6502 derlemeli bir dil kodu yazın.
  3. Commodore-64 ekranına “E” karakterini gönderen 6502-dereceli bir dil programı yazınız.
  4. Klavyeden bir karakter alan ve onu Commodore-64 ekranına, tuş kodunu ve zamanlamayı göz ardı ederek gönderen 6502 derlemeli bir dil programı yazın.
  5. Commodore-64 disketinden bir bayt alan 6502 derlemeli bir dil programı yazın.
  6. Bir dosyayı Commodore-64 disketine kaydeden 6502 derlemeli bir dil programı yazın.
  7. Commodore-64 disketinden bir program dosyasını yükleyen ve başlatan 6502 derlemeli bir dil programı yazın.
  8. Kullanıcıya Commodore-64'ün RS-232 uyumlu portuna bağlı olan modeme 'E' (ASCII) baytını gönderen 6502-dereceli bir dil programı yazınız.
  9. Commodore-64 bilgisayarında sayma ve zamanlamanın nasıl yapıldığını açıklayın.
  10. Commodore-64 sistem biriminin, maskelenemeyen kesme talepleri de dahil olmak üzere 10 farklı anlık kesme isteği kaynağını nasıl tanımlayabildiğini açıklayın.
  11. Commodore-64 bilgisayarında bir arka plan programının ön plandaki bir programla nasıl çalışabileceğini açıklayın.
  12. Assembly dili programlarının Commodore-64 bilgisayarı için tek bir uygulamada nasıl derlenebileceğini kısaca açıklayın.
  13. Commodore-64 bilgisayarının boot işlemini kısaca açıklayınız.