"Color Extender for ZX-Spectrum" - هذا هو عنوان المقال المنشور في echo fido7.zx.spectrum في 3 أغسطس 1997. وصف المقال فكرة حل إحدى المشكلات الرئيسية لمنصة ZX-Spectrum - صراع السمات . أثار المنشور بعض الاهتمام في ذلك الوقت ، وأود أن أخبرنا عن التفاصيل الفنية وتاريخ القضية.

لن أتعمق في التفاصيل الفنية وأصف فقط الفكرة والحل بشكل هيكلي.
جزء غير فني من القصة ، يمكنك تخطيبدأت قصة التطوير في أوائل ربيع عام 1994 ، عندما كانت البلاد لا تزال تشهد "تغييرات في المسودة" ، مما أدى إلى الإغلاق الهائل للإرجاء وجاذبية طلاب المدارس المهنية والمدارس الفنية. كنت محظوظًا - لقد كنت في السنة الأخيرة في كلية لينينغراد للأشعة الراديوية وبهذه الطريقة وافقت الدولة على منح تأخير قصير الأجل لاستلام دبلوم سريع مع استبدال تصميم الدبلوم بامتحان في جميع المواد. غادر الجيش في 1 مارس 1994 ، كفني راديو معتمد.
في القوات المسلحة في ذلك الوقت ، كان هناك تدفق غير مسبوق من نفس المتخصصين من المستوى التقني المتوسط ، على الرغم من أن هذا قد خرب قليلاً نظام التجنيد في فصل الربيع لرؤساء "الأجداد" الذين لديهم بالفعل تدرج واضح في الأسماء ، أطلقوا على هذه الدعوة غير القياسية "عفريت". من بين "الازدهار" كان هناك عدد كافٍ من الناس الذين كانوا مولعين بـ ZX-Spectrum وكان ألكساندر غومين مثلهم في دوري (كتب ألعابًا على ZX-Spectrum تحت علامة ANCCAN مع Denis Markelov وأصبح معروفًا بتكييفه لمورتال كومبات في هذه المنصة في عام 1997) ، الذين للحديث عن البرمجة والأجهزة.
أقرب إلى منتصف أبريل 1994 ، في نهاية "دورة المقاتلين الشباب" ، تم نقلنا أنا وألكسندر إلى كتيبة البناء الواقعة في ستريلا ، إحدى ضواحي سان بطرسبرغ. هناك كان علينا إتقان التخصص الصعب لجهاز الربط الكهربائي لعدة أشهر. تدفقت الحياة في هذا الجزء على مهل ودراسة بالتناوب مع الجماعات ، والتي توترت معظمها الأيدي ، ولكن أعطى الوقت للدماغ للتفكير. لذلك ، في أحد الأجنحة في المطبخ ، وطاولتي في التفكير في ZX-Spectrum وقدراته ، توصلت إلى فكرة - كيفية التغلب على "تعارض السمات".
لقد فكرت في هذه الفكرة حتى نهاية الخدمة وأصبحت مقتنعًا أكثر فأكثر "أنها قد تنجح". لسوء الحظ ، فإن فكرة جدوى المنصة نفسها ، والتي كنت بصدد تطبيقها هذه الفكرة ، زارتني كثيرًا. ومع ذلك ، في روسيا ، تومض ZX- الطيف بشكل واضح في السماء من حوالي 1991 إلى 1996. ارتفع بعض المنتجين الروس من الحيوانات المستنسخة إلى درجة أنهم قاموا برعاية البرامج على التلفزيون (على سبيل المثال ، قامت شركة BiM برعاية برنامج "اسم الغابة" لبعض الوقت). ولكن أثناء الخدمة كانت هناك مشاكل أخرى ، لذلك قررت تأجيل جميع القضايا المتعلقة بالتجارة حتى يتم إرسالي إلى الاحتياطي. بشكل دوري ودون الكشف عن التفاصيل ، كنت مهتمًا بالعديد من الخبراء حول موضوع الجدوى التقنية وصلاحية النهج. لقد أبقى الفكرة في عمق عميق ولم يشاركها مع ألكساندر غومين ، مشيرًا بشكل غامض إلى أنه وجد حلاً بسيطًا للغاية لزيادة عدد الألوان مع الحفاظ على التوافق مع الإصدارات السابقة.
بعد أن دخلت "المواطن" في عام 1997 وحصلت على وظيفة كمهندس برمجيات من الفئة الثانية في شركة سانت بطرسبرغ "تكنولوجيا المعلومات والموديلات" ، بدأت اهتم قليلاً بمسألة تسويق الحل. لسبب ما ، كنت متأكدًا من أنني لو ألمحت للتو إلى الحل الذي وجدته ، فسيبدأ الجميع في التمزق بأيديهم وتدفق الأموال. بدأت في الاتصال بالهاتف المحمول ، في ذلك الوقت في مجال المصنعين والتجار في "هندسة الطيف" ، مثل سيرجي زونوف ، وفياتشيسلاف سكوتين (نيمو) وغيرهم. أخبرني سيرجي زونوف ببساطة أن "القطار قد غادر بالفعل" ولم يعد هناك أي معنى تجاري في هذا المشروع. فياتشيسلاف سكوتين ، كونه عالم سبايك أرثوذكسي ، أبدى عداءه لأي فكرة حاولوا فيها تغيير شيء ما في المنصة وكانت هذه أيضًا نسخة ميتة تمامًا. قررت أنه كان هناك القليل من الكلام ، وعلى الأقل يجب القيام بشيء ما ، وكان من الأفضل أن تبدأ مع محاكي للحصول على المواد الترويجية والبيانات التجريبية.
في عام 1998 ، مع الأخذ كأساس لأحد محاكيات ZX-Spectrum الموجودة في ذلك الوقت والمكتوبة باللغة Pascal ، صنعت محاكيًا بدائيًا لأربعة أجهزة كمبيوتر تعمل على التوازي. لقد عدلت جزئياً اللعبة بعد الحرب 2 من أجل تلوين بعض العفاريت. نجح النظام ، بالإضافة إلى الاستمتاع بفكرة العمل ، حصلت على لقطات شاشة للتأكيد على فكرة تلوين الألعاب الحالية.
في عام 1998 ، قمت بزيارة شركة Peters ، التي كانت تقوم بتطوير منصة Sprinter الجديدة في ذلك الوقت. قام بمحاولة لإثارة اهتمام مديرهم نيكولاي نوسكوف. لقد استثمروا بكثافة في التطوير الجديد ، ووفقًا لقانون الوسطاء ، لم تستطع بنية Sprinter فائقة المرونة ، القادرة على محاكاة أي منصة أحادية المعالج تقريبًا على Z80 ، تمديد أربعة معالجات. ومع ذلك ، كانت زيارة هذه الشركة مفيدة للغاية ، حيث التقى مع مؤلف منصة Sprinter Ivan Makarchenko وتعلم عن فرص جديدة في مجال تطوير FPGA.
بعد فترة وجيزة من الأزمة 1998 "ذبلت" وكان هناك أمل ساذج أن الاهتمام في ZX- الطيف يمكن أن تنتعش. في بداية عام 1999 ، كان لدينا (مع شريكي في ذلك الوقت ، Andrei Savichev) خطط لإنشاء "الصندوق الوطني للطيف" وعقد اجتماع واحد حول هذا الموضوع في المكتب الجديد لشركة Peters نفسها. لكنهم لا يدخلون النهر نفسه مرتين وبالطبع لم يحدث شيء منه. بالفعل في عام 1999 ، تم تجاهل جميع الأفكار المتعلقة بموضوع تطبيق الأجهزة للنظام الأساسي (عملنا على هذا التطوير مع سيرجي إيجوروف ، لكننا لم نذهب إلى أبعد من المخططات). حتى عام 2007 ، لم أتعامل مع المنصة عملياً ، لكن كان هناك وقت وقررت إعادة كتابة المحاكي وتحديد تفاصيل المنصة ، والتحقق من الأساليب والسماح لها "فعليًا".
يعرض وضع الفيديو القياسي ZX-Spectrum 256 × 192 بكسل. في الوضع أحادي اللون ، يتطلب ذلك 6144 بايت فقط ، أي حوالي 10٪ من إجمالي مساحة الذاكرة (مقابل 50٪ على BK-0010). يتم تخزين معلومات اللون في 768 بايت إضافية تقع مباشرة بعد بيانات بكسل. تتكون اللوحة من ثمانية ألوان وظلال. يتم تحديد لون البيكسلات المضيئة والمهملة فورًا للكتلة 8 × 8 بكسل ، ويتم تحديد الصبغة فورًا للون البيكسلات المضيئة والمهملة.
يبدو ملونًا ويتم إرسال كمية صغيرة نسبيًا من البيانات بسرعة كبيرة ، ولكنها تتطلب جهدًا وفنًا لا يصدقين من الفنانين والمبرمجين عند تطوير الألعاب الملونة وشاشات التوقف. أدنى تباين في الرسم البياني يؤدي إلى تعارض في السمات. قام معظم المطورين بعملهم بشكل مثالي وعلى خلفية BK-0010 ، بأربعة ألوان فقط (ولكن لكل نقطة!) ، بدا Spectrum شبه اللون مفيدًا وجديدًا للغاية.

