เป็นไปได้ไหมที่จะสร้างตัวแปลง ROM?

Jack Kasbrack 11/01/2018. 5 answers, 4.011 views
emulation nes compilers turbografx-16

จากความเข้าใจของฉันอีมูเลเตอร์เป็นสิ่งจำเป็นเนื่องจากเครื่องที่มีอีมูเลเตอร์ติดตั้งอยู่ (เช่น Windows) ไม่ได้รันรหัสเครื่องเดียวกับแพลตฟอร์มเป้าหมาย (เช่น 6502) ดังนั้นสิ่งที่อีมูเลเตอร์ทำคือแปลรหัสบรรทัดทีละบรรทัดและดำเนินการเองเช่นเดียวกับวิธีการทำงานของล่าม

เมื่อคำนึงถึงสิ่งนี้จะเป็นไปได้ไหมที่จะสร้างคอมไพเลอร์ที่เทียบเท่าซึ่งจะแปลง (ตัวอย่าง) ไฟล์. PCE ไปเป็นไฟล์. exe เพื่อให้สามารถทำงานบน Windows โดยไม่มีอีมูเลเตอร์ได้

5 Answers


NobodyNada 11/01/2018.

หมายเหตุ: คำตอบนี้ส่วนใหญ่มุ่งเน้นไปที่ NES เนื่องจากเป็นสิ่งที่ฉันคุ้นเคยมากที่สุด

ใช่; สิ่งนี้เรียกว่าการคอมไพล์แบบสแตติกหรือการ แปลไบนารี่แบบสแตติก อย่างไรก็ตามการคอมไพล์ซ้ำอาจเป็นเรื่องยากอย่างไม่น่าเชื่อ (ในบางกรณีอาจจำเป็นต้องถอยกลับไปตีความที่รันไทม์) นอกจากนี้ฮาร์ดแวร์ที่ไม่ใช่ของ CPU (เช่นกราฟิกและฮาร์ดแวร์เสียง) ยังคงต้องถูกจำลอง


การคอมไพล์รหัสเครื่องซ้ำแบบคงที่นั้นทำได้ยากอย่างเหลือเชื่อ การกำหนดพฤติกรรมของโปรแกรมโดยการวิเคราะห์โค้ดล่วงหน้า เป็นไปไม่ได้ ในบางกรณี ปัญหาบางอย่างที่พบเมื่อมีการคอมไพล์วิดีโอเกม retro retro แบบคงที่ ได้แก่ :

เราจะทราบได้อย่างไรว่าส่วนใดของ ROM ที่เป็นรหัสที่สามารถเรียกใช้งานได้และส่วนใดเป็นข้อมูล

วิธี "ชัดเจน" ในการคอมไพล์ NES ROM อีกครั้งคือการผ่านครั้งเดียวอ่านสตรีมคำสั่ง 6502 และส่งกระแสข้อมูลคำสั่ง x86 อย่างไรก็ตาม ROM ยังมีข้อมูลไบต์ซึ่งจะสร้างขยะหากตีความว่าเป็นคำแนะนำ คำแนะนำขยะเหล่านี้ไม่ควรถูกเรียกใช้เนื่องจากโปรแกรมจะไม่ข้ามไปยังที่อยู่นั้น แต่การมีข้อมูลที่ไม่ใช่คำสั่งทำให้เกิดปัญหาสองประการ:

1) โปรแกรมจะต้องสามารถอ่าน ROM ของตัวเองได้ นี่ไม่ใช่ปัญหาที่ยากเลย เราแค่ต้องรวมสำเนาของ ROM ที่ยังไม่ได้คอมไพล์ในไบนารีของโปรแกรมที่คอมไพล์เพื่ออ่านข้อมูลไบต์

