Retrojen Forum

Retro Sistemler => Sinclair => Konuyu başlatan: Ref - 09 Şubat 2012, 12:53:46

Başlık: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 09 Şubat 2012, 12:53:46
09.03.2014 edit: ilgili paketin hazır hali şu başlıkta paylaşılmıştır: http://retrojen.org/pano/index.php?topic=539.msg4197#msg4197 (http://retrojen.org/pano/index.php?topic=539.msg4197#msg4197) Download (http://retrojen.org/pano/index.php?topic=539.msg4197#msg4197)



Crimson editörün admin olmayan kullanıcılarda bazı kullanım zorlukları bulunduğundan dolayı context ile değiştirilmiştir.

Zx Spectrum'a Assembler ile girişmek istiyorsanız ben kendi kullandığım yöntemi buraya yazıyorum, daha iyisini bulan varsa lütfen eklesin:

Benim kullandığım toolchain pasmo+crimson editör+specemu'dan oluşuyor. Yıllardır spectrum coderları ile konuşuyorum, üzerinde uzlaşılmış ideal bir ortam yok. Neden bu üçlüyü tercih ettiğimi şöyle açıklayayım:

Pasmo, özellikle zx spectrum düşünülerek geliştirilmiş bir derleyici. İşini de çok iyi yapıyor, derleyiciyi yazan arkadaş wos forumlarının en aktif kullanıcılarından biri.

Specemu, bugünlerde 3.0 sürümü çıktı. Gerçek makine davranışına en yakın emülatör. Çok sade, multiface ve çeşitli disk emülasyonu dışında hiçbir aksesuarı desteklemiyor, hatta joystick desteği bile yok. Fakat, eğer yazdığınız program specemu üzerinde çalışıyorsa, gerçek bir spectrumda da aynı şekilde çalışacaktır. Ayrıca Specemu'da eşsiz bir Debugger mevcut. Çok acaip noktalara çok acaip şekillerde breakpoint koyabiliyorsunuz. Örneğin ekran çizilmeden önceki son frame'de, rom'dan ayrılırken, belli bir yere yazma ya da okuma yapıldığında, interrupt başında vs. Specemu'ya bu konudaki tek alternatif WinFuse gibi görünüyor, ama o da çok karmaşık bir emülatör, yani seçim specemu.

Crimson Editor ise güzel bir editör, elbette başka bir editör kullanabilirsiniz, bundan önce Context kullanıyordum, windows7 ile birlikte pencere boyutlarında tuhaflıklar çıkmaya başladı ve kod penceresini ikiye bölme gibi bir özellik yok, bundan dolayı crimson editör'e geçtim.

BAŞLANGIÇ