مع تطوير النظام الأساسي إلى ZX-Spectrum 128 ، تمت إضافة القدرة على تبديل الأجهزة بين صفحتين من ذاكرة الفيديو. اكتشف المبرمجون بسرعة طريقة للحصول على ألوان متعددة باستخدام تغيير سريع للغاية لصفحات الفيديو المعروضة وتغيير ديناميكي لسمات الألوان.
نتيجة لهذا ، كان من الممكن رفع دقة الشاشة برمجيًا (والذي يظهر تمامًا ، على سبيل المثال ، في العرض التوضيحي "Dead Morose" ، حيث يتم تشغيل النص في نفس الوقت بدقة 256 و 512 و 768 نقطة أفقياً).
لكن أي حلول برامج تتطلب زيادة في تدفق معلومات الفيديو أدت إلى زيادة في استهلاك المعالج ، وهو أمر بالغ الأهمية في حالة الألعاب الديناميكية. لم يكن هناك مصدر غير مستخدم لاحتياطيات الطاقة الحاسوبية في النظام. كل شيء معلق على المعالج في ZX-Spectrum ويمنحه القليل من التحميل ، باستثناء ربما معالج الموسيقى في مجال المؤثرات الصوتية.
كانت فكرتي هي أنه يمكنك إضافة ثلاثة معالجات أخرى ، مع إلقاء كل منهم معالجة مكون اللون الخاص بهم. يجب دمج البيانات المستلمة من ذاكرة الفيديو الخاصة بكل معالج ، بحيث تشكل قيمة YRGB لكل بكسل . يتم تجاهل سمات الألوان القياسية. يجب أن تضمن المعالجة المتوازية للمعلومات عدم وجود أداء تراجعي.

