สถาปัตยกรรม PlayStation
(copetti.org)- สถาปัตยกรรม PlayStation เลือกโครงสร้างที่เรียบง่ายและใช้งานได้จริงเพื่อลดความซับซ้อนของการพัฒนาฮาร์ดแวร์ 3D แต่ก็ยังทิ้งภาระให้ผู้พัฒนาและข้อจำกัดด้านภาพไว้ในเรื่องการจัดเรียงกราฟิก การแก้ไขเท็กซ์เจอร์ และความแม่นยำ
- Sony CXD8530BQ เป็น SoC ที่รวมคอร์เข้ากันได้กับ MIPS R3000A บนพื้นฐาน CoreWare ของ LSI Logic พร้อม CP0, GTE และ MDEC ทำงานที่ 33.87MHz และจัดการการเคลื่อนย้ายข้อมูลโดยมี RAM 2MB, Scratchpad 1KB และ DMA เป็นแกนหลัก
- ด้านกราฟิกใช้โครงสร้างที่ GTE รับหน้าที่ฉายภาพ 3D, แสง และ clipping ส่วน GPU เรนเดอร์เส้น สี่เหลี่ยม และสามเหลี่ยมแบบอิงคำสั่ง และใช้ ordering table แทน Z-buffer ทำให้ CPU ต้องกำหนดลำดับของโพลิกอนเอง
- GPU ทำให้เกิดอาการสั่น การซ้อนทับ และ texture warping จาก affine texture mapping, nearest neighbour, พิกัดจำนวนเต็ม และการไม่มีความละเอียดระดับ subpixel จึงมีการใช้วิธีอ้อมอย่าง tessellation, การแทนด้วยสีล้วน และฉากหลังแบบ pre-rendered
- การออกแบบบนพื้นฐาน CD-ROM มอบพื้นที่เก็บข้อมูล 620MB, การสตรีมเสียง ADPCM 44.1kHz, สภาพแวดล้อมการรันแบบ BIOS และผสานการป้องกันการคัดลอก Wobble Groove เข้ากับการล็อกโซน จนเปลี่ยนวิธีพัฒนาและจัดจำหน่ายเกม
การออกแบบพื้นฐานและ CPU
- PlayStation มุ่งสู่การออกแบบที่เรียบง่ายและใช้งานได้จริงภายใต้สมมติฐานว่าฮาร์ดแวร์ 3D อาจพัฒนาให้ซับซ้อนเกินไปได้ และยอมรับข้อจำกัดบางอย่างเป็นสิ่งแลกเปลี่ยน
- ชิปหลัก Sony CXD8530BQ ตามนิยามปัจจุบันถือเป็น SoC และใช้คอร์ CPU บนพื้นฐาน CoreWare ของ LSI Logic ที่อยู่ในตระกูล MIPS R3000A และเข้ากันได้ในระดับไบนารี
- คอร์ CPU มีความถี่ 33.87MHz, ใช้ MIPS I ISA, word 32 บิต, รีจิสเตอร์เอนกประสงค์ 32 ตัว, data bus 32 บิต, address bus 32 บิต, pipeline 5 ขั้น และ instruction cache 4KB
- ไม่มี data cache และหน่วยความจำ 1KB ที่เดิมเทียบได้กับ data cache ถูกจัดให้เป็น Scratchpad ที่แมปกับแอดเดรสคงที่เพื่อใช้งานเหมือน SRAM ความเร็วสูง
- ระบบมี 2MB EDO RAM สำหรับงานทั่วไป โดย EDO RAM ถูกอธิบายว่าเป็นชิปที่มีประสิทธิภาพดีกว่าและมี latency ต่ำกว่า DRAM ทั่วไปเล็กน้อย
บัสและโคโปรเซสเซอร์
- data bus แบ่งเป็น Main Bus 32 บิต และ Sub Bus 16/8 บิต โดย Main Bus เชื่อม MDEC กับ GPU ส่วน Sub Bus เชื่อมองค์ประกอบที่เหลือและ I/O
- CD-ROM controller, MDEC, GPU, SPU และ parallel port สามารถเข้าถึง DMA controller ได้ และ DMA จะยึด main bus เพื่อส่งข้อมูลด้วย throughput สูงโดยไม่ต้องผ่าน CPU
- ระหว่างที่ DMA ทำงาน CPU จะเข้าถึง main bus ไม่ได้ และหากไม่มีงานให้ประมวลผลใน Scratchpad ก็จะอยู่ในสถานะรอ
- CP0 หรือ System Control Coprocessor จัดการการติดตั้ง cache, การเข้าถึง Scratchpad โดยตรง, การแยก instruction cache, interrupt, exception และ breakpoint
- CP2 หรือ Geometry Transformation Engine เร่งการคำนวณเวกเตอร์และเมทริกซ์แบบ fixed-point และรับผิดชอบขั้นต้นของกราฟิกไปป์ไลน์ เช่น การฉายภาพ 3D, แสง และ clipping
- MDEC คลายการบีบอัด macroblock ที่เข้ารหัสคล้าย JPEG ให้อยู่ในรูปแบบที่ GPU เข้าใจได้ และสามารถประมวลผลบิตแมป 24bpp ขนาด 8×8 พิกเซลได้ 9,000 macroblock ต่อวินาที ทำให้สตรีม FMV 320×240px ที่ 30fps ได้
- ไม่มี FPU ที่เทียบกับ CP1 ดังนั้นการคำนวณทศนิยมต้องทำผ่านซอฟต์แวร์ floating-point หรือ fixed-point ซึ่งมีข้อจำกัดทั้งด้านความเร็วและความแม่นยำ
ไปป์ไลน์และ delay slot
- ไปป์ไลน์ MIPS I มีความเปราะบางต่อ control hazard และ data hazard และมีพฤติกรรม branch delay slot ที่คำสั่งถัดจาก branch หรือ jump จะถูกรันเสมอ
- คำสั่ง load จะไม่หยุดไปป์ไลน์จนกว่าข้อมูลที่ดึงมาจะพร้อม ดังนั้นหากคำสั่งถัดไปพึ่งพาผลของ load ก่อนหน้าโดยตรง จะต้องมี filler เพื่อให้ได้ operand ที่ถูกต้อง
- delay slot บางส่วนสามารถเติมด้วยคำสั่งที่มีความหมายได้ จึงไม่ได้กลายเป็น cycle ที่สูญเปล่าเสมอไป
- MIPS เลือกการออกแบบที่เปิดเผยไปป์ไลน์ของ CPU ให้ผู้พัฒนาและ toolchain เห็น ตามปรัชญา RISC ที่เชื่อว่า compiler และ assembler คุณภาพสูงจะจัดการ reorder คำสั่งหรือแทรก filler ให้
- การออกแบบนี้ยังมีข้อเสียคือยิ่งมีไมโครสถาปัตยกรรมใหม่ใน CPU รุ่นถัดไป ก็ยิ่งทำให้การคง backward compatibility ยากขึ้น
กราฟิกไปป์ไลน์
- กราฟิกไปป์ไลน์ส่วนใหญ่ถูกประมวลผลโดย GTE และข้อมูลผลลัพธ์จะถูกส่งต่อไปยัง GPU แบบเฉพาะของ Sony เพื่อเรนเดอร์
- ระบบเก็บ frame buffer, texture และทรัพยากรเรนเดอร์อื่น ๆ ไว้ใน 1MB VRAM และ CPU สามารถเติมข้อมูลในพื้นที่นี้ผ่าน DMA ได้
- VRAM ของรุ่นแรกเป็นโครงสร้าง dual-ported ใช้บัส 16 บิตสองชุด ทำให้ CPU, DMA, GPU และ video encoder เข้าถึงพร้อมกันได้
- รุ่นหลังเปลี่ยนเป็น SGRAM ที่ใช้ data bus 32 บิตชุดเดียว และความต่างด้าน timing นี้อาจทำให้เกมรุ่นหลังอย่าง Jet Moto 3 แสดงกราฟิกผิดเพี้ยนบนระบบที่ใช้ VRAM แบบเดิม
- CPU ส่งข้อมูลเรขาคณิตโดยเติมคำสั่งได้สูงสุด 3 รายการลงใน FIFO buffer ขนาด 64 ไบต์ของ GPU ซึ่งคำสั่งเหล่านี้ใช้สำหรับการเรนเดอร์ การเปลี่ยนการตั้งค่า และการจัดการ VRAM
- GPU สามารถวาดเส้น สี่เหลี่ยม และสามเหลี่ยมแยกกันได้ โดยสามเหลี่ยมเป็นองค์ประกอบพื้นฐานในการสร้างโมเดล 3D ที่ซับซ้อน
- ระบบพิกัดของ GPU เป็นโมเดลพิกัดจำนวนเต็มที่แต่ละพิกัดสอดคล้องกับ sampling point ที่กึ่งกลางพิกเซล และไม่ใช้ fractional coordinate
การมองเห็น แรสเตอร์ไรซ์ และเท็กซ์เจอร์
- PlayStation GPU ไม่มีความสามารถแก้ปัญหา visibility ในฮาร์ดแวร์ และใช้ ordering table เพื่อจัดการแอดเดรสของคำสั่ง GPU ตามค่า depth
- CPU ต้องจัดเรียงโพลิกอนก่อน ใส่ reference ลงในรายการที่เหมาะสมของ table แล้วส่ง table ไปยัง GPU ผ่าน DMA เพื่อให้เรนเดอร์ตามลำดับที่ถูกต้อง
- GPU ต้องการเพียง frame buffer เดียว และ rasteriser จะเปลี่ยน vertex ให้เป็นเส้น สามเหลี่ยม สี่เหลี่ยม และพิกเซล
- สามเหลี่ยมเป็น primitive ที่ซับซ้อนและอเนกประสงค์ที่สุดเพราะรองรับ texture และ shading ส่วนเส้นจะเร็วแต่ไม่เหมาะกับพื้นผิวที่มี texture และสี่เหลี่ยมถูกจำกัดให้เป็น sprite สูงสุด 256×256 พิกเซล โดยไม่ให้เอฟเฟกต์ shading หรือ affine transformation
- เอฟเฟกต์แสงมีสองแบบคือ flat shading และ Gouraud shading โดย flat shading เติมโพลิกอนต่อวินาทีได้มากกว่า Gouraud shading ราว 2.5 เท่า
- texture ถูกนำไปใช้ด้วย inverse texture mapping ที่ค้นหา texel จาก texture map สำหรับแต่ละพิกเซลที่ถูก rasterised
- Affine Texture Mapping ของ PlayStation GPU ใช้เพียงพิกัด 2D X/Y และทิ้งค่า depth จึงไม่มี perspective correction
- ไม่มีการติดตั้ง texture filtering และการชดเชยการสเกลใช้ nearest neighbour ซึ่งรวดเร็วและประหยัด แต่ทำให้โมเดลที่มี texture ดูเป็นบล็อก
- GPU รองรับ semi-transparency และ dithering บนสามเหลี่ยม และ PlayStation ถูกอธิบายว่าทำได้โดดเด่นในเอฟเฟกต์เหล่านี้
การจัดการ VRAM และข้อจำกัดด้านภาพ
- แนวคิดการใช้ 1MB VRAM ทั้งหมดเป็น frame buffer ขนาดใหญ่ต้องมีการปรับใหม่ให้เข้ากับรูปแบบมาตรฐานทีวีและจะลดพื้นที่สำหรับ texture กับ colour table อีกทั้งตัว GPU เองก็เรนเดอร์ frame buffer สี 16 บิตได้สูงสุดเพียง 640×480 พิกเซล
- buffer 16 บิตความละเอียด 640×480 จะเหลือ VRAM สำหรับทรัพยากรเพียง 424KB แต่ข้อเสียคือในทีวีตามบ้านยุคนั้น ข้อได้เปรียบของความละเอียดสูงไม่ได้เด่นชัดนัก
- adjustable frame-buffer เป็นวิธีลดขนาด frame buffer เพื่อไม่ให้เปลือง VRAM ไปกับความละเอียดที่แทบไม่รู้สึก และเพิ่มพื้นที่ให้ texture กับ colour lookup table
- เดโม Gears Episode 2 ของ Halkun แสดงการแบ่ง frame buffer 640×480 ออกเป็น buffer 320×480 สองชุด และใช้ page flipping เพื่อเรนเดอร์ฉากหนึ่งขณะอีกฉากกำลังแสดงผล
- layout นี้ใช้ VRAM เพียง 600KB และเหลืออีก 424KB สำหรับ colour lookup table และ texture จึงเป็นโครงสร้างที่มีประสิทธิภาพเมื่อทำงานร่วมกับ texture cache ขนาด 2KB
- VRAM สามารถแมปหลาย colour depth พร้อมกันได้ ทำให้วางบิตแมป 24bpp ที่มักใช้กับเฟรม FMV ไว้ข้าง frame buffer 16bpp ได้
- rasteriser ประมวลผลเพียงระดับพิกเซลและไม่ได้ติดตามว่าสามเหลี่ยมครอบคลุมเศษส่วนของพิกเซลมากน้อยเพียงใด จึงอาจเกิดอาการขอบโมเดลกระโดด รวมถึง flicker และการซ้อนทับบริเวณที่สามเหลี่ยมตัดกัน
- ordering table โยนภาระการตัดสินว่า geometry ไหนอยู่ด้านหน้าให้ผู้พัฒนาหรือโปรแกรม และหากใช้การคำนวณแบบประมาณมากเพื่อประสิทธิภาพ ก็อาจเกิดปัญหา flickering หรือพื้นผิวที่ควรถูกบังยังมองเห็นได้
- affine transformation ไม่มีความรับรู้เรื่อง depth จึงอาจทำให้เกิด texture warping เมื่อกล้องเข้าใกล้โมเดลและตั้งฉากกับแนวสายตา โดยบางเกมลดความเพี้ยนด้วย tessellation หรือแทนที่ด้วยสีล้วน
- ฉากหลังแบบ pre-rendered ถูกใช้เมื่อจำเป็นต้องมีฉากสมจริงมากกว่าที่ GPU แบบเรียลไทม์ทำได้ โดยสตรีมวิดีโอผ่าน MDEC แล้วนำไปแปะบนสามเหลี่ยมสองชิ้น
เสียงและเกมบนพื้นฐาน CD
- SPU รองรับ sample แบบ ADPCM 16 บิต 24 แชนเนล ที่คุณภาพระดับ Audio CD 44.1kHz
- SPU มีฟังก์ชัน pitch modulation, frequency modulation, ADSR envelope, looping และ digital reverb
- บัฟเฟอร์เสียง Sound RAM เป็น DRAM ขนาด 512KB โดยเกมใช้เก็บ sample ได้จริงเพียง 508KB และหากเปิด reverb ความจุที่ใช้ได้จะลดลงอีก
- CD controller สามารถส่ง sample ไปยัง audio mixer ได้โดยตรงโดยไม่ต้องพึ่ง audio buffer หรือการแทรกแซงจาก CPU และ sample ที่บีบอัดด้วย XA encoding สามารถให้ SPU ถอดรหัสแบบเรียลไทม์ได้
- สื่อ CD-ROM มอบพื้นที่เก็บข้อมูล 620MB คุณภาพเสียงที่สมบูรณ์ยิ่งขึ้น และความเร็วการอ่านที่ค่อนข้างเร็วของไดรฟ์ 2x ให้กับเกม PS1
- มีข้อมูลว่ารุ่น revision ของ PS1 ที่ออกถึงปี 1997 ใช้เลเซอร์ไดรฟ์ CD ที่มีข้อบกพร่อง ทำให้ FMV และ Audio CD กระตุกหรือข้ามบ่อย ส่วนรุ่นหลังได้ปรับปรุง laser unit และ housing เพื่อลดปัญหานี้
I/O, BIOS และสภาพแวดล้อมการพัฒนา
- PlayStation ยุคแรกมีพอร์ต I/O แบบ Serial และ Parallel สำหรับ add-on แต่ภายหลังถูกถอดออกใน revision ถัดมาเพราะมีการใช้งานน้อยและกังวลเรื่องการเลี่ยง copy protection
- CD subsystem ประกอบด้วย DSP ที่ควบคุมมอเตอร์ เลเซอร์ และสัญญาณ RF, Sub-CPU ที่เป็น Motorola 68HC05 microcontroller พร้อม RAM 512B และ ROM 16KB, CD Controller ที่เป็นตัวกลางระหว่าง main CPU กับ CD subsystem และ SRAM buffer 32KB
- โปรแกรมใน ROM ของ Sub-CPU ใช้บังคับกระบวนการ copy-protection โดยไม่ขึ้นกับความประสงค์ของ main CPU
- ด้านหน้ามีช่องเสียบ 4 ช่องสำหรับ controller 2 ตัวและ Memory Card 2 ใบ โดยทั้งสี่ช่องเหมือนกันทางไฟฟ้าและมีแอดเดรสที่ฮาร์ดโค้ดไว้
- ระบบเก็บ BIOS ไว้ใน ROM ขนาด 512KB โดย BIOS ทำหน้าที่ startup, user shell และ I/O routine
- การเข้าถึง BIOS ROM ช้ามากเพราะใช้ data bus 8 บิต ดังนั้น API จึงถูกจัดให้เป็น Kernel ที่คัดลอกเข้าสู่ main RAM ระหว่างบูต และกัน main RAM 64KB ไว้สำหรับ PlayStation OS
- กระบวนการบูตดำเนินตามลำดับคือรัน BIOS ROM, โหลด PlayStation OS, แสดง splash, ตรวจสอบความแท้ของ CD, ตรวจ
SYSTEM.CNFแล้วจึงรันหรือแสดง shell - shell เป็นกราฟิกอินเทอร์เฟซแบบเรียบง่ายสำหรับคัดลอกหรือลบเซฟใน Memory Card และเล่น Audio CD
- Sony SDK มีทั้ง C compiler และ library โดย library จะเชื่อมกับ BIOS routine เพื่อเข้าถึงฮาร์ดแวร์
- DTL-H2000 สำหรับสตูดิโอเป็นการ์ด ISA แบบ dual-slot ที่บรรจุส่วนภายใน PS1 พร้อมวงจร I/O และ debugging และต้องใช้ซอฟต์แวร์ที่ทำงานบน PC ที่ติดตั้ง Windows 3.1 หรือ 95
- Net Yaroze สำหรับนักพัฒนาสาย hobbyist มี toolkit, manual และเครื่อง PS1 สีดำให้ แต่มีข้อจำกัดว่าเข้าถึง CD drive ไม่ได้ ทำให้ homebrew software ต้องอยู่ภายใน main RAM ทั้งหมด
การป้องกันการคัดลอกและการล็อกโซน
- copy protection ของ Sony ใช้วิธีให้ Sub-CPU ตรวจว่า Table of Contents ของแผ่น CD มี Wobble Groove ที่สลักด้วยความถี่เฉพาะหรือไม่
- Wobble Groove ถูกใส่มาในขั้นตอน mastering จึงไม่สามารถคัดลอกด้วย CD burner ทั่วไปได้ และ TOC อยู่ในพื้นที่ Lead-In ของ CD โดยมีการทำซ้ำหลายครั้งเพื่อความทนทานต่อความผิดพลาด
- TOC ของเกมจะมีสตริง SCEA, SCEE หรือ SCEI อย่างใดอย่างหนึ่ง และวิธีนี้ยังถูกใช้สำหรับ region-locking ด้วย
- การตรวจสอบทำเพียงครั้งเดียวตอนเริ่มต้น จึงสามารถหลบเลี่ยงได้ด้วย swap trick ที่สลับแผ่นด้วยมือหลังยืนยันตัวตนเสร็จ แต่มีความเสี่ยงทำให้ไดรฟ์เสียหาย
- บางเกมพยายามป้องกัน swap trick ด้วยการเริ่มต้นไดรฟ์ใหม่ระหว่าง gameplay เพื่อบังคับให้ตรวจสอบซ้ำ
- Modchip คือบอร์ดขนาดเล็กที่โปรแกรมให้เลียนแบบสัญญาณ Wobble Groove แล้วนำไปบัดกรีในเครื่อง console แม้มีข้อถกเถียงทางกฎหมาย แต่ได้รับความนิยมมาก
- เกมในยุคหลังยังเพิ่มมาตรการป้องกันของตนเองที่อิง checksum เพื่อรับมือกับการแพร่หลายของ modchip, CD burner และ emulator
- Libcrypt ของ Sony ผสานทั้งแนวทางฝั่งฮาร์ดแวร์ที่เก็บ checksum ของ sector เฉพาะไว้ใน sub-channel ของแผ่น และ routine ฝั่งซอฟต์แวร์ที่ดึง checksum มาใช้ร่วมกับค่าอื่นเพื่อตรวจสอบในหลายจุดของเกม
1 ความคิดเห็น
ความเห็นจาก Hacker News
มีบริเวณหน่วยความจำที่แมปไปยังหน่วยความจำกายภาพเดียวกัน — https://psx-spx.consoledev.net/memorymap/
ตอนพอร์ต Metal Gear Solid ลง PC โปรแกรมเมอร์ของ Konami ใช้ทริกที่ค่อนข้างดิบพอสมควรเพื่อเก็บข้อมูลว่าระเบิด C4 ถูกติดไว้ที่กำแพงหรือที่พื้น
โดยพื้นฐานแล้วพอยน์เตอร์จะชี้ไปยังแอดเดรสหน่วยความจำกายภาพเดียวกัน แต่ถ้าติดไว้ที่กำแพงหรือพื้นก็ดูเหมือนว่าจะใช้การ OR กับ
80000000hหรือไม่ก็ใช้A0000000hอะไรทำนองนั้น จำรายละเอียดที่ทำเป๊ะ ๆ ไม่ค่อยได้แล้วเพราะนานมาก แต่กระบวนการพอร์ตมาลง PC สนุกดีมีตัววนซ้ำอาร์เรย์ในโค้ด BIOS ที่มีบั๊ก ทำให้สามารถคัดลอกข้อมูลตามใจไปยังตำแหน่งที่สูงกว่าพอยน์เตอร์อ้างอิงใน memory map ได้ ปกติพอยน์เตอร์อ้างอิงจะอยู่สูงมากจนไม่สามารถเขียนทับโค้ดที่กำลังรันอยู่ได้ แต่เพราะมี memory aliasing ถ้าปรับค่าให้พอดี การเขียนจะ “วนกลับมา” แล้วเขียนทับ BIOS ได้
ดังนั้นในทางปฏิบัติ แค่เข้าไปที่หน้าจอเมมโมรีการ์ดก็สามารถบูต BIOS แบบคัสตอมได้ และจากตรงนั้นก็รัน PSX.EXE โดยไม่ต้องผ่านการตรวจของ mechacon เพื่อข้ามระบบป้องกันการคัดลอกได้
อยากรู้เรื่องการพอร์ต MGS เพิ่มเหมือนกัน สงสัยว่าพอจะจำอะไรได้อีกไหม จำได้ลาง ๆ ว่าสคริปต์ส่วนใหญ่ใช้ TCL และดูเหมือนว่า MGS 1~4 จะใช้ภาษาสคริปต์ที่อยู่ในสายตระกูลเดียวกัน
ไม่นานมานี้ซอร์สโค้ดของ MGS2 หลุดออกมา แต่คงเกือบจะเป็นการเขียนใหม่ทั้งหมด เลยน่าจะมีส่วนที่ใช้ร่วมกับโค้ดเบส PSX น้อยมาก
PS1 เองก็มีการ alias ของ RAMเพราะมี RAM ไม่พอจะครอบคลุมหน้าต่างการดีโค้ด RAM ทั้งหมด ฉันไม่รู้กลไกละเอียดนัก แต่เคยเห็นว่าแม้ไฟล์รันของ PS1 จะตั้ง stack pointer ไปที่ท้าย RAM 8MiB ของ dev kit แต่บนเครื่องขายจริงมันก็จะไปตกที่ท้าย RAM 2MiB อยู่ดีและยังทำงานได้ตามปกติ ตามทฤษฎีแล้วก็น่าจะใส่บิตตรงนั้นได้เหมือนกัน โดยไม่ต้องไปแตะบริเวณหน่วยความจำที่มีพฤติกรรมแคชต่างออกไป
https://github.com/FoxdieTeam/mgs_reversing/blob/master/sour...
https://en.wikipedia.org/wiki/Classic_Mac_OS_memory_manageme...
ผลคือในบางรุ่นมีโหมดความเข้ากันได้ย้อนหลังที่ไม่ต่างจาก A20 gate ของ PC มากนัก แต่ช่วงเวลานั้นก็สั้นมาก
มี Arm Top Byte Ignore(TBI), Intel Linear-Address Masking(LAM) และเวอร์ชันปรับปรุงอย่าง Linear Address Space Separation(LASS), AMD Upper Address Ignore(UAI) และ UAI ก็ยังไม่ปลอดภัยจากการโจมตีแบบ SLAM ข้างบนนี้ยังมีส่วนขยายด้านความปลอดภัยอย่าง ARM Memory Tagging Extension(MTE) ด้วย
เป็นบทความที่ยอดเยี่ยม แต่จริง ๆ เผยแพร่ครั้งแรกตั้งแต่ปี 2019 แล้ว การพูดคุยเก่ามีในปี 2020 ที่ https://news.ycombinator.com/item?id=22932134 และปี 2021 ที่ https://news.ycombinator.com/item?id=27576902 ซึ่งแต่ละครั้งมีคอมเมนต์ 114 ข้อความ
เว็บไซต์นี้ออกแบบได้สวยจริง ๆ ทุกอย่างถูกจัดวางอย่างใส่ใจ และดูเป็นตัวอย่างที่ดีของสวนดิจิทัลที่คัดสรรมาอย่างดี ดูแลดีมากและให้ความรู้สึกว่ามนุษย์ทำขึ้นเองจริง ๆ
ตอนนี้ฉันกำลังทำโปรเจ็กต์เกี่ยวกับ PS1 อยู่ และอยากเอามาเผยแพร่เร็ว ๆ นี้ เลยโพสต์บทความนี้
อยากถามว่ามีใครแนะนำ อีมูเลเตอร์ PS1 บนเว็บ/JS/WASM บ้างไหม บนเดสก์ท็อปฉันชอบ PCSX-Redux [0] กับ DuckStation [1]
เจอพวกที่พยายามทำบนฐาน JS/emscripten อยู่บ้างสองสามตัว แต่ถ้ามีตัวแนะนำก็น่าจะดีมาก
[0] https://github.com/grumpycoders/pcsx-redux/
[1] https://duckstation.org/
PS1 เป็นสถาปัตยกรรมที่ทำให้ฉันชอบแนว RISC หรือพูดให้แม่นกว่านั้นคือสถาปัตยกรรม load-store และทำให้ตระหนักว่าที่ผ่านมาฉันเข้าใจฝั่ง x86 ผิดไป
สถาปัตยกรรม PS1 มีเสน่ห์มาก และยังแสดงให้เห็นด้วยว่าทำไมเกม PS1 ถึงมีสไตล์เฉพาะตัวที่ทุกวันนี้ยังถูกหยิบมาทำซ้ำและมองออกได้ทันที
ฉันชอบบทความของ Copetti ถึงจะไม่ได้เข้าใจทุกอย่างที่เขาพูดถึง แต่แค่ไล่อ่านกับดูไดอะแกรมก็เพลินแล้ว
โดยเฉพาะความพยายามทำความเข้าใจว่าเกิดอะไรขึ้นข้างในเครื่องอย่างคอนโซลยุคที่ 5 และ 6 นั้นสนุกมาก
https://fabiensanglard.net/
ยิ่งชอบเข้าไปอีกเพราะเป็นบทความที่ออกมาก่อนยุค Claude
การที่ต้องรันคำสั่งหลังการกระโดด ตอนแรกมันดูเหมือนบ้าสิ้นดี แต่พอผ่านไปไม่กี่วันก็รู้สึกว่ามันเป็นธรรมชาติไปเอง N64 ก็มีปัญหาคล้ายกัน เลยต้องหาว่า จะเอาคำสั่งอะไรไปแทรกระหว่างการคูณสองครั้ง
ถ้าการคูณครั้งแรกเป็นการคูณด้วย 0 หรืออะไรทำนองนั้นจนจบในสองไซเคิล พอคำสั่งถัดไปเป็นคำสั่งคูณเหมือนกัน CPU ก็จะหยุดทำงาน
เพราะงั้นถ้าเกิดข้อยกเว้น ตัวจัดการเคอร์เนลอินเทอร์รัปต์จะต้องตรวจว่าคำสั่งถัดไปเป็น COP2 หรือไม่ และต้องบวก 4 ให้ program counter เพื่อไม่ให้มันรันซ้ำสองครั้ง
อีกอย่างคือไม่สามารถใส่คำสั่ง COP2 ลงใน branch delay slot ได้ ซึ่งก็น่าจะด้วยเหตุผลคล้ายกัน แต่บางเกม เท่าที่จำได้คือ Tekken 3 กลับทำแบบนั้นจริง ๆ อีมูเลเตอร์หลายตัวเลยมีปัญหาตรงนี้หรือต้องมีการทำเคสพิเศษ ทำให้ผมสงสัยมาตลอดว่ามันเป็นการใส่ระบบกันอีมูเลชันแบบแอบ ๆ หรือเปล่า
บทความชุดนี้ยอดเยี่ยมเสมอ
เกม PS1 อาจไม่ได้ทนกาลเวลาเท่าไรนักในมาตรฐานปัจจุบัน แต่ถ้าเอาเกม PS2 มาอัปสเกลเป็น 1440p~4K ผมว่ามันแทบจะสมบูรณ์แบบเลย
ส่วนหนึ่งก็แน่นอนว่าเป็นเรื่องของความคิดถึง แต่ก็มีเสน่ห์ชัดเจนอยู่ และพอได้รู้ข้อจำกัดฮาร์ดแวร์อันเป็นเอกลักษณ์ของ PS1 ผมก็ยิ่งชอบมันมากขึ้นเรื่อย ๆ แค่ดูฟีดโซเชียลมีเดียก็เห็นแล้วว่า “กราฟิกแบบ PS1” กำลังกลับมาได้รับความนิยมเล็ก ๆ และมีคนจำนวนมากพยายามสร้างความรู้สึกนั้นขึ้นมาใหม่
ถ้ามองในแง่เกมเพลย์ เครื่องนี้มีคลังเกมขนาดมหึมาที่มีเกมวางขายจริงนับเป็นหลักพัน และยังมีเกมดี ๆ ที่คนมองข้ามอีกมากมาย ถ้ามีนักเล่นเกมคนไหนหาเกมที่ตรงรสนิยมตัวเองจากลิสต์นั้นไม่ได้เลย ผมคงจะประหลาดใจมาก