على عكس أجهزة الكمبيوتر الحديثة ، لم يكن مفهوم نظام الملفات على الأطياف كذلك. هذا يعني أن التنزيل من كل نوع من الوسائط يتطلب تطبيقًا منفصلاً ، وفي معظم الحالات لا يمكن نسخ البرنامج من شريط إلى قرص. في الحالات التي يكون فيها برنامج تحميل البرنامج مكتوبًا باللغة BASIC ، يمكن تكييفه مع TR-DOS مع مراجعة بسيطة إلى حد ما. ومع ذلك ، كان الموقف معقدًا بسبب حقيقة أنه في العديد من الألعاب (التي تحمل علامات تجارية ومخترقة) ، كانت اللوادر مكتوبة برموز الماكينة وأحيانًا كانت تحتوي على حماية نسخ.

على الرغم من وجود "الزر السحري" ، الذي أدى ببساطة إلى تفريغ كامل لذاكرة الكمبيوتر وجعل من الممكن حفظ البرنامج بطريقة أو بأخرى على قرص مرن ، فقد نظر الخبراء في إنشاء إصدارات قرص للألعاب مع الحفاظ على صورة التمهيد الأصلية وغيرها من السمات الأخرى.
في هذه المقالة ، سأخبرك بكيفية إجراء مثل هذا التعديل على مثال لعبة Pac-Man ، أي صورة Pac-Man.tzx الأصلية.
الأدوات
على الرغم من حقيقة أنه في الأيام الخوالي ، كان كل هذا العمل يتم مباشرة على ZX Spectrum (في غياب خيارات أخرى) ، سأقوم بتكييف اللعبة باستخدام أدوات المحاكاة وسطر الأوامر. السبب الرئيسي هو أنه في البداية ، تتألف عملية التكيف من عدد كبير من التجارب والخطأ ، وستصبح أقل إيلامًا إذا كانت الآلية. كل نفس يمكن القيام به مباشرة على الطيف.
في الجزء الأول ، سوف نستخدم الأدوات التالية:
- فيوز المحاكي للتصحيح والاختبار.
- SkoolKit لتفكيكها.
تعطيل بدء التشغيل في أداة تحميل التشغيل
نظرًا لأنه يتم تنزيل ملف الصورة والبيانات دون حظر رأس (17 بايت يحمل اسم ونوع الملف) ، فهذا يعني أن المُحمل مكتوب برموز الجهاز. تحتاج إلى العثور على مكان وجود هذه الرموز ومن العنوان الذي يتم تشغيلها به.
هناك عدة طرق للنظر إلى رمز أداة تحميل التشغيل:
- أسهل طريقة هي بدء تنزيل البرنامج ، والانتظار لبدء تشغيل أداة تحميل التشغيل ، وإيقافه عن طريق الضغط على مفتاح - Space. في كثير من الحالات ، يعمل هذا ، ولكن في حالة Pacman ، كما هو الحال في العديد من الحالات الأخرى ، يؤدي هذا إلى إعادة التعيين.
 
 
- الطريقة التالية هي تحميل البرنامج باستخدام - MERGE ""بدلاً من- LOAD "". بخلاف- LOAD، يتجاهل- MERGEالتشغيل التلقائي للبرنامج. في حالة Pac-Man ، يؤدي التشغيل من خلال- MERGEإلى تجميد الكمبيوتر من خلال نقلة مميزة على الشاشة اليسرى. هذا يرجع إلى حقيقة أنه بدلاً من تنفيذ سطر البرنامج سطراً ، تحاول- MERGEتحليله بالكامل ودمجه مع البرنامج الذي تم تحميله بالفعل. ومع ذلك ، إذا كان البرنامج يحتوي على كتلة بها رموز آلة تنتهك بناء جملة البرنامج ، فسيؤدي ذلك إلى تعطل.
 
 
- إذا كنت لا تريد تعليق أدمغتك ، فيمكنك تحويل صورة الشريط من TZX إلى TAP واستخدام الأداة المساعدة - listbasicالتي تأتي مع Fuse:
 
 -  - $ tzx2tap Pac-Man.tzx $ listbasic Pac-Man.tap 1 RANDOMIZE USR (PEEK 23635+256*PEEK 23636+91)
 
 - العنوان - 23635(- 23635- $5C53) يتوافق مع متغير نظام- PROG، والذي يحتوي على عنوان البداية لمنطقة BASIC. وبالتالي ، يتم تعويض نقطة الإدخال إلى أداة تحميل التشغيل بواسطة 91 بايت بالنسبة إلى منطقة BASIC.
 
 
