Gönderen Konu: kurs sonrasI ornekLer II  (Okunma sayısı 25104 defa)

kurs sonrasI ornekLer II

« Yanıtla #15 : 24.01.2007 20:43:02 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Skatecim 2.si de aynI rutine daLLanIyor. Yani SPRRENK rutinine gidiyor. Ama pek iyi olmadI zannedersem :) Senin yakLa$ImLarInI merak ediyorum.
 
Bir sure $d021'in rengini okutup tersini basmaya caLI$TIm ama yemedi. eheheh
 
 
 
(Interrupt rutinine kadar ust ornekle aynI code)
 
 
............
EKRANBOL:
LDA#$20
LDX#$01
EKRANUST CMP$D012
BNE EKRANUST
STX$D020
STX$D021
LDA#$9A
LDX#$02
EKRANALT CMP$D012
BNE EKRANALT
STX$D020
STX$D021
RTS
SPRITEHAREKET:
INC$D001
LDA$D001
CMP#$90
 
BEQ SPRRENK
 
CMP#$00
 
BEQ SPRRENK
 
RTS
MUZIK:
JSR$1003
RTS
 
 
SPRRENK:
LDX$D001
CPX#$90
BEQ ARTI
LDX$D001
CPX#$00
BEQ EKSI
JMP IRQSON
ARTI:
LDX#$01
STX$D027
JMP IRQSON
EKSI:
LDX#$02
STX$D027
JMP IRQSON
 
IRQSON:
RTS
« Son Düzenleme: 24.01.2007 21:05:58 Gönderen: stranger »

kurs sonrasI ornekLer II

« Yanıtla #16 : 24.01.2007 23:30:05 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Aslında beklediğim cevap değil ama ilk beklediğim cevaba yakın. Bu soruyu kodların ne derece optimize edebileceğini göstermek için sormuştum. şimdi senin rutini kısalta kısalta kuşa çeviricez :)
 
Öncelikle çıkış noktanı değiştirerek başlıyorum. Sen tek rutine de inse hala $d001'e bağlı olarak kod yazmaya kararlısın. Halbuki $d001'e bağlı olarak bu rutine doğru yerlerde dallanıyor. şimdi bırakalım programı ve Türkçe cümle kuralım.
 
$d001 $90'a gelince SPRRENK'e dallan
$d001 $00'a gelince SPRRENK'e dallan
 
SPRRENK:
Eğer sprite rengi kırmızıysa beyaz yap, beyaz ise kırmızı.
 
Aha! ışte bu son cümle işi değiştirdi. Bu durumda $d001'e hiç bakmayacağız ve işi doğrudan $d027 ile bitireceğiz.
 
Kod: [Seç]
SPRRENK:
LDX$D027
CPX#$F1
BEQ KIRMIZIYAP
LDX$D027
CPX#$F2
BEQ BEYAZYAP
JMP IRQSON
KIRMIZIYAP:
LDX#$02
STX$D027
JMP IRQSON
BEYAZYAP:
LDX#$01
STX$D027
JMP IRQSON
 
IRQSON:
RTS

Eee, ne değişti ki? şimdi gereksiz satırları atalım (başlarına noktalıvirgül koyacağım)
 
Kod: [Seç]
SPRRENK:
LDX$D027
CPX#$F1
BEQ KIRMIZIYAP
;LDX$D027
CPX#$F2
BEQ BEYAZYAP
JMP IRQSON
KIRMIZIYAP:
LDX#$02
STX$D027
JMP IRQSON
BEYAZYAP:
LDX#$01
STX$D027
;JMP IRQSON
 
IRQSON:
RTS

Eh hemen hemen bu kadar diyebiliriz.
 
Bu 1.sorumun cevabıydı. Gelelim 2. yönteme. cmp, cpx, cpy, beq, bne, bcc, bcs, bpl, bmi v.s. yok. Peki ne var? Olayı bit bazlı düşünmek var.
 
Beyaz = 1 = %00000001
Kırmızı = 2 = %00000010
 
