Retrojen Forum

Dijital Sanat => Kodlama => Konuyu başlatan: Ref - 02 Ocak 2015, 18:48:49

Başlık: z80 asm ile iyi seneler
Gönderen: Ref - 02 Ocak 2015, 18:48:49
Alco'nun tatmin olmaması üzerine bugün aynı kodu (http://retrojen.org/pano/index.php?topic=786.msg6574#msg6574) asm ile yazdım, z80 ile ilgilenen arkadaşlar için buraya koyuyorum.

Kodun içindeki konu başlıklarını şöyle sıralayabilirim:

-LDIR
-IM2 yapılandırması
-Y ekseninde çizim için tablo kullanarak adresi hızlıca hesaplamak (bunu Jonathan Claudwell'in tutorial'inden modifiye ettim)
-Pasmo tekrar macro'su REPT
-Ekranı daha hızlı temizlemek için Stack pointer+PUSH komutu kullanımı

Kod 50 fps çalışıyor, 1 karede yapılan işlemlerin bitmesi yaklaşık 37500 cycle tutuyor, geriye de 30000 kadar cycle boşluk kalmış durumda. Yani işlemci zamanının %60'ını kullanıyor. Kod biraz dağınık, çok iyi düşünülmüş bir kod değil. Getaddr alt rutini bu efekte göre optimize edilebilir, şimdi genel kullanım için uygun.

Kodu hızlandırmak mutlaka mümkündür, her türlü geliştirme ve eleştiri kabul ederim :D

Kodu kafama göre satır satır yorumladım, merak edenler bakabilir.

Herkese iyi seneler!
Başlık: Ynt: z80 asm ile iyi seneler
Gönderen: Alco - 02 Ocak 2015, 18:54:30
Alco'nun tatmin olmaması üzerine bugün aynı kodu (http://retrojen.org/pano/index.php?topic=786.msg6574#msg6574) asm ile yazdım, z80 ile ilgilenen arkadaşlar için buraya koyuyorum.
Alco kolay tatmin olmaz be bro :)

O değil de; İlker'e ilaç gibi gelmiştir bu şimdi :)

Alıntı
-Y ekseninde çizim için tablo kullanarak adresi hızlıca hesaplamak (bunu Jonathan Claudwell'in tutorial'inden modifiye ettim)
Neymiş bu tutorial? Link falan var mı? Bana googlelatma şimdi...
Başlık: Ynt: z80 asm ile iyi seneler
Gönderen: Ref - 02 Ocak 2015, 20:00:53

Neymiş bu tutorial? Link falan var mı? Bana googlelatma şimdi...

Ehe, evet, üşenmiştim bende, çok eski bir tutorial, güzel hemde, şöyle bir google'layalım bulalım:

http://www.spanglefish.com/egghead/index.asp?pageid=397755 (http://www.spanglefish.com/egghead/index.asp?pageid=397755)
Bu sayfanın en altında link bulunuyor. Arşiv olması amacıyla eke de koyuyorum.

Jonathan Cauldwell Dökümanın 0.6 numaralı sürümü
Başlık: Ynt: z80 asm ile iyi seneler
Gönderen: ilkergorkem - 03 Ocak 2015, 17:44:39
Evet bu örneği incelemek harika olacak. Önce forumu tepeden tırnağa taramayı z80 ile ilgili taramamı bitireyim, sonra sorularım gelmeye başlayacak zaten...
Başlık: Ynt: z80 asm ile iyi seneler
Gönderen: hades - 03 Ocak 2015, 19:55:14
Jonathan Cauldwell Dökümanını indirdim. Keşke ingilizcem anlayacak kadar iyi olsaydı. Çok güzel bilgiler var.
Ayrıca DYCP rutinini de incelemeye aldım. Bir de IM 2'nin bellek doldurma yöntemiyle ayarlanmasının mantığını kavrasam iyi olacak. Örnekte IM 2 kuruluyor ama IRQ rutininde sadece RET var. 
Başlık: Ynt: z80 asm ile iyi seneler
Gönderen: Ref - 04 Ocak 2015, 02:25:39
IM2 biraz tuhaf, normalde zıplanacak adresin adresi gibi bişey. Bu vektörün vektörünün yüksek byte'ı I registerından alınıyor iken, düşük byte'ı expansion portta bulunan donanım tarafından sağlanması gerekmekte. Donanım yoksa ve siz takılı olmayan bir porttan okuma yaparsanız ULA'nın kucağına düşüyorsunuz, sonuçta elinize geçen değer ULA'nın son çizdiği grafiğin byte değeri oluveriyor. Bu durumda düşük byte 0-255 arasında bir değer olabiliyor, bu sebepten 257 byte'lık bir tablo hazırlıyoruz. Bunu da tek bir değer ile dolduruyoruz, örneğin FD. Dolayısı ile interrupt olduğunda, Z80 önce sizin ayarladığınız tablodan peş peşe 2 byte okuyor, ve eline FDFD (65021) geçiyor. Sonra bu adrese zıplıyor ki burada sadece bir RET var. Ama istersen bu komutu JP nn şeklinde değiştirip istediğin rutine yönlendirebilirsin.

Ben burada interrupt'u sadece senkronizasyon için kullandığım için HALT ile bekletiyorum, sonra interrupt oluşunca RET komutu HALT'tan bir sonraki komuttan devam etmemizi sağlıyor. Bu şekilde vblanking tamamlanmış, ekranın başına dönülmüş oluyor (bu anda interrupt oluşur), ben de hiç vakit kaybetmeden RET ile dönüp çizime başlıyorum.

IM2 işini detaylı olarak şuraya yazmışım, bir bakınız:
http://retrojen.org/pano/index.php?topic=189.msg1152#msg1152 (http://retrojen.org/pano/index.php?topic=189.msg1152#msg1152)

Önemli uyarı: I registeri 0x40-0x7F arasında olamaz. Bu aralıkta ekranda parazit oluşur (Snow Effect adıyla bilinen efekt).