Gönderen Konu: Z80 Makine diline meraklı olan?  (Okunma sayısı 104463 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Z80 Makine diline meraklı olan?
« : 15 Ocak 2014, 22:46:00 »
"6502 Makine diline meraklı olan?" başlığı olurda "Z80 Makine diline meraklı olan?" başlığı olmaz mı?

1985'te 48K ZX Spectrum sahibi olup ilk sene oyun oynayıp kendi çapımda Basic öğrendikten sonra Z80 öğrendim. Kaynak ise zamanın meşhur elektronik dergilerinden Elo Elektronik'te çıkan Z80 bölümüydü. Spectrum'um ölünceye kadar makine dilinde programlar yazardım. Kasetten assembler editör yükle, kısa rutinler yaz (mesela oyun yükleme sırasında çıkan ekranı ters çevir vs..) denemeler yap vs.. 
Sonrasında C64'e takılıp bu sefer 6510 ile ilgilendim.
2009'da ise Z80'e ve dolayısıyla Spectruma dönüş yaptım.

Başlığı açtım ama içeriği nasıl olacak bilmiyorum. Z80 komutlarından mı başlasam, yoksa ufak rutinler mi yazsam karar veremiyorum.

Hafızada 4K'lık bir bölgeyi temizleyen (sıfırla dolduran) bir rutin yazalım bari.

LD HL,$8000
LD DE,$8001
LD BC,$1000
LD (HL),0
LDIR
RET

$8000-$9000 arasını "0" ile dolduruyoruz.

(Ref, Alco ve diğer Z80 bilenlerin katkılarını bekliyoruz.)




Çevrimdışı memrah

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 188
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #1 : 16 Ocak 2014, 02:54:24 »
Hades, darilma ama bir elestiride bulunacagim;

Cocukken, henuz teknik kitaplari anlayabilecek kadar ingilizce bilmezken, Turkiye'de ZX Spectrum icin cikmis bir iki Turkce kaynaktan Z-80 makine dilini anlamaya calisirdim. (Ne yazik ki ELO Elektronik'teki makine dili yazilarindan haberdar degildim o zamanlar) Anlayamamamin yegane sebebi yukarida ornegini verdigin LDIR komutu tarzinda anlatim yapan, yani ornegi veren ama adim adim aciklamayan kaynaklardi :D

Evet 4K'lik bir bolgeyi 0'la doldurdun ama hic Z-80 bilmeyen birisine anlatirken, asagidaki bilgileri de vermek onemli bence.

LDIR komutu, bellekteki herhangi bir alani baska bir alana kopyalamak icin kullanilan dongusel komutlardan birisidir. (Bir digeri icin bkz. LDDR)

Calisma sekli:

LDIR komutu yurutulmeden once 3 yazmac gerekli parametreler ile yuklenir.

HL ciftine, kopyalanmak istenen (kaynak) alanin baslangic adresi,
DE ciftine hedef alanin baslangic adresi,
BC ciftine ise baslangic adresinden itibaren kac byte kopyalanacagi yuklenir.

Ardindan LDIR komutu verilerek kopyalama gerceklestirilir.

Gercekte LDIR komutu bir islemler dongusunu baslatir. Adim adim incelersek, LDIR komutu verildiginde, ilk olarak;

LD (DE),(HL) islemi ile DE'nin isaret ettigi adrese HL'nin isaret ettigi adresteki deger yuklenir.

Ardindan DE ve HL 'nin degerleri 1 arttirilir ve BC 'nin degerinden ise 1 eksiltilir. Dongu kontrol degiskeni olarak BC yazmaci kullanilir ve dongu BC'nin degeri 0 oluncaya kadar tekrar eder. Komutun calisma suresi kopyalanacak byte miktarina bagli olarak degisir.

