في البداية ، لم أخطط لإجراء عرض توضيحي في
Chaos Constrictions 2018 ، ولكن قبل 2-3 أسابيع من نسخة إلى
أني أدركت أنه لا يمكنك الذهاب إلى حفلة تجريبية فارغة ، وقررت كتابة عرض توضيحي قصير لـ
386 / EGA / DOS .
بعد أن قمت بتجميعها في
Turbo-C تحت
DOS ،
أضع مكتبي الآخر AnotherGraphicsLibrary ، والذي يتناسب بشكل مثالي مع هيكل خطة الضرب في وضع
EGA ، شعرت بخيبة أمل من الفرامل ، وخاصة مكابح
EGA . كان من المستحيل القيام بالعرض التوضيحي بالشكل الذي أود أن أراه فيه ، خلال هذه الفترة المحدودة للغاية.
ومع ذلك ، لم أستطع الاستسلام ولا أفعل أي شيء. ثم تذكرت أنني كنت أرغب طويلًا في المشاركة في مسابقات
ZX-Spectrum التجريبية. وبما أنني حصلت على اثنين من
ريالين 48k في العام الماضي ، يمكنني الحصول على بعض المتعة من إنشاء عرض توضيحي. بالمناسبة - بالنسبة لي ، أهم شيء في كتابة عرض توضيحي هو الاختبار في الحياة الواقعية ،
المستحلبات لا تعطي هذه المتعة من العملية ، إنه حقًا شعور رائع عندما تقوم ، بعد التغيير التالي في التعليمات البرمجية ، بتحميل العرض التوضيحي إلى حقيقي ، ومعرفة كيف يقوم الجهاز الحقيقي بتعديل تأثير رسم الذاكرة.
نظرًا لأن لدي
48 ألفًا فقط من الريال ، قررت تقديم عرض توضيحي مقابل
48 ألفًا . وبسبب الوقت المحدود والافتقار إلى أي تطورات ، وقع الاختيار على إنشاء
مقدمة 1 كيلو بايت (عرض توضيحي لـ 1 كيلوبايت فقط ، أو 1024 بايت).
آخر مرة قمت بدس
z80 asm في
EmuZWin - محاكي رائع مع مجمع مدمج. ولكن لسوء الحظ
EmuZWin لا يعمل على أي شيء أعلى من
Windows XP ، أو أنه عربات التي تجرها الدواب.
بعد دراسة الخيارات المختلفة ، توقفت عند مجموعة من برامج
Unreal + sjAsm + Notepad ++ ، والتي ، في رأيي ،
أسهل بكثير
من EmuZWin من حيث الراحة ، ولكنها ، على النقيض من ذلك ، على قيد الحياة.
أثناء كتابة هذه المقدمة ، أجريت في المصدر مباشرة سجل تطوير ، بناءً على ذلك تم كتابة النص التالي:
مرحبا بالعالم!
ما الذي يجب أن أكتبه أولاً ، مع وجود خبرة صفرية تقريبًا في
z80 asm ؟ هذا صحيح ، إن إخراج العفريت 5x5 مألوف أو 40x40 بكسل ، لأحد التأثيرات (من المفارقات ، في المستقبل ، من أجل احتواء 1k تم التخلص من هذا الجزء غير المكتمل من المقدمة).
من المثير للدهشة أنه كان من السهل جدًا القيام بذلك من البداية باستخدام ملصق عنوان السطر الذي تم إنشاؤه مسبقًا باستخدام
Down HL .
أوه ، يسجل الفهرس ، مدى ملاءمتها ، ولكنها أبطأ ، تستهلك الأشرطة حرفياً. اضطررت إلى التخلص من استخدامهم في مجموعة من الأماكن.
ما زلت هنا ، في البداية ، صادفت
عيوبًا مذهلة في sjAsm ، أو بالأحرى أحدث إصدار لها. أظهرت عدم الواقعية في
Unreal تسلسلًا جنونيًا تمامًا للأوامر. لقد قمت بتنزيل الإصدار قبل الأخير - كان من الممكن بالفعل العيش معه بطريقة أو بأخرى.