- تم وصف طريقة أخرى لإلقاء نظرة على أداة تحميل التشغيل في المقالة Desativando a autoexecução de um programa BASIC . في مصحح أخطاء Fuse ، تحتاج إلى تعيين نقطة توقف - br 2053، وتحميل البرنامج ، وعندما ينتهي التنزيل ويتوقف تنفيذ التعليمات البرمجية ، قم بتنفيذ- set 23619 128. سيمنع هذا البرنامج من بدء التشغيل وسيسمح لك بالخروج إلى BASIC.
 
 
بووتلوأدر التفكيك
معرفة تحول نقطة الدخول بالنسبة إلى منطقة BASIC ، يمكنك حساب عنوانها المطلق. في حالة جهاز ZX Spectrum 48K بدون TR-DOS محمل ، تبدأ منطقة BASIC من 23755 ( $5CCB ). وبالتالي ، سيبدأ محمل الإقلاع من 23755 + 91 = 23846 ( $5D26 ).
للبدء ، ما عليك سوى وضع نقطة توقف على عنوان البداية وإلقاء نظرة على رموز الجهاز. في Fuse ، يمكنك جعل br 23846 وبدء تنزيل البرنامج. بمجرد بدء تشغيل أداة تحميل التشغيل ، سيتوقف المحاكي عن:

في حالة كون اللودر بسيطًا جدًا ، ما عليك سوى إلقاء نظرة على الكود المفكك في اللوحة الوسطى وفهم ما يتم تحميله. عادةً ما يبدو رمز التنزيل لملف مقطوع الرأس مثل هذا:
 LD IX, $8000 ;    LD DE, $4000 ;    LD A, $FF ;    CALL $0556 ;  LD-BYTES JP $8000 ;    
في حالة أكثر تعقيدًا مع تنفيذ التعليمات البرمجية ، تحتاج إلى فهم الخطوات وتدوين الملاحظات. مجموعة الأدوات المساعدة SkoolKit مناسبة تمامًا لهذا الغرض. إذا قمت بتعيين هدف ، فيمكن مساعدتها في تحليل اللعبة إلى آخر المسمار (رسالة ، شبح ، صوت). كيفية القيام بذلك موصوفة بالتفصيل في الوثائق .
باختصار ، قم بما يلي:
- قم بعمل لقطة Pac-Man.z80الكمبيوترPac-Man.z80باستخدام ميزاتtap2sna.pyأو المحاكي.
- قم Pac-Man.ctlملف تحكمPac-Man.ctlمع مجموعة أولية من الإرشادات للتفكيك:
  i 16384 Ignore for now c $5D26 Loader
 
- تشغيل التفكيك: sna2skool.py -H -c Pac-Man.ctl Pac-Man.z80 > Pac-Man.skool.
- أثناء دراسة الرمز ، أضف تعليمات وتعليقات جديدة إلى ملف التحكم.
- كرر حتى المستنير تماما.
نتيجةً لذلك ، بعد أول مرور نحصل على ما يلي (تعليقاتي ، عناوين حذفت):
 ORG $5D26 ;   23846,   ;   DI IM 1 ;   LD D, IYh ; LD E, IYl ; LD B, $25 ;    EX DE, HL ; LD DE, $0019 ; ADD HL, DE ;    HL  $5C53 (  PROG) LD E, (HL) ;   PROG  DE  IX INC HL ; LD D, (HL) ; LD IXh, D ; LD IXl, E ; LD A, (IX+$7F) ;      (  $7F-  ;  PROG) LD HL, $0035 ;    ($35   PROG) ADD HL, DE ; PUSH HL ;      XOR (HL) ;    LD (HL), A ; INC HL ; DJNZ $5D43 ;   AND (HL) ; RET NZ ;           ;    DEFB $77 
