في الثمانينات، قامت شركة غير معروفة تدعى Binary Systems بنشر لعبة Starflight. تضع اللعبة اللاعب في دور قائد المركبة الفضائية الذي تم إرساله لاستكشاف المجرة. لا يوجد مسار محدد، مما يسمح للاعبين بالتبديل بحرية بين التعدين والقتال من سفينة إلى سفينة والدبلوماسية الفضائية. تظهر الحبكة الأوسع للعبة ببطء، حيث يكتشف اللاعب أن جنسًا قديمًا من الكائنات يتسبب في اشتعال النجوم وتدمير جميع الكائنات الحية. لقد حظيت اللعبة بإشادة واسعة النطاق من قبل النقاد المعاصرين والحديثين على حد سواء، وهي واحدة من أقدم الأمثلة على لعبة وضع الحماية. أثرت اللعبة على تصميم العديد من الألعاب الأخرى لعقود من الزمن بعد إصدارها.
لمعرفة المزيد عن اللعبة قم بزيارة الروابط التالية:
يمكنك شراء اللعبة من موقع GoG
أول مرة سمعت عن اللعبة أردت أن ألعبها. ومع ذلك، كنت صغيرًا جدًا ولم أتمكن من التحدث باللغة الإنجليزية. بعد 20 حاولت مرة أخرى وكانت تجربة ممتعة للغاية. الاستكشاف ممتع، والقصة ملحمية وتنتهي بمفاجأة، وهي واحدة من أفضل ما جربته. من المؤكد أن اللعبة لم تنضج بشكل جيد، ولكن يمكنك أن تشعر بإخلاص المطورين للعبة. هناك جانب فني لهذه اللعبة بالإضافة إلى اهتمام الحرفي بالتفاصيل.
بقدر ما يكون لعب هذه اللعبة المذهلة أمرًا ممتعًا، كذلك فإن الهندسة العكسية لهذه اللعبة هي أيضًا ممتعة. أنت تتبع خطى المطورين وتختبر عمليات تفكيرهم كما لو كان ذلك في عام 1985 مرة أخرى. لهذه اللعبة توقع ما هو غير متوقع. عادةً، عندما تقوم بإجراء هندسة عكسية لمثل هذه اللعبة القديمة، يجب أن تتلقى عشرة آلاف أسطر من كود المجمع النقي، والتي يمكنك تحليلها باستخدام الأدوات المعتادة مثل IDA Pro. ولكن ليس هذه المرة. في الواقع، بالنسبة لهذه اللعبة، يمكنك التخلص من الأدوات المعتادة. فهي عديمة الفائدة. أنت وحدك. والسبب هو أن Starflight تمت كتابته باللغة الرابعة، وهي لغة بالكاد أعرفها.
الرابعة هي اللغة ذات البساطة المطلقة فيما يتعلق ببناء الجملة. لا يوجد بناء جملة أكثر من المسافة بين "الكلمات". يمكنك كتابة قارئ ومترجم فوري بشكل أساسي في بضعة أسطر من التعليمات البرمجية.
في اللغة الحديثة تكتب شيئا من هذا القبيل
print ( 2 + 3 )
لطباعة نتيجة 2+3. ولكن في الرابع يبدو مثل هذا.
2 3 + .
الرابع عبارة عن آلة مكدسة، مع تدوين بولندي عكسي. التفسير هو على النحو التالي
بناء الجملة بسيط والمترجم بسيط. "2" و"3" و"+" و"". تسمى فقط "الكلمات". لا يوجد تمييز نحوي بين البيانات والتعليمات البرمجية. من المؤكد أنها لغة ترقى إلى مستوى حدود أجهزة الكمبيوتر المنزلية المبكرة.
عندما تقوم بتشريح ملف STARFLT.COM القابل للتنفيذ، فإنه يكشف عن بعض العناصر الداخلية الرائعة
كما هو موضح أعلاه، فإن Forth عبارة عن آلة مكدسة. باعتباره ميكانيكيًا للتشفير، فهو يستخدم الترابط غير المباشر، وهي طريقة فعالة جدًا في استخدام المساحة لتخزين التعليمات البرمجية المجمعة. يحتوي الكود المترابط على نموذج يتكون بشكل أساسي بالكامل من استدعاءات للإجراءات الفرعية. يستخدم الترابط غير المباشر مؤشرات إلى المواقع التي تشير بدورها إلى رمز الجهاز.
لنفترض أن مؤشر التعليمات الخاص بك يشير إلى العنوان 0x1000 ويحتوي على قيمة 16 بت Read16(0x1000)=0x0f72.
0x1000 : dw 0x0f72
القيمة 0x0f72 هي المكافئ المشفر للكلمة الرابعة '+'. تذكر الوصف أعلاه. تقوم الكلمة "+" بإبراز آخر إدخالين في المكدس، وتجمعهما معًا وتدفع النتيجة مرة أخرى إلى أعلى المكدس. وفقًا للترابط غير المباشر، تعد قيمة 16 بت 0x0f72 بمثابة مؤشر إلى موقع يشير بدوره إلى رمز الجهاز. عند قراءة محتوى الذاكرة Read16(0x0f72) تحصل على المؤشر إلى 0x0f74. وبالفعل، عندما تنظر إلى موقع الذاكرة هذا وتفككه، تتلقى ما يلي
0x0f72 : dw 0x0f74
0x0f74 : pop ax
0x0f75 : pop bx
0x0f76 : add ax , bx
0x0f78 : push ax
0x0f79 : lodsw
0x0f7a : mov bx , ax
0x0f7c : jmp word ptr [ bx ]
تنفذ التعليمات الأربعة الأولى بالضبط العمليات التي يجب أن تؤديها الكلمة "+". آخر ثلاثة تعليمات للمجمع بدءًا من "lodsw" تزيد من مؤشر التعليمات وتنتقل إلى الكود التالي.
دعونا نستمر. الآن يشير مؤشر التعليمات إلى 0x1002
0x1002 : dw 0x53a3
قراءة العنوان 0x53a3 يكشف
0x53a3 : dw 0x1d29
0x53a5 : dw 0x0001
والرمز المقابل
0x1d29 : inc bx
0x1d2a : inc bx
0x1d2b : push bx
0x1d2c : lodsw
0x1d2d : mov bx , ax
0x1d2f : jmp word ptr [ bx ]
في هذا الوقت يحتوي السجل bx على عنوان الكلمة 0x53a3. لذلك يقوم هذا الرمز فقط بدفع العنوان 0x53a5 أعلى المكدس. ما قمنا به هو تزويد البرنامج بمؤشر لمتغير. يحتوي المتغير على المحتوى 0x0001. الكلمة الرابعة '@' ستبرز العنوان من المكدس، وتقرأ محتواه وتدفعه مرة أخرى إلى المكدس.
حتى الآن تمكنت من تحديد 6256 كلمة تحتوي إما على كود أو بيانات.
وهذا في الواقع كل ما تحتاج لمعرفته حول بنية الكود. كما ترون، يمكن أن يكون هذا ترميزًا موفرًا للمساحة، لكنه يعد كارثة. كل عدد قليل من تعليمات كود الآلة يجب عليك الانتقال إلى كتلة تعليمات برمجية مختلفة.
سيبدو ما يعادل الترابط غير المباشر في لغة C بهذا الشكل.
uint16_t instruction_pointer = start_of_program_pointer ;
void Call ( uint16_t word_adress )
{
// the first two byte of the word's address contain
// the address of the corresponding code, which must be executed for this word
uint16_t code_address = Read16 ( word_address );
switch ( code_address )
{
.
.
.
case 0x0f74 : // word '+'
Push16 ( Pop16 () + Pop16 ());
break ;
.
.
.
}
}
void Run ()
{
while ( 1 )
{
uint16_t word_address = Read16 ( instruction_pointer );
instruction_pointer += 2 ;
Call ( word_address );
}
}
الكود الذي يتم تنفيذه لكلمة معينة لديه إمكانية الوصول إلى 5 متغيرات رئيسية (16 بت)
يقوم المفكك بنقل كود FORTH إلى كود النمط C. يتم تجميع معظم الكود المنقول. لفهم ما يفعله البرنامج، قم بإلقاء نظرة على الجدول التالي. يأخذ "الرمز الثانوي" (الذي يتكون أساسًا من مؤشرات 16 بت) كمدخل ويحوله إلى C.
الكود الرابع:
: .C ( -- )
Display context stack contents.
CR CDEPTH IF CXSP @ 3 + END-CX
DO I 1.5@ .DRJ -3 +LOOP
ELSE ." MT STK"
THEN CR ;
EXIT
تحويل:
مؤشرات 16 بت | رابعا | ج |
---|---|---|
: .ج ( -- ) | void DrawC() { | |
unsigned short int i, imax; | ||
0x0642 | سي آر | Exec("CR"); |
0x75d5 | عمق | CDEPTH(); |
0x15fa 0x0020 | لو | if (Pop() != 0) { |
0x54ae | CXSP | Push(Read16(pp_CXSP) + 3); |
0xbae | @ | |
0x3b73 | 3 | |
0x0f72 | + | |
0x4ffd | نهاية-CX | Push(Read16(cc_END_dash_CX)); |
0x15b8 | يفعل | i = Pop(); |
imax = Pop(); | ||
do { | ||
0x50e0 | أنا | Push(i); |
0x4995 | 1.5@ | _1_dot_5_at_(); |
0x81d5 | .DRJ | DrawDRJ(); |
0x175d 0xfffd | -3 | Push(-3); |
0x155c 0xffff | + حلقة | int step = Pop(); |
i += step; | ||
if (((step>=0) && (i>=imax)) || ((step<0) && (i<=imax))) break; | ||
} while(1); | ||
0x1660 0x000b | آخر | } else { |
0x1bdc | "إم تي إس تي كيه" | PRINT("MT STK", 6); |
0x06 | ||
0x4d | "م" | |
0x54 | "تي" | |
0x20 | '' | |
0x53 | 'S' | |
0x54 | "تي" | |
0x4b | "ك" | |
ثم | } | |
0x0642 | سي آر | Exec("CR"); |
0x1690 | مخرج | } |
اللعبة تأتي في 3 ملفات
محتوى موقع ستارا.كوم
دخول | مقاس | وصف |
---|---|---|
دليل | 4096 | يحتوي على دليل STARA وSTARB |
إيلو-CPIC | 4816 | |
غاز-CPIC | 3120 | |
MEC-CPIC | 2848 | |
MYS-CPIC | 6064 | |
نوم-CPIC | 1136 | |
SPE-CPIC | 1888 | |
THR-CPIC | 2480 | |
VEL-CPIC | 4672 | |
فبر-CPIC | 1248 | |
مين-CPIC | 2096 | |
دفقة | 16384 | صورة |
ميد-بيك | 2048 | صورة |
مراحل | 6144 | |
همهمة الموافقة المسبقة عن علم | 480 | صورة |
فيل-بيك | 432 | صورة |
THR-الموافقة المسبقة عن علم | 272 | صورة |
إيلو-الموافقة المسبقة عن علم | 608 | صورة |
و-الموافقة المسبقة عن علم | 640 | صورة |
يحفظ | 124000 | |
موسيقى | 4960 | تراكب الكود |
أرض | 1152 | خريطة كوكب الأرض |
المجرة | 6304 | |
الاعتمادات | 16384 | صورة |
مؤتمر الأطراف CPIC | 2928 | |
الخطوط | 768 | |
سي جي ايه | 3600 | إجراءات رمز الجهاز لبطاقة الرسومات CGA |
EGA | 3600 | إجراءات رمز الجهاز لبطاقة الرسومات EGA |
محتوى ستارب.كوم
دخول | مقاس | وصف |
---|---|---|
دليل | 4096 | يحتوي على دليل STARA وSTARB |
مثال | 150528 | هيكل شجرة مع معظم محتوى اللعبة |
صندوق | 1024 | طاولة |
التحويلات المصرفية | 144 | طاولة |
عضو الطاقم | 128 | طاولة |
إناء | 1936 | طاولة |
عنصر | 544 | طاولة |
قطعة أثرية | 1584 | طاولة |
كوكب | 1360 | طاولة |
عينة | 448 | طاولة |
البيانات الحيوية | 448 | طاولة |
تيبورت-الموافقة المسبقة عن علم | 2416 | صورة |
بيبورت-الموافقة المسبقة عن علم | 3984 | صورة |
تحليل النص | 3200 | طاولة |
أزرار | 944 | طاولة |
أيقونة1:1 | 912 | |
أيقونة1:2 | 912 | |
أيقونة1:4 | 912 | |
اسم الرمز | 736 | |
DPART-OV | 1552 | تراكب الكود |
المناطق | 176 | طاولة |
مخلوق | 17024 | طاولة |
CHKFLIGHT-OV | 960 | تراكب الكود |
فركت-OV | 4640 | تراكب الكود |
أيقونة-OV | 832 | تراكب الكود |
الموقع-OV | 1888 | تراكب الكود |
HYPERMSG-OV | 4112 | تراكب الكود |
جبولي | 368 | |
الوجه | 288 | |
قمة الرأس | 416 | |
BLT-OV | 864 | تراكب الكود |
MISC-OV | 1440 | تراكب الكود |
بنك-OV | 1520 | تراكب الكود |
ASSCREW-OV | 2800 | تراكب الكود |
الموظفين-OV | 4192 | تراكب الكود |
SHIPGRPH-OV | 2112 | تراكب الكود |
التكوين-OV | 3072 | تراكب الكود |
تديبوت-OV | 4800 | تراكب الكود |
بورتمينو-OV | 3120 | تراكب الكود |
فيتا-أو في | 3552 | تراكب الكود |
HP-OV | 4832 | تراكب الكود |
ليرة لبنانية-OV | 5280 | تراكب الكود |
إرسال-OV | 4784 | تراكب الكود |
تلفزيون-OV | 3472 | تراكب الكود |
كوم-أوف | 7232 | تراكب الكود |
كومسبيك-OV | 2864 | تراكب الكود |
SEED-OV | 2400 | تراكب الكود |
القوائم | 720 | تراكب الكود |
تحرك-OV | 3808 | تراكب الكود |
مهندس | 2320 | تراكب الكود |
طبيب | 1280 | تراكب الكود |
أوربت-OV | 6640 | تراكب الكود |
قبطان | 5952 | تراكب الكود |
علوم | 3952 | تراكب الكود |
نافيجاتر | 880 | تراكب الكود |
أزرار الشحن | 1984 | |
خريطة-OV | 4160 | تراكب الكود |
فرط-OV | 7168 | تراكب الكود |
تحليل-OV | 2560 | تراكب الكود |
إطلاق-OV | 1360 | تراكب الكود |
تأثير التدفق | 464 | |
OP-OV | 4400 | تراكب الكود |
العناصر-OV | 6016 | تراكب الكود |
ليسيكون | 752 | |
MSYSICON | 448 | |
سيسيكون | 176 | |
بيهاف-أوف | 5360 | |
CMAP | 1008 | |
ثَبَّتَ | 800 | |
شفاء-OV | 1232 | تراكب الكود |
إصلاح-OV | 1696 | تراكب الكود |
لعبة-OV | 5920 | تراكب الكود |
بليست-OV | 2400 | تراكب الكود |
خرائط-OV | 2240 | تراكب الكود |
VES-BLT | 4528 | |
العاصفة-OV | 1232 | تراكب الكود |
المركبات | 176 | طاولة |
تكنولوجيا المعلومات-OV | 1936 | تراكب الكود |
القتال-OV | 6192 | تراكب الكود |
الضرر-OV | 2752 | تراكب الكود |
أرض-OV | 1088 | تراكب الكود |
إحصائيات | 64 | طاولة |
STP-OV | 1440 | تراكب الكود |
ضع ملفات لعبة Starflight الأصلية في المجلدات starflt1-in
و starflt2-in
وقم بتشغيل make
. يجب أن تحصل على ملفين قابلين للتنفيذ ( disasOV1
و disasOV2
)، اللذين ينتجان المحتوى في المجلدات starflt1-out
و starflt2-out
. يعد الإخراج الذي تم إنشاؤه جزءًا من هذا المستودع.