tr-demoscene
the scene => coding => c64 => Konuyu başlatan: stranger - 05.10.2009 16:57:42
-
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
-
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.
-
ş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.
!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
-
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
-
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.
-
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
-
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 :)
!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