Bu sayfadaki yazılar
Sayfanın metni
Sayfa 66
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
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 67
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