لا أستطيع أن أقول أنها كانت أصلاً في الفكرة ، لأنها كانت مستوحاة من قراءة الكتاب المترجم "The Computer Gains Mind" (دار النشر مير ، 1990) ، التي وصفت منصة Pixar للرسومات معينة تم تطويرها في Lucasfilm. وفقًا لـ TRIZ ، إنه مجرد انتقال من نظام أحادي إلى نظام متعدد.

سؤال مؤلم للغاية لأي تطور - ومن سيكتب البرنامج؟ (على وجه الخصوص ، واجهت منصة العداء عبر هذا "المأزق"). في حالتي ، تم حل المشكلة المتعلقة بالبرنامج تلقائيًا من خلال حقيقة أن البرامج النادرة جدًا التي تفحص نوع البيانات التي سجلتها في ذاكرة الفيديو وعملت معها ببساطة "مثل ساعي البريد بحرف مختوم". وفقًا لحساباتي ، اتضح أن معظم برامج الألعاب الحالية يمكنها بسهولة التكيف مع بيانات الفيديو الخاصة بها دون تغييرات في التعليمات البرمجية القابلة للتنفيذ. بالطبع ، تم قطع الألعاب التي تحتوي على مجموعة من الرسومات أو التحسينات الداخلية في إخراجها على الشاشة. يتطلب تكييف مثل هذه البرامج إجراء البحوث وتعديل التعليمات البرمجية القابلة للتنفيذ. تطوير ROMs المتخصصة لم يكن مطلوبا على الإطلاق.
أعتقد أن هذا المفهوم قابل للتطبيق على أي نظام أساسي منزلي قديم (على سبيل المثال ، AGAT ، Radio86RK ، BK-0010 ، وما إلى ذلك) ، حيث لا يوجد مسرع فيديو مخصص ويعمل المعالج مباشرة مع ذاكرة الفيديو لتكوين صورة.
في الإصدار الأول من بروتوكول المضاهاة ، عملت للتو على تشغيل أربعة أجهزة ZX-Spectrum 48 بشكل متزامن ، لكن من السهل للغاية تكرار ما هو سهل المحاكاة على المحاكي على أجهزة حقيقية. من الصعب للغاية ضمان تحميل البيانات إلى أربع وحدات حوسبة وجعل بداية متزامنة من نفس العنوان. يقدم حل مشابه Spec256 لهذا الجهاز الظاهري SIMD Z80 ذو 64 بت ، والذي لا وجود له في الطبيعة. كجزء من حل أكثر واقعية (وأكثر تعقيدًا) لهذه المشكلة ، تم تشكيل منصة ZX-Poly.
من "موسع الألوان" إلى ZX-Poly
وحدات المعالج
ZX-Poly عبارة عن منصة حاسوبية تعتمد على ZX-Spectrum 128 التي تحتوي على أربع وحدات للمعالج. تحتوي كل وحدة نمطية على منافذ الإدخال / الإخراج للنظام المرئي خارجيًا. على الرغم من مشاركة وحدات المعالج في إشارات التحكم في النظام (RESET و NMI و CLK و INT) ، إلا أنها تعمل بشكل مستقل.

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

