Oncelikle guzel sozlerin icin tesekkurler Punisher. Her 4-5 ayda bir genelde benim kurslardan dolayi bir kac kisi bu konuya heveslenip calismaya basliyor. Ben malesef herkesin sorularini ve bekledikleri yeni dokumanlari sizlerin okuma hizinda yetistiremesem de bundan cok cok buyuk bir mutluluk ve tatmin duyuyorum. Umarim cok gec olmadan birgun VIC ve 3D kurslarini da bitiririm 🙂
Ilk iki dersteki bilgileri kullanarak yazdigini dusunursek aslinda oldukca ilginc bir problem secmis ve oldukca da optimize bir sekilde kodu yazmissin. 4. bolumde anlatilan jsr ve 5. bolumde anlatilan "kendi kendini degistiren programlar" konulari kullanilmadan bu problemi senin yaptigindan cok daha iyi sekilde yapmanin bir yolunu ben de bulamadim.
Bir de optimizasyondan bahsederken aslinda iki eksen var bildigin gibi: bellek ve hiz. Ben genelde hiz optimizasyonlarina daha cok egildim bugune kadar. Asagida verecegim ornekte de hiz optimizasyonu daha on planda. Bellekte de nispeten az yer kapliyor ama hizdan fedakarlik yapilip daha da kucuk alanda yapilabilir. Fakat bunun icin daha ileri konularin kullanilmasi lazim.
Ayrica dedigim gibi 4. ve 5. bolumlerdeki bilgileri kullanmamaya calistim ben de. yani normalde bu kodu ihtimlen boyle yazmaz ve bir sutun_ciz alt rutini yazardim.
benim cozumume gecmeden once senin cozumundeki dikkatimi ceken yerlere yorum yapayim:
baslangic:
ldx #0
sayac:
cpx #200
beq baslangic
ldy #0
cok onemli degil ama bu bolumde beq baslangic yerine beq bitis gibi bir satir koyup ardindan
bitis: jmp bitis
gibi bir sonsuz dongu daha iyi olur. senin kodun su anda surekli sutunlari ciziyor.
Ikinci yorumum genel yaklasimla ilgili. burada problemin asil can alici noktasini renk ramine yapilan yazmalar olusturuyor. yani video matrise ekranin her yerinde aslinda ayni degeri yaziyorsun. o yuzden bu ornekte aslinda ben olsam once basit bir donguyle video matrisi olusturur. ardindan karmasik dongulerimde sadece color ram ile ugrasirdim.
Ucuncu bir nokta kodun icindeki sabitler (102, 2,5 gibi). Bu aslinda her programlama dilinde her platformda gecerli bir konu. Genelde kod satirlarinin icinde sabit sayilar kullanmaktan kacinmak lazim.Bunlara bazen sihirli sayilar deniyor. Cunku 102 nedir tam olarak, bunu ilk bakista anlamak mumkun olmayabilir. Hem kodu okuyan baskalari icin hem de kendin icin sabitleri isimli etiketler olarak tanimlamak iyi bir aliskanliktir. mesela 102 yerine ben DOLDURMA_KARAKTERI diye bir sabit kullandim. Senin orneginde birgun doldurma karakteri olarak 102 yerine 103 kullanmak istesen ne kadar cok satir degistirmen gerekecegini dusun. Halbuki etiket kullanirsan, sadece etiketin tanimli oldugu satiri degistirebilirsin.
Bu sekilde yazilmis asagidaki ornege bakabilirsin. Tekrar belirtiyorum. Senin cozumun de gayet guzel. Cok ciddiyim seni gazlamak icin falan soylemiyorum. Sadece senin kullandigin komutlari kullanarak cozmek icin hayli zor bir problem. Yani degil optimize olarak cozmek, tek basina "cozmek" hayli zor. Ben bu ornegi kursta kullansam kurs sonunda "iddiali ogrenciler icin meydan okuma odevi" falan diye isimlendirirdim. O yuzden icten tebrikler
!to "4barrenkli.prg"
*=$c000
DOLDURMA_KARAKTERI = 102
RENK1 = 2
RENK2 = 1
RENK3 = 5
RENK4 = 7
;;----------------------------------------------------------------------
basla:
;; once video matrisi dolduralim
ldx #0
lda #DOLDURMA_KARAKTERI
vm_dongu:
sta $0400,x
sta $0400+250,x
sta $0400+500,x
sta $0400+750,x
inx
cpx #250
bne vm_dongu
;; simdi renk ram'ine sutunlari cizelim
ldx #0
ldy #10
lda #RENK1
;; sutun cizme alt rutini
;; x registerinde sutunun baslama x degeri
;; y registerinde sutunun kalinligi
;; a registerinde sutunun rengi
sutun_ciz:
sta $d800+(00 * 40),x
sta $d800+(01 * 40),x
sta $d800+(02 * 40),x
sta $d800+(03 * 40),x
sta $d800+(04 * 40),x
sta $d800+(05 * 40),x
sta $d800+(06 * 40),x
sta $d800+(07 * 40),x
sta $d800+(08 * 40),x
sta $d800+(09 * 40),x
sta $d800+(10 * 40),x
sta $d800+(11 * 40),x
sta $d800+(12 * 40),x
sta $d800+(13 * 40),x
sta $d800+(14 * 40),x
sta $d800+(15 * 40),x
sta $d800+(16 * 40),x
sta $d800+(17 * 40),x
sta $d800+(18 * 40),x
sta $d800+(19 * 40),x
sta $d800+(20 * 40),x
sta $d800+(21 * 40),x
sta $d800+(22 * 40),x
sta $d800+(23 * 40),x
sta $d800+(24 * 40),x
inx
dey
bne sutun_ciz
cpx #10
bne ucuncu_sutun_mu
;; ikinci sutuna basla
lda #RENK2
ldy #10
jmp sutun_ciz
ucuncu_sutun_mu:
cpx #20
bne dorduncu_sutun_mu
;; ucuncu sutuna basla
lda #RENK3
ldy #10
jmp sutun_ciz
dorduncu_sutun_mu:
cpx #30
bne bitis
;; dorduncu sutuna basla
lda #RENK4
ldy #10
jmp sutun_ciz
bitis: jmp bitis ; sonsuz dongu
;;----------------------------------------------------------------------