بووتلوأدر فك التشفير
كل ما هو مهم حقًا هو أن أداة تحميل التشغيل المشفرة موجودة في PROG + $35 . هذا يعني أنه إذا وضعنا نقطة توقف على br 23808 ، فسيتم الانتهاء من فك التشفير في هذه اللحظة ، وسنرى محمل الإقلاع المشفر:

هذا البرنامج بالفعل يشبه إلى حد كبير الحالة النموذجية المذكورة أعلاه. يتم تحميل القيمة $4000 ( 16384 ) في سجلات IX و DE ، ويتم القيام بشيء آخر ويتم نقل التحكم إلى روتين ROM عند $055A (وهذا أقل ببضعة بايت عن نقطة الإدخال القياسية في LD-BYTES ). يبدو أن هذا النهج يطبق نوعا من حماية النسخ ، لأنه لا يقوم الإجراء القياسي بتحميل هذا الملف ولا يفهمه بعض الناسخين.
نقطة دخول البرنامج
يبقى لمعرفة كيف يتم استدعاء البرنامج بعد التحميل. بدلاً من المعتاد CALL LD-BYTES و JP ، يتم استخدام LD SP, XXXX و JP LD-BYTES هنا. الخيار الأول (المعتاد) يعمل كما يلي:
- CALLيدفع القيمة الحالية لعداد البرنامج (- PC) إلى المكدس.
- يتم تمرير التحكم إلى الروتين يسمى.
- عند الرجوع من روتين فرعي ( RET) ، تتم إزالة القيمة من المكدس ويحدث انتقال إلى برنامج الاستدعاء.
لماذا يتم ذلك بشكل مختلف هنا؟ الحقيقة هي أن Pac-Man متوافق مع ZX Spectrum 16K ويحتل كامل ذاكرة الوصول العشوائي (انظر حجم الملف أعلاه). وبالتالي ، عند التحميل ، يقوم البرنامج بالكتابة فوق كل من المحمل والمكدس ، أينما كانا. إذا أردنا التبديل من ROM إلى أداة تحميل التشغيل باستخدام المكدس ثم استدعاء البرنامج الذي تم تنزيله عبر JP ، في وقت اكتمال التنزيل ، لن تكون هناك ذاكرة في العنوان الذي يوجد به JP .
بدلاً من ذلك ، ينتقل مؤشر المكدس إلى منطقة الذاكرة ، حيث يظهر بعد ذلك عنوان نقطة الدخول إلى البرنامج ، ويقوم المعالج ، دون أن يلاحظ الاستبدال ، بإزالته من المكدس بواسطة المؤشر الجديد ويذهب إلى العنوان المحدد.
يمكن عرض نتيجة التفكيك الكاملة في مستودع المشروع على جيثب.
في المجموع
نتيجة لدراسة أداة تحميل التشغيل ، اكتشفنا ما يلي:
- يتم تنزيل ملف مقطوع الرأس بطول 16384 بايت في 16384 (في منطقة الشاشة ، وهو أمر واضح بشكل عام أثناء عملية التنزيل).
- في نهاية التنزيل ، يوجد مؤشر المكدس عند $5D7C، حيث يتم نقل التحكم إلى.
في الأجزاء التالية ، سأتحدث عن كيفية إعداد الملفات للكتابة على القرص وكتابة محمل ملف أحادي الكتلة في المجمع.
روابط ذات صلة:
- الملف الشخصي "طيف TRUB . "
- ألعاب الهندسة العكسية ZX Spectrum (Z80) .
- Adaptação de jogos de fita para Beta 48 .