من التفاصيل المهمة للغاية أن جميع أجهزة المعالجات المستخدمة يجب أن تكون من نفس الشركة المصنعة (وسيكون من الجيد أن يكون لديك سلسلة إنتاج واحدة) ، لأن أدنى اختلاف في التنظيم الداخلي أو التحسين يمكن أن ينتهك تناسق النظام.
مباشرة بعد بدء تشغيل النظام ، يتم تشغيل الوحدة الرئيسية (CPU0) فقط ، والوحدات المتبقية في وضع الانتظار ، لذلك بالنسبة للمستخدم ، كل شيء يمر دون أن يلاحظه أحد.
في مساحة IO ، يضيف ZX-Poly المنافذ التالية المتاحة للكتابة والقراءة:
- منفذ التكوين الرئيسي 3D00 $
- الوحدة 0 - $ 00FF ، 10FF $ ، 20FF $ ، 30FF $
- الوحدة 1 - 01FF $ ، 11FF $ ، 21FF $ ، 31FF $
- الوحدة 2 - 02FF $ ، 12FF $ ، 22FF $ ، 32FF $
- الوحدة 3 - 03FF $ ، 13FF $ ، 23FF $ ، 33FF $
المنفذ الرئيسي لتكوين ZX-Poly هو 3D00 دولار. يمكن للوحدة الرئيسية فقط الكتابة إليها ، ولكنها متاحة للقراءة لجميع الوحدات ويتم إرجاع كل من معلوماتها المتخصصة. على وجه الخصوص ، يمكن للوحدة النمطية اكتشاف فهرسها ، سواء كانت ذاكرتها معيَّنة إلى منافذ IO الخاصة بالوحدة الرئيسية ، أو إزاحة ذاكرتها في الكومة ، وما إلى ذلك. أيضًا ، خضع منفذ التكوين للنظام الأساسي الأساسي $ 7FFD إلى تغييرات بسيطة ، والتي تستخدم وحدات بت غير مستخدمة في الأصل.
الذاكرة
كما هو الحال في الهيكل الأصلي لجهاز ZX-Spectrum 128 ، فهناك ذاكرة الوصول العشوائي ROM وذاكرة الوصول العشوائي RAM إذا لم تتغير المؤسسة والعمل مع ROM عملياً ، فقد تحولت ذاكرة الوصول العشوائي إلى "كومة" مشتركة من 512 كيلو بايت يعمل فيها كل معالج مع إطار 128 كيلوبايت مخصص (هذه هي 8 صفحات من 16 كيلو بايت في ZX-Spectrum 128). يمكن تغيير إزاحة النافذة بزيادات قدرها 64 كيلو بايت ويمكن توقع أن تعمل جميع وحدات المعالج مع قطعة ذاكرة متداخلة كليًا أو جزئيًا في الكومة. يمكن تعطيل ROM وسيتم توصيل صفحة RAM0 RAM في مكانها (يسمح لك هذا بإنشاء إصدار "بالألوان الكاملة" لنظام التشغيل الأساسي ، على سبيل المثال ، مترجم أساسي). بعد إعادة ضبط الجهاز ، تتلقى جميع الوحدات الإزاحة التلقائية لفصل نوافذ الذاكرة في الكومة.
يتمتع سيد وحدة المعالج (CPU0) ، بالقدرة على تعيين مساحات عناوين الوحدات النمطية الأخرى (CPU1-3) في منطقة منافذ الإدخال / الإخراج. أي يمكنه الكتابة إلى المنفذ ، وتغيير حالة خلية الذاكرة لوحدة معينة ، وفي الوقت نفسه ، من الممكن توليد إشارة NMI على وحدة نمطية محددة. عند القراءة من خلايا الذاكرة لوحدة معيارية ، يكون إنشاء INT ممكنًا. تم ذلك لمحاكاة الأجهزة الافتراضية باستخدام الوحدات 1-3.
تحكم الفيديو
"الكرز" الرئيسي هو بالطبع جهاز تحكم فيديو ، كل شيء بدأ من أجله. في المجموع ، تدعم المنصة خمسة أوضاع فيديو.
أوضاع الفيديو ZX-Spectrum 128 (الوضع 0،1،2،3)
أوضاع الفيديو هذه غير ملحوظة ولا تختلف على الإطلاق عن وضع الفيديو القياسي ZX-Spectrum 128. يتم عرض صفحة الفيديو الحالية لوحدة المعالج المحددة مع تلوين السمة. بعد بدء النظام مباشرة ، يتم تنشيط الوضع 0 ، أي يتم عرض صفحة الفيديو الخاصة بالوحدة الرئيسية (CPU0).