من الواضح أنه لا يمكنك وضع عدد كافٍ من العفاريت التي تم رسمها سابقًا في 1k ، لذلك قررت إنشاءها ديناميكيًا. وليس على أي حال ، ولكن ارسم باستخدام المضلعات.
لذلك ، كان الإجراء الثاني الذي كتبته هو إجراء رسم مثلث. بالنسبة للجزء الأكبر ، كان عبارة عن تحويل لرمزهم الخاص المكتوب في
C. مع الاختلاف العالمي الوحيد عن الإصدار
C ، يتم إنشاء خطوط المسح المضلع أولاً ، وبعد ذلك فقط يتم رسمها على خطوط المسح هذه.
بعد اللغات عالية المستوى ، تحصل على بعض المتعة من
jr aka goto :
.sort_me_please: ld de,(tr_x2) ld bc,(tr_x0) ld a,d cp b jr nc,.skip1 ld (tr_x2),bc ld (tr_x0),de .skip1: ld de,(tr_x1) ld bc,(tr_x0) ld a,d cp b jr nc,.skip2 ld (tr_x0),de ld (tr_x1),bc jr .sort_me_please .skip2: ld de,(tr_x2) ld bc,(tr_x1) ld a,d cp b jr nc,.skip3 ld (tr_x2),bc ld (tr_x1),de jr .sort_me_please .skip3:
لقد صدمت قليلاً من حقيقة أنه
اتضح في وقت معقول لكتابة رسم
رسم يعمل على
z80 asm ، والذي يرسم بكسل مضلع بواسطة بكسل وبدون ثقوب عند توصيل المضلعات.
مرحبا المثلثات!الجسيمات

نظرًا لوجود مولد تسمية خط الشاشة ، كتبت إجراء إخراج منحنى وبطيء إلى حد ما باستخدام هذا الملصق. يحتوي الإجراء على نقطتي إدخال - فقط معكوس البكسل ، وعكس البكسل بملئه بـ
INK +
BRIGHT + واللون المحدد في أحد السجلات.
في مرحلة إنشاء تأثير مع الجسيمات ، اكتشفت أن المثال مع الهياكل من الأمثلة في
ويكي sjAsm لا يعمل. طرح Googling موضوعًا من موقع
zx-pk.ru ، حيث تم وصف هذه المشكلة ، ولا يوجد حل - ها ، جيد - خلل آخر.
قررت أن أفعل كل شيء بوضوح - تحديث الإحداثيات بغض النظر عن التقديم ، عن طريق الانقطاع. نعم ... بالإضافة إلى وحدات البايت لإنشاء جدول المقاطعة.
كان هناك عدد قليل من الجسيمات في هذه المرحلة ، وهي بالكاد تتناسب مع الإطار - وهذا بالمناسبة حول بطء عملي لإخراج النسبة المئوية) ولكن استخدام جدول مشترك مع النقوش المتحركة لم يسمح لي برميها وأخذها جاهزة ، لأن هذا توفير كبير على الحاجة لمولد جدول واحد فقط. وحبي للدراجات أيضا :)
عدد قليل جدًا من الجسيمات ... زاد عددها ، ولكن الآن أصبح العرض سمينًا إلى إطارين.
اختبار على Peters WS64 ، الذي حصلت عليه في آخر نسخة إلى cc وإصلاحه هذا الشتاء :)بالمناسبة ، في هذه المرحلة ، تحولت النقاط بالفعل إلى نقاط أفقية جريئة
2: 1 ، كما هو الحال في
Commodore 64 . حدث هذا بسبب العدد الصغير في البداية من الجسيمات ، واستيائي من حقيقة أنها كانت غير مرئية تمامًا عند تشغيلها في الحياة الحقيقية. حل المشكلة عن طريق استبدال اللوحة
db 128,64,32,16,8,4,2,1;
على
db 192,192,96,24,12,6,3,3;
مما أدى إلى تفاقم دقة تحديد المواقع وجعل الرحلة متوترة قليلاً ، ولكنها زادت من الرؤية. هنا ، لعبت أيضًا في يد أن الجسيمات سقطت من الأعلى إلى الأسفل - لطخت رؤيتهم عموديًا.
تقع الجسيمات بالمناسبة بسرعتها العشوائية ، ويتم استخدام وحدتي بايت لتخزين الإحداثيات
Y.العفاريت
لقد رميت الجزء غير المكتمل من جزء العفريت ، وأدركت أنني لا أستطيع أن
أتوافق مع
1 كيلو معها.
بالإضافة إلى ذلك ، كان هناك بالفعل نقص في المساحة ، لذلك تذكرت
مقالة Introspek الرائعة حول الحزم ، اخترت
zx7 كحزمة ، والتي وفرت حوالي 110 بايت. بالمناسبة ، ربما شخص يعرف باكر أكثر ملاءمة لمقدمة 1K؟
الإنشاءات الفوضى

