Ş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
Ş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;
Windows 2000 TR: Denetim Masası -> Sistem -> Gelişmiş -> Performans Ayarları
Windows 2000 EN: Control Panel -> System -> Advanced -> Performance Options
Windows XP/2003 TR: Denetim Masası -> Sistem -> Gelişmiş -> Performans -> Ayarlar -> Gelişmiş -> İşlemci Zamanlaması
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?
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.
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.
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