Öyle bir bit işlemi bulalım ki beyazsa kırmızı kırmızıysa beyaz yapsın. Ben öyle bir bit işlemi biliyorum. EOR (ya da PC'deki yaygın ismiyle XOR). Bu nasıl bir işlemdir?
 
Bit 1 EOR Bit 2 Tablosu şu şekildedir.
 
Bit 1 Bit 2 EOR
----- ----- -----
0 0 0
0 1 1
1 0 1
1 1 0
 
Yani olaya şöyle bakabiliriz Bit 1 bizim orjinal bitimiz olsun. Hem sıfır hem de bir olma durumunda (1. ve 3. satırlar) 0 ile EORlandığında değeri aynen kalıyor, değişmiyor. Yani 0 ile EORlamak bit değerini aynen korumak demek. Peki 2. ve 4. satırlarda ne oluyor. 1 ile EORlandığında değer tersine dönüşüyor. Yani 0 EOR 1 dediğimizde 0'ı 1 yapmış oluyoruz 1 EOR 1 dediğimizde 1'i 0 yapmış oluyoruz. Kısaca yazmak gerekirse;
 
0 ile EORlamak değeri değiştirmez:
0 EOR 0 = 0
1 EOR 0 = 1
 
1 ile EORlamak değeri tersine çevirir:
0 EOR 1 = 1
1 EOR 1 = 0
 
Öyleyse biz nasıl bir değerle EORlamalayız ki beyaz ise kırmızı, kırmızı ise beyaz olsun? Önce cevabını vereyim. Cevap 3. Peki bunu nasıl elde ettim? Önce sağlamasını yapalım.
 
Beyaz EOR 3 = Kırmızı
 
%00000001 <- Beyaz (1)
%00000011 <- EOR (3)
-----------
%00000010 <- Kırmızı (2)
 
 
Kırmızı EOR 3 = Beyaz
 
%00000010 <- Kırmızı (2)
%00000011 <- EOR (3)
-----------
%00000001 <- Beyaz (1)
 
 
şimdi iş eğlenceli olmaya başladı işte di mi? :)
 
Peki 3'ü nerden bulduk. ışlemin değişme özelliğini kullandık. Yani;
 
a eor b = c
ise
a eor c = b'dir.
 
Biz
Beyaz EOR x = Kırmızı
dediğimize göre
Beyaz EOR Kırmızı = x
yani EORlayacağımız değerdir.
 
%00000001 <- Beyaz (1)
%00000010 <- Kırmızı (2)
-----------
%00000011 <- x = 3
 
ışte böyle. şimdi gelelim rutinimizin son haline :)
 
Kod: [Seç]
SPRRENK:
lda $d027
eor #3
sta $d027
rts

ışte if...then...else programcılığının sona erdiği nokta. Bit tabanlı hesaplama gücü.
 
Edit: Bir noktayı atlamışım. Sprite renklerine siz $01, $02 gibi değerler de verseniz okurken üst 4 biti set olarak okursunuz yani $f1, $f2 gibi. Bunun için cpx'leri değiştirdim. Aslında yapılması gereken şey;
 
lda $d027
and #%00001111
cmp #$01
 
gibi bir işlem. Yani yalnızca alt 4 biti karşılaştırmamız lazım.
« Son Düzenleme: 27.01.2007 00:59:50 Gönderen: skate »

kurs sonrasI ornekLer II

« Yanıtla #17 : 25.01.2007 10:39:03 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
AsLInda $u kodu(alttaki) yazMI$tIm. Hemde ilk akLIma gelendi. Fakat $F1 ve $F2 yerine $01, $02 yazmI$tIm. Hatta bu kodun caLI$mamasIna mana da verememi$tim. Bu yuzden zaten $d001 in pe$inden ko$tum.
-----------------------
SPRRENK:
LDX$D027
CPX#$F1
BEQ KIRMIZIYAP
;LDX$D027
CPX#$F2
BEQ BEYAZYAP
JMP IRQSON
KIRMIZIYAP:
LDX#$02
STX$D027
JMP IRQSON
BEYAZYAP:
LDX#$01
STX$D027
;JMP IRQSON
-------------------------