نظرًا لأن لدي بالفعل إجراء لإخراج مضلع ، فقد كانت فكرة رائعة تقسيم شعار
cc إلى مضلعات وعرضها واحدًا تلو الآخر.
لقد كتبت بعض كود الاختبار الذي يعرض عدة مضلعات - كل شيء يعمل كما كنت أريد - جيد.
للتحقق مما إذا كانت فكرتي تناسب
1k أم لا ، ولدت عددًا معينًا من المضلعات العشوائية ، وفقًا للتقديرات ، عددًا كافيًا للشعار ، وقادته إلى المصدر. تم تجميعها والتأكد من أن المقدمة - ممتازة - في هذا الشكل ، تتناسب مع حد 1024 بايت.
صورة الحياة ، هل تتعرف على الجهاز على الطاولة؟ :)))قررت مرة أخرى اختبار المقدمة شبه النهائية ، بالفعل مع المضلعات ، وحزم ، تم تحميله إلى حقيقي و ... حصل على إعادة تعيين. بادئ ذي بدء ، بدأت أخطأ أنني نسيت تهيئة الذاكرة في مكان ما ، حيث ، حيث يعمل كل شيء على ما يرام على محاكي
0x00 ، في الحياة الحقيقية هناك القمامة تتسبب في إعادة الضبط.
لا يوجد شيء أفضل للعثور على مكان مشكلة من طريقة نصف القسمة و
di stop التي لم أستطع التوصل إليها.
تم إجراء إعادة تعيين على ساعتين حقيقيتين ، لم يكن هناك طريقة لتوطين خلل ...
كما اتضح ، لم يكن في الكود الخاص بي ، كان في
محسن الصوت المضمّن على الهاتف الذي قمت بتحميل WAVs منه. أنتج محسن من دفق بت في ملف
WAV دفق الهذيان.
بمجرد أن أطفئه ، عمل كل شيء بطريقة سحرية.
أوجز الشعار في
محرر أخطاء الأخطاء greenpixel ، وكسره في مجموعة من المثلثات ، ودفع الإحداثيات يدويًا إلى المصدر. بعد حشو شعار
Chaos Constructions بالكامل وتشغيله في الحياة الواقعية - كنت سعيدًا - بدا جيدًا.
عرض الشعار الأول على الحقيقيومع ذلك ، قمت بحشو مضلعات عشوائية قليلة جدًا ، وعلى الشعار الحقيقي ، كان هناك حد
1 كيلو لكل 150 بايت. وهذا على الرغم من حقيقة أن تأثير الجسيمات لم يكتمل بعد ، وكان الانتقال بين الأجزاء حادًا.
للذهاب إلى الفراش في ذلك اليوم ، بسبب الضجة مع مواطن الخلل ، اتضح في وقت مبكر من الساعة 8 صباحًا 8)
ونعم ، حاولت تحسين الحجم من خلال تخزين الإحداثيات ومؤشرات القمة بشكل منفصل ، لكن المعبئ لم يعجبه كثيرًا ، مما جعل الحجم يزيد فقط.
نهائي

