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

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


مرن 5.25 "


المجموع ، اتضح متعدد الخطوات التالية:


  1. من BASIC نقوم بنقل التحكم إلى البرنامج في رموز الجهاز.
  2. يقوم البرنامج في رموز الآلة بنقل أداة تحميل التشغيل من منطقة BASIC إلى منطقة أخرى لن تتأثر برموز آلة اللعبة ، وينقل التحكم فيها.
  3. قم بتنزيل وفك صورة التمهيد.
  4. نقوم بتحميل أكواد آلة اللعبة في منطقة لا تتداخل مع منطقة متغيرات النظام.
  5. ننقل رموز الآلة إلى عنوان الوجهة.
  6. ننقل السيطرة على البرنامج.

التنمية يجب أن تبدأ في منتصف (الفقرة 3). الحقيقة هي أنه من أجل كتابة برنامج للحركة ، تحتاج إلى معرفة حجم البرنامج الذي تقوم بنقله ، ومن أجل تضمين رموز الآلة بشكل أساسي ، تحتاج إلى معرفة حجم برنامج الحركة.


محمل الإقلاع الأحادي (جزء من أكواد الآلة)


في TR-DOS ، يشبه تحميل البيانات من ملف أحادي الكتلة تنزيل ملف بدون رأس من شريط ، عندما تتم قراءة بيانات ذات حجم محدد مسبقًا ببساطة من الموضع الحالي وتحميلها في منطقة محددة من الذاكرة. لهذا ، في TR-DOS ، يكون الروتين في #3D13 . أولاً ، قم بتنزيل وفك ضغط الصورة:


 LD DE, ($5CF4) ;        LD BC, $0805 ;  B  -  (9)*, ;   —   #05 ( ) LD HL, $8000 ;    32768** CALL $3D13 ;   TR-DOS CALL $8000 ;    

& ast؛ - انظر ضغط صورة التمهيد في الجزء السابق ؛
& ast؛ & ast؛ - أداة فك الحزم قابلة للنقل ، بحيث يمكنك التنزيل في أي مكان.


وبالمثل ، قم بتنزيل أكواد آلة اللعبة:


 LD DE, ($5CF4) ;        LD BC, $2505 ;  B  - , ;   —   #05 ( ) LD HL, $6000 ;    24576 CALL $3D13 ;   TR-DOS 

في هذه المرحلة ، لم نعد بحاجة إلى TR-DOS ؛ يمكننا نقل رموز الجهاز إلى عنوان الوجهة باستخدام LDIR معالج LDIR :


 LD HL, $6000 ;  (,      ) LD DE, $5B00 ;  LD BC, $2500 ;     (  data.bin) LDIR 

حسنًا ، في النهاية ، نقوم بنقل التحكم إلى البرنامج بنفس الطريقة كما في أداة تحميل التشغيل الأصلية - عن طريق تحريك مؤشر المكدس:


 LD SP, $5D7C RET 

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


 $ pasmo tmp.asm tmp.bin $ wc -c tmp.bin 44 tmp.bin 

إجراء نقل Bootloader


يأخذ محمل الإقلاع 44 بايت. أنت الآن بحاجة إلى كتابة الإجراء الخاص بنقل أداة تحميل التشغيل من التعليقات في BASIC (النقطة 2 من القائمة في بداية المقال). العائق هو أن العنوان الذي توجد به منطقة BASIC يمكن أن يختلف تبعًا للأجهزة الطرفية المتصلة بالكمبيوتر ، وبالتالي ، لتحديد المكان الذي تريد نقل البيانات فيه ، تحتاج إلى التركيز على متغير نظام PROG (كما في أداة تحميل التشغيل الأصلية) أو إلى عداد البرنامج (تسجيل معالج PC ).