EOR komutunu acIKLamasI icinde ekstra te$ekkur.
 
YanLIz
lda $d027
and #%00001111
cmp #$01
 
'In oLayInI tam anLamadIm. . %00001111 = #15 =#$0F ???
Buradaki (AND) 'in kuLLanIm $eklini biraz acabilir misin?

kurs sonrasI ornekLer II

« Yanıtla #18 : 25.01.2007 10:46:25 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Bu arada diger arkada$Larda muhabbete katILsaLar ya... Belki yeni fikirler tartI$maLar vs.. dimi ama? Galiba herkes Plasma'dan sonra cIkacak tutorial bombardImanInI bekliyor....
« Son Düzenleme: 25.01.2007 10:48:31 Gönderen: stranger »

kurs sonrasI ornekLer II

« Yanıtla #19 : 25.01.2007 11:38:48 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
haklısın orasını sonradan hızlı bir editle eklediğim için eksik kaldı. and komutu şu şekilde işler.
 
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
 
Yani yalnızca her iki bit de 1 ise sonuç 1 olur. Bu bize nasıl fayda sağlıyor? Örneğin $d027 örneğinde olduğu gibi biz sadece alt 4 bit ile ilgileniyorsak, bu durumda üst 4 biti yok etmek için o bitler 0 geri kalan bitler 1 olan bir sayıyla ANDliyoruz. Sonucu görelim.
 
%11011010 <- $da
%00001111 <- AND $0f
---------
%00000110 <- $0a
 
Aslında bu olayı daha güzel açıklamak için nibble kavramını açıklamak gerekiyor. Normalde bit ve byte arasında bir birim pek telaffuz edilmez ancak aslında bytelar 4'er bitlik 2 nibbledan oluşmuştur. şu şekilde:
 
%11011010 => üst nibble %1101, alt nibble %1010
 
Her bir nibble byteların hexadecimal gösteriminin bir basamağına denk gelir. Yani
 
%1101 = 13 = $d
%1010 = 10 = $a
%1101 %1010 = %11011010 = $da
 
Her bir nibble 0-15 arası 16 farklı değer alabilir. Byteların toplam alabileceği değerin sağlamasını da bu şekilde yapmamız mümkün.
 
16*16 = 256 farklı değer.
 
şimdi Commodore 64 16 renk olduğu için bize alt nibble yetiyor. Yani $00-$0f arası değerler. Bu durumda biz soladaki basamağa aldırış etmiyoruz. Yalnızca byte'ın hexadecimal gösterimizdeki sağdaki basamak yetiyor. Bu durumda $0f ile AND'leyerek byte değeri ne olursa olsun $00-$0f arası değerler elde ediyoruz. Örnekler:
 
$3c AND $0f = $0c
$7e AND $0f = $0e
$d3 AND $0f = $03
$a8 AND $0f = $08
v.s. v.s.
 
Hadi konuyu bitirmeden OR'u da kısaca geçelip. OR'lamak ise şu şekilde oluyor
 
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
 
Yani AND'in tam tersi. Yalnızca her iki bit de 0 ise sonuç sıfır, en az biri 1 ise sonuç 1.
 
Bunu da şöyle kullanıyoruz. Örnek olarak biz soldaki nibble'ın değerinin kesinlikle 2'ye eşit olmasını istiyoruz. Ama sağdaki nibbleı da bozmak istemiyoruz. Yani:
 
$9c gibi bir değerimiz varsa bizim elde etmek istediğimiz sonuç $2c olacak. Bu durumda doğrudan $20 (üst nibble 2) ile OR'larsak sorun yaşayabiliriz. Görelim.
 
%10011100 <- $9c
%00100000 <- OR $20
--------------------
%10111100 <- $bc
 
ıstediğimiz sonucu elde edemedik. Bu durumda önce 9'u yok edip sonra orlamamız gerekiyor. Bunun için deminki gibi $0f ile ANDleyip sonra orlayarak istediğimiz sonucu elde edeceğiz.
 
