Gönderen Konu: z80 asm ile iyi seneler  (Okunma sayısı 3307 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 3093
  • Advanced User Simulator
    • ae unutmadan
z80 asm ile iyi seneler
« : 02 Ocak 2015, 18:48:49 »
Alco'nun tatmin olmaması üzerine bugün aynı kodu 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!

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2251
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: z80 asm ile iyi seneler
« Yanıtla #1 : 02 Ocak 2015, 18:54:30 »
Alco'nun tatmin olmaması üzerine bugün aynı kodu 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...

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 3093
  • Advanced User Simulator
    • ae unutmadan
Ynt: z80 asm ile iyi seneler
« Yanıtla #2 : 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
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ü

Çevrimdışı ilkergorkem

  • RAAT
  • Retromanik
  • *
  • İleti: 23
Ynt: z80 asm ile iyi seneler
« Yanıtla #3 : 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...

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 192
Ynt: z80 asm ile iyi seneler
« Yanıtla #4 : 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. 

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 3093
  • Advanced User Simulator
    • ae unutmadan
Ynt: z80 asm ile iyi seneler
« Yanıtla #5 : 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

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