plazma - amatör bilgisayar kültürü

İpuçları

Emir 'Skate' Akaydın

1. Commodore 64

Şekil 1.

$F5C1 (62913) adresinin en son yükletilen dosyayı ekrana yazdığını biliyor muydunuz?

	load"program",8,1
	sys 62913
      

Eğer dosyayı load"*",8,1 şeklinde yüklediyseniz ekrana * karakteri yazılacaktır. Yani bu komut sizin yüklediğiniz en son dosya isminin tutulduğu tampon belleği ekrana yazar. Peki nerede bu tampon bellek? $a000 adresi Basic ROM'unun başladığı adrestir. Yükletilen dosya isminin uzunluğuna bağlı olarak bu bellek alanı $9fff'den geriye doğru kullanılır, yani Basic ROM'unun başlangıcından geriye doğru. Örneğin dosyayı "*" ile yüklemişsek bellek başlangıcı tam olarak $9fff'de yer alır. Ama "dutch breeze" diye bir dosya yüklediysek, dosya ismi 12 karakter olduğu için $a000-12 = $9ff4 adresinden itibaren hafızaya yerleşecektir. Bu bellek adresinin başlangıcı ise zeropage'de $bb ve $bc adreslerinde 16 bit şeklinde durur. Örneğin "dutch breeze" için $bb = $f4, $bc = $9f gibi.

6510 ASM'de hiçbir flag'i (zero flag, carry flag v.b.) etkilemeyen komutlar nelerdir?

NOP, JSR, JMP, PHA, PHP, RTS, STA, STX, STY. Bu komutlar haricindeki tüm 6510 assembler komutları en az bir flagi etkiler.

$D011'e sıfır değeri verdiğimizde DMA satırlarından kurtuluyoruz ve iç ekran kapanıyor ancak bu sefer sprite veya herhangi bir grafik göstermemiz mümkün olmuyor. FLD kullanmadan kolay bir şekilde yalnızca karakter ekranını kapatarak DMA'dan kurtulmanın bir yolu var mıdır?

Olmasa ne diye uzun uzun yazayim bu soruyu :) Birbirine benzer iki yolu var bunun. Birincisi 48. raster satırında ($30) $d011'i kapatıp (0'a eşitleyip) 1-2 raster satırı kadar bekledikten sonra yine $d011'in 3 numaralı bitini set edecek olursak (örneğin 8 değerine eşitleyecek olursak) karakter ekranı kapandığı halde spritelar ve bankın sonundaki adres ($3fff, $7fff, $bfff ya da $ffff) görüntülenebilir. Kısacası FLD tekniğinin yarattığı etkinin aynısı yaratılmış olur. Avantajı ise 200 raster satırlık tüm ekranın DMAlarını 1-2 raster satırı zaman harcayarak yok edilebilmesidir.

İkinci yöntem ise bunu ekranın bitiminde 248. raster satırı civarında yapmaktır. Ancak bu durumda ekstra kazancımız alt ve üst borderların da açılmasıdır. Bu alanlara da sprite basabiliriz bu yöntemle.

Şimdi 48.raster satırını kullanarak yaptığım bir örneği inceleyelim. Bu örnekte $3fff adresi kullanılarak iç ekranda dikey çubuklar kaydırılıyor. Bunun haricinde 50. raster satırdan ($32) itibaren 254 raster satırı boyunca hiçbir ekstra zaman tablosu içermeyen bir döngüyle raster çekebiliyoruz. ACME ile derlemenizi öneririm.

        !to "nobadlines.prg",cbm

!macro WAIT .v {
	ldy #.v
	dey
	bne *-1
}

	* = $0801
	!byte $0c, $08, $00, $00 
	!byte $9e, $32, $30, $36
	!byte $31, $00, $00, $00

	* = $080d
	lda #$01
	sta $3fff
	sei
start:
	lda #$30
	cmp $d012
	bne *-3
	lda #$00
	sta $d011
	+WAIT 24
	lda #$0b
	sta $d011
	lda #$31
	cmp $d012
	bne *-3
	lda #$1b
	sta $d011
	+WAIT 8
	bit $ea
	ldx #$00
loop1:
	txa
	sta $d020
	sta $d021
	+WAIT 9
	inx
	cpx #254
	bne loop1
	asl $3fff
	bne start
	inc $3fff
	jmp start
      

Commodore 64'de sabit renk adresleri nelerdir?

  • $0286: Cursor'un o anda sahip olduğu karakter rengi

  • $0287: Cursor'un üzerinde bulunduğu arkaplan rengi

  • $d020: Border rengi

  • $d021: Arkaplan Rengi 0

  • $d022: Arkaplan Rengi 1 - Multicolor 0

  • $d023: Arkaplan Rengi 2 - Multicolor 1

  • $d024: Arkaplan Rengi 3

  • $d025: Sprite Multicolor 0

  • $d026: Sprite Multicolor 1

  • $d027-$d02e: Sprite Renkleri

  • $d800-$dbe7: Ekran Renk Belleği

