Amiga Assembly Kursu - 2
Retro bilgisayarAmiga Kursumuzun 2. bölümüne hoş geldiniz. Önceki sayımızda sizin de fark etmiş olacağınız gibi, bu yazı programcı olmayanlara değil, daha çok, programcılığı (Assembly, C veya en az bir programlama dilini) biliyor olup Amiga'da 68000 Assembly ile program yazmak isteyenlere yönelik. Ancak bu, programlamaya yeni başlayanları korkutmasın, bu şekilde öğrenmek zor olduğu kadar zevklidir de.
Önceki sayımızda 68000 komutlarını, veri transfer komutlarını ve Amiga'nın hafıza yapısı konularını incelemiş, basit bir kodu nasıl derleyeceğimizi öğrenmiştik. Bu sayımızda 68000 komutlarını öğrenmeye devam edecek, donanım register'larını kısaca tanıyacağız, ardından çeşitli örnek kodları inceleyeceğiz, son olarak biraz daha görsel sonuçlar görebileceğimiz, ilginizi çekeceğini umduğum bir örnek kod ile devam edeceğiz. Bunu yaparken henüz öğrenmediğimiz bazı konulara girmek zorunda kalacağız, ancak ileriki sayılarda bu konuların tümüne sırasıyla değineceğiz.
Öncelikle örnekleri kolaylıkla test edebilmeniz için hazırladığım asmpro.adf isimli dosyayı; eğer gerçek bir Amiga kullanıyorsanız boş bir diskete yazın (bunu yapan programları İnternet'ten bulabilirsiniz), eğer WinUAE Amiga emülatörü kullanıyorsanız ayarlarınızı aşağıdaki gibi yapın, df0'a asmpro.adf dosyasını gösterin, ayarlarınızı kaydedin ve emülatörü başlatın. Sistem bu disketten boot ederek açılacak ve karşınıza AsmPro çıkacaktır.
WinUAE ayarlarınızda 68020 işlemci, AGA chipset (en azından ECS), 3.1 veya 2.0 kickstart rom dosyası ve 4 MB fastram seçin.
Kodlarınızı rahatça yükleyip kaydetmek için bir harddisk oluşturmanızı tavsiye ederim. Hatta asmpro.adf disketindeki dosyaları harddiskinize kopyalayıp oradan da çalışabilirsiniz.
AsmPro ilk açıldığında gelen ekranda kullanacağınız ram tipi ve miktarını seçebilirsiniz. Şimdilik 100 KB CHIP RAM seçebilirsiniz.
68000 BCC Komutları (Dallanma Komutları)
68000 işlemcilerde genel olarak CC (Conditional Code) komutları adı verilen bir grup komut vardır. Bunlar çoğunlukla program içinde dallanmaya yarayan BCC komutlarıdır:
BCC Komutları (Koşullu Dallanma Komutları):
BCC komutlarının genel kullanım şekli aşağıdaki gibidir:
<label>
Becc.W <label>
Burada komutu takip eden .S ve .W sonekleri (suffix) dallanmanın mesafesine göre belirlenir; .S kısa mesafe (short range: -128, +127 byte), .W ise uzun mesafe (word range: -32768, +32767 byte) dallanma anlamındadır.
Normalde belirtmediğiniz takdirde derleyiciniz en uygun olanı seçecektir.
BCC Komutları listesi aşağıdadır:
BCS BLS BEQ BNE BHI BCC
Carry Bit Set Lower or Same Equal (Z-bit Set) Not Equal (Z-bit Clear) Higher than Carry Bit Clear
BPL BMI BVC BVS BRA
PLus (N-bit Clear) Minus (N-bit Set) V-bit Clear (No Overflow) V-bit Set (Overflow) BRanch Always
BLT BLE BGT BGE
Less Than Less than or Equal Greater Than Greater than or Equal
İngilizce açıklamalarından komutların işlevlerini kolayca çıkarabilirsiniz. Burada dallanma komutlarına genel bir isim olarak kullanılan Bcc ile dallanma komutlarından biri olan BCC arasındaki benzerlik aklınızı karıştırmasın.
Bu listedeki tüm komutlar, .S ve .W eki ile kullanılabilir, .S hafızada daha az yer kapladığından ve daha hızlı olduğundan mümkün olan her durumda tercih edilir.
NOT: 68000 işlemcilerin üst modellerinde (68020/40) .L eki ile 32 bitlik mesafelerde dallanma yapılabilir. Ancak 68000 işlemcide .L ekli BCC komutları desteklenmemektedir.
waitelieck:
btst #6,$bfe00l1l
bne.s waitclick
vts
Ayrıca DBcc (Decrement and branch conditionally) komutlarını da bu listeye eklemeliyiz. DBcc komutları (DBeq, DBne, DBpl vb.) verilen data register'ını bir azaltır ve koşul SAĞLANMADIĞI sürece veya verilen data register'ı sıfırın altına düşmediği sürece dallanma işlemini gerçekleştirir.
start:
moveg #4,DO
loop:
nop ;buraya kodlar girilir
dbeg DO,loop
rus
Burada BEQ komutu ile DBEQ komutu arasındaki önemli farka değinmemiz gerek: BEQ komutu işlemin sonucu sıfır İSE dallanır, DBEQ komutu ise işlemin sonucu sıfır olana dek dallanır, sıfır olduğunda ise döngüden çıkılır.
NOT: Önce data register'ının değerinin sıfır olup olmadığına bakılır, sonra değer bir azaltılır, ilk karşılaştırmanın sonucu sıfır değilse dallanma gerçekleşir. Yani DBEQ komutundan çıkıldığında D0 register'ında $FFFF değeri olacaktır.
NOT 2: Verilen register'ın sıfır ile karşılaştırma işlemi 16 bit (word) olarak yapılır ve register'ın değeri yine word olarak azaltılır. Sayaç register'ındaki değer başlangıçta $12340000 ise DBcc komutundan sonra $1234FFFF değeri olacaktır.
Ayrıca yukarıdakilere ek olarak DBF ve DBRA komutlarını söyleyebiliriz, bu iki komut koşula (condition) bakmaksızın sadece register'ın değeri sıfır olana dek dallanma işlemi yapar. Genel olarak koşulsuz döngüler için kullanılırlar.
Hardware Register'ları
Hardware register'ları işlemcinin doğrudan custom chiplere ulaşabilmesini sağlayan adreslerdir. RAM ve ROM'da bulunmazlar. Normal şartlarda, eğer bir utility veya sistem uyumlu, multitasking bir uygulama geliştiriyorsanız bu adreslere doğrudan erişmeniz gerekmez, hatta erişmemeniz daha doğru olur. Bu adreslere dolaylı olarak ulaşmanızı sağlayacak kütüphaneler vardır. Kütüphaneler konusuna ileride detaylı olarak değineceğiz.
Ancak demo (ve hatta çoğu oyun) programları bu adreslere doğrudan erişim yapılarak yazılır. Bu bölümde ileride çok defa karşılaşacağımız bu adresler hakkında kısa bilgiler vereceğim:
Hardware register'larının 68000 üzerindeki base (taban) adresi $DFF000'dır. Yani verilen chip adreslerini bu taban adrese ekleyerek ulaşacağınız adresi bulabilirsiniz.
68000 adresi (chip adresi) + $DFF000
Örneğin Joystick/Mouse bilgisini okumak için kullanılan adres $DFF0DA için genelde sadece $0DA register'ı denir.
Aşağıdaki listede donanım register'larının adreslerini ve kısa açıklamalarını bulabilirsiniz. Listede R/W olarak verilen kısım register'ın sadece okunabilir ya da sadece yazılabilir olduğunu ifade eder.
W write-only, yalnız yazılabilir; R read-only, yalnız okunabilir; ER early-read DMA için kullanılır; S strobe yazma işlemi yapıldığında bir olay tetiklenir.
Bu register'ları kullanılırken okunabilir/yazılabilir olmalarına dikkat etmelisin, asla okunabilir bir register'a veri yazmaya kalkmayın ya da yazılabilir bir register'ı okumayın. Bu makinenin kilitlenmesine sebep olur.
Hardware Register'ları Listesi
BLTDDAT (000,ER) : Blitter RAM'e veri kopyalarken kullanır. Kullanmayınız.
DMACONR (002,R) : DMA kontrol, tüm DMA durumlarını bu adresten okuyabilirsiniz.
VPOSR (004,R) : Dikey tarama MSB (most significant bit) VHPOSR (006,R) : Yatay/Dikey tarama pozisyonu DSKDATR (008,ER) : Disk DMA tamponu. Kullanmayınız JOY0DAT : Joystick-mouse 0 verisi (dikey, yatay) JOY1DAT (00C,R) : Joystick-mouse 1 verisi (dikey, yatay)
CLXDAT : Sprite/görüntü çarpışma verisi (oku ve temizle)
ADKCONR (010,R) : Ses, disk kontrol register'ı POT0DAT (012,R) : Pot sayacı (dikey, yatay) POT1DAT (014,R) : Pot sayacı (dikey, yatay) POTGOR (016,R) : Pot port data SERDATR (018,R) : Seri port data ve durumu DSKBYTR (01A,R) : Disk data byte'ı ve durumu INTENAR (01C,R) : Interrupt enable bitleri INTREQR (01E,R) : Interrupt request bitleri DSKPTH (020,W) : Disk adres pointer'ı (üst 3 bit) DSKPTL (022,W) : Disk adres pointer'ı (alt 15 bit) DSKLEN (024,W) : Disk DMA data uzunluğu (word) DSKDAT (026,W) : Disk DMA data yazma REFPTR (028,W) : Kullanmayınız. (Refresh pointer)
VPOSW (02A,W) : Dikey tarama MSB (yaz)
VHPOSW (02C,W) : Yatay/Dikey tarama pozisyonu (yaz)
COPCON (02E,W) : Coprocessor (Copper) kontrol register'ı
SERDAT (030,W) : Seri port data ve stop biti (yaz)
SERPER (032,W) : Seri port periyod/kontrol
POTGO (034,W) : Pot port data yaz/başla
JOYTEST (036,W):
STREOU (038,S) : Yatay senkronizasyon strobe adresi
STRVBL (O3A,S) : Yatay senkronizasyon strobe adresi
STRHOR (03C,S) : Yatay senkronizasyon strobe adresi
STRLONG (03E,S) : Yatay senkronizasyon strobe adresi
BLTCONO (040,W) : Blitter kontrol register'ı O
BLTCONA1 (042,W) : Blitter kontrol register'ı 1
BLTAFWM (044,W) : Blitter mask değeri (Kaynak A, ilk word)
BLTALWM (046,W) : Blitter mask değeri (Kaynak A, son word)
BLTCPTH (048,W) : Blitter pointer C (üst 3 bit)
BLTCPTL (O4A,W) : Blitter pointer C (alt 15 bit)
BLTBPTH (04C,W) : Blitter pointer B (üst 3 bit)
BLTBPTL (04E,W) : Blitter pointer B (alt 15 bit)
BLTAPTH (050,W) : Blitter pointer A (üst 3 bit)
BLTAPTL (052,W) : Blitter pointer A (alt 15 bit)
BLTDPTH (054,W) : Blitter pointer D (hedef) (üst 3 bit)
BLTDPTL (056,W) : Blitter pointer D (hedef) (alt 15 bit)
BLTSIZE (058,W) : Blitter boyut/başla (genişlik, yükseklik)
BLTCMOD (060,W) : Blitter modulo C
BLTBMOD (062,W) : Blitter modulo B
BLTAMOD (064,W) : Blitter modulo A
BLTDMOD (066,W) : Blitter modulo D
BLTCDAT (070,W) : Blitter kaynak C data register'ı
BLTBDAT (072,W) : Blitter kaynak B data register'ı
BLTADAT (074,W) : Blitter kaynak A data register'ı
DSRSYNC (07E,W) : Disk okuması için sync patern register'ı
(080,W) : Coprocessor lokasyonu 1 (üst 3 bit)
COPİLCL (082,W) : Coprocessor lokasyonu 1 (alt 15 bit)
COP2LCH (084,W) : Coprocessor lokasyonu 2 (üst 3 bit)
COP2LCL (086,W) : Coprocessor lokasyonu 2 (alt 15 bit)
COPJMP1 (088,S) : Coprocessor restart (ilk lokasyon)
COPJMP2 (08A,S) :
Coprocessor restart (ikinci lokasyon)
COPİNS (08C,W) : Coprocessor tarafından kullanılır
DIWSTRT (08E,W)
yatay pozisyon)
DIWSTOP (090,W) :
zisyon)
DDFSTRT (092,W) :
DDFSTOP (094,W) :
: Görüntü alanı başlangıcı (sol üst dikey-
Görüntü alanı bitişi (sağ alt dikey-yatay po-
Data fetch başlangıç (yatay pozisyon)
Data fetch bitiş (yatay pozisyon)
DMACON (096,W) : DMA kontrol (yaz)
CLXCON (098,W) : Çarpışma kontrol register'ı
INTENA (09A,W) : Interrupt enable bitleri
INTREO (09C,W) : Interrupt isteği
ADKCON (09E,W) : Audio, disk, UART kontrol
AUDOLCH (0AO,W)
AUDOLCL (0A2,W) :
AUD0LEN (0A4,W) : AUD0PER (0A6,W) : AUD0VOL (0A8,W) : AUD0DAT (0AA,W) :
AUDİLCH (0BO,W) :
(0B2,W) :
AUDİLEN (0B4,W) :
(0B6,W) :
AUD1VOL (0B8,W) :
(OBA,W) :
AUD2LCH :
AUD2LCL (0C2,W) :
AUD2LEN (0C4,W) :
AUD2PER (0C6,W) :
AUD2VOL (0C8,W) :
AUD2DAT (0CA,W) :
AUD3LCH (0DO,W) :
AUD3LCL (0D2,W) :
AUD3LEN (0D4,W) :
: Ses kanalı 0 DMA data'sı (üst 3 bit)
Ses kanalı 0 DMA data'sı (alt 15 bit) Ses kanalı 0 uzunluk Ses kanalı 0 periyot Ses kanalı 0 ses Ses kanalı 0 data Ses kanalı 1 DMA data'sı (üst 3 bit) Ses kanalı 1 DMA data'sı (alt 15 bit) Ses kanalı 1 uzunluk Ses kanalı 1 periyot Ses kanalı 1 ses Ses kanalı 1 data Ses kanalı 2 DMA data'sı (üst 3 bit) Ses kanalı 2 DMA data'sı (alt 15 bit) Ses kanalı 2 uzunluk Ses kanalı 2 periyot Ses kanalı 2 ses Ses kanalı 2 data Ses kanalı 3 DMA data'sı (üst 3 bit) Ses kanalı 3 DMA data'sı (alt 15 bit)
Ses kanalı 3 uzunluk
AUD3PER (0D6,W) : Ses kanalı 3 periyod SPRA4APTL (132,W) : Sprite 4 pointer (alt 15 bit)
AUD3VOL (0D8,W) : Ses kanalı 3 ses (134,W) : Sprite 5 pointer (üst 3 bit)
AUD3DAT (ODA,W) : Ses kanalı 3 data SPRSPTL (136,W) : Sprite 5 pointer (alt 15 bit)
BPL1İPTH (0DC,W) : Bit plane 1 pointer (üst 3 bit) SPR6PTH (138,W) : Sprite 6 pointer (üst 3 bit)
BPL1PTL (0DE,W) : Bit plane 1 pointer (alt 15 bit) SPRG6PTL (13A,W) : Sprite 6 pointer (alt 15 bit)
BPL2PTH (0E0,W) : Bit plane 2 pointer (üst 3 bit) SPR7PTH (13C,W) : Sprite 7 pointer (üst 3 bit)
BPL2PTL (0E2,W) : Bit plane 2 pointer (alt 15 bit) (13E,W) : Sprite 7 pointer (alt 15 bit)
BPL3PTH (0E4,W) : Bit plane 3 pointer (üst 3 bit) SPROPOS (140,W) : Sprite 0 dikey-yatay start pozisyon data
BPL3PTL (0E6,W) : Bit plane 3 pointer (alt 15 bit) SPROCTL (142,W) : Sprite 0 dikey bitiş pozisyonu ve kontrol re-
gister'ı
BPL4PTH (0E8,W) : Bit plane 4 pointer (üst 3 bit)
SPRODATA (144,W) : Sprite 0 image data register'ı A
BPLA4APTL (0EA,W) : Bit plane 4 pointer (alt 15 bit)
SPRODATB (146,W) : Sprite 0 image data register'ı B
BPL5PTH (0EC,W) : Bit plane 5 pointer (üst 3 bit)
SPR1POS (148,W) : Sprite 1 dikey-yatay start pozisyon data
BPLSPTL (0EE,W) : Bit plane 5 pointer (alt 15 bit)
SPR1CTL (14A,W) : Sprite 1 dikey bitiş pozisyonu ve kontrol re-
BPL6PTH (0FO,W) : Bit plane 6 pointer (üst 3 bit) gister'i
BPLGPTİ (0F2,W).: Bit plane © pointer (art 15 bit) SPR1DATA (14C,W) : Sprite 1 image data register'ı A
BPLCONA W) : Bit plane konirol registerı SPR1DATB (14E,W) : Sprite 1 image data register'ı B
BPLCON1 (OFE,W) : Bit plane kontrol reg. (kayma değeri) SPR2POS (150,W) : Sprite 2 dikey-yatay start pozisyon data
BPLCON2 (100,W) : Bit plane kontrol reg. (Öncelik kontrolü) SPR2CTL (152,W) : Sprite 2 dikey bitiş pozisyonu ve kontrol re-
gister'ı
BPL1MOD (104,W) : Bit plane modulo (tek plane'ler)
BPL2MOD (106,W) : Bit plane modulo (çift plane'ler) SPR2DATA (154,W) : Sprite 2 image data register'ı A
BPL1DAT (10C,W) : Bit plane 1 data (paralel->seri) SPR2DATB (156,W) : Sprite 2 image data register'ı B
BPL2DAT (10E,W) : Bit plane 2 data (paralel->seri) SPR3POS (158,W) : Sprite 3 dikey-yatay start pozisyon data
BPL3DAT (110,W) : Bit plane 3 data (paralel->seri) : Sprite 3 dikey bitiş pozisyonu ve kontrol re-
BPLADAT (112.4) : Bit data (paralek>seri) SPR3DATA (15C,W) : Sprite 3 image data register'ı A
BPLSDAT : Bit plane SPR3DATB (15E,W) : Sprite 3 image data register'ı B
(116.4) : Bit plane 6 data SPR4POS (160,W) : Sprite 4 dikey-yatay start pozisyon data
SPROPTER Sprite BD bil) SPR4ACTL (162,W) : Sprite 4 dikey bitiş pozisyonu ve kontrol re-
SPROPTL (122,W) : Sprite O pointer (alt 15 bit) gister'ı
SPR1PTH (124,W) : Sprite 1 pointer (üst 3 bit) SPRADATA (164,W) : Sprite 4 image data register'ı A
SPR1PTL (126,W) : Sprite 1 pointer (alt 15 bit) SPRADATB (166,W) : Sprite 4 image data register'ı B
SPR2PTH (128,W) : Sprite 2 pointer (üst 3 bit) SPRSPOS (168,W) : Sprite 5 dikey-yatay start pozisyon data
SPR2PTL (12A,W) : Sprite 2 pointer (alt 15 bit) (16A,W) : Sprite 5 dikey bitiş pozisyonu ve kontrol re-
gister'ı
SPR3PTH (12C,W) : Sprite 3 pointer (üst 3 bit)
SPRS5DATA (16C,W) : Sprite 5 image data register'ı A
SPR3PTL (12E,W) : Sprite 3 pointer (alt 15 bit)
SPRS5DATB (16E,W) : Sprite 5 image data register'ı B
SPRAPTH (130,W) : Sprite 4 pointer (üst 3 bit)
SPR6POS (170,W) : Sprite 6 dikey-yatay start pozisyon data
SPR6CTL (172,W) : Sprite 6 dikey bitiş pozisyonu ve kontrol register'ı
SPRG6DATA (174,W) : Sprite 6 image data register'ı A SPR6DATB (176,W) : Sprite 6 image data register'ı B SPR7POS (178,W) : Sprite 7 dikey-yatay start pozisyon data
SPRT7CTL (17A,W) : Sprite 7 dikey bitiş pozisyonu ve kontrol register'ı
SPRT7DATA (17C,W) : Sprite 7 image data register'ı A SPRT7DATB (17E,W) : Sprite 7 image data register'ı B COLOR0000 (180,W) : Renk değeri 00
COLOR01 (182,W) : Renk değeri 01
COLOR31 (1BE,W) : Renk değeri 31
Bu register'lara şimdilik sadece göz atmanız yeterli. Birçok konuda size fikir verecektir. İleride blitter, copper, ses ve görüntü alanları ile ilgili bu register'lara çokça ihtiyaç duyacağız.
Örnek Program 1 — ASCII2Hex Converter
Aşağıdaki örnek kod A0'da adresini verdiğiniz 8 karakterlik ifadeyi okuyup D0'da hexadecimal değerini döndürür. Açıklamalar kodun içindedir.
start:
;try adresini A0'a koy
#tohex isimli altrutini cagir
lea try(pc),;a0
İsr tohex
rts
Ascii -> Hex Cevirici
;
;
; A0: string baslangic adresi
; Sonuc: DO (longword)
; Degisen register'lar: DO/D1/D2/A0O
;
tohex:
;DO 0, Dİ - O, D2 - O
dl
moveg #0,d2
ŞA0'in gosterdigi yerden
#1 byte'i DO'a oku
move.b (a0) 4,dO0
;hexit altrutinini cagir
bsr.s .hexit
;D2'nin degerini 1 arttir
olmadiysa loop'a git
addag #1,d2
cmp #8,d2
bne.s .loop
;sonucu D1'den DO'a kopyala
;ve programdan cik
move.l d1,;dO0
rts
.hexit:
;DO'daki deger 'a' ($61)'den kucukse
;nolowercase'e git, deger a-f degildir
şaksi halde 'a'-10 ($51) cikart
;boylece deger 'a' ise $0A kalir
;ve out'a dallan
cmp.b #'a',d0
.nolowercase
sub.b #'a'-ı0,d0
bra.s
.nolowercase:
;DO'daki deger 'A' ($41)'den kucukse
;nouppercase'e git, deger A-F degildir
şaksi halde 'A'-I10 ($31) cikart
;boylece deger 'A' ise $0A kalir
;ve out'a dallan
cmp.b #'A',dO
blt.s .nouppercase
sub.b #'A'-10,dO0
bra.s «OUt
.nouppercase:
;DO'daki deger '0'-'9' arasi ($30-$39
;7'0' cikart ve byte degerini elde et
sub.b
;sonucu tutacak olan Dİ registerini
74 bit sola kaydir (1 nibble, yarim byte)
;ve elde edilen DO'daki deger ile OR'la
;sonuc yine Dl1l'de durur
dsl adl
ör.b d0,d1
vts
try:
de.b "3a06DECO"
Örnek Program 2 — Copper Bar
Aşağıdaki kod örnek bir copper listesidir. Henüz bu konulara girmemiş olmamıza rağmen hardware register'ları ile ilgili olduğundan burada yer verdim (biraz da ilginizi çekmek için), önümüzdeki sayıda copper ve görüntü alanları (display fields) hakkında daha detaylı bilgi bulabilirsiniz. Şimdilik sadece yazıp inceleyiniz.
; Ornek Copper List
;
#bazi hardware register ofsetleri
bplcon0 - $100
bplconl - $102
bpllmod - $108
diwstrt - $08E
diwstop - $090
dd£strt - $092
ddfstop - $094
color00 - $180
color0l - $182
coplle - $080
copjmpl - $088
dmacon — $096
bpllpth - $0EO
bpliptl - $0E2
start;
;Custom Chip taban adresi
lea $Ad£f000,a0
;1 bitplane (tek renk)
move.w #$1200,bplcon0 (a0)
move.w #0,bplconl1(a0)
move.w #0,bpllmod(a0)
#ooruntunun baslangic/bitisi
move.w #$0038,ddfstrt (a0)
move.w #$00d0,ddfstop(a0)
move.w #$2c81,diwstrt (a0)
move.w #$f4cl,diwstop(a0)
#bitplane adresini copper
;liste yerlestir
move.l #bitplane,d0
move.w
swap d0O
move.w
;copper listesinin baslangic
yaz
move.l #copperlist,copllc(a0)
;copper'i tetikle
move.w
;dma'lari ayarlar
move.w
;sol tusa basilana kadar bekle
«Leftelick:
btst #6,$bfe00l
bne.s #leftelick
rts
;copper list ve bitmap daima
;CHIP Ram'de durmalidir
section data,data c
copperlist:
de.w bpllpth
ehi dec.w 0
dc.w
el; dec.w 0
;sprite'i kapat
dec.w $0120,$0000
dec.w $0122,$0000
raster satirini bekle
dec.w $9601,$£f00
;color00'a (zemin rengi,$0180
;RGB $678 degeri gir
dc.w $0180,$0678
dc.w
dc.w $0180,$0789
de.w $9801,$££00O
de.w $0180,$089a
dc.w $9901,$££00O
dc.w $0180,$09ab
dc.w $9a01,$££00
dc.w $0180,$0567
;copper listesini bitir
dc.w
;Bitplane icin bos alan ayir
bitplane:
ds.b 320*256
Yukarıdaki örnek kodda Bitmap için gerekli boş hafıza alanını kodun içinde ayırdık. Elbette birçok durumda bunun için Exec library'nin hafıza ayırma fonksiyonlarını (memory allocation functions, AllocMem) kullanmamız gerekir. Ancak bir süre daha örnek kodlarımızı bu şekilde yapmaya devam edeceğiz. Library'ler konusuna ise daha ileriki sayılarda gireceğiz.
Bu sayıdaki yazımızın sonuna geldik. Bu sayıda dallanma komutlarını öğrendik ve hardware register'ları hakkında bilgi edindik, örnek kodlarla da öğrendiklerimizi uygulamış olduk. Ayrıca dergi ile birlikte AsmPro'yu doğrudan çalıştırabileceğiniz bir ADF dosyasını bulabilirsiniz. Buradaki örnek kodları disketin içindeki sources klasöründe bulabilirsiniz.
Bir sonraki sayıda görüşmek üzere hoşçakalın.
Kaynaklar:
1. Amiga Machine Language — Abacus 2. Amiga Hardware Reference Manual
3. Programming the 68000 - Steve Williams. (c) 1985 Sybex Inc