تكييف برامج ZX Spectrum مع TR-DOS بالوسائل الحديثة. الجزء 1

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


5.25 "مرن


على الرغم من وجود "الزر السحري" ، الذي أدى ببساطة إلى تفريغ كامل لذاكرة الكمبيوتر وجعل من الممكن حفظ البرنامج بطريقة أو بأخرى على قرص مرن ، فقد نظر الخبراء في إنشاء إصدارات قرص للألعاب مع الحفاظ على صورة التمهيد الأصلية وغيرها من السمات الأخرى.


في هذه المقالة ، سأخبرك بكيفية إجراء مثل هذا التعديل على مثال لعبة Pac-Man ، أي صورة Pac-Man.tzx الأصلية.


الأدوات


على الرغم من حقيقة أنه في الأيام الخوالي ، كان كل هذا العمل يتم مباشرة على ZX Spectrum (في غياب خيارات أخرى) ، سأقوم بتكييف اللعبة باستخدام أدوات المحاكاة وسطر الأوامر. السبب الرئيسي هو أنه في البداية ، تتألف عملية التكيف من عدد كبير من التجارب والخطأ ، وستصبح أقل إيلامًا إذا كانت الآلية. كل نفس يمكن القيام به مباشرة على الطيف.


في الجزء الأول ، سوف نستخدم الأدوات التالية:


  1. فيوز المحاكي للتصحيح والاختبار.
  2. SkoolKit لتفكيكها.

تعطيل بدء التشغيل في أداة تحميل التشغيل


نظرًا لأنه يتم تنزيل ملف الصورة والبيانات دون حظر رأس (17 بايت يحمل اسم ونوع الملف) ، فهذا يعني أن المُحمل مكتوب برموز الجهاز. تحتاج إلى العثور على مكان وجود هذه الرموز ومن العنوان الذي يتم تشغيلها به.


هناك عدة طرق للنظر إلى رمز أداة تحميل التشغيل:


  1. أسهل طريقة هي بدء تنزيل البرنامج ، والانتظار لبدء تشغيل أداة تحميل التشغيل ، وإيقافه عن طريق الضغط على مفتاح Space . في كثير من الحالات ، يعمل هذا ، ولكن في حالة Pacman ، كما هو الحال في العديد من الحالات الأخرى ، يؤدي هذا إلى إعادة التعيين.


  2. الطريقة التالية هي تحميل البرنامج باستخدام MERGE "" بدلاً من LOAD "" . بخلاف LOAD ، يتجاهل MERGE التشغيل التلقائي للبرنامج. في حالة Pac-Man ، يؤدي التشغيل من خلال MERGE إلى تجميد الكمبيوتر من خلال نقلة مميزة على الشاشة اليسرى. هذا يرجع إلى حقيقة أنه بدلاً من تنفيذ سطر البرنامج سطراً ، تحاول MERGE تحليله بالكامل ودمجه مع البرنامج الذي تم تحميله بالفعل. ومع ذلك ، إذا كان البرنامج يحتوي على كتلة بها رموز آلة تنتهك بناء جملة البرنامج ، فسيؤدي ذلك إلى تعطل.


  3. إذا كنت لا تريد تعليق أدمغتك ، فيمكنك تحويل صورة الشريط من 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.


  4. تم وصف طريقة أخرى لإلقاء نظرة على أداة تحميل التشغيل في المقالة 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 مناسبة تمامًا لهذا الغرض. إذا قمت بتعيين هدف ، فيمكن مساعدتها في تحليل اللعبة إلى آخر المسمار (رسالة ، شبح ، صوت). كيفية القيام بذلك موصوفة بالتفصيل في الوثائق .


باختصار ، قم بما يلي:


  1. قم بعمل لقطة Pac-Man.z80 الكمبيوتر Pac-Man.z80 باستخدام ميزات tap2sna.py أو المحاكي.
  2. قم Pac-Man.ctl ملف تحكم Pac-Man.ctl مع مجموعة أولية من الإرشادات للتفكيك:
     i 16384 Ignore for now c $5D26 Loader 
  3. تشغيل التفكيك: sna2skool.py -H -c Pac-Man.ctl Pac-Man.z80 > Pac-Man.skool .
  4. أثناء دراسة الرمز ، أضف تعليمات وتعليقات جديدة إلى ملف التحكم.
  5. كرر حتى المستنير تماما.

نتيجةً لذلك ، بعد أول مرور نحصل على ما يلي (تعليقاتي ، عناوين حذفت):


 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 هنا. الخيار الأول (المعتاد) يعمل كما يلي:


  1. CALL يدفع القيمة الحالية لعداد البرنامج ( PC ) إلى المكدس.
  2. يتم تمرير التحكم إلى الروتين يسمى.
  3. عند الرجوع من روتين فرعي ( RET ) ، تتم إزالة القيمة من المكدس ويحدث انتقال إلى برنامج الاستدعاء.

لماذا يتم ذلك بشكل مختلف هنا؟ الحقيقة هي أن Pac-Man متوافق مع ZX Spectrum 16K ويحتل كامل ذاكرة الوصول العشوائي (انظر حجم الملف أعلاه). وبالتالي ، عند التحميل ، يقوم البرنامج بالكتابة فوق كل من المحمل والمكدس ، أينما كانا. إذا أردنا التبديل من ROM إلى أداة تحميل التشغيل باستخدام المكدس ثم استدعاء البرنامج الذي تم تنزيله عبر JP ، في وقت اكتمال التنزيل ، لن تكون هناك ذاكرة في العنوان الذي يوجد به JP .


بدلاً من ذلك ، ينتقل مؤشر المكدس إلى منطقة الذاكرة ، حيث يظهر بعد ذلك عنوان نقطة الدخول إلى البرنامج ، ويقوم المعالج ، دون أن يلاحظ الاستبدال ، بإزالته من المكدس بواسطة المؤشر الجديد ويذهب إلى العنوان المحدد.


يمكن عرض نتيجة التفكيك الكاملة في مستودع المشروع على جيثب.


في المجموع


نتيجة لدراسة أداة تحميل التشغيل ، اكتشفنا ما يلي:


  1. يتم تنزيل ملف مقطوع الرأس بطول 16384 بايت في 16384 (في منطقة الشاشة ، وهو أمر واضح بشكل عام أثناء عملية التنزيل).
  2. في نهاية التنزيل ، يوجد مؤشر المكدس عند $5D7C ، حيث يتم نقل التحكم إلى.

في الأجزاء التالية ، سأتحدث عن كيفية إعداد الملفات للكتابة على القرص وكتابة محمل ملف أحادي الكتلة في المجمع.


روابط ذات صلة:


  1. الملف الشخصي "طيف TRUB . "
  2. ألعاب الهندسة العكسية ZX Spectrum (Z80) .
  3. Adaptação de jogos de fita para Beta 48 .

Source: https://habr.com/ru/post/ar451174/


All Articles