Hades'in verdigi ornekte, hedef alan, kopyalanacak kaynak alanin sadece 1 byte ilerisinde oldugu icin, kaynak alanin ilk byte'inda tutulan deger (Hades'in orneginde 0) hemen bir ilerisindeki adrese yazilacak.  Ardindan da HL ve DE yazmaclari birer arttirilacagi icin bir bu defa bir onceki adimda hedef alanda olan adres bu kez kaynak alana girecek, ve icerisinde tutulan deger (0) yine kendisinden sonraki adrese kopyalanacak. Bu da BC'deki deger yani $1000 (dec.4096) sifirlanana kadar, yani 4096 kere tekrarlanarak, 4K'lik bir RAM alanini 0'larla dolduracaktir.

Bu tarz bir kullanim ornegin ekran bellegi bolgesini (ZX Spectrum'da 16384 ten baslayan 6912 byte) sifirlamak sureti ile ekrani silmek amaci ile kullanilabilir. Tabi kullanim alani bununla sinirli degildir.

LDIR genel olarak son derece kullanisli bir komuttur.

Yani ne bileyim, eger amac hic bilmeyenler icin bir kaynak olusturmaksa boyle biraz "Z-80 Machine Code for Dummies" tarzinda yazmak lazim sanki.  :)

Çevrimdışı memrah

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 188
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #2 : 16 Ocak 2014, 03:14:21 »
Aslinda biraz tersten basladik, daha LD, ADD, SUB vs ogretmeden LDIR dedik ama, madem dongulerden bahsettik, Z-80 makine dilinin en temel ve basit dongu komutu DJNZ'den bahsedip kacayim. Sabaha yetistirmem gereken bir is var ve ben daha yarisini bile bitiremedim.

Z-80 Makine dili'nin esnek komutlarindan biri olan DJNZ, 255 defa'ya kadar tekrarlanmasi istenen islemleri bir donguye sokmak icin kullanilabilir.  Dongu kontrol degiskeni olarak B yazmaci kullanilir. B yazmacindaki sayi 0'dan buyuk oldugu surece, DJNZ komutu isletildiginde, komutun isaret ettigi adrese atlanir.

B yazmacindaki deger her DJNZ komutu calistirildiginda bir eksiltilir ve 0'a ulastiginda, DJNZ komutunun isaret ettigi adrese atlama yapilmaz. Onun yerine DJNZ komutundan bir sonraki komuta atlanir.

Ornegin asagidaki rutin NOP komutunu 128 kere calistirir:

LD B,128
islemyok:
NOP
DJNZ islemyok
RET

DJNZ'nin acilimi eger yanlis hatirlamiyorsam Decrease and Jump if Not Zero idi.

Bir de, DJNZ ile goreceli atlamalar yapilir. Yani atlanacak adres, o anki adresin en fazla 128 byte ilerisi veya 128 byte gerisi olabilir.

Bana musade.. Mikrofon Z-80 bilen diger arkadaslarda....

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #3 : 16 Ocak 2014, 07:27:59 »
En iyisi hem komutlardan bahsetmek hem de kısa rutinler yazmak.  Şu anda cepten yazıyorum akşam evde daha rahat birşeyler yazarım.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #4 : 16 Ocak 2014, 09:04:00 »
Oh burası coşmuş, hatta memrah da gelmiş! Ansiklopedi gibi olur burası şimdi, eğer bu başlık çok büyürse bunu düzenleyip bir bölüm yapacağıma söz veriyorum :)

Alıntı
Yani ne bileyim, eger amac hic bilmeyenler icin bir kaynak olusturmaksa boyle biraz "Z-80 Machine Code for Dummies" tarzinda yazmak lazim sanki.  :)
Kesinlikle katılıyorum, hatta bu konuda bir yöntem önereceğim, 10 yıllık bir eğitmen olarak yeni öğrenenlerin basamaklı yazımları daha iyi kavradığını farkettim. Üssteki düz paragrafı şöyle birşeye çevirince daha anlaşılır olabiliyor. Tabii takdir sizin, bu benim yöntemimdir.


LD (DE),(HL) islemi ile DE'nin isaret ettigi adrese HL'nin isaret ettigi adresteki deger yuklenir.

Ardindan DE ve HL 'nin degerleri 1 arttirilir ve BC 'nin degerinden ise 1 eksiltilir. Dongu kontrol degiskeni olarak BC yazmaci kullanilir ve dongu BC'nin degeri 0 oluncaya kadar tekrar eder. Komutun calisma suresi kopyalanacak byte miktarina bagli olarak degisir.
....

