PlayStation mimarisi
(copetti.org)- PlayStation mimarisi, 3D donanım geliştirme karmaşıklığını azaltmak için sade ve pratik bir yapı benimsedi; ancak grafik sıralama, doku düzeltme ve hassasiyet tarafında geliştiricilere ek yük ve görsel sınırlamalar bıraktı
- Sony CXD8530BQ, LSI Logic'in CoreWare tabanlı MIPS R3000A uyumlu çekirdeğini CP0, GTE ve MDEC ile birleştiren bir SoC'dir; 33.87MHz'de çalışır ve veri hareketini 2MB RAM, 1KB Scratchpad ve DMA etrafında düzenler
- Grafik tarafında GTE, 3D projeksiyon, aydınlatma ve clipping işlemlerini üstlenir; GPU ise komut tabanlı olarak çizgi, dörtgen ve üçgen render eder. Z-buffer yerine ordering table kullanıldığı için poligon sırasını CPU'nun belirlemesi gerekir
- GPU; affine texture mapping, nearest neighbour, tam sayı koordinatlar ve alt piksel çözünürlüğünün olmaması nedeniyle titreme, çakışma ve texture warping üretir; bunları aşmak için tessellation, düz renk ikameleri ve pre-rendered arka planlar kullanılır
- CD-ROM tabanlı tasarım; 620MB depolama alanı, 44.1kHz ADPCM ses akışı, BIOS tabanlı çalışma ortamı ve Wobble Groove kopya korumasıyla bölge kilidini birleştirerek oyun geliştirme ve dağıtım biçimini değiştirdi
Temel tasarım ve CPU
- PlayStation, 3D donanımın geliştirmeyi karmaşıklaştırabileceği varsayımıyla sade ve pratik bir tasarımı hedefledi; bunun karşılığında da bazı sınırlamaları kabul eden bir yapı benimsedi
- Ana yonga olan Sony CXD8530BQ, bugünün terminolojisiyle bir SoC sayılır ve MIPS R3000A ailesiyle ikili düzeyde uyumlu LSI Logic CoreWare tabanlı bir CPU çekirdeği kullanır
- CPU çekirdeği; 33.87MHz, MIPS I ISA, 32 bit sözcük, 32 genel amaçlı yazmaç, 32 bit veri yolu, 32 bit adres yolu, 5 aşamalı pipeline ve 4KB komut önbelleği içerir
- Veri önbelleği yoktur; veri önbelleğine karşılık gelen 1KB bellek, sabit bir adrese eşlenmiş Scratchpad olarak sunulur ve hızlı SRAM gibi kullanılabilir
- Sistem, genel amaçlı işler için 2MB EDO RAM sağlar; EDO RAM, sıradan DRAM'e göre biraz daha verimli ve daha düşük gecikmeli bir bellek türü olarak açıklanır
Veri yolu ve yardımcı işlemciler
- Veri yolu, 32 bit Main Bus ve 16/8 bit Sub Bus olarak ikiye ayrılır; Main Bus, MDEC ile GPU'yu bağlarken Sub Bus diğer bileşenleri ve I/O'yu bağlar
- CD-ROM controller, MDEC, GPU, SPU ve parallel port, DMA controller erişimine sahiptir; DMA, CPU'ya uğramadan ana veri yolunu ele geçirip yüksek aktarım hızıyla veri taşır
- DMA çalışırken CPU ana veri yoluna erişemez; Scratchpad'de işlenecek bir görev yoksa bekleme durumuna geçer
- CP0 olan System Control Coprocessor, önbellek uygulaması, Scratchpad'e doğrudan erişim, komut önbelleği yalıtımı, kesmeler, istisnalar ve breakpoint yönetimini üstlenir
- CP2 olan Geometry Transformation Engine, sabit nokta tabanlı vektör ve matris hesaplarını hızlandırır; 3D projeksiyon, aydınlatma ve clipping gibi grafik pipeline'ının ilk aşamalarını yürütür
- MDEC, JPEG benzeri biçimde kodlanmış macroblock'ları GPU'nun anlayabileceği biçime açar; saniyede 9.000 adet 8×8 piksel 24bpp macroblock işleyerek 320×240px FMV'yi 30fps ile akıtabilir
- CP1'e karşılık gelen bir FPU sunulmaz; ondalıklı hesaplamalar yazılım tabanlı kayan nokta ya da sabit nokta ile yapılabilir, ancak hız ve hassasiyet kısıtları oluşur
Pipeline ve delay slot
- MIPS I pipeline'ı control hazard ve data hazard durumlarına açıktır; branch ve jump sonrasındaki komutun her durumda çalıştığı bir branch delay slot davranışına sahiptir
loadkomutları, getirilen veri hazır olana kadar pipeline'ı durdurmadığı için hemen sonraki komut öncekiloadsonucuna bağımlıysa doğru işleneni almak adına doldurucu komut gerekir- Bazı delay slot'lar anlamlı komutlarla doldurulabildiğinden her zaman boşa giden çevrimler yaratmaz
- MIPS, yüksek kaliteli derleyici ve assembler araçlarının komut yeniden sıralama ya da doldurucu ekleme işini üstlendiği RISC felsefesi doğrultusunda CPU pipeline'ını geliştiricilere ve araç zincirine görünür kılan bir tasarım seçti
- Bu yaklaşım, sonraki CPU nesillerinde yeni mikro mimariler ortaya çıktıkça geriye dönük uyumluluğu zorlaştıran bir dezavantaj da taşıdı
Grafik pipeline'ı
- Grafik pipeline'ının önemli bir kısmı GTE tarafından işlenir; sonuç verisi ise render için Sony'nin özel GPU'suna gönderilir
- Sistem, 1MB VRAM içinde frame buffer, texture ve diğer render kaynaklarını saklar; CPU bu alanı DMA ile doldurabilir
- İlk modellerin VRAM'i, iki adet 16 bit veri yolu kullanan dual-ported bir yapıya sahiptir; böylece CPU, DMA, GPU ve video encoder aynı anda erişebilir
- Sonraki modellerde bu yapı, tek bir 32 bit veri yolu kullanan SGRAM ile değiştirildi; zamanlama farkları nedeniyle Jet Moto 3 gibi daha sonraki oyunlarda VRAM tabanlı sistemlerde grafik bozulmaları görülebilir
- CPU, geometri verisi göndermek için GPU'nun 64 baytlık FIFO buffer'ına en fazla 3 komut doldurur; bu komutlar render, ayar değişikliği ve VRAM işlemleri ister
- GPU; çizgi, dörtgen ve üçgenleri ayrı ayrı çizebilir; üçgenler, zengin 3D modellerin temel yapı taşı olarak kullanılır
- GPU koordinat sistemi, her koordinatın piksel merkezindeki sampling point'e karşılık geldiği bir tam sayı koordinat modelidir; fractional coordinate kullanılmaz
Görünürlük, rasterleştirme ve doku
- PlayStation GPU, donanımsal görünürlük çözümü sunmaz; bunun yerine ordering table ile derinlik değerlerine göre GPU komut adresleri yönetilir
- CPU önce poligonları sıralar, ardından tablodaki uygun girdilere başvuruları yerleştirir ve tabloyu DMA ile GPU'ya göndererek doğru sırada render edilmesini sağlar
- GPU yalnızca tek bir frame buffer gerektirir; rasteriser ise vertex'leri çizgi, üçgen, dörtgen ve piksele dönüştürür
- Üçgenler, texture ve shading destekleyen en karmaşık ve en genel amaçlı primitive'tir; çizgiler hızlıdır ama texture yüzeyler için uygun değildir; dörtgenler ise en fazla 256×256 piksel sprite ile sınırlıdır ve shading ya da affine dönüşüm efekti sunmaz
- Aydınlatma efektleri iki türdür: flat shading ve Gouraud shading; flat shading, Gouraud shading'e göre saniyede yaklaşık 2,5 kat daha fazla poligon doldurabilir
- Texture, rasterleştirilmiş her piksel için texture map içindeki texel'in bulunmasına dayanan inverse texture mapping ile uygulanır
- PlayStation GPU'nun Affine Texture Mapping tekniği yalnızca X/Y 2D koordinatlarını kullanır ve derinlik bilgisini attığı için perspective correction yapmaz
- Texture filtering uygulanmamıştır; ölçek düzeltmesinde nearest neighbour kullanılır. Bu yöntem hızlı ve ucuzdur, ancak texture modellerinin bloklu görünmesine yol açar
- GPU, üçgenlerde semi-transparency ve dithering efektlerini destekler; PlayStation bu efektlerde özellikle başarılı olarak tanımlanır
VRAM kullanımı ve görsel sınırlamalar
- 1MB VRAM'in tamamını büyük bir frame buffer için kullanma fikri, TV standart biçimlerine yeniden ayarlama gerektirir ve texture ile colour table alanını azaltır; ayrıca GPU'nun kendisi de en fazla 640×480 piksel 16 bit renkli frame buffer render edebilir
- 640×480 16 bit buffer, materyaller için 424KB VRAM bırakır; ancak dönemin ev tipi TV'lerinde yüksek çözünürlüğün avantajı özellikle belirgin değildir
- adjustable frame-buffer, farkı az hissedilen çözünürlüklere VRAM harcamamak için frame buffer boyutunu küçültüp texture ve colour lookup table alanını artıran bir yaklaşımdır
- Halkun'un Gears Episode 2 demosu, 640×480 frame buffer'ı iki adet 320×480 buffer'a bölüp page flipping kullanarak bir sahne gösterilirken diğerini render eden bir düzen sergiler
- Bu yerleşim yalnızca 600KB VRAM tüketir; kalan 424KB ise colour lookup table ve texture için kullanılabilir, 2KB texture cache ile birlikte verimli bir yapı oluşturur
- VRAM, birden fazla colour depth'i aynı anda eşleyebilir; böylece 16bpp frame buffer'ın yanına FMV karelerinde sıkça kullanılan 24bpp bitmap yerleştirilebilir
- Rasteriser yalnızca piksel düzeyinde çalışır ve üçgenin pikselin ne kadarını kapladığını izlemez; bu nedenle model dış hatlarında sıçrama ile üçgen kesişimlerinde flicker ve overlap oluşabilir
- Ordering table, hangi geometrinin önde olduğunu belirleme yükünü geliştiriciye ya da programa bırakır; performans için yoğun yaklaşık hesaplar kullanıldığında flickering ya da gizlenmesi gereken yüzeylerle ilgili sorunlar görülebilir
- Affine transformation, derinlik hissi taşımadığı için kamera modele yakınken ve bakış doğrultusuna dik durumdayken texture warping yaratabilir; bazı oyunlar bozulmayı azaltmak için tessellation ya da düz renk ikamesi kullanır
- Pre-rendered arka planlar, gerçek zamanlı GPU sunumundan daha gerçekçi sahneler gerektiğinde MDEC ile akıtılan görüntünün iki üçgene kaplanması şeklinde kullanılır
Ses ve CD tabanlı oyunlar
- SPU, 44.1kHz Audio CD kalitesinde 16 bit ADPCM örneklerinden 24 kanalı destekler
- SPU; pitch modulation, frequency modulation, ADSR envelope, looping ve digital reverb özellikleri sunar
- Ses arabelleği olan Sound RAM, 512KB DRAM'dir; oyunlar örnek depolama için bunun yalnızca 508KB'ını kullanabilir ve reverb açıldığında kullanılabilir kapasite daha da azalır
- CD controller, ses arabelleğine ya da CPU müdahalesine ihtiyaç duymadan örnekleri doğrudan audio mixer'a gönderebilir; XA encoding ile sıkıştırılmış örnekler SPU tarafından gerçek zamanlı çözülebilir
- CD-ROM ortamı, PS1 oyunlarına 620MB depolama alanı, zengin ses kalitesi ve 2x sürücünün görece hızlı okuma hızını sağladı
- 1997'ye kadar çıkan PS1 revision'larının, kusurlu CD drive laser nedeniyle FMV ve Audio CD atlamalarına sıkça yol açtığı bilinir; sonraki modellerde laser unit ve housing iyileştirilerek sorun hafifletildi
I/O, BIOS ve geliştirme ortamı
- İlk PlayStation modellerinde eklentiler için Serial ve Parallel I/O portları vardı; ancak düşük benimsenme oranı ve kopya korumasını aşma endişeleri nedeniyle sonraki revision'larda kaldırıldılar
- CD subsystem; motor, laser ve RF sinyalini yöneten DSP; Motorola 68HC05 microcontroller ile 512B RAM ve 16KB ROM'dan oluşan bir Sub-CPU; ana CPU ile CD subsystem arasında aracı olan CD Controller; ayrıca 32KB SRAM buffer'dan oluşur
- Sub-CPU'nun ROM programı, kopya koruma prosedürünü uygular ve bunu ana CPU'nun iradesinden bağımsız olarak zorunlu kılar
- Ön yüzde 2 controller ve 2 Memory Card için toplam 4 soket bulunur; bu dört slot elektriksel olarak aynıdır ve adresleri sabit kodlanmıştır
- Sistem, 512KB ROM içinde BIOS saklar; BIOS başlangıç, kullanıcı kabuğu ve I/O rutinlerini sağlar
- BIOS ROM'a erişim 8 bit veri yolu nedeniyle çok yavaştır; bu yüzden API, açılış sırasında ana RAM'e kopyalanan bir Kernel biçiminde sunulur ve 64KB ana RAM PlayStation OS için ayrılır
- Açılış süreci; BIOS ROM'un çalıştırılması, PlayStation OS'nin yüklenmesi, splash ekranının gösterilmesi, CD'nin orijinalliğinin doğrulanması,
SYSTEM.CNFkontrolü ve çalıştırılması ya da shell'in gösterilmesi sırasıyla ilerler - Shell, Memory Card kayıtlarını kopyalama ve silme ile Audio CD oynatmayı sunan basit bir grafik arayüzdür
- Sony SDK, bir C compiler ve kütüphane içeriyordu; kütüphane, donanım erişimi için BIOS rutinlerine bağlanıyordu
- Stüdyolar için DTL-H2000, PS1 iç bileşenleri ile I/O ve debugging devrelerini barındıran çift yuvalı bir ISA kartıdır; Windows 3.1 ya da 95 kurulu bir PC'de çalışan yazılım gerektirir
- Hobi geliştiricilere yönelik Net Yaroze, araç seti, kılavuz ve siyah bir PS1 console sunuyordu; ancak CD drive erişimi olmadığı için homebrew yazılımın tamamen ana RAM içine sığması gerekiyordu
Kopya koruma ve bölge kilidi
- Sony'nin kopya koruması, CD'nin Table of Contents bölümünde belirli bir frekansta işlenmiş Wobble Groove bulunup bulunmadığını Sub-CPU'nun doğrulamasına dayanır
- Wobble Groove, mastering sürecinde eklenir; sıradan CD burner ile kopyalanamaz. TOC, CD'nin Lead-In alanında yer alır ve hata toleransı için birden çok kez tekrar edilir
- Oyun TOC'si, SCEA, SCEE veya SCEI dizgelerinden birini içerir; bu yöntem bölge kilidinde de kullanılır
- Kontrol yalnızca başlangıçta bir kez yapıldığı için doğrulamanın hemen ardından diski elle değiştirmeye dayanan swap trick ile aşılabilir, ancak sürücüye zarar verme riski vardır
- Bazı oyunlar, swap trick'i engellemek için oyun sırasında sürücüyü yeniden başlatıp kontrolü tekrarlamaya çalıştı
- Modchip, Wobble Groove sinyalini taklit edecek şekilde programlanmış küçük bir karttır; konsola lehimlenerek kullanılmış, hukuken tartışmalı olsa da son derece popüler olmuştur
- Sonraki oyunlar, modchip, CD burner ve emulator yayılımına karşı checksum merkezli ek koruma yöntemleri ekledi
- Sony'nin Libcrypt sistemi, belirli sektör checksum'larını disc sub-channel içinde saklayan donanım taraflı yaklaşımı; oyun genelinde bu checksum'ları alıp başka değerlerle karıştırarak doğrulayan yazılım taraflı rutinlerle birleştirir
1 yorum
Hacker News görüşleri
Aynı fiziksel belleğe eşlenen bellek bölgeleri var — https://psx-spx.consoledev.net/memorymap/
PSX'ten PC'ye Metal Gear Solid portu yapılmıştı ve Konami programcıları C4 bombasının duvara mı yoksa zemine mi yerleştirildiğini saklamak için epey sert bir numara kullanmıştı
Esasen işaretçi aynı fiziksel bellek adresini gösteriyordu ama duvara ya da zemine yerleştirilme durumuna göre
80000000hile OR'lanıyor ya daA0000000hkullanılıyor gibiydi. Çok uzun zaman geçtiği için tam olarak ne yaptıklarını artık net hatırlamıyorum ama PC'ye port etme süreci eğlenceliydiBIOS kodunda hatalı bir dizi yineleyicisi var; bu sayede temel işaretçinin üzerindeki bellek eşlemi konumlarına rastgele veriler kopyalanabiliyor. Normalde temel işaretçi çok yukarıda olduğu için çalışan kodun üzerine yazılamıyor ama bellek takma adları sayesinde değerler doğru ayarlanırsa yazma işlemi “geri sarılıp” BIOS'un üstüne yazabiliyor
Bu yüzden fiilen sadece bellek kartı ekranına girerek özel bir BIOS önyüklemek ve oradan mechacon kontrolünden geçmeden PSX.EXE çalıştırarak kopya korumasını aşmak mümkün
MGS portu hakkında daha fazlasını da duymak isterim. Aklında kalan bir şey var mı merak ediyorum. Çoğu betikleme için TCL kullanıldığını hatırlıyorum ve MGS 1~4'ün aynı soydan gelen bir betik dilini kullandığını sanıyorum
Yakın zamanda MGS2 kaynak kodu sızdırıldı ama muhtemelen neredeyse baştan yazılmıştı, bu yüzden PSX kod tabanıyla ortak kısmı çok azdı
PS1'de de RAM, tüm RAM kod çözme penceresini kaplayacak kadar büyük olmadığı için RAM takma adları oluşuyor. Ayrıntılı mekanizmayı bilmiyorum ama PS1 çalıştırılabilir dosyasının yığın işaretçisini geliştirme kitindeki 8MiB RAM'in sonuna ayarlasa bile perakende cihazda sonunda 2MiB RAM'in sonuna düştüğünü ve yine de düzgün çalıştığını görmüştüm. Teorik olarak oraya da bitler konabilir ve önbellek davranışı farklı olan bellek bölgelerine dokunmak gerekmez
https://github.com/FoxdieTeam/mgs_reversing/blob/master/sour...
https://en.wikipedia.org/wiki/Classic_Mac_OS_memory_manageme...
Bunun sonucunda bazı modellerde, PC'deki A20 kapısından çok da farklı olmayan bir geriye dönük uyumluluk modu ortaya çıktı ama bu dönem kısa sürdü
Arm Top Byte Ignore(TBI), Intel Linear-Address Masking(LAM) ve onun düzeltilmiş sürümü Linear Address Space Separation(LASS), AMD Upper Address Ignore(UAI) var; UAI ise hâlâ SLAM saldırılarına karşı güvenli değil. Bunların üzerinde ARM Memory Tagging Extension(MTE) gibi güvenlik genişletmeleri de bulunuyor
Harika bir yazı ama aslında ilk olarak 2019'da yayımlandı. Önceki tartışmalar 2020'de https://news.ycombinator.com/item?id=22932134 ve 2021'de https://news.ycombinator.com/item?id=27576902 açılmış; ikisinde de 114'er yorum var
Gerçekten çok güzel tasarlanmış bir web sitesi. Her şey düşünülerek yerleştirilmiş ve iyi küratörlüğü yapılmış bir dijital bahçenin iyi bir örneği gibi görünüyor. İyi bakılmış ve gerçekten bir insan tarafından yapılmış hissi güçlü
Şu anda PS1 ile ilgili bir proje üzerinde çalışıyorum ve yakında duyurmak istiyorum, bu yüzden bu yazıyı paylaştım
Önerebileceğiniz bir PS1 web/JS/WASM emülatörü var mı diye merak ediyorum. Masaüstünde PCSX-Redux [0] ve DuckStation [1] iyi geldi
JS/emscripten tabanlı birkaç deneme buldum ama öneriniz varsa sevinirim
[0] https://github.com/grumpycoders/pcsx-redux/
[1] https://duckstation.org/
PS1, RISC ya da daha doğrusu load-store mimarisini sevmemi sağlayan ve x86 tarafında yanlış düşündüğümü fark ettiren mimariydi
PS1 mimarisi büyüleyici. PS1 oyunlarının neden bugün bile taklit edilmeye çalışılan, kendine özgü ve kolay tanınan bir stile sahip olduğunu da gösteriyor
Copetti'nin yazılarını seviyorum. Ele aldığı her şeyi iyi bildiğim söylenemez ama yazılara ve diyagramlara göz gezdirmek bile keyifli
Özellikle 5. ve 6. nesil konsollar gibi makinelerin içinde neler olup bittiğini anlamaya çalışma süreci eğlenceli
https://fabiensanglard.net/
Claude'dan önce yazılmış olması onu daha da iyi yapıyor
Zıplamadan sonraki komutu çalıştırma fikri ilk başta delilik gibi gelmişti, ama birkaç gün geçince doğal gelmeye başladı. N64'te de benzer bir sorun vardı; iki çarpma arasına yerleştirilecek komutu bulmak gerekiyordu
İlk çarpma 0 ile çarpma gibi bir nedenle iki çevrimde biterse, sonraki komut da çarpma olduğunda CPU duruyordu
Bu yüzden bir istisna oluştuğunda çekirdek kesme işleyicisi bir sonraki komutun COP2 olup olmadığını kontrol edip, iki kez çalışmaması için program sayacına 4 eklemek zorundaydı
Ayrıca COP2 komutları branch delay slot içine konamıyordu; muhtemelen benzer bir sebeptendi. Ama bazı oyunlar, yanlış hatırlamıyorsam Tekken 3, bunu gerçekten yapıyordu. Birçok emülatör bu noktada sorun yaşadı ya da özel işlem gerektirdi; bu yüzden bunun gizlice eklenmiş bir emülasyon karşıtı önlem olup olmadığını hep merak etmişimdir
Bu yazı dizisi her zaman harika
PS1 oyunları bugünün ölçütlerine göre çok iyi dayanmıyor, ama PS2 oyunlarını 1440p~4K'ya upscale edince neredeyse kusursuz görünüyorlar
Bunun büyük kısmı nostalji olabilir ama ortada kesin bir çekicilik var; PS1'in kendine özgü donanım kısıtlarını öğrendikten sonra zamanla daha da çok sevmeye başladım. Sadece sosyal medya akışlarına bakınca bile “PS1 grafikleri”nin küçük çaplı bir geri dönüş yaşadığını ve pek çok kişinin o hissi yeniden üretmeye çalıştığını görebiliyorsunuz
Oynanış açısından bakınca bu konsol, ticari olarak çıkmış binlerce oyundan oluşan devasa bir kütüphaneye sahip ve içinde pek çok gizli cevher var. Bu listede kendi zevkine uygun tek bir oyun bile bulamayan bir oyuncu olursa doğrusu şaşırırım