%10011100 <- $9c
%00001111 <- AND $0f
--------------------
%00001100 <- $0c
%00100000 <- OR $20
-------------------
%00101100 <- $2c
 
ışte AND ve OR bir arada bu şekilde kullanılır. ASM kodu olarak yazarsak;
 
lda #$9c
and #$0f
ora #$20
 
dediğimizde accumulatordeki değer $2c olur. Bu değeri sta ile istediğimiz yere yazabiliriz.
 
şimdilik bu kadar. Sorulara göre detaylara ineriz. Ağaşıdaki tabloları ezberleyin.
 
AND Tablosu
-----------
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
 
OR Tablosu
----------
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
 
EOR(XOR) Tablosu
----------------
0 EOR 0 = 0
0 EOR 1 = 1
1 EOR 0 = 1
1 EOR 1 = 0
« Son Düzenleme: 25.01.2007 11:46:26 Gönderen: skate »

kurs sonrasI ornekLer II

« Yanıtla #20 : 25.01.2007 22:34:23 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Oh oh.. aradan OR 'u da cIkarmI$sIn... Helal valla...
$imdi bana biraz musade. Hem bunLara bakaYIm hemde sana ku$a cevriLecek bir ornek daha hazIrLayayIm. :)
 
Bu arada bunLar gercekten onemli bilgiLer; gerek Skate gerekse Nightlord'un yazdIgI tutoriallarI en son birle$tirerek bir ASM kitabI oLu$turuLabilinir. Veya mega bir tutorial... BakaLIm nereye kadar gidecek bu i$...

kurs sonrasI ornekLer II

« Yanıtla #21 : 25.01.2007 23:00:09 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
AkLIma taKILan bi$ey daha...
 
*=$1000
jsr$e544
ldx#$f1
stx$d021

spc:lda$dc01
cmp#$ef
bne spc

ldx#$01
stx$d020
hold jmp hold
 
Burda $01 de ekranI beyaz yapIyor $f1 de...
 
Fakat ilk ornekte
 
SPRRENK rutininde
LDX$d027 ile x'e $d027 in degerini okuduktan sonra
CPX#$01 neden caLI$madI?
 
Yani renklerle oynarken asLInda ldx#$01 stx$d020 yazmak yerine
ldx#$f1 stx$d020 yazarsak daha dogru bir$ey mi yapmI$ oLacagIz..
 
Direk renk vereceksek ust nibble.... and or yada eor la i$Leme sokup rengi vereceksek alt nibble la ilgileniyoruz. Eger dogru anLadIysam.

kurs sonrasI ornekLer II

« Yanıtla #22 : 25.01.2007 23:14:13 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Stranger, aslında bu tür işlerin teknik açıklamasını Nightlord benden çok daha iyi yapar. Ben yalnızca VIC'in sprite renk değerlerini okurken sana her zaman üst 4 biti set olarak yani %1111xxxx şeklinde verdiğini biliyorum. Ancak sen yazarken üst bitlere hangi değeri verirsen ver, farketmez. Aslında olayı şöyle düşünebilirsin. Üst 4 bit işe yaramaz bitler. 0 dönmeleri ne kadar doğalsa 1 ya da random dönmeleri de aslında o kadar doğal. Sonuçta benim gözümde "açıkta kalmış bacaklar" onlar. Karı kız olayı değil, çip bazında :)
 
Bu arada nibbleları anlatarak biraz kafanı karıştırmış olabilirim. Renkler her zaman alt 4 bitte duruyor. Yani alt nibble ya da diğer bir deyişle sağdaki 4 bit. Soldaki 4 bit ise hiçbir işe yaramıyor. Söz konusu sprite renkleri olduğunda...

kurs sonrasI ornekLer II

« Yanıtla #23 : 25.01.2007 23:20:21 »
Hızlı düğmeleri aç

hades

İleti: 214

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
c64 te 16 renk olduğu için genel bir ifade ile #$01 ile #$x1 arasında bir fark yoktur. (x=0,1,......e,f) Bu nedenle renklerle ilgili herhangi bir OR, AND, EOR, CMP,  CPX ve  CPY  işlemlerinde sadece alt nibble değerleri sonucu belirler.
Bu arada küçük bir bilgi vereyim.  JSR $E544 rutininden geri dönüşte X registerinde 1 değeri bulunur. senin örneğine uyarlarsak
JSR $E544
STX $D021
haline gelir ve 2 byte tasarruf etmiş oluruz.