توصلت إلى كيفية تنويع إخراج الشعار ، لذلك لم يستغرق الأمر سوى تسميتين إضافيتين بالبكسل:
fake_points1: db 1,2,4,8,16,32,64,128; 1 ch fake_points2: db 32,8,128,2,16,1,64,4; 2 ch normal_points: db 128,64,32,16,8,4,2,1; 3 ch
وقد أعطى ذلك تأثيرًا رائعًا لزيادة تفاصيل عرض الشعار ، أو الافتقار الأولي للتفاصيل وزيادة تدريجية في الحدة.
وأخيرًا ، قمت بعمل النسخة النهائية مع كل التحولات ، وأرمي مجموعة من كل شيء. في هذه العملية ، وجدت خللاً في إجراء رسم المثلث - إذا كان للقمين نفس إحداثيات
Y ، فسيتم رسم المثلث بشكل منحرف (يبدو أن القسمة على 0 عند حساب
dx ) ، يتم تجاوزه باختراق مؤقت.
اختبار النسخة النهائية على لينينغراد 48تحسين الحجم
الأرقام المزدوجة هي "بايت إضافية"94 بايت إضافية ...
لقد حان الوقت لقطع الحفظ / الترميم "الثقافي" لسجلات إجراءات المدخلات / المخرجات ، بعيدًا عن كل مكان يكون ضروريًا ، ولكن الذاكرة تأكل.
86 بايت ...
تم اختباره في الحياة الواقعية - إنه يعمل! هزم ذاكرة أكبر بقليل ، وأصلح في الوقت نفسه خطأً مقسومًا على 0-63 بايت!
57 بايت ...
تمت إضافة حلقات.
random_store: start:
الحلقات بالمناسبة تتم على مستوى التفريغ ، كما كمصدر للانتروبيا لـ
RNG ، تم استخدام عدة بايت من كود التهيئة (لتوفير مساحة) ، والتي
أفسدها RNG خلال الجزء الأول. لذلك ، للتكرار ، بعد نهاية المقدمة ، هناك
ret ، جيد ، ثم تفريغ آخر والانتقال إلى التعليمات البرمجية غير المعبأة ...
لم يكن من الممكن التخلص من الـ 48 بايت الأخيرة ، كان علي قطع معالج المقاطعة ، لكن مرحى! محشوة! حتى بايت واحد إضافي بقي.
وبما أنه لا توجد مقاطعات ، يمكن تسجيلها للإطارات ، ومن الصعب رؤية المقطع العرضي للحزمة عند بكسل واحد في التأثير الأول ، لذلك قمت بزيادة عدد الجسيمات لكل عين ، مع وجود حل وسط بين السرعة والترفيه.
على الرغم من صعوبة الوصول إلى التعليمات البرمجية والبيانات بغباء أكثر صعوبة ، من مكان إلى آخر ، مما يساعد أداة التعبئة. الذي استغرق بعض الوقت :)
أدى هذا إلى تحرير حوالي
10 بايت تمسكت به محاكاة ساخرة للصوت. Khk ، khe ، الصوت - هذا في بعض الأماكن ، عن طريق إدخال الأذن:
ifdef UseSound ld a,d and
لم أقم "بتثبيت" الصوت ، ولكني قمت بتحديده ، وبالتالي حصلت على نسختين من المقدمة ، مع وبدون صوت. في ذلك بدون صوت ، مكتوبة بالبايتات "الإضافية"
db 'e','r','r','o','r'
جمعت
trd واضغط على وتحميلها كلها على موقع
cc .
مرحبا - أنا أشارك في ديموباتي!
خاتمة
اتضح أن الأمر مضحك مع الصوت ، قال أحدهم على صوت "صوت واضح" ، ونظر إلي شخص غريب ، وعلى
الدمية وجدت ما يلي:

وهذا:

بشكل عام ، لم أفهم ما إذا كان أي شخص يحب صوت 10 بايت أم لا :)
والأخير - من العار أن مسابقة
1k لم تحدث هذا العام ، تبين أن العمل لائق ، في رأيي ، ولكن
من الصعب التنافس مع
640 ألف ، لكنني أردت حقًا المنافسة.
اكتب عروض تجريبية ، اكتب 1 كيلو!وهنا ما انتهى (ملاحظة ، اعتني بأذنيك):
الإصدار الصامت: