1 คะแนน โดย GN⁺ 20 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • สถาปัตยกรรม 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 น้อยมาก
    • ทุกวันนี้ทริกแบบนี้มักทำโดยใช้บิตล่างที่ยังว่างของพอยน์เตอร์ แล้วค่อยลบออกด้วยการมาสก์ตอน dereference แทน แต่ก็ต้องแลกกับการบังคับให้จัดแนวสูงขึ้น เช่น ถ้าใช้ 4 บิตก็ต้องจัดแนว 16 ไบต์
      PS1 เองก็มีการ alias ของ RAMเพราะมี RAM ไม่พอจะครอบคลุมหน้าต่างการดีโค้ด RAM ทั้งหมด ฉันไม่รู้กลไกละเอียดนัก แต่เคยเห็นว่าแม้ไฟล์รันของ PS1 จะตั้ง stack pointer ไปที่ท้าย RAM 8MiB ของ dev kit แต่บนเครื่องขายจริงมันก็จะไปตกที่ท้าย RAM 2MiB อยู่ดีและยังทำงานได้ตามปกติ ตามทฤษฎีแล้วก็น่าจะใส่บิตตรงนั้นได้เหมือนกัน โดยไม่ต้องไปแตะบริเวณหน่วยความจำที่มีพฤติกรรมแคชต่างออกไป
    • น่าสนใจมาก พอลองหาส่วนนี้ในโค้ดที่ถอดกลับมาก็ไม่ง่ายเลย สงสัยเหมือนกันว่าอาจจะยังหาไม่เจอและยังไม่ได้บันทึกไว้หรือเปล่า
      https://github.com/FoxdieTeam/mgs_reversing/blob/master/sour...
    • Mac ยุคแรก ๆ ใช้ไบต์บนสุดของพอยน์เตอร์ 32 บิตไปเก็บข้อมูลอื่น
      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 ข้อความ

    • หลังจากนั้นก็อัปเดตหลายรอบ
    • ถึงอย่างนั้นก็เป็นเรื่องเมื่อ 5~7 ปีก่อนอยู่ดี ฉันเพิ่งเคยเห็นบทความนี้ เลยดีใจที่มันถูกขุดขึ้นมาอีกครั้ง
  • เว็บไซต์นี้ออกแบบได้สวยจริง ๆ ทุกอย่างถูกจัดวางอย่างใส่ใจ และดูเป็นตัวอย่างที่ดีของสวนดิจิทัลที่คัดสรรมาอย่างดี ดูแลดีมากและให้ความรู้สึกว่ามนุษย์ทำขึ้นเองจริง ๆ

  • ตอนนี้ฉันกำลังทำโปรเจ็กต์เกี่ยวกับ 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 นั้นสนุกมาก

    • ถ้าคุณชอบ Copetti งานของ Fabien Sanglard ก็ควรดูทั้งหมดเหมือนกัน มีทั้ง Black Books ของ Wolfenstein และ Doom, การวิเคราะห์การพอร์ต Another World และรีวิวโค้ดอีกหลายสิบชิ้นที่เขาเผยแพร่
      https://fabiensanglard.net/
    • ปี 1994 เองก็ทำให้ทึ่งเสมอ เครื่องพวกนี้ให้ความรู้สึกเหมือนเป็นของช่วงปลายยุค 90 มากกว่า
  • ยิ่งชอบเข้าไปอีกเพราะเป็นบทความที่ออกมาก่อนยุค Claude

  • การที่ต้องรันคำสั่งหลังการกระโดด ตอนแรกมันดูเหมือนบ้าสิ้นดี แต่พอผ่านไปไม่กี่วันก็รู้สึกว่ามันเป็นธรรมชาติไปเอง N64 ก็มีปัญหาคล้ายกัน เลยต้องหาว่า จะเอาคำสั่งอะไรไปแทรกระหว่างการคูณสองครั้ง
    ถ้าการคูณครั้งแรกเป็นการคูณด้วย 0 หรืออะไรทำนองนั้นจนจบในสองไซเคิล พอคำสั่งถัดไปเป็นคำสั่งคูณเหมือนกัน CPU ก็จะหยุดทำงาน

    • อีกจุดประหลาดคือคำสั่ง COP2 หรือก็คือคำสั่ง GTE จะเริ่มทำงาน เร็วกว่าตำแหน่งตาม program counter อยู่หนึ่งคำสั่ง
      เพราะงั้นถ้าเกิดข้อยกเว้น ตัวจัดการเคอร์เนลอินเทอร์รัปต์จะต้องตรวจว่าคำสั่งถัดไปเป็น COP2 หรือไม่ และต้องบวก 4 ให้ program counter เพื่อไม่ให้มันรันซ้ำสองครั้ง
      อีกอย่างคือไม่สามารถใส่คำสั่ง COP2 ลงใน branch delay slot ได้ ซึ่งก็น่าจะด้วยเหตุผลคล้ายกัน แต่บางเกม เท่าที่จำได้คือ Tekken 3 กลับทำแบบนั้นจริง ๆ อีมูเลเตอร์หลายตัวเลยมีปัญหาตรงนี้หรือต้องมีการทำเคสพิเศษ ทำให้ผมสงสัยมาตลอดว่ามันเป็นการใส่ระบบกันอีมูเลชันแบบแอบ ๆ หรือเปล่า
  • บทความชุดนี้ยอดเยี่ยมเสมอ
    เกม PS1 อาจไม่ได้ทนกาลเวลาเท่าไรนักในมาตรฐานปัจจุบัน แต่ถ้าเอาเกม PS2 มาอัปสเกลเป็น 1440p~4K ผมว่ามันแทบจะสมบูรณ์แบบเลย

    • เกม PS1 เองก็ยังดูดีได้มากถ้าเล่นในแบบที่ตั้งใจไว้แต่แรก คือเล่นบน CRT ถ้าทำได้ หรือไม่อย่างนั้นก็ใช้อีมูเลเตอร์ที่มีฟิลเตอร์ CRT การเล่นบน LCD คม ๆ ที่ความละเอียดสูงมากนี่แหละที่ผมว่ามันแย่ที่สุด
    • เรื่องที่ว่า “เกม PS1 ดูยากในทุกวันนี้” ก็แล้วแต่มุมมองของแต่ละคน PS1 เป็นเครื่องคอนโซลภายในบ้านที่ประกาศการมาถึงของ ยุค 3D และก็มีคนจำนวนมากที่ชอบโมเดล 3D โพลิกอนต่ำพร้อมอาการ “สั่น” แบบฉบับ PS1
      ส่วนหนึ่งก็แน่นอนว่าเป็นเรื่องของความคิดถึง แต่ก็มีเสน่ห์ชัดเจนอยู่ และพอได้รู้ข้อจำกัดฮาร์ดแวร์อันเป็นเอกลักษณ์ของ PS1 ผมก็ยิ่งชอบมันมากขึ้นเรื่อย ๆ แค่ดูฟีดโซเชียลมีเดียก็เห็นแล้วว่า “กราฟิกแบบ PS1” กำลังกลับมาได้รับความนิยมเล็ก ๆ และมีคนจำนวนมากพยายามสร้างความรู้สึกนั้นขึ้นมาใหม่
    • ถ้าดูจากสเปกแล้ว ผลงานที่นักพัฒนาดึงออกมาจากมันได้นั้นน่าทึ่งจริง ๆ
    • ในด้านกราฟิก จะเล่นบน CRT หรือใช้ฟิลเตอร์ CRT ก็ได้ หรือจะใช้อีมูเลเตอร์ที่รองรับ การแก้เรขาคณิต PGXP เพื่อลบอาการจุดยอดสั่นเมื่อเรนเดอร์ที่ความละเอียดสูงก็ได้
      ถ้ามองในแง่เกมเพลย์ เครื่องนี้มีคลังเกมขนาดมหึมาที่มีเกมวางขายจริงนับเป็นหลักพัน และยังมีเกมดี ๆ ที่คนมองข้ามอีกมากมาย ถ้ามีนักเล่นเกมคนไหนหาเกมที่ตรงรสนิยมตัวเองจากลิสต์นั้นไม่ได้เลย ผมคงจะประหลาดใจมาก
    • เกม 2D ยังทนกาลเวลาได้ดีมาจนถึงทุกวันนี้ เช่นงานอย่าง Symphony of the Night