Gelişmiş Assembler

Gelişmiş Assembler

Selam sevgili assembler meraklıları! Yaz sonunun getirdiği bu nemli ve sıcak günlerden biri daha. Ve yine bıkkınlık verebilecek bir yazı! Dilerseniz biraz sohbetle bu can sıkıcı sayfaları neşelendirelim; ne dersiniz? Sizi bilmem, ama bu sene gayet zevkli bir tatil geçirdim diyebilirim. Kuşadası güzel, şiş kebap güzel, ben var Türkiye'ye tekrar gelmek ... Hay allah galiba turistlerin yanında fazla kaldım. Kuşadası'nda geçen 26 günden sonra İstanbul'a dönmek, insanda şok etkisi yaratıyor. Bu trafik, bu kargaşa, koşuşturmaca. Ben de isyan ettim, eve kapandım. U2 grubunu dinleyerek dergimize karşı olan büyük sorumluluğumuzu elimden geldiğince yerine getirmeye çalışıyorum. Oysa en azından iki hafta daha güneyde kalabilmek için bilgisayarımı komple elden çıkarmaya razıydım. O kadar eğlence ve güneşten sonra buz kütlesi gibi bir makina hiç mi hiç aradığım bir şey değil. Bunun yerine Kuşadası'nda yaşadığım en berbat günü tercih ederim. Zaten dergiye yazı hazırlama görevim olmasaydı (ve tabii ki param da suyunu çekmeseydi!) kesinlikle orada kalırdım. Eminim ki birçoğunuz da benim bu konudaki fikrime katılırsınız. Burada kalıp da bilgisayarla uğraşmayı tercih edenlere bir an önce bu hastalıktan kurtulmalarını öneririm. Gidin, dolaşın, eğlenin; fakat kesinlikle bilgisayarı düşünmeyin. Bilgisayarınız soğuk kış aylarında evde otururken can sıkıntınızı giderecek bir hobi olsun. Bilgisayarla uğraştığım bu kadar seneden sonra ona karşı böyle güzel duygular beslemek gayet enteresan bence, siz bu konuda ne dersiniz? Tabii diğer konularla uğraşırken dersleri de ihmal etmeyin; zira okullar artık açılıyor. Bazılarınız bunu fark etmemiş olabilir, ama mazeret günlerinizi şimdiden harcamayın derim. Sonra baharda herkes mutlu mutlu okul kırarken, siz gitmek zorunda kalabilirsiniz. Tabii burada kimseyi okul kırmaya teşvik etmiyorum; fakat 1-2 günün de bence kimseye zararı dokunmaz; aksine okul stresinden uzaklaşmak bir hayli yararlı olabilir. Düşünüyorum da, bu yazı bir an önce bitse de başımda duran gitarımı elime alabilsem « Ne, evinde gitarın yok mu? Bir an önce kendine bul bir tane ve tıngırdat biraz. Hoşlanmıyorsan karışamam; ama insanı rahatlattığı da bir gerçek. Değişik şeylerle uğraşmak insanı hem geliştirir, hem de sorunlardan kısa bir süre için de olsa uzaklaştırır. Her neyse, bu kadar dalga yeter. Biraz da sıkıcı konulara geçelim. Genel istek üzerine bundan sonra her ay yararlı bir alt rutin ya da komple bir source vereceğim. Vereceğim tek teorik bilgiler, bu rutinlerde kullanılan teknik ayrıntılar olacak. Artık size programı yazmak ve işlevini inceleyerek anlamak kalıyor. Tüm komutları işlevleriyle birlikte verdiğim için, anlayacağınızı umuyorum. Teknik ayrıntılar da artık zaten kısa kısa değinilecek konulara dönüşecek. Her zamanki gibi assembler gelecek aydan itibaren yine iki bölüm halinde olacak. Gelişmiş Assembler köşesinde daha çok intro ve demo source'ları, Amiga ve Assembler köşesinde ise sistem library'lerini kullanan ufak utility source'ları vermeye çalışacağım. Her iki köşenin source'larını hazır olarak benden direkt temin edebilirsiniz. Bu şekilde çalışma hatalarıyla karşılaşmazsınız. Zaten buna bir bakıma da mecbursunuz; zira her ay vereceğim intro datalarının dergide binary dökümünü yayınlamaya kalkışsak ilerde bütün dergi bir demo için yetmeyebilir! Source'ları ve dataları tek bir diskette topladığımdan bir defada şimdiye kadar yayınlanan tüm source'ları çalışır vaziyette temin edebilirsiniz. Bunun için bana bir mektup yazarak isteğinizi belirtmeniz gerek. Tabii mektuba boş bir disket ve posta masrafını (1000 TL'lik pul olarak) eklemeyi de unutmayın. Adresim gayet basit: PK 46 - 81110 Bostancı - İstanbul. Bu ay verdiğim alt rutin, bazılarınızın istemiş olduğu NoiseTracker (ve SoundTracker) — replay rutinidir. Bununla NoiseTracker'da hazırlanmış olan tüm modül parçaların programlarınızda çalınmasını sağlayabilirsiniz. Bazı SoundTracker modüllerini de çalabilmek mümkündür; ama bu gibi durumlarda yine de SoundTracker'ın replay rutinini kullanmanız işi garantiye alır. SoundTracker'ın da replay rutini buradaki rutine çok benzer ve çalışması da aynıdır. Programın açıklayacağım tek önemli tarafı, nasıl kullanılacağıdır. Modül parçamızı mt data label'ının gösterdiği adrese

Cem GENCER yüklemeliyiz. Dilerseniz ilk satır olan mt data=$58000'i programın sonuna alarak 'mt data: incbin "mod.xxx"' şeklinde değiştirebilirsiniz. Bu şekilde modül datasının, programınız compile edilirken otomatik olarak hafızaya yüklenmesini sağlayabilirsiniz. Üçüncü yöntem, bence aslında en güvenilir olanı. Exec library'sini kullanarak hafıza rezerve ederek (AllocMem) modülü dos library'sinden Open ve Read fonksiyonlarıyla hafızaya yüklemek ve kullanmak. Biraz detaylı gözükse de, programınızın yeni KickStart'larda (ROM 2.0 ve yukarısı) sorunsuz çalışmasını sağlayabilir. Tabii işiniz bittiğinde ayrılan hafızayı tekrar sisteme geri vermeyi unutmayın. Şayet sistemin multitasking özelliğini kapamayan bir programla uğraşıyorsanız, bu üçüncü yöntemi kullanmanız zorunludur. Esas programınıza aşağıdaki rutini ekledikten sonra yapacağınız tek şey, programınızın açılış rutinine 'bsr mt init' satırını da eklemek. Ana döngünün içinde bir yere 'bsr mt play' satırını yazmanız, müziğin çalmaya başlamasını sağlayacaktır. Bu satırı devamlı tekrar eden bir döngü içine yazın; aksi halde müziğin sadece bir ya da birkaç notası çalınacak, ardından da büyük ihtimalle susacaktır. Programınızın sonunda (ya da başka bir yerde) müziği komple susturmak için 'bsr mt end' satırını kullanmanız gerekmekte. Bunu da programınızın çıkış rutinine eklemeniz mantıklı olur. Bu satırı kullanmazsanız, programdan çıkılsa bile müzik arka fonda devamlı olarak çalmaya devam edecektir. Bu, size öyle gelmese bile başkalarına göre rahatsız edici olabileceğinden müziği de çıkışta kapamanızı öneririm. Bu kadar açıklama herhalde yeter; gelecek ay bu source ile ilgili sadece sesle ilgili sistem register'larına kısaca bir göz atarak başka bir source vereceğim. Hadi hoşçakalın ...

Noisetracker V1.0

Mahoney & Kaktus

mt data-$58000
mt init: lea mt data,a0
move.l —
add.| #$3bB, at
moveg #$7f,d0
moveg
mt İoop:move.|
subg.w
mt l0p2:move.b
moveg
mt lop3:clr.|
move.|
moveg
move.w
asl.|
add.|
add.|
dbf
or.b
move.b
cİr.w
cİr.b
cir.b
çİr.w
Tits
mt end: cir.w
Cİr.w
cir.w
Cİr.w
move.w
mt music:
movem.|
lea
addg.b
bit.s
cir.b
bra
mt nonew:
lea
lea
bsr
lea
lea
bsr
lea
lea
bsr
lea
lea
bsr
bra
mt arpeggio:
moveg
move.b
divs
swap
CMp.w
beg.s
beg.s
movet
move.
İsr.b
bra.s
mt
move.b
and.b
bra.s
mt arp2:move.w
a.s
mt arp3:asi.w
moveg
move.w
lea
moveg
Mt arploop:
move.w
#0,d1
di,d2
(af)4,di
mt. loop
d0,mt İop2
#1,d2
mt samplestarts(pc),at
#2,d2
#$43c,d2
a0,d2
d2,a2
(a2)
#0di
42(a0),di
#i,di
di,a2
dü,mt lop3
#$2,$bfe001
#$6,mt speed
$dffob8
$dffoc8
$dffod8
mt songpos
mt counter
mt pattpos
$dffoa8
$dffob8
$dffoc8
$dffod8
d0-d4/a0-a3/a5-a6,-(a7)
mt data,a0
counter
mt counter,DO
mt speed,DO
mt nonew
mt counter
mt getnew
mt
mt checkcom
mt voice2(pc),a6
mt checkcom
mt voice3(pc),a6
mt checkcom
mt voice4(pc),a6
$dffOdo,a5
mt checkcom
mt endr
#0,d0
mt counter,d0
dü
mt arp2
#$2,d0
mt arpi
#4,
mt arp3
#0,dO
$3(a6),do
#$İ,dO
mt arp3
$10(a6),d2
#0di
$10(a6),di
mt. periods(pc),a0
#$24,07
(a0,d0.w),d2
bge.s
dbf
rts
mt arp4:move.w
ri
is
mt getnew:
move.b
asl.|
asl.
add.w
cİr.w
lea
lea
bsr.s
lea
lea
bsr.s
lea
lea
bsr.s
lea
lea
bsr.s
bra
mt playvoice:
move.|
mover
move.
and.b
İsr.b
move.b
and.b
or.b
tst.b
beg.s
moveg
lea
bra.s
mt noloop:
add.|
move.|
move.w
move.w
mt setregs:
mMove.w
and.w
beg
move.b
and.b
cmp.b
bne.s
bsr
bra
mt setperiod:
Move.w
and.w
mt arp4
#2,a0
d7,mt arploop
d2,$6(a5)
mt data,a0
a0,a2
#$c,a3
#$3b8,a2
#$43c,a0
#0,dO
dü,di
mt songpos,d0
#8,di
#2,di
mt pattpos,di
mt dmacon
mt playvoice
$dffOb0,a5
mt voice2(pc),a6
mt playvoice
$dffüco,a5
mt voice3(pc),a6
mt playvoice
mt Voice4(pc),a6
mt playvoice
mt setdma
0,d1.1), (a6)
#0,d2
$2(a6),d2
#$f0,d2
#4,d2
(a6),do
#$fO,dO
dü,d2
d2
mt setregs
#0,d3
mt samplestarts(pc),at
d2,d4
#$1,d2
#$te,dâ
a3,d4.)),$8(a6)
ağda. 12(a6)
13
mt noloop
$4(a6),d2
#1,d3
d3,d2
d2,$a(a6)
$4(a3,d4.1),d0
d0,8(a6)
$6(a3,d4.1),$e(a6)
$12(a6),$8(a5|
mt setregs
$4(a6),d2
d3,d2
$12(a6),$8(a5)
(a6),do
mt checkcom2
#$3,dO
mt setperiod
mt setmyport
mt checkcom2
16),$10(a6)
move.w
cirb $1b(a6)
move.| (a5)
move.w
move.w
and.w
move.w  d0,$6(a5)
move.w  $14(a6),do
dü,mt dmacon
bra mt checkcom2
mt setdma:
move.w
mt wait:dbf dü,mt wait
move.w mt dmacon,d0
Or.Ww #$8000,dO
move.w  d0,$dffo96
move.w #$12c,d0
mt wai2:dbf dü,mt wai2
lea $dffOOO,a5
lea mt voice4(pc),a6
move.| —
move.w  $e(a6),$d4(a5)
lea mt voice3(pc),a6
move.l — $afa6),$col 2)
move w
lea mt voice2(pc),a6
move.| )
 $e(a6) $b4(a5)
