Kiến trúc PlayStation
(copetti.org)- Kiến trúc PlayStation chọn cấu hình đơn giản và thực dụng để giảm độ phức tạp khi phát triển phần cứng 3D, nhưng đổi lại để lại gánh nặng cho lập trình viên và những giới hạn hình ảnh ở căn chỉnh đồ họa, hiệu chỉnh texture và độ chính xác
- Sony CXD8530BQ là một SoC tích hợp lõi tương thích MIPS R3000A dựa trên CoreWare của LSI Logic cùng CP0, GTE và MDEC, chạy ở 33.87MHz và tổ chức việc di chuyển dữ liệu xoay quanh 2MB RAM, 1KB Scratchpad và DMA
- Về đồ họa, GTE đảm nhiệm phép chiếu 3D, chiếu sáng và clipping, còn GPU render line, hình chữ nhật và tam giác theo kiến trúc dựa trên lệnh; do không có Z-buffer nên hệ thống dùng ordering table và CPU phải quyết định thứ tự polygon
- GPU tạo ra rung hình, chồng lấp và
texture warpingdo affine texture mapping, nearest neighbour, tọa độ số nguyên và thiếu độ phân giải subpixel, nên các biện pháp lách như tessellation, thay bằng màu đơn và hậu cảnh dựng sẵn được sử dụng - Thiết kế dựa trên CD-ROM với 620MB dung lượng lưu trữ, streaming âm thanh ADPCM 44.1kHz, môi trường chạy dựa trên BIOS, cùng cơ chế chống sao chép Wobble Groove kết hợp khóa vùng đã thay đổi cách phát triển và phân phối game
Thiết kế cơ bản và CPU
- PlayStation được định hướng theo thiết kế đơn giản và thực dụng, dựa trên giả định rằng phần cứng 3D có thể trở nên quá phức tạp để phát triển, và chấp nhận một số giới hạn như cái giá phải trả
- Chip chính Sony CXD8530BQ theo cách gọi ngày nay là một SoC, sử dụng lõi CPU dựa trên CoreWare của LSI Logic, tương thích nhị phân với dòng MIPS R3000A
- Lõi CPU có xung 33.87MHz, ISA MIPS I, word 32-bit, 32 thanh ghi đa dụng, bus dữ liệu 32-bit, bus địa chỉ 32-bit, pipeline 5 giai đoạn và cache lệnh 4KB
- Không có cache dữ liệu; thay vào đó, vùng nhớ 1KB vốn tương ứng với data cache được cung cấp dưới dạng Scratchpad ánh xạ vào địa chỉ cố định để dùng như SRAM tốc độ cao
- Hệ thống cung cấp 2MB EDO RAM cho tác vụ tổng quát; EDO RAM được mô tả là loại chip hiệu quả hơn đôi chút và có độ trễ thấp hơn DRAM thông thường
Bus và bộ đồng xử lý
- Bus dữ liệu được chia thành Main Bus 32-bit và Sub Bus 16/8-bit; Main Bus kết nối MDEC và GPU, còn Sub Bus kết nối các thành phần còn lại và I/O
- CD-ROM controller, MDEC, GPU, SPU và parallel port có thể truy cập DMA controller; DMA chiếm Main Bus để truyền dữ liệu với thông lượng cao mà không cần đi qua CPU
- Trong lúc DMA hoạt động, CPU không thể truy cập Main Bus và sẽ rơi vào trạng thái chờ nếu không có công việc nào để xử lý trong Scratchpad
- CP0, tức System Control Coprocessor, quản lý triển khai cache, truy cập trực tiếp Scratchpad, cô lập cache lệnh, interrupt, exception và breakpoint
- CP2, tức Geometry Transformation Engine, tăng tốc tính toán vector và ma trận dựa trên fixed-point, đảm nhiệm các giai đoạn đầu của pipeline đồ họa như phép chiếu 3D, chiếu sáng và clipping
- MDEC giải nén các macroblock được mã hóa tương tự JPEG sang định dạng mà GPU có thể hiểu, xử lý 9.000 macroblock 8×8 pixel 24bpp mỗi giây để stream FMV 320×240px ở 30fps
- Không có FPU tương ứng với CP1; phép tính số thực có thể xử lý bằng floating-point phần mềm hoặc fixed-point, nhưng bị giới hạn về tốc độ và độ chính xác
Pipeline và delay slot
- Pipeline MIPS I dễ bị ảnh hưởng bởi control hazard và data hazard, đồng thời có cơ chế branch delay slot trong đó lệnh ngay sau branch hoặc jump luôn được thực thi
- Lệnh load không dừng pipeline cho đến khi dữ liệu nạp xong, nên nếu lệnh kế tiếp phụ thuộc ngay vào kết quả của lệnh load trước đó thì cần có filler để nhận được toán hạng chính xác
- Một số delay slot có thể được lấp bằng lệnh có ý nghĩa, nên không phải lúc nào cũng là chu kỳ bị lãng phí
- Dựa trên triết lý RISC rằng compiler và assembler chất lượng cao sẽ xử lý việc sắp xếp lại lệnh hoặc chèn filler, MIPS chọn thiết kế phơi bày pipeline CPU cho lập trình viên và toolchain
- Thiết kế này cũng có nhược điểm là càng về các thế hệ CPU sau, khi xuất hiện vi kiến trúc mới, việc duy trì tương thích ngược càng khó hơn
Pipeline đồ họa
- Phần lớn pipeline đồ họa do GTE xử lý, sau đó dữ liệu kết quả được chuyển cho GPU độc quyền của Sony để render
- Hệ thống lưu frame buffer, texture và các tài nguyên render khác trong 1MB VRAM, và CPU có thể dùng DMA để nạp dữ liệu vào vùng này
- VRAM của các mẫu đầu tiên có cấu trúc dual-ported, dùng hai bus 16-bit để CPU, DMA, GPU và video encoder có thể truy cập đồng thời
- Các mẫu sau chuyển sang SGRAM dùng một bus dữ liệu 32-bit; do khác biệt timing nên các game phát hành muộn như Jet Moto 3 có thể bị lỗi hiển thị trên hệ thống dùng VRAM kiểu cũ
- CPU gửi dữ liệu hình học bằng cách nạp tối đa 3 lệnh vào FIFO buffer 64 byte của GPU; các lệnh này yêu cầu render, thay đổi thiết lập hoặc thao tác VRAM
- GPU có thể vẽ line, hình chữ nhật và tam giác riêng lẻ; tam giác là thành phần cơ bản để tạo nên các mô hình 3D phong phú
- Hệ tọa độ của GPU là mô hình tọa độ số nguyên, trong đó mỗi tọa độ tương ứng với sampling point ở tâm pixel, và không dùng fractional coordinate
Hiển thị, raster hóa và texture
- GPU của PlayStation không cung cấp cơ chế hardware để giải quyết hiển thị theo chiều sâu, mà dùng ordering table để quản lý địa chỉ lệnh GPU theo từng giá trị depth
- CPU phải sắp xếp polygon trước, đặt tham chiếu vào mục phù hợp trong bảng, rồi gửi bảng đó tới GPU bằng DMA để render đúng thứ tự
- GPU chỉ cần một frame buffer duy nhất, còn rasteriser chuyển vertex thành line, tam giác, hình chữ nhật và pixel
- Tam giác là primitive phức tạp và đa dụng nhất, hỗ trợ texture và shading; line thì nhanh nhưng không phù hợp với bề mặt có texture, còn hình chữ nhật bị giới hạn ở sprite tối đa 256×256 pixel và không cung cấp shading hay hiệu ứng biến đổi affine
- Có hai kiểu hiệu ứng chiếu sáng là flat shading và Gouraud shading; flat shading có thể tô được số polygon mỗi giây cao hơn khoảng 2.5 lần so với Gouraud shading
- Texture được áp dụng bằng inverse texture mapping, tức tra texel từ texture map cho từng pixel đã raster hóa
- Affine Texture Mapping của GPU PlayStation chỉ dùng tọa độ 2D X/Y và bỏ qua depth, nên không thực hiện perspective correction
- Không có texture filtering; việc hiệu chỉnh khi scale dùng nearest neighbour, nhanh và rẻ nhưng khiến mô hình texture trông bị khối vuông
- GPU hỗ trợ semi-transparency và dithering cho tam giác, và PlayStation được mô tả là đặc biệt mạnh ở các hiệu ứng này
Vận hành VRAM và giới hạn hình ảnh
- Ý tưởng dùng phần lớn 1MB VRAM cho frame buffer đòi hỏi phải điều chỉnh lại theo chuẩn tín hiệu TV, làm giảm không gian cho texture và colour table; bản thân GPU cũng chỉ có thể render frame buffer màu 16-bit tối đa 640×480 pixel
- Buffer 640×480 16-bit vẫn để lại 424KB VRAM cho dữ liệu tài nguyên, nhưng vấn đề là trên TV gia đình thời đó, lợi thế của độ phân giải cao không đặc biệt nổi bật
- Adjustable frame-buffer là cách giảm kích thước frame buffer để không lãng phí VRAM cho độ phân giải khó cảm nhận rõ, qua đó tăng chỗ cho texture và colour lookup table
- Demo Gears Episode 2 của Halkun cho thấy cấu hình chia frame buffer 640×480 thành hai buffer 320×480 và dùng page flipping để render một cảnh trong khi cảnh còn lại đang được hiển thị
- Bố cục này chỉ tiêu thụ 600KB VRAM, cho phép dùng 424KB còn lại cho colour lookup table và texture, kết hợp với texture cache 2KB để đạt hiệu quả tốt
- VRAM có thể ánh xạ đồng thời nhiều độ sâu màu, nên có thể đặt bitmap 24bpp thường dùng cho frame FMV cạnh frame buffer 16bpp
- Vì rasteriser chỉ xử lý ở mức pixel và không theo dõi tam giác chiếm bao nhiêu phần lẻ của pixel, nên có thể xuất hiện hiện tượng viền mô hình bị nhảy và vùng giao nhau giữa các tam giác bị flicker hoặc chồng lấp
- Ordering table giao gánh nặng xác định geometry nào ở phía trước cho lập trình viên hoặc chương trình; nếu dùng nhiều phép tính gần đúng để tối ưu hiệu năng thì có thể phát sinh flickering hoặc lỗi bề mặt bị che khuất
- Biến đổi affine không có cảm nhận về chiều sâu nên khi camera ở gần mô hình và vuông góc với hướng nhìn, nó có thể tạo ra texture warping; một số game giảm méo bằng tessellation hoặc thay bằng màu đặc
- Hậu cảnh dựng sẵn được dùng khi cần cảnh chân thực hơn khả năng thể hiện thời gian thực của GPU, bằng cách stream video qua MDEC rồi phủ lên hai tam giác
Âm thanh và game dựa trên CD
- SPU hỗ trợ 24 kênh sample ADPCM 16-bit ở chất lượng Audio CD 44.1kHz
- SPU cung cấp các tính năng pitch modulation, frequency modulation, ADSR envelope, looping và digital reverb
- Bộ đệm âm thanh Sound RAM là 512KB DRAM; game chỉ có thể dùng 508KB để lưu sample, và khi bật reverb thì dung lượng khả dụng còn giảm thêm
- CD controller có thể gửi sample trực tiếp tới audio mixer mà không cần bộ đệm âm thanh hay CPU can thiệp; các sample nén bằng mã hóa XA có thể được SPU giải mã theo thời gian thực
- Đĩa CD-ROM mang lại cho game PS1 dung lượng lưu trữ 620MB, chất lượng âm thanh phong phú và tốc độ đọc tương đối nhanh của ổ 2x
- Các bản revision PS1 phát hành đến năm 1997 được biết đến với lỗi laser ổ CD khiến FMV và Audio CD thường xuyên bị skip; các mẫu sau đã cải tiến cụm laser và vỏ để giảm vấn đề này
I/O, BIOS và môi trường phát triển
- Các mẫu PlayStation đầu tiên có cổng I/O Serial và Parallel cho phụ kiện add-on, nhưng các cổng này bị loại bỏ ở những revision sau vì tỷ lệ sử dụng thấp và lo ngại bị lợi dụng để vượt qua copy protection
- CD subsystem gồm DSP điều khiển motor, laser và tín hiệu RF; Sub-CPU gồm Motorola 68HC05 microcontroller với 512B RAM và 16KB ROM; CD Controller làm trung gian giữa main CPU và CD subsystem; cùng bộ đệm SRAM 32KB
- Chương trình ROM của Sub-CPU triển khai quy trình copy-protection và cưỡng chế nó bất kể ý định của main CPU
- Mặt trước có 4 socket cho 2 controller và 2 Memory Card; cả bốn slot giống hệt nhau về điện và địa chỉ được hardcode
- Hệ thống lưu BIOS trong ROM 512KB; BIOS cung cấp quá trình khởi động, user shell và các routine I/O
- Truy cập BIOS ROM rất chậm do bus dữ liệu 8-bit, nên API được cung cấp dưới dạng Kernel được chép vào main RAM khi boot, và 64KB main RAM được dành riêng cho PlayStation OS
- Quá trình boot diễn ra theo thứ tự: chạy BIOS ROM, nạp PlayStation OS, hiển thị splash, kiểm tra tính xác thực của CD, kiểm tra và thực thi
SYSTEM.CNFhoặc hiển thị shell - Shell là giao diện đồ họa đơn giản cho phép sao chép/xóa save trên Memory Card và phát Audio CD
- Sony SDK bao gồm C compiler và library; library liên kết tới các BIOS routine để truy cập phần cứng
- DTL-H2000 dành cho studio là card ISA hai khe chứa nội bộ PS1 cùng mạch I/O và debugging, yêu cầu phần mềm chạy trên PC cài Windows 3.1 hoặc 95
- Net Yaroze dành cho người dùng nghiệp dư cung cấp toolkit, manual và một máy PS1 màu đen, nhưng bị hạn chế ở chỗ không truy cập được ổ CD nên toàn bộ homebrew software phải nằm gọn trong main RAM
Chống sao chép và khóa vùng
- Cơ chế copy protection của Sony hoạt động bằng cách để Sub-CPU kiểm tra xem Table of Contents của đĩa có chứa Wobble Groove được khắc ở một tần số cụ thể hay không
- Wobble Groove được tạo ra trong quá trình mastering và không thể sao chép bằng CD burner thông thường; TOC nằm trong vùng Lead-In của đĩa và được lặp lại nhiều lần để tăng fault tolerance
- TOC của game chứa một trong các chuỗi SCEA, SCEE hoặc SCEI, và cơ chế này cũng được dùng cho region-locking
- Việc kiểm tra chỉ diễn ra một lần khi khởi động, nên có thể lách bằng swap trick là thay đĩa thủ công ngay sau khi xác thực, nhưng có nguy cơ làm hỏng ổ đĩa
- Một số game cố ngăn swap trick bằng cách khởi tạo lại ổ đĩa trong lúc chơi để lặp lại bước kiểm tra
- Modchip là một bảng mạch nhỏ được lập trình để giả lập tín hiệu Wobble Groove, được hàn vào console để sử dụng; dù gây tranh cãi pháp lý, nó vẫn cực kỳ phổ biến
- Các game về sau bổ sung biện pháp tự bảo vệ riêng, chủ yếu dựa trên checksum, để đối phó với sự lan rộng của modchip, CD burner và emulator
- Libcrypt của Sony kết hợp cách tiếp cận phía phần cứng là lưu checksum của một số sector nhất định trong sub-channel của đĩa, với routine phía phần mềm lấy checksum ở nhiều vị trí trong game rồi trộn với các giá trị khác để xác minh
1 bình luận
Ý kiến trên Hacker News
Có các vùng nhớ được ánh xạ vào cùng một bộ nhớ vật lý — https://psx-spx.consoledev.net/memorymap/
Tôi từng port Metal Gear Solid từ PSX sang PC, và các lập trình viên Konami đã dùng một mẹo khá dữ dội để lưu việc thuốc nổ C4 được gắn lên tường hay đặt trên sàn
Về bản chất, con trỏ trỏ tới cùng một địa chỉ bộ nhớ vật lý, nhưng nếu gắn trên tường hay trên sàn thì họ sẽ OR với
80000000hhoặc dùngA0000000h. Đã lâu lắm rồi nên tôi không còn nhớ chính xác họ đã làm gì, nhưng quá trình port sang PC rất thú vịCó một bộ lặp mảng lỗi trong mã BIOS, cho phép sao chép dữ liệu tùy ý tới vị trí cao hơn trên sơ đồ bộ nhớ so với con trỏ gốc. Bình thường thì con trỏ gốc nằm rất cao nên không thể ghi đè mã thực thi, nhưng nhờ alias bộ nhớ, nếu canh giá trị khéo thì thao tác ghi có thể “vòng lại” và ghi đè BIOS
Vì vậy, trên thực tế chỉ cần vào màn hình thẻ nhớ là có thể khởi động BIOS tùy biến, rồi từ đó chạy PSX.EXE mà không qua kiểm tra mechacon để vượt qua chống sao chép
Tôi cũng muốn biết thêm về bản port MGS. Không biết bạn còn nhớ gì không. Tôi nhớ phần lớn scripting dùng TCL, và có vẻ MGS 1~4 đều dùng cùng một dòng ngôn ngữ kịch bản
Mã nguồn MGS2 gần đây đã bị rò rỉ, nhưng có lẽ nó gần như được viết lại hoàn toàn nên chắc hầu như không còn chia sẻ phần nào với codebase PSX
PS1 cũng không có đủ RAM để phủ toàn bộ cửa sổ giải mã RAM, nên sinh ra alias RAM. Tôi không rõ cơ chế chi tiết, nhưng tôi từng thấy file thực thi PS1 đặt stack pointer ở cuối vùng RAM 8MiB của dev kit, vậy mà trên máy bán lẻ cuối cùng vẫn rơi về cuối vùng RAM 2MiB và chạy bình thường. Về lý thuyết, ở đó cũng có thể nhét bit vào mà không cần đụng tới vùng nhớ có hành vi cache khác
https://github.com/FoxdieTeam/mgs_reversing/blob/master/sour...
https://en.wikipedia.org/wiki/Classic_Mac_OS_memory_manageme...
Kết quả là trên một số mẫu máy xuất hiện chế độ tương thích ngược không khác mấy cổng A20 của PC, nhưng giai đoạn đó khá ngắn
Có Arm Top Byte Ignore(TBI), Intel Linear-Address Masking(LAM) và bản chỉnh sửa của nó là Linear Address Space Separation(LASS), cùng AMD Upper Address Ignore(UAI); UAI thì vẫn chưa an toàn trước tấn công SLAM. Phía trên đó còn có các mở rộng bảo mật như ARM Memory Tagging Extension(MTE)
Bài viết rất hay, nhưng thực ra ban đầu đã được đăng từ năm 2019. Các thảo luận cũ lần lượt có 114 bình luận vào năm 2020 tại https://news.ycombinator.com/item?id=22932134 và năm 2021 tại https://news.ycombinator.com/item?id=27576902
Đây là một website được thiết kế thật sự đẹp. Mọi thứ đều được sắp xếp đầy dụng ý, trông như một ví dụ rất tốt về một khu vườn số được tuyển chọn kỹ lưỡng. Cảm giác nó được chăm chút tốt và do con người trực tiếp tạo ra rất rõ ràng
Tôi đăng bài này vì hiện đang làm một dự án liên quan đến PS1 và muốn sớm công bố nó
Không biết có ai gợi ý trình giả lập PS1 web/JS/WASM nào không. Trên desktop, tôi thấy PCSX-Redux [0] và DuckStation [1] khá tốt
Tôi cũng đã tìm được vài thử nghiệm dựa trên JS/emscripten, nhưng nếu có đề xuất nào thì tôi sẽ rất cảm kích
[0] https://github.com/grumpycoders/pcsx-redux/
[1] https://duckstation.org/
PS1 là kiểu kiến trúc khiến tôi yêu thích RISC, hay chính xác hơn là kiến trúc load-store, và nhận ra rằng trước đó mình đã suy nghĩ sai về phía x86
Kiến trúc PS1 rất cuốn hút. Nó cũng cho thấy vì sao các game PS1 lại có phong cách độc đáo và dễ nhận ra đến mức ngày nay người ta vẫn cố tái hiện
Tôi thích các bài của Copetti. Dù không phải lúc nào tôi cũng hiểu rõ mọi thứ ông ấy đề cập, nhưng chỉ riêng việc lướt qua bài viết và các sơ đồ cũng đã rất thú vị
Đặc biệt, quá trình cố gắng hiểu xem bên trong những cỗ máy như console thế hệ thứ 5 và thứ 6 đã diễn ra chuyện gì rất vui
https://fabiensanglard.net/
Bài này ra trước thời Claude nên càng hay hơn
Việc thực thi lệnh sau cú nhảy ban đầu nghe có vẻ điên rồ, nhưng sau vài ngày thì lại thấy bình thường. N64 cũng có vấn đề tương tự nên phải tìm một lệnh để chèn giữa hai phép nhân
Nếu phép nhân đầu tiên nhân với 0 gì đó nên kết thúc trong hai chu kỳ, thì khi lệnh tiếp theo cũng là phép nhân, CPU sẽ bị khựng lại
Vì vậy nếu xảy ra ngoại lệ, trình xử lý ngắt của kernel phải kiểm tra xem lệnh tiếp theo có phải COP2 hay không và cộng thêm 4 vào bộ đếm chương trình để tránh chạy hai lần
Ngoài ra, lệnh COP2 không thể đặt vào branch delay slot, có lẽ cũng vì lý do tương tự. Nhưng một số game, nếu nhớ không nhầm thì là Tekken 3, thực sự đã làm như vậy. Tôi luôn tự hỏi liệu đó có phải là một kiểu chống giả lập được cài lén hay không, vì khá nhiều trình giả lập từng gặp vấn đề ở chỗ này hoặc phải xử lý riêng
Loạt bài này lúc nào cũng rất xuất sắc
Game PS1 theo tiêu chuẩn hiện nay thì không còn giữ phong độ tốt lắm, nhưng game PS2 nếu được upscale lên 1440p~4K thì gần như hoàn hảo
Phần lớn chắc là do hoài niệm, nhưng rõ ràng nó có sức hấp dẫn riêng, và từ khi hiểu các giới hạn phần cứng độc đáo của PS1 thì tôi lại càng thích nó hơn theo thời gian. Chỉ cần nhìn feed mạng xã hội thôi cũng thấy “đồ họa PS1” đang có chút hồi sinh, và có rất nhiều người muốn tái hiện lại cảm giác đó
Xét về gameplay, hệ máy này có một thư viện đồ sộ với hàng nghìn game đã phát hành thương mại, và cũng có rất nhiều hidden gem. Nếu có một game thủ nào đó không tìm nổi lấy một game hợp gu trong danh sách ấy thì tôi còn thấy ngạc nhiên hơn