Yukarıdaki tanım LDIR'i harika açıklıyor olsa da, şöyle yazınca daha bir sadeleşiyor sanki:

LDIR:
   1. (hl) deki byte'ı (de)'ye kopyalar
   2.  HL ve DE yi arttırır BC'yi eksiltir
   3.  BC = 0 olana kadar bu işlemleri tekrar eder.

Ne dersiniz?

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #5 : 16 Ocak 2014, 16:23:26 »
* z80'in temel işlemci, adresleme yapısı, registerları, flagleri nelerdir?
* G/Ç birimleri nasıl kontrol edilir?
* Opcode nedir? z80 hangi işlevsel gruplarda hangi opcodeları barındırır?
* z80 programlama için farklı platformlarda alternatif compiler, monitor, emulator/simulator toolları nelerdir?
* Matematiksel işlem temelleri, floating point v.b. konular...
* z80 tabanlı bilgisayarlarda grafik/sprite, ses kullanımı (burada ZX Spectrum, Amstrad CPC gibi cihazlar ayrı ayrı ele alınabilir)

Bu şekilde ilerlenirse ben dahil birçok kişi faydalanabilir. Hello world example'ı olarak memory'de bir bölgeyi sıfırlamak güzel ama o bölgeyi sıfırlayan kodu yazıp başarıyla çalıştıran kişinin hevesinin kursağında kalacağı nokta o bölgenin sıfırlandığını nasıl kontrol edeceğini bilmediği noktadır. :)

Çevrimdışı memrah

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 188
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #6 : 16 Ocak 2014, 17:38:47 »
* z80'in temel işlemci, adresleme yapısı, registerları, flagleri nelerdir?
* G/Ç birimleri nasıl kontrol edilir?
* Opcode nedir? z80 hangi işlevsel gruplarda hangi opcodeları barındırır?
* z80 programlama için farklı platformlarda alternatif compiler, monitor, emulator/simulator toolları nelerdir?
* Matematiksel işlem temelleri, floating point v.b. konular...
* z80 tabanlı bilgisayarlarda grafik/sprite, ses kullanımı (burada ZX Spectrum, Amstrad CPC gibi cihazlar ayrı ayrı ele alınabilir)

Bu şekilde ilerlenirse ben dahil birçok kişi faydalanabilir. Hello world example'ı olarak memory'de bir bölgeyi sıfırlamak güzel ama o bölgeyi sıfırlayan kodu yazıp başarıyla çalıştıran kişinin hevesinin kursağında kalacağı nokta o bölgenin sıfırlandığını nasıl kontrol edeceğini bilmediği noktadır. :)

Dogru. Zaten mesajimda da dedigim gibi ise tersten basladik. Eger isi hic bilmeyenlere ogretmeyi amaclayan birsey olusturulacaksa, LDIR, DJNZ vs. bir yana, CPU nedir, register nedir, adres nedir kadar temele inilmeli bence. Keske bunu yapmis olan Turkce kitaplar benim cocuklugumda Turkiye'de mevcut olsaydi.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #7 : 16 Ocak 2014, 19:22:28 »
Skate'nin önerisi gayet mantıklı. (Final sınavı sorusu gibi olmuş :))

Alıntı
z80'in temel işlemci, adresleme yapısı, registerları, flagleri nelerdir?

Z80, 8bitlik bir işlemci olup 8bitlik data hattına, 16 bitlik adres hattına ve çeşitli kontrol sinyallerine sahip bir işlemcidir. 64KByte adresleyebilir. Normal memory adreslemesinin yanında çeşitli IO komutları sayesinde 64K IO bölgesi adresleyebilir.
Registerler :

Program Kontrol Registerleri:
PC : Program Counter. İşlemcinin a onda çalışmakta olduğu hafıza adresini gösterir.
SP : Stack Pointer. Yığın işlemleri için kullanılacak bölgenin başlangıç adresini gösterir. Kullanıcı tarafından değiştirilebilir.