Download ve Kurulum:
Pasmo 0.53 (http://arda.kisafilm.org/fish/pasmo53.zip)  400kb
Specemu 3.0 (http://arda.kisafilm.org/fish/SpecEmu-3.0.b010212.zip) 900kb
Crimson Editor 2.86 (http://arda.kisafilm.org/fish/crimsonedt-286M-setup.exe) 1.4MB

Crimson Editörü setupından kuruyoruz, Pasmo ile Specemu'yu path'i kısa olan bir klasöre (örn: D:\dev\z80\ altına) açıyoruz, aynı klasördeymiş gibi anlatacağım, siz ayarlarsınız.

AYARLAR
Crimson editör'ü çalıştırıyoruz.

Önce ASM tipi olarak z80'i öncelikli yapalım. Yoksa intel 8080'i seçiyor crimson.
* Üstteki menülerden Document > Syntax Type > Customize... seçiyoruz.
* Açılan pencerede sol taraftaki Syntax Type liste kutusunda aşağılara kayarak "-Empty-" soketi bulup seçiyoruz.
*Kutucukları şöyle dolduruyoruz (aşağıdan direkt copy-paste yapabilirsiniz, ya da browse edip dosyaları gösterebilirsiniz):
Description : Z80 Asm
Lang. Spec:   Z80-ASM.SPC
Keywords:     Z80-ASM.Key
* Oluşturduğumuz yeni z80 asm slotunu YUKARI OK butonuna basarak en üste taşıyoruz.
OK butonuna basarak pencereyi kapatıyoruz.
(https://retrojen.org/pano/proxy.php?request=http%3A%2F%2Fimg513.imageshack.us%2Fimg513%2F7452%2F54ca933d48df48d29d3a133.png&hash=957a576f1440c607d69122ab65b32681)
Menüde üstteki gibi görebilmemiz gerek. Artık Autodetect olarak bırakabiliriz buradaki ayarı, asm dosyalarını z80 olarak görecektir, görmezse de gidip kolayca elle seçebiliriz.

Sırada PASMO'yu eklemek var:
Şimdi yine üst menüden TOOLS > "Conf. User Tools" seçeneğini seçiyoruz.
Aşağıdaki preferences penceresi görünecek:
(https://retrojen.org/pano/proxy.php?request=http%3A%2F%2Fimg6.imageshack.us%2Fimg6%2F4918%2Feb2eb902ad024e51ade8490.png&hash=a52edddf3ca392dc17431bb4a6be36ef)

* Resimde 1 numara ile işaretlenmiş "user tool | hot key" şeklinde gösterilen liste kutusunda "-EMPTY-" yazan bir soket buluyoruz ve onu seçiyoruz.
* 4 numaralı "Menu Text" kısmına "Compile with Pasmo" yazıyoruz.
* Command kısmının yanında 3 ile gösterilen butona basıyoruz ve PASMO.exe'yi koyduğumuz klasörde bulup seçiyoruz. O kutucukta örneğimize göre şöyle yazmalı:
D:\dev\z80\pasmo.exe
* Hemen altında 5 ile işaretli "ARGUMENT" kutusuna aynen şunu yazıyoruz:
-v --tapbas $(FilePath) $(FileDir)\$(FileTitle)_out.tap
* bir altındaki 6 ile işaretli "INITIAL DIR" kısmına $(FileDir) yazıyoruz.
* Hotkey kutusuna klikleyip, kutucuk aktif iken ctrl+1 tuşlarına basarak bu görevi ctrl+1 kombinasyonuna atıyoruz.
* Capture Output (8) ve Save before execute(9) seçiyoruz.
* Resimde 2 ile işaretli yukarı butonuna basarak bu aracımızı listenin üstüne taşıyoruz (eğer altta kaldıysa).
* Save Tools diyoruz (bazen kaybolabiliyor toollar) ve bu ayarımızı bir isim altında kaydediyoruz.

* Pencereyi KAPATMIYORUZ.

Şu anda pasmo hazır olmalı. Ama listeye pasmo'nun çıktısını hızla test etmemize yardımcı olacak olan
specemu'yu da ekleyelim.

* Resimde 1 numara ile işaretlenmiş "user tool | hot key" şeklinde gösterilen liste kutusunda "-EMPTY-" yazan yeni bir soket buluyoruz ve onu seçiyoruz.
* 4 numaralı "Menu Text" kısmına "Run with Specemu" yazıyoruz.
* Command kısmının yanında 3 ile gösterilen butona basıyoruz ve specemu.exe'yi koyduğumuz klasörde bulup seçiyoruz. O kutucukta örneğimize göre şöyle yazmalı:
D:\dev\z80\specemu.exe
* Hemen altında 5 ile işaretli "ARGUMENT" kutusuna aynen şunu yazıyoruz:
$(FileDir)\$(FileTitle)_out.tap
* bir altındaki 6 ile işaretli "INITIAL DIR" kısmına $(FileDir) yazıyoruz.
* Hotkey kutusuna klikleyip, kutucuk aktif iken ctrl+2 tuşlarına basarak bu görevi ctrl+2 kombinasyonuna atıyoruz.
* Capture Output (8) ve Save before execute(9) seçiyoruz.
* Resimde 2 ile işaretli yukarı butonuna basarak bu aracımızı listenin üstüne taşıyoruz (eğer altta kaldıysa).
* Bu sefer son olarak Save Tools diyoruz ve bu ayarımızı bir isim altında kaydediyoruz.
* OK ile bu pencereyi kapatıp çıkıyoruz.

Artık ctrl 1 ve 2 tuşlarına pasmo ve specemu'yu eklemiş olduk. Aynı şekilde TOOLS menüsünü açarsanız artık iki ayrı menü göreceksiniz.
(https://retrojen.org/pano/proxy.php?request=http%3A%2F%2Fimg6.imageshack.us%2Fimg6%2F3497%2F94840ca65bd3450eb79cdd1.png&hash=b6f4695db9edb9f928655300c10b5b97)

Fakat daha bitmedi.

Şimdi specemu'yu uygun şekilde ayarlayalım:

Options > Options (f8) menüsüne giriyoruz şu seçenekleri ayarlıyoruz:

Display:
ULA Snow effect
Enable Vsync
Show Tape Disk icons in the border
Bu üç kutucuk seçili olsun, diğerlerini temizleyin.

Sound:
Output: Mono
High Quality AY emulation
None
22khz
diğer kutucuklar boş

Hardware:

ZX Spectrum 48k ve 128k için ZX Spectrum +2 dışında bir model kullanmayın.
Use late timings for this model
Diğer tüm kutucuklar boş

Tape:
Burası önemli, BOOST opsiyonları dışındaki tüm kutucukları işaretleyin.

Advanced:
En alttaki Ask before exiting specemu kutucuğunu tercihen temizleyin.

Ok diyerek çıkın ve emülatörü kapatın. Ayarlarınızı otomatik olarak kaydedecektir.

Artık çalışmaya hazırız.

Hemen şu test programını deneyelim:


Kod: [Seç]
org 40000   ;Başlangıç adresi

Call $0D6B  ;Ekranı temizler (Basic CLS)

ld de,16384 ;Ekran belleğinin adresi
ld hl,3000  ;Rom'daki rastgele bir nokta, veri kopyalayacağız
ld bc,2048  ;Kopyalanacak veri uzunluğu
ldir        ;LoaD with Increment and Repeat (bu kopyalamayı yapan komut)

end 40000  ;Bu pasmo'ya otomatik bir loader eklemesini söyleyen komut. 40000 ise başlangıç adresi oluyor.
Yukarıdaki kodu crimson editörde boş bir sayfa oluşturup içine yapıştırıyoruz, hemen dosyayı kaydediyoruz, örneğin "karmasa.asm" olarak.
Daha sonra CTRL+1 tuşuna basarsanız şöyle bir metin görünecek editörün altında:
(https://retrojen.org/pano/proxy.php?request=http%3A%2F%2Fimg193.imageshack.us%2Fimg193%2F5022%2F60fec99b5bbf401284dd756.png&hash=14b14e65145b5714c7fba41b7deae3f0)

Terminated with exit code 0 gördüyseniz hatasız derlenmiş demektir. Pasmo bizim için bir TAP dosyası yarattı bile. Dosyayı asm dosyasını kaydettiğiniz klasörde bulabilirsiniz. Ama bununla uğraşmayalım diye specemu'yu ayarlamıştık:

Şimdi CTRL+2 tuşuna basıp biraz bekliyoruz, specemu açılıyor, açıldığı gibi dosyamızı otomatik olarak yükleyip kodu da otomatik olarak çalıştırması lazım. Ekranda karmaşık bir görüntü göreceksiniz, rom datasını ekrana kopyaladığımız için parazitten başka birşey yok:
(https://retrojen.org/pano/proxy.php?request=http%3A%2F%2Fimg443.imageshack.us%2Fimg443%2F1101%2F1267ff19fb084d8489f1b62.png&hash=dac571aa1c4415e1256748014fece924)


Bitti.




Son olarak win7 kullanıcıları için Crimson Editör her açılışta admin onayı istiyor. Bunu kapatmak mümkün ama bunun için Microsoft Compatibility Administrator isimli programı indirip kurmanız gerek. Bununla uğraşmak istemeyenler için Context ayarlarını da çok kısa geçeceğim:

Context kullanıyorsanız, aynı ayarları şöyle yapıyoruz:
Options > Environment Options > Execute Keys >
ADD butonuna bas, "asm" (küçük harfle) ekle.
Listede asm kategorisi görünecek, onun altındaki F9'u seç:
Execute: pasmo.exe
Start in: D:\dev\z80\
parameters: -v --tapbas %n %p\%F_out.tap
Window: normal
Hint: boş
Save: Current file before execution
Use short dos names seçili
Capture Console Output seçili
Compiler output parsel rule boş
Scroll Console seçili
Idle Priority boş
[APPLY] butonuna bas,

Sonra .asm altındaki F10'u seç:
Execute: Specemu.exe
Start in: D:\dev\z80\
parameters: %p\%F_out.tap

diğerleri üstteki gibi.

Burada F9 ile asm dosyalarını derliyor, F10 ile specemu'ya atıyoruz.

Benden bu kadar.
Daha pratik yöntemler vardır mutlaka, fakat ben çok yoğun bir asm kullanıcısı olmadığım için bukadar bulabildim. Kolay gelsin.


Bu metne aksesuar olarak şunları iliştirmek istiyorum, aslında konu ile alakaları pek yok:

Z80 için sprite geliştrmek için 7up kullanabilirsiniz.
ftp://ftp.worldofspectrum.org/pub/sinclair/tools/pc/SevenuP-v1.20-win.zip (http://ftp://ftp.worldofspectrum.org/pub/sinclair/tools/pc/SevenuP-v1.20-win.zip)

Grafik çizmek için ZX Paintbrush:
http://www.zxmodules.de/zxpaintbrush/download.html (http://www.zxmodules.de/zxpaintbrush/download.html)

Müzik için PC üzerinde Vortex Tracker II var, genel olarak Sound Tracker gibi spectrum tabanlı programlar kullanılır.
ftp://ftp.worldofspectrum.org/pub/sinclair/music/players-pc/VT1.0beta14.zip (http://ftp://ftp.worldofspectrum.org/pub/sinclair/music/players-pc/VT1.0beta14.zip)
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: nightlord - 09 Şubat 2012, 19:28:00
abi bu supper bi kaynak olmus ellerine saglik
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: hades - 09 Şubat 2012, 20:57:06
OLMUYOR OLMUYOR OLMUYOR >:( :'(

Çalışmalarım (.asm dosyalarım) G:\_RETRO\ZX SPECTRUM\MY WORKS klasöründe
Pasmo.exe G:\_RETRO\ZX SPECTRUM\pasmo 0.53 klasöründe
SpecEmu.exe G:\_RETRO\ZX SPECTRUM\SpecEmu-3.0.b010212 klasöründe bulunuyor.

F9 için;
Execute: pasmo.exe
Start in: D:\dev\z80\ yerine G:\_RETRO\ZX SPECTRUM\MY WORKS\ yazıyorum
Parametreleri aynen yazıyorum ve gerekli seçimleri yapıp uyguluyorum.

F10 için;
Execute: Specemu.exe
Start in: G:\_RETRO\ZX SPECTRUM\MY WORKS\
Parameters: G:\_RETRO\ZX SPECTRUM\MY WORKS\out.tap
Gerekli seçimleri yapıp uyguluyorum.

Herhangi bir .asm dosyasını yükleyip F9'a bastığımda " '.asm' uzantısıyla ilişkilendirilmiş bir kullanıcı komutu yok. Ortam Ayarları / Execute Keys diyalog tuşlarını kullanarak ilişkilendirebilirsiniz." şeklinde bir pencere çıkıyor.
Hatta SpecEmu'nun bütün dosyalarını ve Pasmo.exe'yi my works içine kopyalayıp ayarları değiştiriyorum yine olmuyor.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: ozayturay - 09 Şubat 2012, 21:30:24
Pasmo ile Specemu'yu path'i kısa olan bir klasöre (örn: D:\dev\z80\ altına) açıyoruz, aynı klasördeymiş gibi anlatacağım, siz ayarlarsınız.

Sorun klasör adlarındaki boşluklarda olabilir.

G:\_RETRO\ZX SPECTRUM\MY WORKS -> G:\_RETRO\ZX\WORK şeklinde deneyebilirsin.

Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: hades - 09 Şubat 2012, 22:05:38
Sorun klasör adlarındaki boşluklarda olabilir.

G:\_RETRO\ZX SPECTRUM\MY WORKS -> G:\_RETRO\ZX\WORK şeklinde deneyebilirsin.

Bu ihtimalide düşündüm ve yukarıdaki mesajı gönderdikten hemen sonra G:\_RETRO\Z80\WORKS şeklinde bir klasör açtım ve pasmo.exe'yi buraya kopyaladım. Ayrıca specemu'yuda ayrı bir klasör olarak works'un içine kopyaladım. Context'in ayarlarını değiştirdim ama sonuç yine aynı.
Belkide vazgeçsem iyi olacak.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 10 Şubat 2012, 00:45:49
Herhangi bir .asm dosyasını yükleyip F9'a bastığımda " '.asm' uzantısıyla ilişkilendirilmiş bir kullanıcı komutu yok.

Tamam hata bende, fakat hata kodu gayet açıklayıcıymış hades? "add" butonuna bastığında ".asm" değil, "asm" olarak oluşturman gerekiyor kategoriyi, yani nokta olmadan. Sonra sorun hallolacak. Aslında enteresan, 5 sayfa metin yazıyorum, screenshot'lı basamaklı falan, ama ufacık bir "nokta" herşeyi boşa yaptırmış oluyor.



Alıntı
G:\_RETRO\ZX SPECTRUM\MY WORKS\out.tapG:\_RETRO\ZX SPECTRUM\MY WORKS\out.tap
Yanlız bu şekilde specemu dosyayı açamaz. LAkin pasmo parametresini de ona göre düzenlemen lazım. Benim ayarlarımda her dosya kendi klasörüne, kendi adının sonuna xxx_out.tap şeklinde çıkış alıyor ve bu şekilde specemu'ya geçiyor. Eğer sen her dosya out.tap olsun istiyorsan kesin path ver, hiç "%" switchleri kullanma.

Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Shax - 10 Şubat 2012, 10:13:51
 Bu ne kadar guzel bi sey olmus yav. Yani "Server ne demek?" safhasinda olan kullanicidan tut, mimariler arasi jonglorluk yapan adama kadar her kesime hitab ediyor. Icim bi hos oldu bak.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 10 Şubat 2012, 11:10:07
Çalışmalarım (.asm dosyalarım) G:\_RETRO\ZX SPECTRUM\MY WORKS klasöründe
Pasmo.exe G:\_RETRO\ZX SPECTRUM\pasmo 0.53 klasöründe
SpecEmu.exe G:\_RETRO\ZX SPECTRUM\SpecEmu-3.0.b010212 klasöründe bulunuyor.

F9 için;
Execute: pasmo.exe
Start in: D:\dev\z80\ yerine G:\_RETRO\ZX SPECTRUM\MY WORKS\ yazıyorum
Parametreleri aynen yazıyorum ve gerekli seçimleri yapıp uyguluyorum.

Start in: "G:\_RETRO\ZX SPECTRUM\pasmo 0.53"
olması gerek, path'de boşluklar varsa tırnak içine alman gerek. En güzeli path'de boşluk olmaması, sadece harf ve sayılardan oluşması.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: hades - 10 Şubat 2012, 17:27:00
Ayrıca, context'i bırakıp hazır linkini de verdiğim crimson editör'e geçer misin? Bak ne güzel fotograflı izahlı anlatmışım.

Crimson'u kurup çalıştırdığımda makinaya restart yaptırıyordu. Sonra context'i kurmuştum.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 10 Şubat 2012, 18:10:48
Crimson'u kurup çalıştırdığımda makinaya restart yaptırıyordu. Sonra context'i kurmuştum.

Abovvv. O zaman bilican lazım.. Context yukarıdaki düzeltmeleri yapınca çalışmıyor mu?
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: hades - 10 Şubat 2012, 19:14:46
Şimdi eve geldim ve hemen .asm'yi asm olarak değiştirdim.
Aşağıdaki yazılar çıktı. Ama .tap dosyası ortada yok. :(


> Executing: C:\Program Files\ConTEXT\ConExec.exe "pasmo.exe" -v --tapbas G:\Z80\WORKS\overscan.asm G:\Z80\WORKS\ overscan.asm_out.tap

Loading file: G:\Z80\WORKS\overscan.asm in 0
Finished loading file: G:\Z80\WORKS\overscan.asm in 97
Entering pass 1
Pass 1 finished
Entering pass 2
Pass 2 finished
ERROR: Error creating object file
> Execution finished.

Aynen böyle diyor.

Edit:F9 parametrelerini -v --tapbas %n %p %F.tap olarak değiştirdim. .asm_out yazısından kurtuldum. Sırada ERROR var. Acaba Pasmo komutlarında bir hata olabilir mi?

> Executing: C:\Program Files\ConTEXT\ConExec.exe "pasmo.exe" -v --tapbas G:\Z80\WORKS\overscan.asm G:\Z80\WORKS\ overscan.tap

Loading file: G:\Z80\WORKS\overscan.asm in 0
Finished loading file: G:\Z80\WORKS\overscan.asm in 97
Entering pass 1
Pass 1 finished
Entering pass 2
Pass 2 finished
ERROR: Error creating object file
> Execution finished.

F10 parametresinide G:\Z80\WORKS\%F.tap olarak değiştirince Specemu ilgili dosya adına sahip dosyayı (overscan.tap) yüklemeye çalışıyor. Haliyle dosya olmadığı için bir işe yaramıyor. Böylece hem F9, hem de F10 parametrelerinde %F.tap olursa compile edilen asm dosyası aynı isimle .tap olarak SpecEmu'ya yüklenmiş olacak.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 11 Şubat 2012, 10:06:33

> Executing: C:\Program Files\ConTEXT\ConExec.exe "pasmo.exe" -v --tapbas G:\Z80\WORKS\overscan.asm G:\Z80\WORKS\ overscan.asm_out.tap


çıkış dosyası path'inde boşluk var yine hades.

G:\Z80\WORKS\ overscan.asm_out.tap
             ^
             |
             +--  şurda



birde yine hata yapmış olabilirim, son kez execute key parametrelerini şu şekilde hiç değiştirmeden düzenleyip dener misin?

F9 için:
Parameters: -v --tapbas %n %p\%F_out.tap

F10 için:
%p\%F_out.tap

yalnız en iyisi buradan olduğu gibi copy-paste yapman, elle yazınca boşluklar oluşabilir. Ayrıca büyük küçük harfler de önemli, senin çıkışında fazladan görünen harflerin sebebi bu.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: hades - 11 Şubat 2012, 18:24:13
F9 parametresi
-v --tapbas %n %p%F.tap

F10 parametresi
G:\Z80\WORKS\%F.tap

Çalıştırınca;
> Executing: C:\Program Files\ConTEXT\ConExec.exe "pasmo.exe" -v --tapbas G:\Z80\WORKS\overscan.asm G:\Z80\WORKS\overscan.tap

Loading file: G:\Z80\WORKS\overscan.asm in 0
Finished loading file: G:\Z80\WORKS\overscan.asm in 98
Entering pass 1
Pass 1 finished
Entering pass 2
Pass 2 finished
> Execution finished.

> Executing: C:\Program Files\ConTEXT\ConExec.exe "SpecEmu.exe" G:\Z80\WORKS\overscan.tap

> Execution finished.

İşte bu kadar.
Ancak .tap dosyasında loader'den sonra "bytes  G:\Z80\WOR" olarak çıkıyor. Bunuda bir şekilde düzeltirim artık.

.asm dosyasını Spin ile derleyip çalıştırınca düzgün görüntü elde ettiğim halde .tap haline getirince sapıtıyordu. Aynı dosyayı context + pasmo ile derlediğimde de .tap dosyası bozuk çıkması ise aslında kodun hatalı olduğunu gösteriyor. Demekki spin'in editörü sakat :)
Ben kod yazmaya gidiyorum.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 12 Şubat 2012, 14:23:05
Demekki spin'in editörü sakat :)
Ben kod yazmaya gidiyorum.
Aslında spin'in editörü sakat değil ama yaratılan kodun uygulanma şekli ve emülatörün kendisi (demo programcısı için) sakat.

Şöyle ki, senin kullanma şeklini hatırlıyorum 7D'den, spin'in editöründen start veriyordun, bu durumda o sırada belki de rom'da bir işlem yapan basic editörü, spin'in asm editörü tarafından işinden alı konularak (o andaki registerlerin durumunu bilmeden) PC değiştirilmek suretiyle senin koduna aniden yönlendiriliyor. Halbuki exec ortamının yaratılması gerek önce, örneğin basic sistem değişkenlerini CLEAR komutuyla güvenli bir yere almak, Registerleri pushlamak ve sıfırlamak vs gibi.

Pasmoda bu durum USR komutu ile sağlandığı için normal bir başlangıç ortamı yakalanıyor. Ayrıca testleri genel olarak 48k üzerinde yapmak, sonra 128k'ya göre ayrı bir timing ayarı çekmek gerekiyor. Şunlara dikkat etmek gerek:

128k spectrumda CPU 3.54690 MHz hızında iken 48k'da 3.50000 MHz hızında.
128k spectrumda  her tarama satırı (scanline) 228 T-state tutarken, 48k'da  224ts tutuyor, yani 128k ulası biraz daha yavaş.
128k spectrumda her karede 311 tarama satırı var, 48'k da 312.
128k spectrumda görüntü oluşmadan önce border alanında 63 tarama satırı var, 48k'da 64.


Bir de border konusunda ince bir detay var, şöyle ekleyeyim:
Çerçeveyi çizen aletin de ULA olduğunu düşünürsek ve ula'nın arada sırada data okumak için -ekranı çizmeye ara vererek- ram'a eriştiğini ve ramdaki datayı kendi registerine çektiğini bildiğimize göre, işte o anlarda meşgul olduğundan kelli, border rengini değiştirme işlemi de "contended memory"-gecikmeli yazma/okuma kurallarına göre işlemekte. Yani border efektleri yapmak için birkaç kural var. Yani istesen de tam istediğin anda border rengini değiştiremeyebilirsin. Bunlar üzerinde pek durmadığım için detayları ben de pek bilmiyorum. Belki bir gün.

Sen özellikle deli gibi ince timing yapan border işleri kastığın için bu bilgi çok faydalı olacaktır diye tahmin ediyorum.

Bu arada amstrad yapımı +2a/b ve +3'lerinkine hiç girmiyorum, onlar komple farklı, ve malesef bunun sebebi sinclair 128k kullanma kılavuzundaki bir baskı hatası! Amstrad sinclair markasını satın alıp yeni modelleri üretirken, amstrad mühendisleri kullanma kılavuzundaki değerlere göre tasarlamışlar çipi, halbuki gerçekte makinenin timingleri yukarıdaki gibiymiş. Tabii bir grup oyun programcısı da aynı hatayı yaptığı için (kılavuzdaki değerlere göre zamanlama yapmışlar) 128k'da kötü çalışan birsürü oyun amstrad makineler sayesinde kurtulmuşlar.. Acaip bir durum :)

Alıntı
Ancak .tap dosyasında loader'den sonra "bytes  G:\Z80\WOR" olarak çıkıyor. Bunuda bir şekilde düzeltirim artık.
Bunun sebebi pasmo'nun yarattığı tap dosyasının blok adı olarak dosya adını truncate etmesi. Zx spectrumda dosya adları 10 harfle sınırlı.  pasmo'nun otomatik Tap loader'inde 10 load "" code: randomize usr 40000 yazıyor, arada bir cls olsaymış güzel olacakmış. Bunu düzeltmek mümkün değil ama, benim örneğimde yaptığım gibi başlamadan önce ekranı temizlemek gerekiyor.

bunun için basic'den cls komutunu çağırabilirsin,
Call $0D6B
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: ozayturay - 12 Şubat 2012, 14:33:45
Hem C64 hem de ZX programlama için bir araç zinciri oluşturdum. Deneyip fikirlerinizi belirtiseniz sevinirim.

http://retrojen.org/pano/index.php?topic=191.0 (http://retrojen.org/pano/index.php?topic=191.0)

Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: ozayturay - 12 Şubat 2012, 15:14:22
ZX için exomizer benzeri bir cross packer varsa tavsiye edeceğiniz F12 tuşuna da onu koyalım DevKitRetro'da. :)
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 12 Şubat 2012, 15:39:03
ZX için exomizer benzeri bir cross packer varsa tavsiye edeceğiniz F12 tuşuna da onu koyalım DevKitRetro'da. :)

Olmaz mı, aynısının tıpkısı.
Hatta yeni versionu iki hafta önce çıktı, hem de eskisinden daha merdane, şu anda ondan iyi paketleyici yok piyasada,

http://www.speccy.org/metalbrain/exo_v4.zip (http://www.speccy.org/metalbrain/exo_v4.zip)

tabiiki pasmo'nun coder'ından yine :D

acaba sorduğun başka bişey mi, tabii bilemiyorum, windows'da paketliyor, zx üzerinde açıyor. Ama 1k-4k arası size coding ile uğraşanlar için ancak, yoksa normal bir kodlama işi için sıkıştırma yapmak biraz gereksiz iş yükü gibi geliyor. Lakin depacker 140byte civarı zaten.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: ozayturay - 12 Şubat 2012, 15:57:05
Cruncherların amacı programın diskette veya kasette daha az yer kaplaması, sfx özelliği sayesinde hafızaya en hızlı şekilde açılması.

PC'de UPX'i senelerdir kullanırım, C64'de Exomizer en iyi çözüm gibi görünüyor.

ZX'den pek anlamam ama nasıl kullanıldığını çözüp tarif edebilirsen F12'ye atayabiliriz.

Edit: Cruncher'lar özellikle resim, müzik, sinüs tablosu gibi uzun datalar içeren programları sıkıştırmak için kullanılıyor. Yoksa zaten derlendiğinde 256 byte altında olan bir programı 190 küsür byte decruncher ekleyerek boyutunu büyütmenin bir mantığı yok tabi ki. :)
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Alco - 13 Şubat 2012, 12:15:58
"Satılık Araba Kar Zinciri, İhtiyacı Olana" başlıklarından sonra bu "Zx Spectrum için Assembler Araç Zinciri oluşturmak" başlığı fazla elitist geldi gözüme. Kapatın şu elitleri!
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 13 Şubat 2012, 15:33:29
"Satılık Araba Kar Zinciri, İhtiyacı Olana" başlıklarından sonra bu "Zx Spectrum için Assembler Araç Zinciri oluşturmak" başlığı fazla elitist geldi gözüme. Kapatın şu elitleri!

Eheh, evet başlığı koyarken biraz esinlendim :D İhtiyacı olana satılık takmatik z80 araç zinciri.

Örnek Z80 Kodlarına devam edeyim:
Şartlı sıçrama komutlarına birkaç örnek de benden gelsin:
önce DJNZ, pratik bir opcode.

DJNZ, basic'deki for...next döngüsüne benzer.
Örnek:


        ld B,16    ; For b=0 to 16 gibi
loop1   
       
        ...        ; Buraya tekrar edecek kodu ekleyin
       

        DJNZ loop1



B'ye yüklediğiniz rakam kadar tur atacak bu program.

Tabiiki bu halde maksimum 255 tekrar yapılabilir. Daha fazla tekrar için şöyle bişey yapabilirsiniz:

        LD BC, 9999 ; burada 9999 tur atılacak
                    ; 16 bitlik register çifti kullanarak (max.65535)
loop1

        ...         ;Tekrar edilecek kodunuzu tam buraya ekleyin
       
        DEC BC       
        LD A,B       
        OR C         
        JR NZ, loop1 
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 21 Şubat 2012, 15:58:10
Belki de en önemli işlerden biri, interrupt kurulumu yapmak.  Interrupt denilen şey, "kesme isteği" olarak çevrilmiş Türkçeye, kesme denilen şey ise, işlemcinin o sırada yaptığı işi bırakıp başka bir adrese zıplamasını sağlayan bir zamanlayıcı. Zx spectrumda saniyede 50 intterupt oluşur.

z80 işlemcide 3 adet kesme modu mevcut. Bunlar IM0 IM1 ve IM2.

Kesme modu 0 iken, kesmeleri bir aygıt kontrol ediyor demektir. Yani genişleme yuvasından takılan bir aygıt olabilir. Bu modda bus'tan bir byte okur ve ona göre hareket eder, bu komut genellikle RSTx komutu olur.

Mod 1 iken işlemci kesme modunu kendi kontrol ediyor demektir ki bu genel olarak servis modu olarak adlandırılır. Zx Spectrumda servis rutini 0x0038 'de tutulmakta, bu adresin özelliği bir byte'lık RST38 komutu ile ulaşılabilinmesi. Basitçe saniyede 50 kere kesme uygulanır, ve bu kesme sırasında RST38 çağrılır. 38h servis rutininde yapılan iki şey var, frames isimli sistem değişkeni bir arttırılır ve klavye okunur.

Mod 2 ise vector jump denilen bir  zıplama şekli. Düşük byte databus'tan okunur, yüksek byte ise I yazmacında tutulan değerdir. Yani vektör= I*256+databus . Problem şu ki, zx spectrumda bustan gelecek verinin ne olacağını tutturmak çok zor (floating bus problemi, ula da aynı veri yolunu kullandığı için oradaki değeri ula değiştirebiliyor). Bu durumda IM2 vektörünün nereyi işaret ettiği konusunda 256 farklılık olabiliyor. Bu işi genellikle o rutine bir tablo yerleştirerek çözüyoruz.

Örneğin I yazmacını 254 olarak ayarlayalım. Bu durumda IM2 vektörü 65024'den başlayacak, ve 256 byte'lık bir sapma olabilecek yani 65280'e kadar. (tablomuzu 257 byte olarak hazırlıyoruz)

Buradaki püf noktasını vermek istiyorum, ki bu bilgi bitpazarlarının yeri kadar gizli kalmış bir sırdır, ayarladığımız bu adres zıplanacak olan adres değil, zıplanacak olan adresi gösteren adrestir. Yani Örneğin databus 255 olsun (ki genellikle interrupt oluştuğunda %99 databus 255'tir) ve I ise 254 olsun, IM2 65280'i işaret edecek ve oraya biz ne koyarsak oraya zıplayacak. Örneğin 65280 ve 65281'de FDh FDh (65021) varsa bu durumda IM2 doğrudan 65021'e zıplar.

Ben kendi kullandığım kodu veriyorum:

 
Kod: [Seç]

org 65021
JP 40000  ;interrupt rutininizi 40000'e koyun.

org 32768
di ;interrupt ayarı yapmadan önce kesmeleri kapatalım

ld   hl,65024 ;tabloyu oluşturacagız, 65024<->65280 arasında
ld   de,65025
ld   (hl),253
ld   b,e
ld   c,e
ldir          ;tablo hazır, aralığı 253'lerle doldurduk.

ld   a,254    ; kesme rutinini tablomuzu gösterecek sekilde ayarlayalim
ld   i,a        ; I yazmacı 254'ü gösterdiginde bus'taki degere göre vektör 65024<->65280 arasında kalacakır.
im   2          ; interrupt mode 2 aktif
        ei          ; interruptlar? açalım

Şimdi buradaki ilk kısımda 257 byte'lık bir FDh tablosu oluşturuluyor, ve interrupt modu o tabloyu işaret ediyor, böylece databusdaki değişmeler sonuca etki edemiyor. Bu kod bir kere çalıştığında artık kesmeler bizim istediğimiz adrese yönlenecek, o adreste de JP 40000 olduğu için her 1/50 saniyede bir 40000 adresine gidilecek demektir.

Interrupt rutini çalıştığında otomatik olarak di çalıştırılır. Yani interrupt rutininden dönmeden önce ei ve ret kullanmayı unutmayın.

Alternatif olarak, eğer 48k için kodlama yapıyorsanız ve FD tablosu için 257 byte harcamak niyetinde değilseniz romdaki FF tablosunu kullanabilirsiniz. 48k Rom'unda 14446'dan başlayıp 15615'e kadar giden devasa bir FF tablosu vardır. Buradaki veriyi kullanarak ve I'yı 59 haline getirerek IM2 zıplama adresini tablo kullanmadan 65535'e dönüştürürsünüz. 65535'e ise 18h (=JR n) yerleştirdiğinizde ve 65535'den sonraki adres 0 olduğu için, romdaki ilk byte olan 243 alınacak ve dolayısıyla -12 geri zıplanacak (JR 243 =-12 göreli zıplar) ve 65524'e düşmüş olacaksınız. Buraya da nihayet kodunuzu yerleştirebilirsiniz. Fakat bu kod 128k'da çalışmayabilir, çünkü o tablo 128k'da 128k editör kodu ile doldurulmuş. +3/+2A'da ise FF yerine 00'lardan oluşuyor. Yani dediğim gibi 48k ile limitli bir opsiyon, fakat ekleyeyim, üst modellerde 48k rom'a dönmek mümkün, programı 48k modunda yükledikleri sürece 128k ve +3'de de çalışacaktır.

Kolay gelsin.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: hades - 21 Şubat 2012, 20:36:36
                     org     8000h

                        di
                        ld      hl,irq
                        ld      (0feffh),hl
                        ld      a,0feh
                        ld      i,a
                        im      2
                        ei
xxx                     jr      xxx

irq                     ld      bc,540
wait00                  dec     bc
                        ld      a,b
                        or      c
                        jr      nz,wait00
                        inc     a
                        out     (254),a
                        ld      b,80
wait01                  djnz    wait01
                        ld      b,32
                        ld      hl,22528
loop00                  ld      (hl),%00001000
                        inc     hl
                        djnz    loop00
                        dec     a
                        out     (254),a
                        ei
                        ret


Kodun sonucu aşağıdaki resimde.

Bu mesajı hafta sonu atacaktım ama üşendim. Ref benden önce interrupta dalmış.
Benim kullandığım metod ise şöyle.

di -------------------- interruptı durduruyoruz
ld      hl,irq --------- kullanıcının interrupt rutini başlangıç adresi hl registerine yazıyoruz
ld      (0feffh),hl --- bu adresi FEFF  ve FF00 adresine yazıyoruz (vektör abimiz olur kendileri)
ld      a,0feh ------- Vektörümüzün High baytını aküye,
ld      i,a ------------ aküyüde i (interrupt) registerine yazıyoruz.
im      2 ------------- interrupt modunu 2 yaptıktan sonra
ei -------------------- interruptı başlatıyoruz

buradan sonrası normal rutin olacak veya
xxxx    jr  xxxx ile sonsuz döngüye girsin.

irq ..............

buradan itibaren interrupt rutini bulunacak.

Rutinin en son satırları ise

ei
ret

komutları olmalı.

Keşke zx'in romundaki interrupt rutini C64'teki gibi ramdaki vektör üzerinden tekrar roma sıçrasa ne güzel olurdu. Reset rutininde

ld hl,oldirq
ld (ramvector),hl

komutlarıyla setup olsa, romdaki irq rutininde ise

ld hl,(ramvector)  ---- hl'ye ramdaki vektörde tutulan adresi yükle
jp (hl) ----- hl'de tutulan adrese zıpla. (oldirq adresine sıçrayacak)
oldirq ......  ;burada ise romdaki normal rutin bulunacak
         ........
komutları olsa, Bizde hiç kasmadan

di
ld hl,myirq    -------- kendi rutinimizin başlangıç adresini hl'ye yazıyoruz.
ld (ramvector),hl --- bu adresi vektöre kopyalıyoruz.
ei

ile kendi rutinimizi aktif hale getirsek çok güzel olurdu. Rutinimizin sonunda ise jmp oldirq ile roma zıplayıp devam etsek süper olurdu aslında.
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 22 Şubat 2012, 01:23:02
                     org     8000h

                        di
                        ld      hl,irq
                        ld      (0feffh),hl
                        ld      a,0feh
                        ld      i,a
                        im      2
                        ei


benim metod ile aynı, data bus'ının herzaman 255 olduğunu kabul ediyor bu rutin. Problem şu ki, IM2 aslında donanım interruptu. Dolayısıyla böyle kullanımda sorunlar çıkabiliyor. Ama ne zaman, belkide hiç önemli değil, mesela kempston joystick takılı iken senin demo çalışmaz. Ya da interface1. Divide problem çıkarmıyormuş fakat divide+ yine databus'a random değerler bırakabiliyormuş.  Yani senin irq setupın çıplak zx spectrum için oluyor. Birçok demo programcısı için belirli bir setup istemek kolaydır. Bu demoyu izlemeden önce tüm aygıtlarınızı sökünüz diye bir mesaj gösterebilirsin, yüklerken mesela. :D Yine dediğim gibi, birçok durumda bu setup gayet düzgün. Fakat eğer programın garip davranırsa emülatörün aksesuarlarını kapat :D

Alıntı
Keşke zx'in romundaki interrupt rutini C64'teki gibi ramdaki vektör üzerinden tekrar roma sıçrasa ne güzel olurdu. Reset rutininde

Aslında +2 ve +3'de ALL RAM modu var. Böylece IM1 rutinini senin söylediğin gibi değiştirebiliyorsun. Yani rom yerine ram page edebiliyorsun. Sözü gelmişken yineleyeyim, Spectrum camiasında en uyumlu ve en gelişkin makine olarak +2A/B kabul ediliyor. Hem gelişkin bir sayfalama/gecikme yapısı var, hem de 128k kullanma kılavuzundaki değerlere göre düzenlenmiş. :) Ama pek yaygın değiller, bu sebepten eski yöntemlerle çalışmak şart. Bu arada IM1'in ram'daki bir vektöre göre yönlenmemesi tamamen z80'in tasarımıyla ilgili. IM1 direkt olarak rst 38 çağırıyor. Orda da rom var. IM2 varken rom'un ramdeki bir değişkeni kontrol etmesi zaman kaybı olarak düşünülmüştür belkide.

Alıntı
xxx                     jr      xxx
Interrupt oluşması için komutun tamamlanması gerekiyor. Yanlış hatırlamıyorsam (bakmaya üşendim) JR n, 7tstate tutuyordu. Bu senin interrupt kodunda 7tstate'lik bir sapmaya sebep olabilir, çünkü interrupt'un oluşmasını 7tstate'lik aralıklarla gerçekleştirebilirsin. Senin kodda herhangi bir kullanıcı girişi vs olmadığı için büyük bir problem değil ama, sonsuz döngü yaratmak yerine araya bir HALT eklesen daha sağlıklı olacaktır.
xxx
ei
halt
jr xxx

gibi bişey
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: hades - 23 Şubat 2012, 20:45:01
Ref bu kadar bilgiden sonra birşeyler yaparsın artık. ZX'le ilgili daha neler biliyorsundur kimbilir?
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: Ref - 24 Şubat 2012, 13:59:51
Ref bu kadar bilgiden sonra birşeyler yaparsın artık. ZX'le ilgili daha neler biliyorsundur kimbilir?

Heheh, ben demodan ziyade tool kodlamayı seviyorum. Aşağı yukarı yılda 2 tool çıkarırım genelde windows tabanlı, ya da zx-windows çaprazında çalışan araçlar. Bu sırada çok şey öğreniyor insan ama, o öğrendiklerimi intro/demoya çevirecek vakit yok.

Örneğin, yeni bir ekran modu önerim (http://arda.kisafilm.org/blog/?p=726) var, şu günlerde onunla uğraşıyorum. En verimli şekilde multicolor kullanımıyla, 48k üzerinde tam erkran multicolour bir grafik oluşturmak. Aslında bu tam bir scene işi. Güzel bir demoda dikkat çeker kesinlikle. Fakat, ben bunu bir tool olarak kodluyorum yine. Yani bu işi otomatize eden bir program yazıyorum ki herkes asmp modunda grafik oluşturabilsin.

Becerebilecekmiyim bilmiyorum, bu yoğunlukta gidilecek yol uzun, ama vakit çok az :D
Başlık: Ynt: Zx Spectrum için Assembler Araç Zinciri oluşturmak
Gönderen: hades - 08 Mart 2014, 20:43:30
Bugün win7 kurdum. Crimson'u ayarlayıp kodların bulunduğu klasörleri düzenledim. Aynı kodu 3-4 yere kaydetmişim. Kodlamaya devam.