2. PHP Problemleri

Şekil 2.

Web serverım PHP çalıştırırken arada bir CGI error veriyor ancak refresh edince geçiyor. Problem ne olabilir?

Öncelikle PHP versiyonu eski olabilir. Ancak versiyon güncellendiği halde problem devam ediyorsa, sorun serverınızın çok hızlı olmasıdır. Bu ne tür bir soruna yer açıyor? PHP henüz çıktıyı web servera veremeden web server sayfayı görüntülemeyi deniyor. Bu konuda gidebileceğiniz en güzel çözüm Windows'un "Performans Ayarları"ndan optimizasyonu "Arkaplan Hizmetleri"nden "Uygulamalar"a çevirmektir. Bu seçeneğin yerine gelince;

  1. Windows 2000 TR: Denetim Masası -> Sistem -> Gelişmiş -> Performans Ayarları

  2. Windows 2000 EN: Control Panel -> System -> Advanced -> Performance Options

  3. Windows XP/2003 TR: Denetim Masası -> Sistem -> Gelişmiş -> Performans -> Ayarlar -> Gelişmiş -> İşlemci Zamanlaması

  4. Windows XP/2003 EN: Control Panel -> System -> Advanced -> Performance -> Options -> Advanced -> Processor Scheduling

Bu çoğunlukla problemi çözer ancak problemi çözmek için serverın arkaplan hizmetlerine tanınan ve büyük olasılıkla da tanınması gereken önceliğini kaldırarak performansını düşürmüş oluyoruz. Bu da işin negatif tarafı.

Web Server'ıma "localhost" yazarak bağlanamıyorum ancak "127.0.0.1" ile bağlanabiliyorum. Problem ne olabilir?

Sistemin C'ye kurulu olduğunu varsayacak olursak "C:\Windows\system32\drivers\etc" ya da "C:\WINNT\system32\drivers\etc" klasöründe yer alan "hosts" dosyasına bakın. Eğer "127.0.0.1 localhost" şeklinde bir satır göremiyorsanız bu satırı ekleyin.

php.ini'de değişiklik yapıyorum ancak bu değişiklikler algılanmıyor. Sebebi ne olabilir?

  1. Eğer PHP'yi CGI modülüyle (php.exe) kurduysanız problem büyük olasılıkla yanlış ini dosyasını editliyor olmanızdan kaynaklanıyordur. Zaman zaman harddisk üzerinde farklı yerlerde php.ini dosyalarının kopyalarıyla karşılaşabilirsiniz. php.exe önce kendi klasörüne, daha sonra windows klasörünün altına bakar ini dosyası için. Normalde php.ini'nin windows klasörünün altında olması tavsiye edilir.

  2. PHP dosyalarının içersinde ini_set gibi yaptığınız ayarları değiştiren bir komut kullanılmış olabilir. Bu durumda yaptığınız değişiklikler algılanmayabilir.

  3. Bir diğer ihtimal ise PHP'nin ISAPI (php4ts.dll) olarak kurulmuş olmasıdır. CGI ile ISAPI kurulumun arasındaki en temel farklılık CGI'ın her PHP dosyası tetiklendiğinde php.exe'yi yeniden tetiklemesi ve php.exe'nin her defasında php.ini'yi baştan okumasıdır. ISAPI'de ise php4ts.dll web server'a bir plug-in mantığıyla eklenir ve web server çalıştırıldığında bir kereye mahsus php.ini'yi okur ve hafızada kalır. Dolayısıyla php.ini'de yapılan değişikliklerin aktive edilmesi için web server'ı durdurup yeniden başlatmak gerekir.

PHP'de CGI Timeout problemi yaşıyorum. Nasıl çözebilirim?

Bu problemin yine birden fazla kaynağı var. İlk olarak php.ini'de yer alan "max_execution_time" ve "max_input_time" parametrelerini kontrol etmenizi tavsiye ederim. Varsayılan değerleri;

	max_execution_time = 30
	max_input_time = 60
      

şeklindedir. Bunların her ikisini de sıfıra eşitlemek ilk aşamada sorunumuzu çözecektir.

	
	max_execution_time = 0
	max_input_time = 0
      

Ancak ne var ki bunları sıfıra eşitlediğimiz halde 15 dk gibi bir süre sonunda yeniden CGI Timeout ile karşılaşılabilir. Bu durumda gidilebilecek en kesin çözüm PHP'nin kurulumunu CGI'dan ISAPI'ye çevirmektir.

En son olarak IIS üzerinde de bir "Connection Timeout" ayarı vardır. Varsayılan değeri 900 saniyedir (15 dk). Bu süreyi uzatmak da bir çözüm olabilir. Ancak bu süre uzadığı halde PHP'nin CGI kurulumunda 15 dk'da timeout'a düşebilirsiniz.

emir (at) akaydin (nokta) com

plazma - 2008