Genel amaçlı kullanılan registerler:
A, B, C, D, E, H, L ve yapılan işlemin sonucuna göre değişen bitlere sahip F (Flag) registeri.

Yukarıdaki 8 bitlik registerlerden B ve C, D ve E, H ve L birlikte kullanılarak BC, DE, HL registerleri 16 bitlik olarak kullanılabilir.

Ayrıca Alternate register denilen AF', BC', DE' ve HL' registerleri vardır. Bu registerlere doğrudan erişim yoktur. EX AF,AF' komutu ile AF register çifti AF' register çiftiyle, EXX komutuyla ise BC, DE, HL register çiftleri BC', DE', HL' register çiftleriyle yer değiştirir. Daha doğrusu bu register çiftlerinde tutulan değerler yer değiştirir. Mesela LD BC,$4000 - LD DE,$5000 ve LD HL,$6000 olsun.
EXX komutuyla $4000, $5000 ve $6000 değerleri Alternate registerlere aktarılır. Alternate registerlerdeki değerler asıl registerlere aktarılır. POP ve PUSH komutlarını kullanmaya gerek kalmadan Alternate registerleri geçici olarak saklama yeri gibi düşünebilirsiniz.

İndex registerleri:
Z80'de iki adet index registeri bulunur ve 16bitlik yapıdadır. IX ve IY olarak adlandırılır. Gerekirse sanki 8 bitlik iki registerden oluşmuş gibi kullanılabilir. Alt 8 bitleri için LX, LY ve üst 8 bitleri için HX, HY olarak adlandırılan  -undocumented opcodes- komutları bulunmaktadır.

I Registeri : Interrupt kontrol registeridir
R Registeri: Dinamik Ramler için kullanılan Refresh registeridir.

Son olarak IFF1 (Interrupt Flip Flop 1) ve IFF2 (Interrupt Flip Flop 2) registerleri bulunmaktadır. Herhangi bir IRQ veya NMI oluştuğunda içerikleri değişmektedir.


FLAG'lar:

Yapılan işleme göre durum değiştiren bitlerdir.

7.bit - S - Sign biti
6.bit - Z - Zero biti
5.bit - Kullanılmıyor.
4.bit - H - Half Carry biti
3.bit - Kullanılmıyor.
2.bit - P - Parity biti
1.bit - N -
0.bit - C - Carry biti

(Ref bit açıklamalarını sen yapıver.)


Alıntı
G/Ç birimleri nasıl kontrol edilir?
Z80 özellik olarak G/Ç komutlarına sahiptir. IN ve OUT komutlarıyla herhangi bir donanımla bilgi alışverişi yapabilir.
Mesela ZX Spectrumun ekran belleği, donanımsal olarak IO adreslemeli bir yapıda olsaydı komutlarımız aşağıdaki şekilde olacaktı.

LD BC,$4000 ; 16384 ekran belleğinin başlangıç adresi.
LD A,$FF ; Akümülatöre $FF (255) sayısını yerleştiriyoruz.
OUT (C),A ; 16384 numaralı ekran belleği adresine aküdeki değeri yazıyoruz.

Normalde ZX Spectrumda ekran belleğine aşağıdaki şekilde yazarız.

LD A,$FF
LD ($4000),A

veya

LD HL,$4000
LD (HL),$FF ;(Skate'in dikkati sonucu düzeltildi.)

Z80'nin G/Ç komutlarına sahip olması donanım tasarımı açısından büyük esneklik sağlar. Nitekim Spectrum'un joystickleri IN komutuyla okunur.

Devam edecek...

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #8 : 16 Ocak 2014, 19:34:37 »
Bak şimdi oldu. :) Eline sağlık Hades.

Ben z80 ile hemen hiçbirşey kodlamamış olsam da epey bir z80 asm öğrendim birkaç sene önce C128 sahibi olduğum zaman. Son derece hakim olduğum bir donanımda z80 kullanmak çok daha keyifli oldu elbette ki. Ama öğrendiğimle kaldım ve aradan geçen zamanla da epey unuttum.

Bir diğer z80 merakı bende Amstrad CPC platformunda üst üste bob rekoru kırıldığı dönemde "ulan şunların ellerine vermek lazım" diye düşündüğüm sıralarda gelip gitmişti, yine bir anlık gaz sonuçsuz kalmıştı. :)

