کار خیلی مشکلی بود ولی با سه ماه مطالعه و بررسی و با کمک دوستان خوبم توی فروم روم هکینگ تونستم حلش کنم! تاریخ اولین و آخرین پست این تاپیک رو ببیند :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته الان دیگه واسم خیلی کار آسونی شده! معما حل شد آسان شد!!! فقط کافیه دو تا بایت رو تغییر بدیم تا حل بشه. یکی واسه برعکس کردن جهت چاپ و اون یکی واسه تنظیم الایمنت جمله.
خلاصه کاری که باید انجام بدیم
آدرس CPU رو که میره از توی ROM مقدار هگزادسیمال حرف اول جمله رو بر میداره رو پیدا میکنیم.
یه Breakpoint از نوع Read رو روی این آدرس CPU میزاریم.
با استفاده از فایل تریسمون کدهای اجرا شده قبلی رو مرور میکنیم و دستور INC رو پیدا میکنیم و بعد تبدیلش میکنیم به DEC تا جمله برعکس چاپ بشه.
برای درست کردن الاینت جمله باید یه جایی دستورات ADC و LDA رو پیدا کنیم و مقدارشون رو عوض کنیم.
مراحل کار
این روش واسه بازی های دیگه هم میتونه راه کار و راهنمای مناسبی باشه ولی باید دقت کنین که کاملا منطبق بر هم نخواهند بود. چرا؟ چون هر بازی توسط یه برنامه نویس جداگانه نوشته شده و طبیعی هست که بنابه سلیقه و یا مهارت برنامه نویس روتین برنامه فرق خواهد کرد. بنابراین اگه میخواهین روی یه بازی دیگه کار بکنین باید اول این رو یاد بگیرین و بعد روی بازی خودتون کار بکنین.
میریم به جایی که یه جمله هست و ما میخواهیم اون رو برعکس چاپش کنیم و یعنی راست به چپ بشه.
مقدار هگزادسیمال چند تا از کاراکترهای اول جمله رو مشخص میکنیم.
مثلا اینجا مقدار سه کاراکتر اولیه جمله بالا A9 B7 A6 هست
این مقدار رو توی Rom پیدا میکنیم. اگه چند تا نتیجه جستجو پیدا شد یکی یکی با عوض کردن مقدار هر کدوم از نتایج دقیقا مشخص میکنیم که کدوم نتیجه ماله جمله ما هست.
به این صورت مشخص میشه که آدرس 1C0B0 همونی هست که میخواهیم و مقدارش A9 هست و یعنی اولین کاراکتر جمله ما (یعنی
) اینجا ذخیره شده.
حالا باید یه جوری بفهمیم که این مقدار توی کدوم آدرس CPU لود میشه. برای این کار باید با استفاده از فرمول زیر یه کم محاسبات انجام بدیم. همه این محاسبات رو به راحتی میشه با ماشین حساب ویندوز که در حالت ساینتیفیگ قرار داده انجام داد :
1C0B0 - 10 = 1C0A0 عدد اولش رو حذف میکنیم تا چهار رقمی بشه C0A0 بعد تبدیلش میکنیم به مبنای ده 49312 این عدد رو با چهار تا عدد دیگه مقایسه میکنیم و عددی که بهش نزدیک تر هست به طوری که رابطه هست برقرار باشه رو انتخاب میکنیم و ازش کم میکنیم 49312 - 49152 = 160 عدد به دست آمده رو تبدیل میکنیم به مبنای هگزادسیمال میشه A0 حالا این عدد رو با دو تا عدد دیگه به طور جدا گانه جمع میکنیم :
A0 + 8000 = 80A0
A0 + C000 = C0A0
اگه گفتین این دو تا عدد به چه دردی میخورن؟ فقط یکیشون به درد بخور هست و همون آدرس CPU هست که مقدار A9 رو توی موقعیت مناسب میره از توی ROM بر میداره و میاره تا چاپش بکنه!
حالا از کجا بفهمیم که کدوم یکی هست؟ و یا کی و کجا میره از توی ROM بر میداره؟ اینجا هست که Breakpoint دیباگر به کمکمون میاد. باید هر دوتاشون رو امتحان بکنیم و ببینیم کدوم یکی هست.
برای استفاده از دیباگر این طوری میکنیم :
FCEUX --> Debug --> Debugger --> Add --> Address --> C0A0 --> Read --> OK
حالا میریم به جایی که جمله مورد نظرمون شروع میکنه به چاپ شدن. در این لحظه یعنی قبل از اینکه حتی حرف اول یعنی که مقدارش A9 هست به نمایش در بیاد باید دیباگر بازی رو استپ کنه و کدی رو که در حال اجرا شدن هست رو به نمایش در بیاره.
واسه هر دو تا آدرس بالا این کار رو میکنیم من قبلا این کار رو انجام دادم و میدونم که آدرس C0A0 درست هست چون اون یکی باعث استپ شدن بازی نمیشه!
خب حالا کد زیر به نمایش در میاد :
l 05:AD93:B1 30 LDA ($30),Y @ $C0A0 = #$A9
این کد داره به A که یه ریجستر هست مقدار A9 رو از توی آدرس C0A0 سی پی یو یا همون آدرس 1C0B0 رام لود میکنه.
از دکمه Step Into استفاده میکنیم تا دستورات بعدی سطر به سطر اجرا بشن. باید دنبال یه دستور INC بگردیم. دستورش به این شکل ظاهر میشه :
l 00:B044:EE 08 06 INC $0608 = #$02
حالا باید تبدیلش بکنیم به DEC تا کاراکترهای جمله برعکش چاپ بشن. B044 نشون دهنده آدرس CPU هست که این دستور رو داره از توی ROM میخونه. هگزا ادیتور رو باز میکنیم :
Debug --> Hex Editor
میاییم به آدرس B044 که مقدارش EE هست روش راست کلیک میکنیم و گزینه Go here in rom file رو میزنیم تا بره به آدرسی که توی رام هست. اینجا میتونیم مقدار EE رو به CE تغییر بدیم تا INC تبدیل بشه به DEC.
الان اگه بریک پونت(های) توی دیباگر رو Delete بکنین و دکمه Run رو بزنین و یه بار FCEUX رو ریست بکنین میبینین که همه جمله ها دارن برعکس چاپ میشن!
ولی هنوز کارمون تموم نشده!
چون الایمنت جملات درست نیستن. از اینجا به بعد دیگه واسه هر بازی کلا فرق میکنه مثلا واسه این بازی من متوجه شدم که با تغییر دستورات زیر الایمنت جملات به شکلی در میاد که مد نظر من هست :
l 00:B032:69 20 ADC #$20 --> 00:B032:69 1A ADC #$1A
l 00:B0AC:AD 18 B1 LDA $B118 --> 00:B0AC:A9 23 LDA #$23
l 00:AF1F:AD 18 B1 LDA $B118 --> 00:AF1F:A9 23 LDA #$23
پیدا کردن این دستورات و تغییر مقادیر اونا دقیقا مثل تغییر مقدار INC به DEC هست که بالا توضیح دادم.
راستی اینم مرجع دستورات اسمبلی 6502 :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بچه ها به خودتون ایمان داشته باشین ما میتونیم فقط کافیه که بخواهیم.