kurs sonrasI ornekLer II

« Yanıtla #24 : 25.01.2007 23:22:47 »
Hızlı düğmeleri aç

hades

İleti: 214

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
yaw skate neredeyse aynı anda yazmışız. ben yazmaya başladığımda senin mesajın henüz yoktu. Benden hızlısın :)

kurs sonrasI ornekLer II

« Yanıtla #25 : 25.01.2007 23:23:16 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
@Skate: Tamam $imdi anLadIm. oh beee :)
@hades: Ok. Bu da guzel bir bilgi oldu. Thx..

kurs sonrasI ornekLer II

« Yanıtla #26 : 25.01.2007 23:26:55 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
@hades: Bana da oluyor kardeşim aldırma. Geçen gün bitfellas'a bir post atıyordum, gönder dedim, bir baktım uyarı çıktı "siz postu gönderene kadar başka biri bu topic'e post attı" diye. Hastası oldum. Onun postunu da okuduktan sonra mesajımı editleyip yolladım. Güzel bir özellik di mi?

kurs sonrasI ornekLer II

« Yanıtla #27 : 26.01.2007 19:17:02 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Skate'in verdigi bilgileri inceledikten sonra komutLarI tam anLamIyLa anLamak icin benim kuLLandIgIm yontem ve bir ornek. Gecen ornekte spriteLar $d012'ler vb. OLdugu icin belkide bu ornek oLayI kavramak icin daha yararLI oLacak.
 
Border rengini okuyarak, EOR komutunu kuLLanIp ekran rengiyle aynI renge ceviriyoruz. (POKE 53280,6'daki renk)
 
ılk değeri en uste yazarak, araya bir bosluk bIrakIp uLa$mak istedigimiz değeri en alta yazIyoruz. Ortaya EOR komutunda kuLLanacagImIz degeri yazarak sagLamasInI yapabiLiyoruz. (Binary,Hex ve 10'lu düzendeki cevirmelerde problem ya$ayan arkada$Lar windows'un hesap makinesinin bilimsel modunu kuLLanabilir)
 
 
\ 0000 1110 /  Border renginin default degeri #14   #$0E
------------------------------------------------------------
\ 0000 1000 /  EOR'da kullanacagimiz deger  #8     #$08
------------------------------------------------------------
\ 0000 0110 /  Border'a vermek istedigimiz renk(KoyuMavi) #6  #$06
 
Code:
----------------------
!TO "eor.prg",CBM
*=$1000 ;SYS4096
LDA$D020
EOR#8
STA$D020
RTS
----------------------
 
\ 0000 1110 /  Border renginin default degeri #14   #$0E
------------------------------------------------------------
\ 0000 0110 /  AND'de kullanacagimiz deger  #6    #$06
------------------------------------------------------------
\ 0000 0110 /  Border'a vermek istedigimiz renk(KoyuMavi) #6  #$06
 
Code:
------------------------------------
!TO "and.prg",CBM
*=$1000 ;SYS4096
LDA$D020
AND#6
STA$D020
RTS

kurs sonrasI ornekLer II

« Yanıtla #28 : 26.01.2007 20:05:52 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
EOR icin kucuk bir ipucu

A EOR B = C

ise

A EOR C = B

yani B yi (ortadakini) bulmak icin usttekini ve alttakini direk eor islemine de sokabiliriz

kurs sonrasI ornekLer II

« Yanıtla #29 : 05.02.2007 15:48:37 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
arada denemelerimi atayIm. Gerci bu biraz eski ama... 2.bar'I araya siyah bo$Luk koymak yerine Skate'in multiplexer'da gosterdigi yontemle koyuyor.
Ba$ka bi oLayI yok...
« Son Düzenleme: 05.02.2007 15:56:50 Gönderen: stranger »