Gönderen Konu: code optimizasyon örnekleri  (Okunma sayısı 7348 defa)

code optimizasyon örnekleri

« : 05.10.2009 16:57:42 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Ara sıra c64 coding bölümünde birşeyler paylaşıyorum. Özellikle daha önce değinilmemiş üzerinde uğraştığım konuları seçiyorum fakat yinede tekrar oluyorsa yada sıkılanlar varsa kusura bakmasınlar. Amaç hani derler ya ... hem ziyaret hem ticaret.
Aşağıdaki codelar; 3 adet farklı sprite'ın datalarının nereden okunacağını ve renklerinin ne olacağını belirliyor. Burdaki nüans sprite banklarını 1'er bank arayla okutmamız.
1.sprite'ı :$0900
2.sprite'ı :$0980
3.sprite'ı :$0a00
datalarını adreslerinden okuyor ve renklerini beyaz yapıyor.

ıntrolarda spriteları set etmek için sıklıkla kullanılan bu kodu elimden geldiği kadar optimize etmeye çalıştım. (En sonunda fazla optimize edilemediğine karar verdim eheheh... )
 
ılk kod klasik ... hafızada rts dahil 26 byte kaplıyor,açık yazılmış olanı...
 
ıkinci kod biraz daha kısaltılmış olanı 24 byte'lık yer kaplıyor
Farkı X register'ini Akü'ye aktarıp ufak bir hesaplamayla bu işi yapıyor. 2 byte kazandırıyor.
 
Aklıma üçüncü ve daha kısa bir yol geldi. Fakat sanırım Pha ve Pla'nın kullanımında boka sardığım için 07f8,07f9,07fa'nın değerlierini verebiliyor fakat $d027,$d028,$d029 'a herhangi bir değer yazamıyor. Aslında kesin bir şekilde
lda#$01
sta$d029
yapmama rağmen olmaması Pha ve Pla 'nın kullanımının Skate, Nightlord ve Endo üçlüsünden birinin olaya el atması gerektiği hissini bende uyandırdı :)
 
;//code#1 =26 byte\\

lda#$24
sta$07f8
lda#$26
sta$07f9
lda#$28
sta$07fa

lda#$01
sta$d027
sta$d028
sta$d029
rts
 
;// code#2 = 24 byte \\
ldy#$00
ldx#$24
dongu:  
lda#$01
sta$d027,y
txa
sta$07f8,y
clc
adc#$02
tax
iny
cpy#3
bne dongu
rts
 
;//code#3 =23 byte\\
ldy#$03
lda#$28
pha
dongu:
lda#$01
sta$d026,y
pla
sta$07f7,y
sec
sbc#$02
pha
dey
bne dongu:
rts

code optimizasyon örnekleri

« Yanıtla #1 : 05.10.2009 17:20:15 »
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/
döngüden çıkmadan önce bir pla daha yapman şart. stack'e birşey yazıyorsan mutlaka okuyacaksın ve stack pointer'ı aynı konuma getireceksin. yoksa herşey patlayabilir, mesela rts.
 
şimdi daha kısa bir kod düşünücem.

code optimizasyon örnekleri

« Yanıtla #2 : 05.10.2009 17:34:42 »
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/
şu 21 byte. Daha da geliştirilebilir. LAX illegal opcodedur. Hem hafızadaki değeri Accumulator'e alır hem de Acuumulator'ü X registerına transfer eder. $2b adresi basic ROM'unun lo byte'ını gösterir. Default'u $0801 olduğu için $2b normalde $01 olacaktır. bu sayede
 
LAX $2b
 
diyerek X ve A'nın her ikisinin de değerini 2 byte'da $01 yapmış oluyoruz. Gerisi açık zaten.
 
Kod: [Seç]
!to "out.prg",cbm
 * = $080d
 ldy #$24
 !byte $a7, $2b ;lax $2b [lax illegal opcode ($A7), $2b: basic address pointer low byte (default: $01)]
loop01:
 sta $d026,x
 sty $07f8 : lopnt = *-2
 inc lopnt
 iny
 iny
 inx
 cpx #$04
 bne loop01
 rts

code optimizasyon örnekleri

« Yanıtla #3 : 05.10.2009 18:15:49 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Açıkçası olayın nasıl  yapılacağı çok açık olduğu için 23 byte'tan aşağı birşey beklemiyordum. (Olmaması lazımdı eheheh...) lax ve inc$0815 ile illegal yollardan bombayı patlattın. Sana ne desem az...
 
Normalde tam tersi olması gerekirken senin code böyle daha açık geliyor bana ;)
 
.C:080d   A0 24      LDY #$24
.C:080f   A7 2B      LAX $2B
.C:0811   9D 26 D0   STA $D026,X
.C:0814   8C FB 07   STY $07FB
.C:0817   EE 15 08   INC $0815
.C:081a   C8         INY
.C:081b   C8         INY
.C:081c   E8         INX
.C:081d   E0 04      CPX #$04
.C:081f   D0 F0      BNE $0811

code optimizasyon örnekleri

« Yanıtla #4 : 05.10.2009 20:17:18 »
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/
Başka yöntemler de olabilir, mesela sprite renklerini verirken üst 4 bitin bir önemi yoktur. Yani beyaz renk için yalnızca $01 değil herhangi bir $X1 aynı sonucu verecektir. kodunun herhangi bir yerinde alt nibble'ı (alt 4 biti) 1 yani %XXXX0001 olan bir değişken varsa ondan da yararlanabilirsin. 256 bytelarda zaman zaman en başta yapman gereken initializasyonları ilerlere taşımak problem yaratmayacaktır. Sonuç olarak ilk frame 20 ms kadar sürüyor. Gerekirse efekti/zamanlamaları bozmadığı sürece main loop içinde yalnızca bir kez yapman yeterli olan bir şeyi her taramada yapmak bile caizdir, yeter ki bir iki byte free etsin.

code optimizasyon örnekleri

« Yanıtla #5 : 05.10.2009 21:03:47 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Buda benim 22 byte'lık code (rts yok)... stack pointer ile ilgili verdiğin tiyo ile 3.kodu da düzeltme imkanım oldu.  
 
.C:0823   A0 03      LDY #$03
.C:0825   A9 28      LDA #$28
.C:0827   48         PHA
.C:0828   A9 01      LDA #$01
.C:082a   99 26 D0   STA $D026,Y
.C:082d   68         PLA
.C:082e   99 F7 07   STA $07F7,Y
.C:0831   38         SEC
.C:0832   E9 02      SBC #$02
.C:0834   48         PHA
.C:0835   88         DEY
.C:0836   D0 F0      BNE $0828
.C:0838   68         PLA

code optimizasyon örnekleri

« Yanıtla #6 : 05.10.2009 22:33:33 »
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/
herşey dahil 19 byte. illegal opcode v.s. de yok. sen en güzel yöntemi bulmuşsun zaten. sadece stack kullanmaya takılmışsın, halbuki x register'ı boşta :)
 
Kod: [Seç]
!to "out.prg",cbm
 * = $080d
 ldy #$03
 ldx #$28
loop01:
 lda #$01
 sta $d026,y
 txa
 sta $07f7,y
 dex
 dex
 dey
 bne loop01
 rts