ZX-Poly 256x192 (الوضع 4)
لا يستخدم وضع الفيديو هذا أي بيانات من منطقة السمة على الإطلاق. يتم دمج بت البكسل لكل وحدة مع بيانات البيكسل من الوحدات الأخرى ، ويتم استخدام البتات الأربعة المولدة لإنشاء إشارة YRGB بسطوع اللون.
كل وحدة مسؤولة عن مكونها:
- الوحدة 0 (ماجستير) للأخضر (الأخضر).
- الوحدة 1 للأحمر (الأحمر)
- الوحدة 2 للأزرق (الأزرق)
- الوحدة 3 للسطوع

إذا بدأت لعبة غير مُكيَّفة في هذا الوضع ، فستكون ببساطة بالأبيض والأسود.

ZX-Poly 256x192 مع التقنيع بواسطة INK + PAPER (الوضع 6)
مثل السابق ، فإنه يوفر 16 لونًا لكل نقطة ، ولكن هناك "خدعة" واحدة. في بعض برامج ZX-Spectrum ، يتم إخفاء عناصر الرسوم باستخدام قيم INK و PAPER المتطابقة في السمات ، وخاصة في ألعاب scroller. إذا قمت بإزالة هذه الفرصة ، تبدأ العناصر الرسومية في التراكم على الشاشة ، مما يؤدي إلى كسر الصورة. لذلك ، يتم تحليل حالة INK و PAPER من سمة الوحدة الرئيسية المقروءة من ذاكرة الفيديو (CPU0) وإذا كانت متطابقة ، فسيتم تمييز جميع النقاط باللون المأخوذ من INK / PAPER (بالطبع ، مع مراعاة السطوع).

