Gönderen Konu: Değişik bir konu  (Okunma sayısı 7001 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Değişik bir konu
« : 30 Nisan 2022, 00:49:33 »
Spectrum'un expansion portunda /ROMCS diye bir hat var. Ne işe yaradığı hakkında hiç bir fikrim yoktu. Bu hafta içinde bir sitede 48K Spectrum'la ilgili bir şema dikkatimi çekti. O anda bir aydınlanma yaşadım.

C64'ün bellek haritasına baktığımızda Basic ve Kernal Romlarının altında Ram vardır. Bu rom bölgelerine yapılacak bir yazma işlemi sırasında aslında rame erişim oluyor. Başka bir deyişle, okuma işleminde Rom, yazma işleminde Ram kullanılıyor. Okuma/yazma işleminde sadece ram kullanılmak isteniyorsa romlar poke komutuyla devre dışı bırakılıyor. Yani benim romlarla işim olmaz deyip belleği 60K Ram + 4K IO olarak konfigüre edebilirsiniz. İsterseniz 64K ram olabilir ama IO çiplerine erişemezsiniz. Hep düşünmüşümdür Spectrumda niye böyle bir özellik yapılmamış diye. 48K Ram var, bunun ilk 16K'sı ULA'nın kullanma önceliğinde. 32K'lık kısım ise tamamen ayrı çiplerle oluşturulmuş. Ekran belleği, renk belleği, sistem değişkenleri derken elimizde programlar için 40K'lık bir bellek kalıyor. Oyunlarda ve diğer programlarda belkide çok az kısmı kullanılan bir rom için 16K'lık bir bölge atıl bırakılmış.   

Yukarıda bahsettiğim aydınlanma tam da bu özellikle ilgili. 16K rom'un altına bir Ram konamaz mıydı? Spectrum'un şemasını incelemeye başladım. /ROMCS sinyali doğrudan roma bağlı ve aynı zamanda ULA'ya gidiyor. Sitedeki bilgilere ve şemaya göre /ROMCS hattı +5V'a bağlanırsa rom devre dışı kalıyor ve sadece adres, data ve /MREQ bağlantıları ile 16K'lık bir rom kartuş kullanılabiliyor. Bunun üzerine bugün işyerinde bir şema çizdim. Aynı C64'te olduğu gibi Rom altında ram bulunan bir devre. Okuma sırasında rom, yazma sırasında ram kullanılıyor. Devrede ayrıca birde rom var. Bir out komutuyla internal/external rom/external ram  seçilebiliyor. Default olarak internal rom kullanılıyor. external rom 32K (16K * 2 bank), Ram 512K (16K*32 bank).

Out komutu ile 8 bitlik bir latch entegresinin kontrol ediliyor ve işlevi şu şekilde. Default çıkış %00000000

Bit 0: /ROMCS kontrolü - "0" ise internal rom, "1" ise extenal rom aktif.
Bit 1: External Ram/Rom kontrolü - "0" ise Rom, "1" ise Ram aktif.
Bit 2: External Rom Bank Select - "0": Bank 0, "1": Bank 1 seçilir.
Bit 3 ... Bit 7: External Ram Bank Select - Bank No: $00-$1F

Devre için hangi Out adresini kullanayım derken bu defa başka bir şey öğrenmiş oldum. Spectrum'un şemasını incelerken Z80'in /MREQ hattı ULA'ya doğrudan bağlı iken /IORQ hattı bir direnç üzerinden ULA'ya bağlı ve aynı zamanda expansion portta /IORQULA olarak yer alıyor. Bu da yetmezmiş gibi Z80'in A0 hattı bir transistör üzerinden /IORQULA'ya bağlanmış. A0 hattının "1" olduğu durumlarda ula'nın girişine 5V uygulanıyor.

İşler karışmaya başladı derken aklıma meşhur OUT 254 geldi. 254 adresinde A0 "0" oluyor. Ula efendiye sadece A0 bağlıysa (Z80'den ise sadece A14 ve A15 hatları doğrudan Ula'ya bağlı) demek ki ula ile haberleşmede A0'ın "0" olduğu her adres kullanılabilir diye düşündüm. Düşüncemde kısmen haklı çıktım. İkiye bölündüğünde sonucu tek sayı veren çift sayılı adreslerde (6,10,14 gibi) Out 254 ile aynı işi yapıyor (borderde renk şeritleri)
İkiye bölündüğünde sonucu çift sayı veren adreslerde ise renk bir kez değişiyor.
İlginç olan ise tek sayılı adreslerde bazen ekran ve renk belleğinin random şekillerle ve renklerle dolması oluyor.

sss inc a
out (33),a
jr sss
Ekran görüntüsü aşağıda. Gerçek makinede de acaba durum böyle mi? Yoksa emulatörün özelliği mi?

Konu rom kartuş devresinden reu'ya oradan da ula'nın garipliklerine geldi.

Bu arada sanırım pasmo'da bir bug var. Programda out (123456789),a yazsam bile derleme sırasında hata vermiyor. ld hl,(655361) denedim yine hata yok. Parantez içindeki sayıları kontrol etmiyor.

Romu rame kopyala

di
ld hl,0
ld de,0
ld bc,16384
ldir

ld bc,kontrol
ld a,%00000011 ; internal rom disable, external rom disable, external ram bank 0 enable
out (c),a
ei

Kafayı bugün bununla bozdum.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 172
Ynt: Değişik bir konu
« Yanıtla #1 : 30 Nisan 2022, 06:43:51 »
Eline sağlık @hades, güzel bir donanım inceleme ve benim gibi donanımcı olmayanlara Bilal'e anlatır gibi anlatma olmuş. :)

Öncelikle;

out (123456789),a
ld hl,(655361)

gibi şeylerin derlenmesi garip değil. Uyarı veriyor olabilir derleyici ama derlemesinde bir gariplik yok. Alt 8 bit, alt 16 bit'i alıyordur. Bu genellikle derleyici direktiflerinde sorun yaşanmasın diye böyle bırakılabiliyor. Bazı derleyiciler hata, diğerleri uyarı üretiyor. Hiç uyarı üretmeyenleri de vardır tabii. O derleyiciyi geliştiren kişinin kontrolünde olan bir şey sonuçta.

Özellikle şu tür durumlar için var bu. Mesela iki kere tekrar edecek 256 byte'lık tablo yaptık diyelim, basit örnek olması açısından anlamsız biçimde 0-255 arası değerleri üretelim. Pseudo kod olarak yazıyorum.

for i, 512 {
    db i
}

bu iki kez 0-255, 0-255 üretebilsin diye overflow'u hiçe saymış (i & 0xff) gibi bir şey yazmana gerek kalmasın diye böyle bırakmışlardır, yani "it's not a bug, it's a feature" olayı.

Pasmo'nun dokümanlarına baktım, dediğim şey var.

https://pasmo.speccy.org/pasmodoc.html

Kod: [Seç]
DB
Define Byte. The argument is a comma separated list of string literals or numeric expressions. The string literals are inserted in the object code, and the result of the numeric expression is inserted as a single byte, truncating it if needed.

Nümerik değerler tek byte olarak kabul edilir ve gerekirse kırpılır demişler. Bu opcode parametreleri için de geçerli belli ki.

Ben SjASMPlus'da daha beterlerini yaşıyorum. Bırak overflow'u adamlar fake opcode desteği eklemişler, geçen bahsetmiştim hatırlarsan. Olmayan opcodeları da derliyor. Z80'e hakim olan kişiler açısından sorun olmasa gerek ancak opcode parametrelerini yeni ezberlemeye başladığım için her defasında dokümantasyona bakmak zorunda kaldım ilk başlarda.

REU konusuna geri dönecek olursak, ZX Spectrum için böyle bir şey yapabileceğinden eminim. Mutlaka açık kapı bırakmışlardır, en basitinden daha sonra kendileri RAM expansion satmak için ticari açıdan onu düşünmüş olacaklarını zannediyorum. Yani bence günümüzde teknik detayları çözdükten sonra çok kolay yapar, ucuza da üretirsin. Biliyorsun, 80 başlarında RAM inanılmaz pahalı bir şey. O yüzden cihazlar üretildikten bir süre geçip, o seviyedeki RAM fiyatları ucuzlayınca RAM expansionlar yaygınlaşmış ancak zaten o sırada 16 bit dönemi de başlamış olduğu için çoğu platformda pek satamamışlar. ZX Spectrum'u bilemiyorum tabii. Ama Atari 800 serisinde RAM expansion çok yaygınmış, çoğu kişide varmış. Commodore 64'de bizler 64k ile yetinmeyi bilmişiz.

Tabii ZX Spectrum 128k modeli hali hazırda varken 48k'ya RAM expansion yapmak ne derece gereklidir, henüz ZX Spectrum dünyasına yeni yeni aşina olan birisi olarak çok fazla kestiremiyorum.

Bir diğer kafamdaki soru da şu oldu. Senin yapacağın RAM expansion double buffer yapmamızı kolay biçimde sağlayabilecek mi? Mevcut RAM adreslerini ($4000, $5800 vb) bir hardware registerıyla switch edip expansion memory'e direct access edebilecek miyiz? Mümkün müdür bu, ne dersin?

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: Değişik bir konu
« Yanıtla #2 : 30 Nisan 2022, 15:02:39 »
Bildiğim kadarıyla Spectrum için 32K ram kartuşu var. Ama bu kartuş 16K versiyonlu Spectrumları 48K yapmak için üretildi. $8000 sonrasını kullanmak için olan bir kartuş.
48K şemasına göre ULA A14 ve A15 hatlarının durumuna göre rom için /CS işareti, $4000-$7FFF arasındaki ram için /RAS, /CAS ve /RAMWRITE işaretlerini üretiyor. Üst 32K belleğe hiç bir şekilde karışmıyor. Aslında ulanın rom erişimide yok. Sadece $4000-$7FFF arası ramla ilgileniyor.
Benim tasarımım Romun bulunduğu ilk 16K'lık alanla ilgili. İkinci 16K'lık alana yani ekran belleğine müdahale yapmak zor gözüküyor. Dolayısıyla 48K modellere double buffer özelliği kazandırmak imkansız değilsede zor.  16K'lık dramlar sökülüp daha yüksek kapasiteli dramler takılıp switching devresi olacak şekilde modifiye yapılabilir. $8000-$FFFF arası ise en kolay olanı. internal ramları tamamen söküp 32K'lık banklar halinde dışarıdan reu olabilir.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2882
  • Advanced User Simulator
    • ae unutmadan
Ynt: Değişik bir konu
« Yanıtla #3 : 30 Nisan 2022, 23:22:27 »
ZX Spectrum +3'ün ALL RAM modu var. yani rom'ları kapatıp kesintisiz bir 128K ram elde edilebiliyor.

ZX Spectrum ise ilk çıktığında 16k olarak çıkmış zaten, yani Clive amca için ram bir lüks. Kaldı ki basic açısından bakınca yaklaşık 43KB kullanım alanı kalıyor basic'e. Bu da tüm rakiplerinden daha fazla, onu da marketing olarak kullanmışlar yani. Bu şekilde de 16k ram fiyatından kesmiş oluyor. Amaç üç kuruşa bilgisayar satmak sounçta.

Bir de eklemem lazım, spectrum'a takılan oyun kartuşları senin o test ettiğin yöntemi kullanıyor, bir göz at istersen:
http://www.fruitcake.plus.com/Sinclair/Interface2/Interface/Interface2_Circuitry.htm

bir dip not daha, zx spectrum 16/48k'yı Richard Altwasser tasarlıyor. Sonra kendi firmasını kuruyor Jupiter Ace'i yapıyor, tutmuyor, başka işler yapıyor. 128k modelleri ispanyol investronica, var olan add on donanımları bir araya getirerek tasarlıyor. Fakat en sonunda Altwasser, ZX Spectrum +3'ü amstrad çatısı altında baştan tasarlıyor. Bittiğinde de "başından beri yapmak istediğim spectrum buydu" diyor. Tek sorun var, spectrum 48 ve 128'in bellek erişim zamanlaması aşağı yukarı aynı iken (örn. 0,0,0,1,2,3,4,5,6 tstate bekletiyor), +3 (0,0,1,2,3,4,5,6,7) bekletiyor. Oradaki 7 ts'lik bekleme zamanlaması kritik kodlarda ciddi sorun yaratıyor ve spectrumu sınırda kullanan birçok oyunun çalışmamasına/grafik bozulmalarına sebep oluyor. (dip dip not: altwasser şu anda bir kilisede rahiplik yapıyormuş)

Alıntı
Olmayan opcodeları da derliyor. Z80'e hakim olan kişiler açısından sorun olmasa gerek ancak opcode parametrelerini yeni ezberlemeye başladığım için her defasında dokümantasyona bakmak zorunda kaldım ilk başlarda.
bu arada skate, benim çok faydalı bulduğum bir text dosyası var, istersen bir göz at, işine yarayabilir (ekte)

Çevrimdışı Bora66

  • Retroman
  • ***
  • İleti: 61
Ynt: Değişik bir konu
« Yanıtla #4 : 20 Mayıs 2022, 12:23:08 »
Güzel çalışma, keyifle okudum. Sir Clive'ın çok ucuz satabileceği bir bilgisayar inadı yüzünden olabileceğinin çok azı olabilmiş Spectrum'a zaman içinde yapılmış çok ilave var. Bunlar çok daha muhteşem şeyler de olabilirlerdi ama malesef maliyet yüzünden çok kısıtlanmış bir donanım için yazılmış onbinlerce yazılıma uyumlu olma zorunluluğu bu eklentileri de kısıtlayıp durmuş. Dylan Smith'in dizaynı orijinal diagnostik kartı ile ilgili bir link koyayım buraya 29F040 (512KB) EEPROM'u 16KB banklar halinde software ile switch etme gibi bir özelliği var, ve sanırım bu konuda bir başlangıç noktası olmuş ve bir sürü çok daha gelişmiş ilavelere ilham vermiş. Belki ilginizi çeken 2-3 şey yakalarsınız içinde bu projenin.

 https://alioth.net/Projects/Spectrum-Diag/

Rahmetli Sir Clive'ın bu pinti yaklaşımı, maliyeti 1 kuruş bile olsa düşürebilecek her türlü yola girmiş olması Spectrum'u donanımsal olarak olabileceğinin çok azı yapmış dedim ama madalyonun bir de öbür yüzü var. Bilgisayarın fiyatı o zamanlar piyasadaki karşılaştırılabilir bütün bilgisayarlardan çok daha düşük olunca çok kısa sürede milyon adetlerle satılmış. Bu kadar kısa süredeki bu büyük satış miktarı bir yandan Sir Clive'a hatırı sayılır bir servet kazandırırken,  öte yandan da özellikle düşük gelirli İngiliz ailelerinin iyi bir eğitim alma şansı pek olmayan çocuklarının, hızlı bir şeklilde yazılım ve donanım öğrenmesini sağlamış. Üzerinde gelen kolay öğrenilebilir ama göreceli olarak oldukça kapsamlı BASIC ve çok iyi hazırlanmış kullanıcı kitabı, zamanın birçok başka bilgisayarında assembly öğrenmeyi ve onlarca POKE ezberlemeyi gerektiren bir sürü şeyi direkt BASIC komutlarla yapabılabilmesini sağladığı için de -C64 gibi- ağırlıklı olarak oyun bilgisayarı olarak kalmak yerine programcılığa bir basamak olmuş "yatak odası programcılığı" akımını başlatmış.