دليل للمطورين يشرح صيغة الباتش الأصلية داخل Cemu 2.x، وتحديد ملفات RPX وRPL عن طريق CRC، وكتابة التعليمات داخل Codecave، واستخدام Labels وConstants وData Directives، ثم نقل باتشات Cemuhook القديمة إلى صيغة Cemu الأصلية.
نافذة Graphic Packs التي يستخدمها المستخدم لتنزيل الحزم، البحث عنها، وتفعيل الباتش المطلوب داخل Cemu.
وضع الباتشات حاليًا في Cemu 2.6
وش هي Cemu Patches؟
بداية من Cemu 1.17.0 صار المحاكي يدعم تعديل Game Code مباشرة من خلال Graphic Packs. قبل ذلك كانت عملية Assembly Patching تعتمد على Cemuhook وملف patches.txt.
مكان الملف وتسميته
عندما يطابق rules.txt اللعبة، يفحص Cemu مجلد Graphic Pack بحثًا عن أي ملف يطابق النمط:
patch_<anything>.asm
الحد الأدنى المطلوب داخل rules.txt
ملف rules.txt هو اللي يربط الحزمة باللعبة ويحدد اسمها ومسار ظهورها داخل نافذة Graphic Packs. مع Cemu 2.x استخدم version = 6.
[Definition] titleIds = 0005000012345600 name = My Patch path = "Example Game/Mods/My Patch" description = Applies a custom PPC patch. version = 6
وش يشوف المستخدم النهائي داخل Cemu؟
واجهة Cemu الفعلية + Community Graphic Packsالمطور يكتب rules.txt وملفات patch_*.asm، لكن المستخدم النهائي ما يحتاج يفتح الكود. كل اللي يشوفه هو اسم الحزمة ومسارها ووصفها والخيارات الموجودة في نافذة Graphic Packs.
مثال واضح على ظهور الحزمة وخياراتها للمستخدم النهائي؛ الاسم والمسار والوصف والـPresets كلها تأتي من ملفات Graphic Pack.
ملاحظات مهمة من تطوير Cemu
Release Notes + Developer TrackerPatch Groups وmoduleMatches
كل مجموعة باتش تبدأ باسم داخل أقواس مربعة، ثم moduleMatches الذي يحتوي CRC واحدًا أو أكثر لتحديد ملفات RPX أو RPL المستهدفة.
[group_name] moduleMatches = 0x11223344, 0xCFF30E4E
تعديل تعليمات منفردة
أبسط استخدام هو الكتابة داخل عنوان محدد في الـModule. اكتب العنوان، ثم علامة =، وبعدها تعليمة PowerPC أو Data Directive يدعمها المجمّع.
0x0200E3A4 = li r3, 0 0x0200E400 = nop
Write Cursor واستخدام .origin
لما تكتب عدة تعليمات متتالية، ما تحتاج تحسب عنوان كل سطر يدويًا. استخدم .origin لتحديد مؤشر الكتابة، وCemu يزيده تلقائيًا بعد كل تعليمة أو Data Directive.
.origin = 0x0200E3A4 bla someLabel blr
كتابة Function داخل Codecave
الكلمة codecave تنقل مؤشر الكتابة إلى مساحة غير مستخدمة مخصصة للكود الإضافي.
.origin = codecave someLabel: li r3, 0 blr
Labels والعناوين الخارجية
عرّف Label بكتابة الاسم متبوعًا بنقطتين. Cemu يعالج Relocation تلقائيًا عشان يظل الاسم يشير إلى مكان الكود الصحيح في الذاكرة.
OurLabel:
وتقدر تربط Label بعنوان موجود داخل Text أو Data Section في اللعبة:
0x0202034C = ExternalLabel:
Constants وExpressions
صيغة Cemu تدعم Constants وعمليات حسابية وقت التجميع، وتقدر تستخدم Preset Variables القادمة من Graphic Pack.
myConst = $presetVariable + 5 li r3, myConst
أو تكتب التعبير مباشرة داخل التعليمة:
li r3, $presetVariable + 5
Data Directives المدعومة
SomeFloat: .float 123.45 lis r12, SomeFloat@ha lfs f0, SomeFloat@l(r12)
الفرق الخطير عند التحويل من Cemuhook
الصيغتان تقبلان كتابة name = value، لكن معنى السطر مختلف.
مثال كامل: الصيغة القديمة مقابل صيغة Cemu
[PatchName] moduleMatches = 0x12345678 # code Cave codeCaveSize = 0x24 # preset variable _ourVariable = 0x0000000 0x0000000 = .int $gfxPackPresetVariable # function in code cave _codeCaveFunction = 0x0000004 0x0000004 = lis r11, _ourVariable@ha 0x0000008 = lwz r11, _ourVariable@l(r11) 0x000000C = cmpwi r11, 1 0x0000010 = bne .+0x0C 0x0000014 = li r3, 0 0x0000018 = blr 0x000001C = addi r3, r3, 1 0x0000020 = blr # redirect game code 0x21EFAA8 = bla _codeCaveFunction
[PatchName] moduleMatches = 0x12345678 .origin = codecave # preset variable _ourVariable: .int $gfxPackPresetVariable # function in code cave _codeCaveFunction: lis r11, _ourVariable@ha lwz r11, _ourVariable@l(r11) cmpwi r11, 1 bne label_skip li r3, 0 blr label_skip: addi r3, r3, 1 blr # redirect game code 0x21EFAA8 = bla _codeCaveFunction
ترتيب إنشاء باتش جديد
تأكد أن الباتش اشتغل من log.txt
Cemu Bug Tracker القديم — سجل تشغيل فعليسجل Cemu يعطيك اسم الـModule والـChecksum واسم Patch Group الذي تم تطبيقه، وقد يعرض نطاق Codecave والحزمة المفعلة. المثال التالي مأخوذ من تقرير قديم في Bug Tracker ويظل مفيدًا لفهم شكل السجل:
Loaded module 'turbo' with checksum 0xd09700ce Applying patch group 'MK8FullDrawVer4_1' Activate graphic pack: Mario Kart 8/Mods/60FPS in splitscreen Applying patch group 'MK8AspectVer4_1' (Codecave: 01800000-01800018)
أخطاء شائعة تمنع الباتش من العمل
متى المشكلة من الباتش وليست من Cemu؟
في Bug Tracker الرسمي أُغلق تقرير كراش لأن العطل كان يظهر فقط مع Graphic Pack، وتم توجيهه ليُصلح داخل الحزمة نفسها بدل تعديل Cemu Core.
المصادر الرسمية
شارك المحتوى بصيغة مناسبة لكل منصة
يُرسل عنوان المقال وملخصًا قصيرًا ورابط HAKAMIQ المباشر بدون نصوص طويلة أو مزعجة.
تابع القراءة
articles طريقة تشغيل Pretendo واللعب أونلاين على محاكي Cemu
Pretendo Network Cemu 2.6 Dumpling 2.7.2 Online Play شرح تجهيز PNID على Wii U، واستخراج ملفات الأونلاين باستخدام Dumpling، ونسخها إلى Cemu، ثم اختيار Pretendo من إعدادات الحساب للع…
articles طريقة تشغيل Pretendo على Wii U وإنشاء حساب PNID
Pretendo Network Inkay SSSL شرح الطريقتين المتاحتين للاتصال بخوادم Pretendo: إضافة Inkay على نظام Aroma، أو طريقة SSSL بدون تهكير، مع إنشاء PNID ونقل ملفات الحفظ من حساب Nintendo ا…
articles طريقة تحميل وتثبيت محاكي Cemu
Cemu Setup Guide Windows / Linux / macOS Graphic Packs شرح كامل لتنزيل Cemu، واختيار التثبيت العادي أو Portable، وتنظيم مجلدات الألعاب وMLC، وضبط Quick Start، وتنزيل Community Grap…
articles تفعيل FPS++ ورفع فريمات Zelda Breath of the Wild على Cemu
Cemu FPS++ Zelda BOTW Graphic Packs Vulkan / OpenGL شرح تنزيل Community Graphic Packs وتفعيل FPS++، والفرق بين الوضع الديناميكي وStatic FPS، وضبط 30 أو 60 فريم، مع حلول التقطيع ومش…