2) เราไม่สามารถเขียน recompiler แบบ single-pass แบบง่ายได้ คำแนะนำอาจมีขนาดกว้างหลายไบต์ดังนั้นหากเราพยายามคอมไพล์บล็อกของข้อมูลที่ไม่สามารถเรียกทำงานซ้ำได้เราอาจสิ้นสุดการจัดแนวที่ไม่ถูกต้องเมื่อทำการคอมไพล์คำสั่งที่ตามมาอีกครั้ง (ตามตัวอย่าง (ค่อนข้างง่าย) ตัวอย่างเช่นในรหัสเครื่อง 6502 ลำดับของไบต์ 69 09 0A คือ ADC #09; ASL ในขณะที่ลำดับไบต์ A5 69 09 0A คือ LDA $69; ORA #0A จุดที่ เราเริ่มดำเนินการอย่างมากส่งผลกระทบต่อผลลัพธ์ของเรา)

ดังนั้นนี่หมายความว่าเราต้องทำการวิเคราะห์รหัสที่ซับซ้อนมากขึ้นเพื่อกำหนด บล็อคพื้นฐาน ของโปรแกรมและรวบรวมเป็นรายบุคคล jamulator ทำสิ่งนี้โดยเริ่มต้นที่เวกเตอร์ขัดจังหวะและติดตามสาขาที่เป็นไปได้ทั้งหมดจากที่นั่น อย่างไรก็ตามวิธีการนี้ still มีปัญหากับ:

การข้ามแบบไดนามิก

นี่คือที่คำนวณที่อยู่ที่จะดำเนินการเมื่อรันไทม์ ในบางกรณีสามารถค้นหาที่อยู่ที่คำนวณโดยใช้งานจริงและค้นหารหัส x86 ที่เกี่ยวข้อง อย่างไรก็ตามหากวิธี only ในการเข้าถึงบล็อกพื้นฐานคือผ่านการกระโดดทางอ้อมผู้คอมไพล์อาจสันนิษฐานว่าบล็อกนั้นไม่ใช่รหัสที่ใช้งานได้และไม่ได้รวบรวมไว้

jamulator ช่วยลดปัญหานี้โดยใช้การแฮ็ก: การสนับสนุนฮาร์ดโค้ดใน recompiler เพื่อให้รู้จักการใช้งานข้ามตารางในเกมเฉพาะ ใช้งานได้ แต่ไม่ชัดเจนว่าเป็นวิธีแก้ปัญหาทั่วไป

การสับเปลี่ยนธนาคาร

แม้ว่า jamulator สนับสนุนเฉพาะเกมของ NROM แต่เกม NES จำนวนมากที่มีตัวแมปที่ซับซ้อนกว่าสามารถสลับส่วนของรหัสและข้อมูลเข้าและออกจากพื้นที่ที่อยู่ที่สามารถเข้าถึงได้ ซึ่งหมายความว่าการกระโดดแต่ละครั้งสามารถไปยังสถานที่ต่าง ๆ ใน ROM ได้หลายสิบแห่งทั้งนี้ขึ้นอยู่กับว่าธนาคารใดถูกแมปกับที่อยู่นั้นขณะรันไทม์

รหัสที่สร้างขึ้นแบบไดนามิก / รหัสแก้ไขตัวเอง

แม้ว่านี่จะเป็นเรื่องแปลกสำหรับเกม NES เนื่องจาก RAM ในปริมาณเล็กน้อย แต่ถ้าฉันจำได้ว่าซอฟต์แวร์ C64 อย่างถูกต้องจะสร้างและเรียกใช้รหัสเมื่อรันไทม์หรือปรับเปลี่ยนรหัสในการประมวลผลกลาง นี่จะเป็นไปไม่ได้เกือบที่จะทำนายแบบคงที่

ฮาร์ดแวร์อื่น ๆ เช่นกราฟิกและเสียง

หน่วยประมวลผลภาพ NES และหน่วยประมวลผลเสียงยังคงต้องทำการจำลอง jamulator มีตัวเลียนแบบสำหรับฮาร์ดแวร์ที่ไม่ใช่ CPU ในไลบรารีรันไทม์และรหัส x86 ที่สร้างขึ้นเรียกฟังก์ชันไลบรารีเพื่อจัดการการเขียนไปยังที่อยู่หน่วยความจำที่แมปกับการดำเนินการ I / O

เกม NES จำนวนมากอาศัยเวลาที่แม่นยำระหว่าง CPU และ PPU ดังนั้นรหัส CPU ที่สร้างขึ้นจะต้องนับจำนวนนาฬิกา 6502 รอบที่ถ่ายโดยรหัสที่ดำเนินการ jamulator ใช้วิธีนี้ค่อนข้างง่าย : หลังจากคำสั่ง NES แต่ละคำสั่งมันจะเรียกไปยังไลบรารีรันไทม์ซึ่งรันส่วนที่เหลือของฮาร์ดแวร์ตามจำนวนรอบที่กำหนด วิธีนี้ง่ายต่อการนำไปใช้ แต่มีข้อเสียเล็กน้อย:

  • ซีพียูเขียนไม่ได้เกิดขึ้น exactly รอบที่ถูกต้องเมื่อเทียบกับส่วนที่เหลือของฮาร์ดแวร์ เวลามีความถูกต้องเฉพาะกับคำสั่งที่ใกล้ที่สุดไม่ใช่รอบที่ใกล้ที่สุด
  • การจำลอง PPU และ APU หลังจากคำสั่ง CPU ทุกคำสั่งลดประสิทธิภาพลงอย่างมากเนื่องจาก recompiler สูญเสียโอกาสในการลบรวมหรือจัดลำดับคำสั่งใหม่เพื่อประสิทธิภาพที่ดีขึ้น การสลับระหว่างการดำเนินการเป็นประจำยังส่งผลเสียต่อประสิทธิภาพแคชของ x86 CPU และความแม่นยำในการทำนายสาขา

วิธีที่มีประสิทธิภาพมากขึ้น (แต่ซับซ้อนยิ่งขึ้น) คือการทำนายเวลาที่ต้องการซิงโครไนซ์ที่แม่นยำระหว่าง CPU และฮาร์ดแวร์ที่เหลือและใช้การทำนายเหล่านี้เพื่อสลับระหว่างโหมดการจำลองที่รวดเร็วและแม่นยำตามต้องการ


แม้ว่าการคอมไพล์ซ้ำแบบคงที่มักจะเป็นไปได้ แต่มันก็เป็นเรื่องยากมาก jamulator บางครั้งกลับไปตีความ เมื่อเกมทำสิ่งที่ไม่ถูกต้องจัดการโดยคง recompiler

ความถูกต้องของการคอมไพล์ซ้ำแบบคงที่สามารถปรับปรุงได้โดยการรันเกมภายในของบางอย่างเช่นตัวบันทึกรหัสข้อมูลของ FCEUX ซึ่งเลียนแบบเกมในขณะที่บันทึกเส้นทางของรหัสที่ใช้ ข้อมูลจากการใช้งานจริงของเกมสามารถใช้เพื่อปรับปรุงความแม่นยำของการคอมไพล์ซ้ำแบบคงที่ อย่างไรก็ตาม "การทดสอบการทำงาน" ที่บันทึกโดยเครื่องบันทึกรหัสข้อมูลจะต้องใช้เส้นทางรหัสที่เป็นไปได้ของเกมเพื่อให้มีประโยชน์

อีมูเลเตอร์ของระบบที่ใหม่กว่าเช่น Dolphin Emulator (ซึ่งเลียนแบบ GameCube และ Wii) มักจะใช้ การรวบรวมแบบทันเวลาพอดี โดยตัวจำลองจะคอมไพล์ส่วนของโค้ดของเกม at runtime โดยทั่วไปจะให้สิ่งที่ดีที่สุดของทั้งสองโลก: เราได้รับการปรับปรุงประสิทธิภาพของโค้ดที่คอมไพล์ใหม่และความเข้าใจที่ดีขึ้นของความสามารถในการวิเคราะห์โค้ดของเกมตอนรันไทม์


Michael Kohne 11/01/2018.

ปัญหาคืออีมูเลเตอร์เลียนแบบจำนวนมากมากกว่าแค่ซีพียู ดังนั้นนอกเหนือจากการส่งรหัส 6502 ไปเป็นรหัส Intel (และไม่คิดว่าง่าย - การกำหนดเวลาออกมาถูกต้องจะเป็นปัญหาที่น่าสนใจ) คุณต้องให้รหัส (คล้ายกับไลบรารีมาตรฐานที่โปรแกรมใด ๆ ใช้) ที่จัดเตรียมสภาพแวดล้อม I / O ที่จำลองขึ้นซึ่งโค้ด 6502 สามารถจัดการได้

มันง่ายกว่ามากที่จะรวมอีมูเลเตอร์และโปรแกรมไว้ในไบนารีตัวเดียวและจัดส่ง นี่คือสิ่งที่ Ian Bogost ทำกับ A Slow Year - ไบนารี 6502 เพิ่งถูกรวมเข้ากับไบนารีด้วยอีมูเลเตอร์


DrMeta 11/01/2018.

ไม่ว่าจะเป็นไปได้หรือไม่นั้นไม่ได้เป็นเพียงปัจจัยเดียวที่กำหนดในการพัฒนา โปรดจำไว้ว่าคุณภาพของอีมูเลเตอร์นั้นเชื่อมต่อกับความสามารถในการสร้าง TAS, Savestate, ใช้ RAMWatch และอื่น ๆ ซึ่งทั้งหมดนี้ไม่สามารถทำได้ถ้า ROM ถูกแปลงเป็นไฟล์. EXE เมื่อคำนึงถึงสิ่งนี้ผู้พัฒนาจึงไม่ได้สนใจที่จะสร้างสิ่งนี้ซึ่งเป็นเหตุผลว่าทำไมมันจึงไม่ "เป็นไปได้" ด้วยความรู้ที่ชุมชนน่าจะมี


Jules 11/01/2018.

การรวบรวมคำแนะนำของตัวประมวลผลโดยพลการ (เช่น 6502) เป็นรหัสที่จะทำงานบนพีซีที่ทันสมัยน่าจะง่าย ท้ายที่สุดแล้วมันไม่ได้แตกต่างจากสิ่งที่ทำโดยคอมไพเลอร์ทันเวลาสำหรับภาษาที่เผยแพร่เป็น bytecode (เช่น Java, .NET, และอื่น ๆ ) และเรียบง่ายกว่าคอมไพเลอร์ JIT สำหรับภาษาที่ไม่ยุ่งยาก การแยกวิเคราะห์ (เช่น Javascript) วิธีง่าย ๆ คือใช้ตัวสร้างโค้ดที่มีอยู่ (เช่น LLVM หรือ gcc) และเพิ่มส่วนหน้าที่ง่ายมากที่อ่านรหัสเครื่องและสร้างคำสั่งกลางที่เหมาะสม ...

มีสามสิ่งที่ทำให้ซับซ้อนกว่านี้มาก:

  • ขั้นแรกคุณจะต้องจำลองฮาร์ดแวร์อื่น ๆ นอกเหนือจาก CPU ดังนั้นระบบกราฟิกระบบเสียงและอื่น ๆ รวมถึงสิ่งนี้คุณจะต้องจัดเตรียมเฟิร์มแวร์รุ่นแปลล่วงหน้าที่คาดว่าจะปรากฏในของคุณ ระบบเป้าหมายเพื่อให้สามารถเชื่อมโยงกับรหัสที่คุณกำลังรวบรวม

  • ประการที่สองคุณต้องระบุว่าส่วนใดของ ROM คือคำแนะนำในการใช้งานจริงและส่วนใดเป็นข้อมูล (เช่นสไปรต์แทร็กเสียงแผนที่ระดับเกมเป็นต้น) ส่วนข้อมูลจำเป็นต้องได้รับการจัดการที่แตกต่างกัน - เป็นการดีเลิศแปลเป็นรูปแบบที่เข้าถึงได้ง่ายขึ้น (โดยเฉพาะตัวเลขหลายไบต์จำนวนเต็มหรือทศนิยมซึ่งอาจอยู่ในรูปแบบที่โฮสต์ประมวลผลไม่เข้าใจ)

  • ประการที่สามและน่าสนใจกว่านี้ทั้งหมดนี้อาจจะถูกกฎหมายน้อยกว่าการใช้การจำลองแบบตีความ ผู้จำหน่ายซอฟต์แวร์และฮาร์ดแวร์หลายรายได้รับอนุญาตให้ใช้รหัส (ทั้งเฟิร์มแวร์หรือเกม) ในอีมูเลเตอร์ตราบใดที่พวกเขายังคงไม่เปลี่ยนแปลง (เช่นฉันรู้ว่านี่เป็นสถานการณ์ที่มี ROM สำหรับ Sinclair ZX Spectrum ซึ่งมี ถูกเผยแพร่ภายใต้เงื่อนไขเช่นนี้โดยผู้ถือลิขสิทธิ์ปัจจุบันของพวกเขา Amstrad PLC) แต่การคอมไพล์ใหม่สำหรับระบบใหม่จะทำการเปลี่ยน แม้ว่าจะไม่ได้รับการอนุญาตด้านลิขสิทธิ์ แต่ก็มีข้อยกเว้นเรื่องลิขสิทธิ์ที่หลากหลายซึ่งอนุญาตให้ทำการคัดลอกน้อยที่สุด (เช่นการคัดลอกเนื้อหาของคาร์ทริดจ์ ROM บนดิสก์เพื่อให้เข้าถึงได้ง่ายขึ้น) หากจำเป็นเพื่อให้ทำงานได้ - ไม่จำเป็นต้องทำการคอมไพล์ซ้ำดังนั้นแม้ว่าจะไม่มีการให้สิทธิ์การใช้งานที่ชัดแจ้ง แต่ก็อาจถูกกฎหมายในการคอมไพล์ใหม่สำหรับสถาปัตยกรรมใหม่มากกว่าการเลียนแบบแบบเก่า (ฉันไม่ใช่นักกฎหมายดังนั้นให้หยิบเกลือขนาดใหญ่มาก แต่ฉันใช้เวลาพอสมควรในการเรียนรู้เกี่ยวกับกฎหมายลิขสิทธิ์และฉันค่อนข้างมั่นใจในตำแหน่งนี้)


lvd 11/01/2018.

ไม่ใช่คำตอบที่สมบูรณ์ อย่างไรก็ตามอีมูเลเตอร์หลายตัวของคอนโซลเช่นเพลย์สเตชั่นและในบางแง่มุมก็เหมือนกันกับที่คุณถาม

แทนที่จะประมวลผลโค้ดอย่างแม่นยำและเลียนแบบฮาร์ดแวร์ได้อย่างแม่นยำชิ้นส่วนรหัสทั่วไป (ส่วนใหญ่เชื่อมต่อกับการแปลง 3D และการเรนเดอร์) ได้รับการยอมรับโดยรวมและผลลัพธ์สุดท้ายจะถูกแทรกในสถานะเครื่องหรือแสดงผลโดยใช้ความสามารถโฮสต์ 3D เหตุผลในการทำเช่นนั้นอาจเป็นเพราะขาดรายละเอียดข้อมูลฮาร์ดแวร์และความเร็วของโฮสต์ CPU นั้นไม่เพียงพอที่จะเลียนแบบทุกสิ่งที่น่ากลัว


HighResolutionMusic.com - Download Hi-Res Songs

1 AJR

Birthday Party flac

AJR. 2019. Writer: Adam Met;Jack Met;Ryan Met;Peter Ivers;David Lynch.
2 Loote

Your Side Of The Bed flac

Loote. 2018. Writer: ​Jesse Saint John;Jackson Foote;Emma Lov Block.
3 AJR

100 Bad Days flac

AJR. 2019. Writer: Jack Met;Adam Met;Ryan Met.
4 Joe Jonas

Longer Than I Thought flac

Joe Jonas. 2018. Writer: Patrick Nissley;Jackson Foote;Dave Katz.
5 Loote

Out Of My Head flac

Loote. 2018. Writer: Emma Lov Block;Michael Pollack;Jeremy Dussolliet;Jackson Foote.
6 Iselin Solheim

Anyone Out There flac

Iselin Solheim. 2019. Writer: Iselin Solheim;Max Grahn.
7 Loote

Wish I Never Met You flac

Loote. 2018. Writer: Jackson Foote;Alex Peter Koste;Jeremy Dussolliet;Emma Lov Block.
8 Kim Petras

Heart To Break flac

Kim Petras. 2018. Writer: Cirkut;Aaron Joseph;Dr. Luke;Jacob Kasher;Kim Petras.
9 A L E X

Out On The Trampoline At Night flac

A L E X. 2018. Writer: A L E X.
10 A L E X

I Want To Hold Your Hand flac

A L E X. 2018. Writer: A L E X.
11 A L E X

Field flac

A L E X. 2018. Writer: A L E X.
12 A L E X

Save Me flac

A L E X. 2018. Writer: A L E X.
13 Devin

Summer Lover flac

Devin. 2019. Writer: Tommy Lee James;Stuart Crichton;Oliver Heldens;Nile Rodgers;Devin Guisande.
14 A L E X

9 To 5 flac

A L E X. 2018. Writer: A L E X.
15 A L E X

Skirt flac

A L E X. 2018. Writer: A L E X.
16 Florian Picasso

Midnight Sun (Extended Version) flac

Florian Picasso. 2019.
17 Florian Picasso

Midnight Sun flac

Florian Picasso. 2019.
18 21 Savage

Enzo flac

21 Savage. 2019. Writer: YungLunchBox;Sheck Wes;Offset;Gucci Mane;21 Savage;DJ Snake.
19 Tales Of Ratatösk

Battle Of The Doomed Gods 320kbps

Tales Of Ratatösk. 2019.
20 Tales Of Ratatösk

Andro 320kbps

Tales Of Ratatösk. 2019.

Related questions

Hot questions

Language

Popular Tags