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