ZX-Poly 256x192 مع تقنيع FLASH + INK + PAPER (الوضع 7)
الوضع عبارة عن مزيج من الوضع 4 والوضع 6. للسمات القابلة للقراءة من الوحدة الرئيسية (CPU0) ، يتم تحليل بت FLASH وإذا تم تعيينه (وهو أمر نادر في الألعاب الديناميكية في مجال اللعب) ، ثم يتم عرض كتلة 8 × 8 بكسل في وضع الوضع 6 ( مع اخفاء مع الحبر متطابقة وورق). إذا تمت إعادة تعيين FLASH ، فسيتم عرض الكتلة كما في ZX-Spectrum عادية. لا يتم ممارسة بت FLASH في دورها المباشر ولن يكون هناك أي وميض.
يعد هذا الوضع مناسبًا للغاية لتجنب إعادة طلاء لوحات معلومات اللعبة وبعض التأثيرات داخل اللعبة (على سبيل المثال ، عندما يقوم مطورو الألعاب بالوميض في الملعب من خلال السمات).

ZX-Poly 512 × 384 مع سمات (الوضع 5)
يتم استخدام السمات بالطريقة نفسها المستخدمة في النظام الأساسي الأصلي ، دون أي تغييرات (حتى بت FLASH). يتم تلوين بيانات بكسل الفيديو الخاصة بكل وحدة بسمة من ذاكرة الفيديو لهذه الوحدة ، وبعد المرور عبر التلوين ، يتم عرضها بنمط رقعة الشطرنج ، بسبب أن كتلة معرفة واحدة هي 16 × 16 نقطة.

يتيح لك هذا الوضع مضاعفة دقة التطبيقات ، دون تغيير التعليمات البرمجية القابلة للتنفيذ. صحيح أن التجارب التي أجريت على لعبة "Pinocchio" نفسها أظهرت أنه في الألعاب الساطعة ذات التفاصيل الكبيرة ، سيكون التأثير ملحوظًا بشكل ملحوظ. نظرًا لأن هذه الأنواع من البكسلات الافتراضية ، فإن الألعاب لا تعرف شيئًا عن هذا ، وأن الحد الأدنى لحركة عناصر اللعبة في مستوى بكسلين افتراضيين. أعتقد أن هذا الوضع جيد للألعاب ذات كائنات اللعبة الصغيرة في مكان مألوف.

تم الحصول على تأثير أفضل بكثير في وضع الفيديو هذا على التطبيقات النصية ، على سبيل المثال ، على محرر النصوص ZX-Word ، حيث تمت معالجة الخط دون تغييرات في التعليمات البرمجية القابلة للتنفيذ.

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

, , "". , .
RESET
RESET , . JP ADDR .
-
master- (CPU0). , ( M1), WAIT, RESET. , , 16 .
2007 JavaSE . Z80 ( -) FDD 181893. JDK 1.8+ .

ZX-Spectrum , 80% , . ZX-Spectrum 128, Options->ZX 128 Mode , ZX-Poly .
-, ZX-Spectrum — . , File->Options

إذا كانت الألعاب لا تستخدم أي حزم من العفاريت ، فالتلوين بسيط للغاية. يجب توخي الحذر عند وجود تحسينات في التعليمات البرمجية القابلة للتنفيذ لإخراج العفاريت ، حيث يمكن أن يؤدي ذلك إلى عدم التزامن في وحدات المعالج.
تم تطوير أداة تحميل التشغيل لتحميل البيانات إلى وحدات من قرص والبدء في وقت واحد في وقت واحد. يتم تقديم الكود الخاص بـ TAP و TR-DOS في المشروع.

جنبا إلى جنب مع المحاكي ، تم تطوير أداة مساعدة صغيرة (مكتوبة بلغة جافا) لتطبيقات التلوين.

تم نشر المشروع بالكامل على جيثب تحت رخصة جنو جي بي في 3 .