Yakın zamanda ise Batman Forever demosu çıktığında artık "tutmayın ulan beni, tutmayın küçük enişteyi!" diye bağırmaya başlamıştım ancak o sıralar Atari 800XL ve Amiga 1200'le eş zamanlı uğraşıyor olduğum için maymun iştahlılık etmemem lazım demiş ve bırakmıştım uğraşmayı.

Bak bu dört etti. :) Artık bu forum başlığı da beni z80 kodlamaya itmezse bir daha ömür boyu tek satır z80 kodu yazmayacağıma eminim. O yüzden hadi, dökün bakalım bilgileri ortaya. Ben parmaklarımı çatırdatıyorum şu anda. Hazır ve nazır bekliyorum. ;)

Ufak bir düzeltme: Hades kardeşim, en son örnekteki $255, $FF olacak tabii ki. Kodları denemek isteyen olursa kafa karışıklığı olmasın diye belirttim.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #9 : 16 Ocak 2014, 21:30:44 »
Alıntı
Opcode nedir? z80 hangi işlevsel gruplarda hangi opcodeları barındırır?

Opcode : Operation Code. Yani bir işlemcinin yapacağı işlemi belirten koddur. İşlemci o anki opcode'a göre ne işlem yapacağını bilir. Z80'de komutların opcode'ları aşağıdaki şekilde olabilir.
(Opcode'lar hexadecimal formatta verilmiştir)
(nn : $00..$FF arasında bir baytlık değer)
(nnnn : $00 ... $FFFF arasında iki baytlık bir değer)

Tek baytlık ve parametre almayan opcode'lar. (00 : NOP, 76 - HALT, C9 - RET vs..)
Tek baytlık ve bir parametre alan opcode'lar. (06 nn : LD B,nn - DE nn : SBC A,nn vs...)
Tek baytlık ve iki parametre alan opcode'lar. (21 nn nn: LD HL,nnnn - FC nn nn : CALL M,nnnn vs..)

İki baytlık ve parametre almayan opcode'lar. (ED B8 : LDIR - DD E5 : PUSH IX vs..)
İki baytlık ve bir parametre alan opcode'lar. (DD 7E nn : LD A,(IX+nn) - DD AE nn : XOR (IX+nn) vs..)
İki baytlık ve iki parametre alan opcode'lar. (DD 21 nn nn : LD IX,nnnn - FD 22 nn nn : LD (nnnn),IY vs..)

Üç baytlık ve bir parametre alan opcode'lar. (FD CB nn 06 : RLC (IY+nn) - DD CB nn FE : SET 7,(IX+nn) vs..)


Daha basit bir ifadeyle Z80 komutları 1, 2, 3 veya 4 bayt uzunluğunda olabilir.
Teorik olarak 256 komut var gibi gözüksede CB, DD, ED, FD opcode'ları birer önkod olup devamında 1, 2 veya 3 bayt daha olabilir. Ön koda sahip komutlarla beraber toplam komut sayısı 705 dir. Eğer undocumented opcode'ları da sayarsak toplam komut sayısı 1278 olmaktadır. (Yanlış saymış olabilir. Kontrol edebilirsiniz)

(Kaynak http://clrhome.org/table/)

Devam edecek....

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #10 : 17 Ocak 2014, 17:15:21 »
"6502 Makine diline meraklı olan?" başlığı olurda "Z80 Makine diline meraklı olan?" başlığı olmaz mı?
Aman diyeyim! Bu tür çekişmeli başlıklar çok tehlikeli. Şimdi biri çıkar "CPUlar Üzerine: Bölünerek Azalma" şeklinde bir başlık açar ve ortalık karışır. Lütfen, uzak duralım böyle şeylerden.

Bak bu dört etti. :)
Beş olabilir mi? Senin çocukken eline bir yerlerden Z80 kitabı geçmişti diye hatırlıyorum. Ama ilgili başlığı TRDS'de bulamadım.


Ders materyali vermek lazım biraz:

http://www.z80.info

http://jemu.winape.net
http://www.oshonsoft.com/z80.html
http://winape.net

Spectrum Basic ve Z80 Makine Kodu(Türkçe)
Programming The Z80 (Rodnay Zacks)

Not: Kendi adıma materyal ve link türü eklemeleri sadece buraya yapacağım ki takip etmesi kolay olsun.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #11 : 17 Ocak 2014, 18:07:00 »
Ben de pek vakit bulamıyorum bu ara ama kendi kullandığım araç zincirini dağıtılabilir hale getirerek tek pakete topladım.

download (lütfen kurulum kısmını da okuyun):
9.7MB Zip dosyası ZxToolchain Windows XP/7/8


Bu araç zincirinde neler var?
1. Context Text editör ve z80 assembler vurgulayıcı
2. Registry makroları (tek tuşla derleme ve emülatörde test etmek için)
3. Pasmo derleyici
4. Specemu 3.1 zx spectrum emülatör

Ek araçlar:
5. Zx Paintbrush - Zx Grafik editörü
6. SevenUp Animasyonlu Sprite editörü (asm data olarak çıktı verir)
7. Vortex Tracker II - Ay müzik editörü - bolca örnek müzik

Kurulum:
Paketi herhangi bir klasöre ayıklayın (unzip) ve executekeys.reg dosyasını çalıştırarak context makrolarını kayıt defterine giriniz. (eğer registry dosyasını çalıştırmazsanız F9 ve F10 tuşları çalışmaz)

Kullanım:
Çalışmaya başlamak için Context klasörüne girip ConTEXT.exe dosyasını çalıştırın.

Yazdığınız kodu ".asm" olarak kayıt ederseniz F9 ve F10 executekeys çalışır hale gelir.

F9 = Pasmo ile derle (kodunuzu kaydeder ve pasmo ile derler, zx spectrum tap dosyası oluşturur)
F10 = Specemu ile çalıştır. (Pasmo'nun oluşturduğu dosyayı specemu ile açar)

Eğer yazdığınız kodun otomatik olarak çalışmasını istiyorsanız kodunuzun sonuna başlangıç adresini END direktifi ile vermeniz gerek. Örnek (örnek kod "deneme.asm" olarak proje klasöründe bulunmaktadır, ekranı temizler, siyaha boyar):

Kod: [Seç]
org 32768

ld hl, 16384
ld de, 16385
ld bc, 6912
ld (hl),0
ldir

end 32768

ORG direktifi programın derleneceği adresi belirtir, END direktifi sayesinde teyp dosyasına eklenen loader'a otomatik olarak USR 32768 komutu eklenir böylece kodunuz yüklendikten hemen sonra otomatik olarak çalıştırılır.

Sorun varsa:
Eğer bunu yapmanıza karşın specemu teybi yüklemiyorsa Specemu içinde Options > Options > Tape > [tape playback options] kısmındaki 4 seçeneği de işaretleyin.


Bu araç zincirini Compiler/editor/emulator vs. kendiniz hazırlamak isterseniz daha önce bunu çok detaylı şekilde anlatmışım: http://retrojen.org/pano/index.php?topic=189.0

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #12 : 17 Ocak 2014, 20:52:34 »
Z80'i spectrum üzerinde kullanacaklar için kodlama donanım püf noktaları:

Zx spectrum belleği 4 bölümden oluşuyor:

0-16383 arası ilk 16k adresler ROM adresidir, değiştirilemez, her zaman ROM bulunur, page edilemez (+3 hariç).

16384-32767 adresleri arası 16k, "contended" gecikmeli hafızadır. İşlemci bu bölge üzerinde hangi işlemi yaparsa yapsın, görüntüyü oluşturan işlemci (ULA) tarafından bekletilir. İşlemci bu bölgede işlem yaparken %20 civarı yavaş çalışır. Bu yüzden bu bölgeye genelde kod konmaz.

32767-49151 arası 16k sabit hafızadır, genelde kalıcı kod bu bölgeye yerleştirilir.

49152-65535 arası son 16k ise page edilebilen hafızadır. Bu kısımdaki RAM bir out komutu ile sayfa çevrilebilir, böylece 128k hafızaya ulaşılır. Bu sayfalardan 5 numaralısı aynı zamanda ULA tarafından bağımsız olarak adreslenebilir. Böylece ekran için Double Buffer olarak kullanılabilir.

Yani, kodunuzun başlangıç adresi 32768 ve üstünde olmalı.

16384-32767 ($4000-$8000) aralığında yazma/okuma işlemlerini minimalde tutmak gerekiyor.

Ula Karlanma Hatası:
Z80 işlemcisi her bir opcode okuma işlemini yaptığında IR yazmaç çiftini adres bus'ına koyar (R yazmacı belleği tazelemek için kullanılıyor). Eğer I yazmacı 64-127 arasında olursa ULA'nın kafası karışıyor ve işlemci habire belleği okumak istiyor sanıyor. Böyle olunca ekranı oluşturmak için yapması gereken ram okumasını yapamamaya başlar böylece ekranı çizmek için bir önce okuduğu veriyi tekrar kullanır. Böylece ekranda bozulmalar olur. Bu spectrum'un işleyişinde herhangi bir problem oluşturmaz. Bu efekt sıkça oyunlarda kullanılmıştır. Aynı efekt hades'in yazdığı "searching for the roots" demoda da mevcuttur. Bu efekti görebilmek için Snow destekleyen bir emülatöre ya da gerçek makinede test etmeye ihtiyacınız vardır. Specemu'da snow efekti desteklenmektedir.

Yüzer Bus:
Bu tasarım vurdumduymazlığı zx spectrumda raster senkronizasyonu için kullanılabilir. Eğer z80 takılı olmayan bir donanım portundan okuma yapmaya kalkarsa onun yerine ULA'nın ekran çizmek için kullandığı byte değerini okur. Bu değer eğer 255 ise o sırada border çizmeye başlamış demektir. Bu durum cobra, arcanoid, sidewize gibi oyunlarda yırtılmasız çizimler yapmak için kullanılmıştır.


Çevrimdışı memrah

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 188
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #13 : 17 Ocak 2014, 21:00:58 »
Ufak tefek kisa denemeler icin ZXSpin'in dahili assembler'ini kullaniyorum ben.  Yeni baslayanlar icin kod parcaciklarini yazip aninda calistirarak sonuc gorebilme acisindan pratik bir cozum olabilir. Ayrica araclar arasinda debugger da var.

Yanliz her nedense bazen assembler'in editor bolumu copy/paste islemlerinde sacmaliyor. Ya bir bug var ya da benim bolca patchlenmis windows'um ile ilgili bir sorun yuzunden oluyor. WOS'ta bu sorundan bahseden kimseye rastlamadim.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Z80 Makine diline meraklı olan?
« Yanıtla #14 : 17 Ocak 2014, 22:06:04 »
WOS'ta bu sorundan bahseden kimseye rastlamadim.

Rastlamazsın çünkü ZX Spin'in assembler'ını yazan Marko iş henüz emekleme aşamasındayken bir bunalıma girerek speccy scene'inden 15 aylığına kayboldu, aynı anda projenin başındaki paul ile bir kavgalaşma durumuna girdiler, assembler tarafı alpha aşamasında kaldı. İçinde zilyon tane bug var. Sonra marko birkaç girişim daha yaptı fakat sonunda baygınlık geldi sanırım. Üzerinde sayaç olan sürümler marko'ya ait. Bir de onları dene istersen. Tabii spectrum development ile uğraşan herkes bir şekilde irc'de bu muhabbete şahit olduğu için zx spin ile bir maceraya girmekten imtina etmiştir. Böylece hiç soru oluşmamış olabilir.

Assembler'ı bir kenara, debugger da aynı problemlerden muzdarip. Yani o assembler ve debugger bayağı problemli ve yarım. Ciddi bir projeye girişmemek gerek onunla. Ufak testler yapılabilir.

Bu arada Marko çok kral adamdır, harbiden bu kadar dost canlısı ve alçak gönüllü bir ingiliz bulmak bir hayli zor. Herhalde bu yüzden stres bindi sonunda adamın üzerine :)