ليس من السهل الوصول إلى عداد البرامج - لا توجد تعليمات المعالج مثل LD HL, PC . لقد تجسست الحل في Laser Compress ويبدو هذا (الاستخدام غير المستهدف UNSTACK_Z لإجراء UNSTACK_Z ):


 LD DE, $00 ;     ,     , ;    .     ;    1 INC E ;  1  E,    ,    ;      .     1  CALL $1FC6 ;    ( ,  LD HL, PC) ADD HL, DE ;       LD DE, $F800 ;    LD BC, $002C ;  ,   (44 ) LDIR JP $F800 ;    ;      ;        

في وقت استدعاء الإجراء ROM #1FC6 ، سيكون عنوان التعليمة التالية ( ADD HL, DE ) في الحزمة. هو الذي سيتم تسجيله نتيجة لاستدعاء الإجراء في HL . وفقًا لذلك ، لتحديد الرقم الذي يجب كتابته في السطر الأول ، تحتاج إلى تجميع قطعة من ADD HL, DE إلى النهاية ومراجعة مقدار ما يتطلبه الأمر:


 $ pasmo tmp.asm tmp.bin $ wc -c tmp.bin 12 tmp.bin 

اتضح 12 بايت. وفقا لذلك ، في السطر الأول نكتب 11 ( #0B ).


بعد ذلك ، نقوم بتكوين إجراء النقل باستخدام اللودر (انظر الملف النهائي ) ، والذي سينتقل ويجمع مرة أخرى. يجب أن تتحول 56 بايت.


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


محمل الإقلاع الأحادي (الجزء الأساسي)


الآن وبعد أن عرفنا حجم أداة تحميل التشغيل في رموز الجهاز ، يمكننا كتابة أداة تحميل التشغيل في BASIC وجمع كل شيء في ملف أحادي الكتلة.


يتم تضمين رموز الجهاز في ملف أساسي إما في تعليق أو في نهاية الملف. الثاني عادة ما يعقد دراسة الملف وهو أكثر ملاءمة للحماية ، لذلك سوف نستخدم الخيار الأول. خيار التعليق كما يلي:


  1 REM @#$%... 10 RANDOMIZE USR (PEEK 23635+256*PEEK 23636+5) 

23635 ( #5C53 ) هو عنوان متغير نظام PROG الذي ذكرناه سابقًا. 5 هي إزاحة الحرف الأول للتعليق نسبة إلى PROG (2 بايت هي رقم السطر ، 2 بايت طول الخط و 1 بايت هو مشغل REM ). إذا كنت ترغب في إضافة أي تعليقات أخرى قبل رموز الجهاز ، على سبيل المثال اسمك أو رقم هاتفك أو عنوانك البريدي ، فستحتاج القيمة 5 إلى التعديل.


إذا لم نستخدم أي أدوات مساعدة إضافية لإنشاء أداة تحميل التشغيل ، فسنحتاج إلى إدخال أحرف عشوائية بعد REM بمبلغ لا يقل عن طول البرنامج في رموز الجهاز التي نريد وضعها في مكان التعليق (في حالتنا 56 بايت). بعد ذلك ، يمكن للمرء تحميل البرنامج من خلال LOAD "" CODE PEEK 23635+256*PEEK 23636+5 وحفظ الملف.


ومع ذلك ، يمكن أن تجعل bas2tap العملية أسهل بكثير. يمكنه تجميع ملف أساسي ودمج البيانات الثنائية فيه إذا تم تمثيل كل بايت كرقم عشري في أقواس مجعدة. للقيام بذلك ، قم بتشغيل محمل الإقلاع hexdump عبر hexdump :


  $ hexdump -ve '1/1 "{%02x}"' loader.bin {11}{0b}{00}{1c}{cd}{c6}{1f}{19}{11}... 

نضع إخراج hexdump في مكان التعليق في السطر الأول بعد REM ، -sboot بتجميع أداة تحميل bootloader على -sboot (- -sboot هو اسم الملف على الشريط ، - -a10 هو رقم سطر -a10 ):


 $ bas2tap -sboot -a10 boot.bas boot.tap 

تحويل أداة تحميل التشغيل من تنسيق tap إلى hobeta خلال التنسيق الوسيط 0 :


 $ tapto0 -f boot.tap $ 0tohob boot.000 

إنشاء ملف من قطعة واحدة


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


 createtrd Pac-Man.trd hobeta2trd boot.\$$B Pac-Man.trd hobeta2trd screen.\$$C Pac-Man.trd hobeta2trd data.\$$C Pac-Man.trd 

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


المبدأ كالتالي: يخزن TR-DOS معلومات حجم الملف الزائدة:


  1. الحجم في القطاعات - يستخدم لوضع الملفات على قرص مرن ونسخها.
  2. الحجم بالبايت - يستخدم لتحميل المحتوى.

تتوافق هذه الأحجام عادةً مع بعضها البعض (256 بايت لكل قطاع) ، ولكن هذا ليس ضروريًا. سوف نستفيد من هذا. إذا قمت بتغيير حجم ملف التمهيد في القطاعات إلى قيمة مساوية للحجم الكلي لجميع الملفات التي نريد تنزيلها ، ولكن لا تغير الحجم بالبايت ، فسوف يقوم TR-DOS بنسخ جميع البيانات كملف واحد كبير ، ولكن سيتم تحميل الملف الأساسي فقط عند التمهيد -part.


على طيف حقيقي أو في محاكي ، يمكن تحرير المسار صفر مع برامج مثل Disk Doctor ، على سبيل المثال ، Hex Disk Editor :


عرافة محرر القرص


ولكن يمكن جعله أكثر بساطة: صورة trd ليست أكثر من نسخة بايت من جميع البيانات الموجودة على قرص مرن ، بحيث يمكن تحريرها في أي محرر سداسي عشرية:


 $ hexdump -C Pac-Man.trd | head -4 00000000 62 6f 6f 74 20 20 20 20 42 d0 00 d0 00 01 00 01 |boot B.......| 00000010 73 63 72 65 65 6e 20 20 43 40 9c 14 07 08 01 01 |screen C@......| 00000020 64 61 74 61 20 20 20 20 43 00 5b 00 25 25 09 01 |data C.[.%%..| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 

كما ترون ، يوجد في بداية القرص المرن (على المسار صفر) جدول تخصيص الملفات حيث تستغرق المعلومات حول كل ملف 16 بايت. يتم تخزين الحجم في القطاعات بالبايت مع الإزاحة #0D (العمود الثالث على اليمين). حجم ملفاتنا هو #01 و #08 و #25 القطاعات ، والتي في المجموع #2E . نكتب هذه القيمة بالبايت المقابل ، ونحذف الرؤوس المتبقية ، لأن لم تعد هناك حاجة:


 $ hexdump -C Pac-Man.trd | head -4 00000000 62 6f 6f 74 20 20 20 20 42 d0 00 d0 00 2E 00 01 |boot B.......| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 

الآن لدينا صورة قرص مرن كامل. يجب أن يتم تحميله بشكل صحيح وأن يتم نسخه بالكامل من قرص لآخر. يبقى فقط لتقليل حجم الصورة. نظرًا لأن صورة trd هي نسخة بايت ، فإنها تستغرق دائمًا 640 كيلوبايت. في الممارسة العملية ، في معظم الحالات ، يكون أكثر ملاءمة لاستخدام تنسيق scl ، والذي يشبه إلى حد كبير مخازن hobeta مباشرة ببيانات الملف:


 $ trd2scl Pac-Man.trd Pac-Man.scl 

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


الأدوات:


  1. Pasmo هو تجميع عبر Z80.
  2. bas2tap هو مترجم bas2tap الطيف الأساسية.
  3. trd2scl - محول صورة trd إلى scl.

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


  1. "تكييف البرامج مع نظام TR-DOS" بقلم نيكولاي روديونوف.
  2. "وظائف TR-DOS" من مجلة دليل المعلومات رقم 1.
  3. "هيكل القرص المرن TR-DOS" من كتاب "TR-DOS للمحترفين والهواة" .
  4. إشارة إلى متغيرات النظام وإجراءات الطيف ROM .

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


All Articles