lea mt voicet (pc),a6
move.| Salaş)
move.w  $e(a6),$a4(a5)
— #$10,mt pattpos
cmp.w — #$400,mt pattpos
bne.s mt endr
mt nex: cir.w mt pattpos
clr.b mt break
addg.b —#i,mt songpos
and.b ink
move.b mt songpos,di
cmp.b — mt data*$3b6,di
bna.s mt endr
move.b mt data*$3b7,mt songpos
mt endr:tst.b mt break
bne.s — mt nex
movem.| (a7)4,d0-d4/a0-a3/a5-a6
Tts
mt setmyport:
move.w  (a6),d2
and.w — #$fff,d2
move.w  d2,$18(a6)
cirb — $16(a6)
cmp.w — dü,d2
beg.s — mt cirport
bge.s mt rt
move.b #$1,$16(a6)
rts
mt. cirport:
$18(a6)
mt rt: rts
mt myport:
beg.s mt myalide
cirb $3(a6)
mt myslide:
tstw — $18(a6)
beg.s mt rt
moveg —
move.b  $17(a6),d0
tst.b $16(a6)
bne.s mt mysub
d0,$10(a6)
move.w
cmp.w — $10(a6),do
bgt.s — mt myok
move.w  $18(a6),$10(a6)
$18(a6)
mt myok:move.w $10(a6),$6(a5)
Tits
mt mysub:
sub.w
move.w
CMp.w
bit.s
move.w
cir.w
d0,$10(a6)
m
mt myok
$18(a6)
move.w  $10(a6),$6(a5)
ris
mt. vib: move.b  $3(a6),d0
beg.s — mt vi
move.b
mt vi: move.b
lea mt
İsr.w #$2,d0
and.w — #$if,dO
moveg
#0,d2
move.b  (a4,d0.w),d2
move.b $ta(a6),d0
and.w
mulu
İsr.w #$6,d2
move.w Üy
tstb — $ibla6)
bmi.s mt vibmin
add.w — d2,d0
bra.s mt vib2
mt vibmin:
sub.w — d2,d0
mt vib2:move.w d0,$6(a5)
move.b  $ia(a6),d0
İsr.w #$2,d0
and.w — #$3c,d0
add.b — d0,$ib(a6)
mt nop: move.w $10(a6),$6(a5)
rts
mt checkcom:
move.w $2(a6),d0
and.w #$fff,dO
beg.s mt nop
move.b
and.b #$f,dO
e dü
eg mt arpeggio
cmp.b #$1,dO
beg.s mt portup
cmp.b #$2,d0
beg mt portdown
cmp.b #$3,d0
beg mt myport
cmp.b
beg mt vib
move.w $10(a6),$6(a5)
cmp.b #$a,d0
beg.s mt volslide
rts
mt volslide:
move.b $3(a6),d0
İsr.b #4,d0
tstb dO
mt voldown
add.w
cmp.w #$40,$12(a6)
bmi.s mt vol2
move.w #540.812120)
mt vol2:move.w $12(a6),$8(a5)
rts
mt voldown:
moveg — #0,d0
move.b ml
andb —
subw — d0,$12(a6)
bpl.s — mt vol3
$i5(a6)
mt vol3:move.w $12(a6),$8(a5)
ris
mt portup:
moveg — #0,d0
move.b  $3(a6),d0
sub.w — d0,$10(a6)
move.w
and.w — #$fff,d0
cmp.w — #$71,d0
bpl.s — mt por2
andw —
orw — #$71,$10(a6)
mt por2:move.w
and.w
mt portdown:
cirw do
move.b  $3(a6),d0
add.w
move.w
and.w
CMp.Ww
bmi.s
and.w
mt por3:move.w
and.w
move.w
rts
mt checkcom2:
move.b
and.b
cmp.b
beg.s
bene
cmp.b
beg.s
cmp.b
beg.s
cmp.b
beg.s
rts
mt setfilt:
move.b
and.b
asl.b
and.b
or.b
rts
mt pattbreak:
not.b
ris
mt posjmp:
move.b
move.b
not.b
move.b
mt vol4:move.b
mt setspeed:
Cm)
ble.s
move.b
mt sets:move.b
beg.s
move.b
cir.b
mt rts2:rts
mt sin:
mt. periods:
mt speed:
mt songpos:
mt pattpos:
mt counter:
mt break:
mt dmacon:
mt samplestarts:
mt voicei:
mt voice2:
mt voice3:
mt, voiced:
d0,$10(a6)
$10(a6),d0
d0
#$358,d0
mt por3
#$1000,$10(a6)
#$358,$10(a6)
$iİ ci ,d0
d0,$6(a5)
#Sİ,dO
#$e,d0
mt settilt
,d0
mt pattbreak |
mt posjimp |
#$C,dO |
mt. setvol
mt 'setspeed
$3(a6),d0
#$1.dO
mt break
$3(a6),d0
#$İ,d0
dü,mt songpos
mt break
#$40,$3(a6)
mt volâ
$3(a6),$8(a5)
#$11,$3(a6)
mt sets
$3(a6),d0
mt rts2
dü,mt speed
mt coünter
dc.b —
deb — $b4 $c5,$d4,$e0,$eb,$f4,$fa,$fd
dcb —$b4,$a1,$8d,$78,$61,$4a,$31,$18
dcw  $0358,$0328,$02fa,$02d0,$02a6,$0280
decw  $025c,$023a,$021a,$01fc,$01e0,$01c5
dew
dcw  $012e,$0110d,$0100,$00fe,$00f0,$00e2
 $00d6,$00ca,$00be,$00b4,$00aa,$00a0
dec.w — $0097,$008f,50087,$0071,$0078,$0071
de.w — $0000,$0000
dc.b
dc.b
dc.w
dc.b
dc.b
dc.w
bik.
bik.w
bik.w
bik.w
bik.w
bik.w
dc.w
bik.w
bik.w
bik.w

26 S4 o 95

So o