Bu sayfadaki yazılar
Sayfanın metni
Sayfa 31
COP1LC $080 BU İKİ REGİSTER, İLK COPPER COP1LCH $080 LIST'İN ADRESİNİ İÇERİR. COP1LCL $082 BU İKİ REGİSTER, İKİNCİ COP- COP2LCH $084 PERLIST'İN ADRESİNİ İÇERİR. COP2LCL $086 COPJMP1 $088 COPPER PROGRAM SAYACINA, İLK COPPERLIST'in ADRESİNİ YÜKLER. COPJMP2 $08A COPPER PROGRAM SAYACINA, İKİNCİ COPPERLIST'in ADRESİNİ YÜKLER. COPCON $02E BU REGİSTER SADECE BİR BİT İÇERİR (BİT 0).
EĞER BU BİT SET OLURSA COP-PER $040 İLE $07E ARASINDAKİ BLİTTER REGİSTER'LARINA DA ULAŞABİLİR.
İki COPxLC register'ı CopperList'in adresini içerirler. Bu copperlist'in işleme başlayabilmesi için, ilgili COPJMPx register'ına herhangi bir değer yazılması yeterlidir. COPJMPx bir strop adresidir ve buraya herhangi bir değer yazılmak istenmesi copper'ı uyarır. Bu uyarı sonucu, copper program sayaçları sıfırlanır ve ilgili copperlist adresi bu sayaçlara yüklenerek copper işletime geçer. Aşağıda yeni copperlist'in, copper'a yüklenmesi için gerekli programı veriyorum.
LEA a5 ;BASE adresi a5 registerina yükle 'Copper DMA off MOVE.L #copperlist.COP1LCH(a5) ; Copperlist adresini belirle MOVE.W ;bu adresi copper program ; sayacına transfer et #$8080,DMACON(a5) DMA on
Program, Copper'ın nasıl yükleneceğini gösteren genel bir programdır. Şimdi bir de aşağıda verdiğimiz programı deneyiniz. Bunun konusu, ekrana siyah, kırmızı ve sarı barlar çıkarmasıdır. Copperlist'in kullanımını gösteren basit fakat çok iyi bir Copper programıdır. Basit bir CopperList için örnek
;Custom Chip Registerlar
IİNTENA —$9a ;İnterrupt-Enable-Register (write) DMACON $96 ;DMA -kontrol Register (write) COLOR00 —$180 ;Color palet register O
;Copper registerları
COPİLC adres registeri COP2LC .copperlistin adres registeri COPJMP1 atla COPJMP2 ;2.copperliste atla
;CIA-A port register'ı (Mouse tuşu için)
CIAAPRA — $BFE001
;Exec Library Base Ofsetleri
OpenLibrary1 ;Libİsmi, Version/a1,dO Forbid Petmit AllocMem ;Byte uzunluğu,istek/dO,d1 FreeMem ;Hafıza adresi,byte
;Graphics Base
StartList —38 ;Diğer Labellar Ex&cbase s4 Chip —2 ;Chip Ramisteği
Programın Başlangıcı
için hafıza ayrılması isteği
Start: move.l ExecBase,a6 moveg #CLuzunluğu,d0 ;AllocMem için parametre düzenle moveg #chip,dl ;chip ram sor AllocMem(a6) ;hafıza isteği move.l d0,CLadr ;Bulunan hafızanın adresi beg.s Son ;hata-->Son
;CopperListi CLadr (copperlist adres) kopyala.
lea CLbaşla,a0 move.| CLadr,al moveg #CLsize-1,d0 CLcopy: move.b (a0)4,(al1)4 dbf d0,CLcopy
;Döngü değeri
;Copperlisti byte byte kopyala
Ana program
İsr forbid(a6) lea $dff0000,a5 move.w #$03a0,dmacon(a5) move.l CLadr,coplle(a5)
;Taskları kapat ;Base adresi a5'e koy ;DMA'yı kapa ;Copperlistin adresini ;COPİLC'ye yaz ;Copperlisti program sayacına ;yükle move.w #$8280,dmacon(a5) ;DMA'yı aç
clr.wcopjmp 1 (a5)
;sol mouse tuşu için bekle
Bekle: btst #6,ciaapra — ;Bit Test bne.s — bekle ;ok? devam et
Sonu
;Eski CopperListi yerine koy
move.l #GRisim ;OpenLibrary için parametreleri düzenle cir.l dO jsr OpenLibrary(a6) ;Graphics Libraryi aç move.l move.l Startlist(a4),coplle(a5) ;StartList adresini yükle cirw —
move.w #$83e0,dmacon(a5) jsr permit(a5)
;Bütün DMA kanallarını aç ;Taskları aç
;Copperlist için ayrılmış olan hafızayı serbest bırak
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 30
CHIP REGISTER'LARI
Geçen ay eksik kalan küçücük bir bölümümüz var. Anlattıklarımız haricinde COPPER üzerinden de chip registerlara ulaşılır. Bu işlemi DMA halleder. Toplam olarak altı DMA kanalı vardır. Bunlar; Bitplane DMA: Bu DMA kanalı ekran datasını devamlı olarak hafızadan okur ve gerekli data register'larına yazar. Sprite DMA: Sprite datayı RAM'den sprite register'larına transfer eder. Disk DMA: Disk'ten RAM'a veya RAM'dan Disk'e data transferi yapar. Audio DMA: RAM'den dijital ton datayı okur ve bunu uygun audio register'lara yazar. Copper DMA: Coprocessor (COPPER) komutları bu kanal üzerinden alır. Blitter DMA: Blitter'e veya blitter'den RAM'a datayı bu DMA kanalı verir. Bu DMA kanalları DMACON, DMA Kontrol Register'ı vasıtasıyla enable veya disable yapılır.
adres $096(yaz) ve $002(oku)
BİT ADI İŞLEVİ (SET iken) 15 SET/CLR SET/CLEAR BİTİ 14 BBUSY BLİTTER MEŞGUL (SADECE OKU) 13 BZERO BLİTTER İŞLEVLERİNİN SONUCU 0 (SADECE OKU) 12 KULLANILMIYOR 11 KULLANILMIYOR 10 BLTPRI BLİTTER DMA, 68000'e GÖRE ÖNCELİKLİ 9 DMAEN BÜTÜN DMA'LARI ENABLE ET (BİT 0-8) 8 BPLEN BİTPLANE DMA ENABLE 7 COPEN COPPER DMA ENABLE 6 BLTEN BLİTTER DMA ENABLE 5 SPREN SPRİTE DMA ENABLE 4 DSKEN DİSK DMA ENABLE 3 AUD3EN 3 NO'LU SES KANALI İÇİN AUDİO DMA ENABLE 2 AUD2EN 2 NO'LU SES KANALI İÇİN AUDİO DMA ENABLE 1 AUD1EN 1 NO'LU SES KANALI İÇİN AUDİO DMA ENABLE 0 AUD0EN 0 NO'LU SES KANALI İÇİN AUDİO DMA ENABLE
DMA kontrol register'ı, normal bir register gibi yazılmaz. Yazılırken seçilen bitler set veya clear olur. Bu, yazılacak data içindeki 15 nolu bitin durumuna göre belirlenir. Eğer bu bit 1 ise, yazılacak datadaki SET bitler DMACON register'ında da SET olur. Eğer 15 nolu bit 0 ise yazılacak datadaki SET bitler DMACON register'ında CLEAR olur. Yazılacak datadaki CLEAR bitlerin bir işlevi yoktur. DMAEN olarak dizayn edilmiş olan 9 nolu bit, bir cins ana anahtardır. Eğer bu 0 ise, bütün DMA kanalları kapanır (0'dan 8'e). Eğer bu bit 1 ise 0'dan 8'e tüm DMA kanalları aktif olur. Herhangi bir DMA kanalının aktif olması durumunda bu bitin de aktif olması gerekmektedir. Bir örnek verelim: Varsayalım DMACON register'ımızda sadece Bitplane DMA aktif geri kalanlar CLEAR. DMACON'un değeri $0100. Biz disk DMA'yı aktif yapmak istiyoruz. Bunun için DSKEN ve DMAEN SET ve BPLEN CLEAR olacak.
MOVE.W #$0100,$DFFO96 ;BPLEN biti CLEAR MOVE.W #$8210,$DFFO96 ;DSKEN ve DMAEN SET olur.(SET/CLR<-1)
DMACON register'ı şimdi $0210 değerine sahiptir. 13 ve 14 nolu bitler sadece okunabilir. Bunlar blitter'in çeşitli bilgilerini içerirler. Bu ilerde blitter bölümünde incelenecek. 10 nolu bit blitter'in 68000'e göre önceliğini belirler. Eğer bit SET ise 68000, blitter chip RAM üzerindeki operasyonlarını bitirinceye kadar, chip RAM'a ulaşım yapamaz. Bit 0 ise, 68000, blitter'den her 14 çift bus cycle'ını alır. Şimdi biraz da Elektron ışınının yatay düşey konumunu ve önemini, Amiga'nın interrupt'larını ve Copper'ı inceleyelim. Ekrandaki elektron ışınının o andaki pozisyonu nasıl okunur? Amiga'da DMA işlevinin zamanlaması, elektron ışınının her ekran satırı başında bulunma pozisyonuyla, senkron olacak şekilde ayarlanmıştır. Bazı zamanlar bu ışının ekran üzerindeki yerini bilmeye ihtiyaç duyarız. Agnus, kendi içinde ekranın o andaki yatay ve düşey bilgilerini içeren iki sayıcı bulundurmaktadır. Bu sayıcılara iki adet register vasıtasıyla ulaşabiliriz.
VHPOS $006 (Read VHPOSR) $02c (write VHPOSW) Bitno: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Fonksiyonu: V7 V6 V5 V4 V3 V2 V1 V0 H8 H7 H6 H5 H4 H3 H2 H1
VPOS $004 (Read VPOSR) $02a (Write VPOSW) Bit no: 15 1413 121110987 6543210 Fonksiyonu:LOF - - - - - 2 v8
H1'den H8'e kadar sıralanmış olan bitler, yatay elektron ışınının o anki yerini içerirler. Aynı zamanda bu bitler Amiga'nın bus'ını tayin ederler. Vertikal pozisyon için geçerli olan satır, iki register'a bölünmüştür. Bunlardan V0-V7 bitleri VHPOS register'ında, V8 biti ise VPOS register'ında bulunmaktadır. LOF biti (LOng Frame) o sırada ekranda bulunan resmin, uzun veya kısa frame'li olup olmadığını belirtir. Bu bit sadece Interlace mod için lazımdır. Normal konumda değeri 1'dir. Elektron ışınının ekran üzerindeki yeri istendiği takdirde, kullanıcı tarafından da yazılabilir. Ancak bu çok nadir kullanılan bir yöntemdir. POS pozisyon register'ları, ayrıca başka bir fonksiyon olarak Lightpen'le çalışılmasına da olanak sağlar. Agnus'un lightpen girişi aktif olduğunda ve lightpen ekran üzerinde bir noktaya pozisyonlandığında, Agnus'a lightpen'le ilgili bilgi gelir. Gelen bilgi bu register'lara iletilir ve işlem tekrarlanır. Interruptlar... Genelde giriş ve çıkışa sahip tüm Custom chipler ve iki adet CIA entegresi interrupt kaynağıdır. Paula içindeki özel bir devre, bunlardan gelen kaynak interrupt sinyallerini toplar, değerlendirir ve uygun olacak şekilde 68000 için interrupt sinyalleri üretir. İşlemcinin kullanılan otovektör dereceleri LEVEL 0-6'dır. LEVEL 7, Non Maskable Interrupt kullanılmaz. Interrupt'la ilgili istek ve maskeleme işlemlerini iki register üstlenmiştir. Bunlar Interrupt Request Register (INTREQ) ve Interrupt Mask Register'larıdır (INTENA, INTerrupt ENAble). Bu iki register'ın da bit dizilişleri ve anlamları birbirinin aynıdır.
$01E HNTENA $09A (WRITE) $01C(READ) İT İSİ İL FONKSİYONU WRİTE/READ (DMACON REGİSTER'INA BAKINIZ) TÜM İNTERRUPTLARI ENABLE ET CİA-B VEYA EXPANSION PORTTAN İNTERRUPT
12 DSKSYN DİSK SENKRON DEĞERİ BELİRLENMESİ 11 RBF SERİAL RECEİVE BUFFER'İ DOLU 10 AUD3 SES ÇIKIŞ BİLGİ KANALI 3 9 AUD2 SES ÇIKIŞ BİLGİ KANALI 2 8 AUD1 SES ÇIKIŞ BİLGİ KANALI 1 7 AUD0 SES ÇIKIŞ BİLGİ KANALI 0 6 BLIT BLİTTER HAZIR 5 VERTB VERTİKAL BLANKING GAP BAŞINA ULAŞILDI 4 COPER COPPER İNTERRUPT İÇİN REZERVEDİR 3 PORTS CIA-A VEYA EXPANSION PORTTAN İNTERRUPT 2 SOFT SOFTWARE İNTERRUPTLARI İÇİN REZERVEDİR 1 DSKSYNC TRANSFERİ TAMAM 0 TBE SERİAL TRANSMİT BUFFER'İ DOLU
İlk 0-13 bitleri çeşitli interrupt bilgilerini işlemek için kullanılırlar. CIA interruptları, tek interrupt olacak şekilde birleştirilmiştir. INTREQ register'ı içindeki bitler, hangi interrupt isteğinin oluştuğunu içerirler. Eğer herhangi bir interrupt oluşursa, bununla ilgili bit high olur. Bir işlemci interrupt'ı yaratmak için, DMAENA ve INTENA register'ı içindeki ilgili bit SET olmalıdır. INTEN biti, ana interrupt bitidir. Bunun sayesinde 14 interrupt kaynağı da on veya off yapılabilir. COPPER Coprocessor... Copper, basit bir yardımcı işlemcidir. Bir task olarak çalışır ve bazı değerleri, bazı custom register'lara yazar. Daha başka bir işlev olarak belirli ekran pozisyonlarındaki bazı register'ların içeriklerini değiştirir. Ekranı çeşitli parçalara bölebilir. Bu bölgeleri değişik renklerde ve değişik çözünürlüklerde gösterebilir. Bu özellik, birçok ekranın aynı anda açılmasını sağlayabilir. Copper, bir coprocessor olarak dizayn edilmiştir. Hafızadaki bir program vasıtasıyla onu programlayabilir ve bu programı komut-komut işletebilirsiniz. Copper üç ayrı komut içermektedir. Bunlar; WAIT, MOVE ve SKIP'tir. Bu komutlar bundan iki sayı önce dergimizde açıklandığı için bunlar üzerinde durmayacağım. CopperList, tek başına copper'ı işletemez; bunun için Copper register'larını incelememiz lazımdır.