كيف يلائم Memories Demo 256 بايت


المقدمة


مرحبا! اسمي HellMood ، وهذه المقالة تدور حول برنامج MS DOS صغير يسمى Memories. يبلغ حجم هذا البرنامج 256 بايت ، وقد فاز في فئة "PC 256 byte" demoscene «Revision» لعام 2020 ، كما حصل على جائزة الجمهور. يمكنك مشاهدة فيديو إخراج البرنامج هنا ، والفيديو مع رد فعل الجمهور عبر الإنترنت والمشرفين هنا . تنزيل الإصدار وترك التعليقات هنا. ستقدم هذه المقالة تحليلاً متعمقًا للبرنامج ، وتتحدث عن المراجع التاريخية ومراحل التطوير. تم نشر المقال في ويكي sizecoding. لن يسمح لك فقط بفهم البنية الداخلية للذكريات ، ولكنه سيساعدك أيضًا في إنشاء شيء مشابه. اكتشف! إذا كنت جديدًا في التشفير (كتابة برامج بالحجم المطلوب) أو في مجمع x86 ، فمن المستحسن أن تبدأ بأساسيات هذا الويكي . المبادئ سهلة الفهم ، ولكن ليس من السهل معرفة تفاصيل التنفيذ.

مراجعة قصيرة


في هذه المقالة سنتحدث عن النسخة المرسلة للمسابقة لـ DosBox (256 بايت). يحتوي الأرشيف أيضًا على إصدارات لـ FreeDos و Windows XP DOS ، والتي لم تكن تعمل وقت كتابة المنشور على جميع أجهزة الكمبيوتر. تم تضمين هذه الإصدارات البديلة في الأرشيف كدليل على المفهوم لإظهار أن البرنامج لا يعمل فقط في المحاكي. في فئة "PC 256 بايت" لمسابقة "المراجعة" لعام 2020 ، كان من الممكن الإشارة إلى "FreeDos" أو "DosBox" كمنصة (هذا الأخير في تكوين محدد). كما تثبت الإصدارات البديلة ، في الواقع ، يمكنك تعديل الإصدار لـ DosBox بحيث يعمل في FreeDos و MS DOS و WinXP و Win98 ، لكن المقالة لن تدور حول ذلك.

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

تاريخ الآثار الصغيرة



فئات الأبعاد في http://www.pouet.net

نحن ، sizcoders ، السبب في فئات الحجم. بالنسبة لـ MS DOS ، هذه الفئات هي 256b و 128 b و 64 b و 32 b. هذه هي معايير أحد أكبر أرشيفات المشهد التجريبي www.pouet.net. لا توجد فئة 16 ب ، ولكن يمكن تنفيذ العديد من التأثيرات الصغيرة في 16 بايت. لقد قمت بكتابة جميع تأثيرات "الذكريات" تقريبًا وتحسينها من قبل ، وكان تنفيذها بشكل أساسي محاولة لتقليل الحجم الحالي للتأثير ، أو لإنشاء شيء مشابه ، ولكن أصغر. من خلال تقليل الحجم هنا ، يعني تخفيضه إلى إحدى الفئات الأصغر التالية 2 ^ N. على سبيل المثال ، إذا تم تنفيذ التأثير في 33-64 بايت ، فسيتم تقليله إلى 32 بايت أو أقل. في كل مرة تقريبًا تمكنت من "تقليل" التأثير إلى فئة أقل ، أرسلت البرنامج الصغير الناتج إلى حدث مخصص لل demoscene ، حيث سمح للمشاركين البعيدين بالمشاركة في الفئة 256 ب ، و / أو نشروا النتيجة على www.pouet.net. في هذا القسم ، سوف أقدمك إلى التأثيرات ، بالإضافة إلى التحدث عن أصلها ومؤلفيها.

صفيف من ألواح الشطرنج



كاسباروف ، 16 بايت ،

مصدر هذا التأثير هو "Kasparov 16b" لعام 2018 ( حلقة الوصل ). يبدو (اقتباس من ملاحظات الإصدار) ، "لقد صنعت هذه اللوحة للتو ، وضمتها إلى 17 بايت ، لكنها لم تكن جميلة جدًا حتى توصلت إلى خدعة ...". سابقًا ، كان هناك بالفعل تأثير مماثل تم تنفيذه في 32 بايت: 2003 مصريات من headcrash المطور. ( رابط ) في هذه الحالة ، حاولت تنفيذ ألواح شطرنج "حقيقية" بمربع 8 × 8 ومربعات سوداء وبيضاء يمكن التعرف عليها ، بالإضافة إلى الاتجاه الصحيح لألواح الشطرنج الفردية ، أي أن الركن الأيمن السفلي (h1) كان يجب أن يكون أبيض. من أجل هذا التأثير للعمل مع الإطار العالمي ، في "الذكريات" كان لا بد من إعادة تطبيقه باستخدام تقنية أخرى: التسجيل على الشاشة ؛ بالإضافة إلى ذلك ، تم تغيير اتجاه التمرير بحيث يختلف عن تأثير "التمرير المائل المستوى".

تكبير الدوائر


كان من المفترض أن تشارك الدوائر القابلة للتوسيع (دوائر التكبير) في demopati كمقدمة 32 بايت ، لكنني لم أشارك أبدًا. لا يحتوي هذا التأثير على سلف 64 بايت ، لأنه في فئة 64b يمكن حدوث تأثيرات أكثر تعقيدًا. كانت دوائر التكبير نتيجة محاولتي اليائسة للدخول في الفئة 32 ب مع تأثير "نفق" دائري ، والذي كان سجلي الشخصي فيه لا يزال 52 بايت ("Neontube" - 2016) ( رابط ) ، والذي أصبح بدوره تحسينًا على الإصدار الكلاسيكي 64 بايت أثر المطورين "التطور المستمر" ryg / Farbrausch (2003) ( حلقة الوصل ). في إجراء دوائر الزوم ، يتم حذف / تجاهل المسافة والزاوية ، والتي كان من الممكن أن تقع في الفئة 32 ب.

التمرير الطائرة المائلة



Floorcast ، إصدار 32 بايت ، وهو شكل من أشكال

طائرة التمرير المائلة ، هو أحد إصداراتي الخاصة ، 2018 floorcast 32b. تأثير "الأرضيات" له تاريخه الخاص في التشفير المتغير وانخفض تدريجيًا من 256 بايت إلى 32 بايت. تختلف الإصدارات المختلفة في عدد الطائرات ، في بعض الطائرتين معروضة ، في أخرى - واحدة فقط. في إصدار "floorcast 32b" ، قررت على وجه التحديد التخلي عن نسيج "XOR" ، وفي "Memories" ، استخدمته مرة أخرى ، أخفيته بلمسة نهائية في شكل "AND".

  • إصدار عاصفة ممطرة لعام 2008 - وصلة 256 بايت
  • نسخة 2008 من org_100h - وصلة 128 بايت
  • نسخة Baudsurfer 2013 - 86 بايت - وصلة
  • نسخة Baudsurfer 2014 - 64 بايت - وصلة
  • إصدار HellMood 2018 - 32 بايت - رابط

ألواح الداما المنظر



Projektbeschreibung ، 32 بايت

، أصدرت لوحات شطرنج المنظر في 2018 كتأثير 32 بايت Projektbeschreibung. في ذلك ، حاولت تقليل حجم "Follow the light" ( link ) من "Digimind" (2006) أو "Lucy" الخاص بي (2014) ( link ) إلى 32 بايت. مصادر الإلهام المفيدة للغاية كانت Paralaxa by Rrrolas (32 bytes، 2007، link ) و Byteropolis by Sensenstahl (2013) ( link) كانت تقنية عرض Rrrolas قريبة جدًا من قراري النهائي ، وتم تغيير الرمز لتصحيح موقع الطائرات ، واستبدال المثلثات بألواح الشطرنج ، وتحسين الألوان. استخدمت الذكريات مخطط ألوان إصدار Digimind. بالإضافة إلى ذلك ، تم تعديل التأثير إلى أقصى حد لتقليل التشوهات.

Sierpinski rotozoomer



colpinski ، 16 بايت


دائري ، 32 بايت

ويتكون من تأثيرين: تأثير rotozoomer و Sierpinski كمادة. يعتمد تأثير Sierpinski على تأثير Colpinski 16b 2013 الخاص بي ( الرابط ) ، حيث تمكنت من الحصول على أقصى قدر ممكن مع وظيفة fsqrt. هذا التأثير ليس له سلف ، لأنه يمكن تنفيذه مباشرة من خلال الجمع بين X و Y ، بدلاً من استخدام نظام الوظائف المكررة أو الأتمتة الخلوية. تم إصدار "rotation and scaleing" (rotozoomer) من قبلي في عام 2017 كمقدمة 32b "rotastic" ( حلقة الوصل ) ، وهي تستند إلى أفكار "ryg" للمطور Farbrausch (51 بايت ، 2002 ، link ) و "Gargaj" من مجموعة "Conspiracy" "(49 بايت ، 2002 ، ارتباط ).

نفق Raycast عازمة



في عصر جديد ، إصدار 64 بت

أصبح نفق raycast المثني نسخة معدلة من إصداري 64 بايت الخاص بي ، "في عصر جديد" ( رابط 2018 ). تم استبدال الألوان الأصلية بألوان اللوحة القياسية ، وتم تغيير الهندسة والحسابات المقابلة بشكل طفيف بحيث لم يتم استخدام تأثير العمق لحساب قيم النسيج. نسخة منفصلة من هذا التأثير حجمها 50 بايت. كانت المصادر الرئيسية للإلهام لإنشاء الإصدار 64 بايت هي مقدمو 128 بايت: "Spongy" من "TBC" (2009 ، link ) و "Wolf128" بواسطة Baudsurfer (2014 ، link ) ، وقمت بتطوير الخوارزمية بنفسي.

ليلة المحيط ليوم



Ocean ، الإصدار 64b

يعتمد تأثير المحيط على إصدار 64 بايت الخاص بي من "Ocean" 2016 ( حلقة الوصل ). تم قطع جيل منفصل من الألوان والموسيقى الأصلية ، ولم يكن كلا المولدين متوافقين مع إطار Memories الرئيسي دون استخدام أكوام من وحدات البايت الإضافية. يرجع التأثير الخاص لـ "الفجر" إلى التنفيذ الشامل لهيكل الإطار. سأتحدث عن هذا في الفصل التالي.

تأثير التلاشي


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

إطار عمل "أكاديمية صغيرة"


لدمج العديد من التأثيرات الصغيرة في "megademo" واحد ، يجب عليهم استخدام نفس التقنية وعلى الأكثر لا يجب عليهم تطبيق الافتراضات (فيما يتعلق بمحتويات الذاكرة والسجلات). كما يُطلب منهم استخدام نفس قيم التوقيت والعمل وفقًا لإجمالي الوقت. استغرق الأمر وقتًا طويلاً لإعداد تأثيرات فردية مناسبة للإطار ، وفي البداية الكثير من المساحة الإضافية. وتجدر الإشارة إلى أن بعض التأثيرات الأكثر إثارة للإعجاب (إذا حكمنا من خلال رد فعل المشاهدين ووجهات النظر على الشبكات الاجتماعية) لا يمكن تضمينها في العرض بسبب الاستخدام المفرط للذاكرة. بعد أن تم إصلاح جميع التأثيرات ، كان بإمكاني البدء في التفكير في "وضع أقواس" للحسابات المتكررة بشكل متكرر ، الأمر الذي سيوفر بضعة بايتات إضافية.يقوم الإطار بتنفيذ الإجراءات التالية:

  • 320 x 200 256


  • 35 FPS
  • ESC
    • ESC,


org 100h
s:
	mov al,0x13				; set AL to mode 320*200 in 256 colors
	int 0x10	 			; call BIOS to set mode
	xchg bp,ax				; set timing value to 0x13 
	push 0xa000-10			; write the screen adress to register ES
	pop es					; works in conjunction with Rrrola trick
	mov ax,0x251c			; parameter for changing timer interrupt
	mov dl,timer			; adress of timer routine, assume DH=1
	int 0x21				; install timer routine
top:
	mov ax,0xcccd			; load magic Rrrola constant
	mul di					; transform screen pointer to X, Y
	add al,ah				; use transformation garbage as
	xor ah,ah				; pseudorandom value and clear AH
	add ax,bp				; add time value to random value
	shr ax,9				; divide by 512 (basically the speed)
	and al,15				; filter effect number
	xchg bx,ax				; move effect number to BX
	mov bh,1				; reset BH to align with start of code
	mov bl,[byte bx+table]	; read the effect address from the table
	call bx					; call the effect
	stosb					; write the return value and advance
	inc di					; triple interlace trick for after
	inc di					; effect and smoothing the animation
	jnz top					; repeat until the frame is complete
	mov al,tempo			; set AL to divider for timer
	out 40h,al				; set timing (dual pass)
	in al,0x60				; read keyboard
	dec al					; quit on ESC
	jnz top					; otherwise repeat loop
sounds: db 0xc3, 11, 0x93; 0xc3 is MIDI/RET; fx2-s is used as volume
table: 	db fx2-s,fx1-s,fx0-s,fx3-s,fx4-s,fx5-s,fx6-s,sounds-s,stop-s


صفيف من ألواح الشطرنج



مجموعة من الشطرنج

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

	xchg dx,ax		; get XY into AX
	sub ax,bp		; subtract time from row
	xor al,ah		; XOR pattern (x xor y)
	or al,0xDB		; pattern for array of boards
	add al,13h		; shift to good palette spot

تكبير الدوائر



دوائر الزووم

المسافة D من النقطة (X، Y) إلى المركز (0،0) هي sqrt (X² + Y²). جعل الإطار مسبقًا DL يحتوي على الإحداثيات X المركزية ، و DH = Y بحاجة إلى توسيط في التعليمات البرمجية. لإجراء عملية حساب الجذر التربيعي في x86 ، هناك حاجة إلى الكثير من التعليمات البرمجية ، ولكن في الواقع يمكن حذفها. مع اختيار دقيق للألوان ، يبدو شعور الدوائر المتقاربة بدون جذر تربيعي مقنعًا تمامًا.

	mov al,dh		; get Y in AL
	sub al,100		; align Y vertically
	imul al			; AL = Y²
	xchg dx,ax		; Y²/256 in DH, X in AL
	imul al			; AL = X²
	add dh,ah		; DH = (X² + Y²)/256
	mov al,dh		; AL = (X² + Y²)/256
	add ax,bp		; offset color by time
	and al,8+16		; select special rings

التمرير الطائرة المائلة



التمرير المستوي المائل

يتم تنفيذ هذا التأثير على النحو التالي: أولاً ، لمحاكاة المسافة ، يتم تقسيم ثابت كبير على رقم السطر Y. ثم يتم استخدام القيمة التي تم الحصول عليها مرتين: أ) مضروبة في القيمة المتمركزة في X و b) كتعويض عن الوقت الحالي. ثم يتم دمج هذه النتائج باستخدام نمط XOR ، الذي يتم اختيار نمط خاص منه.

	mov ax,0x1329	; initialize with constant
	add dh,al		; preventing divide overflow
	div dh			; reverse divide AL = C/Y'
	xchg dx,ax		; DL = C/Y', AL = X
	imul dl			; AH = CX/Y'
	sub dx,bp		; DL = C/Y'-T 	
	xor ah,dl		; AH = (CX/Y') ^ (C/Y'-T)
	mov al,ah		; move to AL
	and al,4+8+16	; select special pattern

ألواح الداما المنظر



لوحات المدقق المنظر

هذا هو نوع من reykasting (انبعاث الأشعة) مع الهندسة الديناميكية. يتم تقسيم كل مستوى من الكائنات بشكل أفقي بسبب الضرب 16 بت مع علامة وعموديًا بسبب تشغيل المنطق الضمني مع رقم العمود. بالإضافة إلى ذلك ، يتم تطبيق تشويه غير مباشر لربط حواف الشبكة الناتجة (4 مناطق "صلبة" ، 4 مناطق "شفافة" بالتناوب). إذا تخطت الحزمة أحد المناطق الصلبة ، يصبح اللون هو رقم التكرار (+ إزاحة اللوحة في ظلال الرمادي) ، وإذا لم يكن كذلك ، ينتقل المستوى إلى مؤشر الشاشة ، وبعد ذلك تتكرر العملية حتى يتم الوصول إلى الحد الأقصى لعدد التكرارات.

	mov cx,bp		; set inital point to time
	mov bx,-16		; limit to 16 iterations
fx3L:
	add cx,di		; offset point by screenpointer
	mov ax,819		; magic, related to Rrrola constant
	imul cx			; get X',Y' in DX
	ror dx,1		; set carry flag on "hit"
	inc bx			; increment iteration count
	ja fx3L			; loop until "hit" or "iter=max"
	lea ax,[bx+31]	; map value to standard gray scale

Sierpinski rotozoomer



sierpinski rotozoomer


الرسم البياني 1 / cos (atan (x)) ، الذي تم إنشاؤه باستخدام www.google.com

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

x' = x*cos(a) - y*sin(a)
y' = x*sin(a) + y*cos(a)

إذا أضفنا مقياسًا ، فستبدو كما يلي:

x' = z * (x*cos(a) - y*sin(a))
y' = z * (x*sin(a) + y*cos(a))

الآن دعنا نقول أننا لا نحدد z أنفسنا ، ونضع 1 / cos (a) خارج الأقواس:

x' = 1/cos(a) * (x - y*tan(a))
y' = 1/cos(a) * (x*tan(a) + y)

الآن نستبدل tan (a) بمتغير زمني ، لأن وظيفة المماس تميل إلى اللانهاية حيث تقترب من 180 درجة:

x' = 1/cos(atan(T)) * (x - y*T)
y' = 1/cos(atan(T)) * (x*T + y)

إذا كنا لا نهتم بنقص القدرة على تعيين عامل التحجيم ولا نتحكم في الزاوية مباشرة ، يمكننا الآن الدوران من -180 درجة إلى + 180 درجة دون استخدام الدوال المثلثية. ونتيجة لذلك ، اتضح أن عامل التحجيم مرتبط بالوقت T. وتظهر وظيفة المعامل في الصورة ، بسبب حدوث التحجيم من رقم متناهي الصغر إلى واحد (الحجم الأصلي) والعودة إلى متناهية الصغر. تم إنفاق قدر لا بأس به من وحدات البايت في تزيين هذا التأثير ، وإصلاح تعويضات الوقت ، وتسريع الرسوم المتحركة ، وزيادة بكسلات مثلثات Sierpinski وإنشاء ألوان جميلة ، ولكن أعتقد أن الأمر يستحق ذلك.

	lea cx,[bp-2048]; center time to pass zero
	sal cx,3		; speed up by factor 8!
	movzx ax,dh		; get X into AL
	movsx dx,dl		; get Y int DL
	mov bx,ax		; save X in BX
	imul bx,cx		; BX = X*T
	add bh,dl		; BH = X*T/256+Y
	imul dx,cx		; DX = Y*T
	sub al,dh		; AL = X-Y*T/256
	and al,bh		; AL = (X-Y*T/256)&(X*T/256+Y)
	and al,252		; thicker sierpinski
	salc			; set pixel value to black
	jnz fx4q		; leave black if not sierpinski
	mov al,0x2A		; otherwise: a nice orange
	fx4q:

نفق Raycast عازمة



نفق raycast منحني

هذا هو نوع من الأنفاق مع rakasting من "إلى عصر جديد" (انظر أعلاه). تم نشر وصف تفصيلي لهذا التأثير لبرنامج Essence مماثل على reddit. تخلصت من الألوان الفريدة ، وغيرت اتجاه الإمالة ، وأصبحت الهندسة أكثر إغلاقًا لتحسين الأداء على أجهزة الكمبيوتر القديمة وفي DosBox.

	mov cl,-9		; start with depth 9 (moves backwards)
	fx5L: 
	push dx			; save DX, destroyed inside the loop
		mov al,dh	; Get Y into AL
		sub al,100	; Centering Y has to be done "manually".
		imul cl		; Multiply AL=Y by the current distance, to get a projection(1)
		xchg ax,dx	; Get X into AL, while saving the result in DX (DH)
		add al,cl	; add distance to projection, (bend to the right)
		imul cl		; Multiply AL=X by the current distance, to get a projection(2)
		mov al,dh	; Get projection(1) in AL
		xor al,ah	; combine with projection(2)
		add al,4	; center the walls around 0
		test al,-8	; check if the wall is hit
	pop dx			; restore DX
	loopz fx5L		; repeat until "hit" or "iter=max"
	sub cx,bp		; offset depth by time
	xor al,cl		; XOR pattern for texture 
	aam 6			; irregular pattern with MOD 6
	add al,20		; offset into grayscale palette

ليلة المحيط ليوم



ليلة المحيط


يوم

المحيطات تأثير المحيط مثال ممتاز على "حظ". إذا قمنا بتحميل القيمة في FPU كعدد صحيح وقمنا بتخزينها كنقطة عائمة ، ثم قمنا بتفسيرها مرة أخرى كعدد صحيح ، فإننا نحصل على نمط رائع. إذا قمت بدمج هذا مع التقسيم العكسي ، فستحصل على تأثير موجة جميل. إنه يعمل بشكل وثيق مع تسجيل DX ، الذي يحتوي على انعكاس إشارة في الموضع الذي نحتاجه ، حتى نتمكن بسهولة من فصل السماء عن البحر. ومع ذلك ، فإن اللمسة النهائية هي اللون. وفقًا لهيكل الإطار العام ، يتم تحديد قيمة AL عند إدخال الوظيفة ، وتحتوي على عنوان التأثير. من خلال تبديل الشفرة قليلاً ، يمكنك الحصول على لون السماء "مجاني" بدون استخدام التعليمات ، تمامًا مثل لون "الانتقال إلى اليوم" ، وهو أيضًا عنوان التأثير. وهذه ليست صدفة سعيدة. في إصدارات أخرى بخلاف إصدار DosBox ،قد يختلف لون السماء لهذا السبب.

	sub dh,120			; check if pixel is in the sky
	js fx6q				; quit if that's the case
	mov [bx+si],dx		; move XY to a memory location
	fild word [bx+si]	; read memory location as integer
	fidivr dword [bx+si]; reverse divide by constant
	fstp dword [bx+si-1]; store result as floating point
	mov ax,[bx+si]		; get the result into AX
	add ax,bp			; modify color by time
	and al,128			; threshold into two bands
	dec ax				; beautify colors to blue/black

تأثير التلاشي


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

	mov ax,0xcccd			; load magic Rrrola constant
	mul di					; transform screen pointer to X, Y
	add al,ah				; use transformation garbage as
	xor ah,ah				; pseudorandom value and clear AH
	add ax,bp				; add time value to random value
	shr ax,9				; divide by 512 (basically the speed)
	and al,15				; filter effect number
	xchg bx,ax				; move effect number to BX
	mov bh,1				; reset BH to align with start of code
	mov bl,[byte bx+table]	; read the effect address from the table

موسيقى MIDI


يزيد هذا القسم من التعليمات البرمجية من قيمة الوقت ويخلق صوتًا. باختيار القناة 3 ، يمكننا إعادة استخدام تعليمات "تغيير أداة القناة" على أنها "RET". من خلال تحويل رمز التأثير ، يمكنك إنشاء قيمة مناسبة لوحدة التخزين ، والتي تحفظ بايت آخر. تجدر الإشارة إلى أن هذا الجزء من الرمز يعمل فقط إذا كان جهاز MIDI في وضع UART بالفعل ، وإلا فستحتاج إلى إنفاق ثلاثة بايت أخرى. أخبرني العديد من المتفرجين والمنظمين أن اللحن يشبه إلى حد ما Incantations لمايك أولدفيلد ، ولكن تم إنشاؤه بتقنية بسيطة جدًا. منذ Hypnoteye 2015 ، جربت MIDI الإجرائي وأصدرت في النهاية إطار عمل MIDI صغير (64 بايت). المبدأ الرئيسي لعمله هو القفز مع درجة ثابتة في مساحة النغمة وتحويل القيم العالية إلى قيم أقل (بواسطة modulo القسمة). يمكن لمجموعات بسيطة من عرض النطاق الترددي و modvalue تحقيق تأثيرات مثيرة للاهتمام. على سبيل المثال ، stepwidth = 3 يسمح لك بالحصول على وتر طفيف مخفض باستمرار ، و stepwidth = 4 أو stepwidth = 6 - تأثيرات مثلثية. باستخدام modvalue المختار جيدًا ، يمكن لهذه الأنماط إنشاء تسلسلات. لم أجري تحليلاً نظريًا مناسبًا ، ولكني ببساطة استكشفت مساحة النغمات والأصوات المثيرة للاهتمام.

sounds: db 0xc3, 11, 0x93, fx2-s
...
		inc bp				; increment timing value
		test bp, 7			; play a note every 8th step
		jnz nomuse			; quit if in between
		mov dx,0x330		; port number for MIDI
		mov si,sounds		; adress for sound data
		outsb				; change instrument of channel 3
		outsb				; to vibraphone
		outsb				; play a note on channel 3
		imul ax,bp,-19*32*4	; the magic melody constant
		shr ax,10			; scale down and implicit "and 63"
		add al,22			; pitch base is 22
		out dx,al			; play THIS note on channel 3
		outsb				; play it with THIS volume

كود الافراج الكامل


; "memories" by HellMood/DESiRE
; the tiny megademo, 256 byte msdos intro
; shown in April 2020 @ REVISION
;
;   (= WILL BE COMMENTED IN DETAIL LATER =)
;
; create : nasm.exe memories.asm -fbin -o memories.com
; CHOOSE YOUR TARGET PLATFORM (compo version is dosbox)
; be sure to use the dosbox.conf from this archive!
; only ONE of the defines should be active!
%define dosbox			; size : 256 bytes
;%define freedos		; size : 230 bytes
;%define winxpdos		; size : 263 bytes

; DON'T TOUCH THESE UNLESS YOU KNOW WHAT YOU'RE DOING
%ifdef winxpdos
	%define music
	%define switch_uart
	%define safe_dx
	%define safe_segment
%endif
%ifdef freedos
	%define safe_dx
%endif
%ifdef dosbox
	%define music
	;%define safe_dx ; sometimes needed
%endif

; GLOBAL PARAMETERS, TUNE WITH CARE!
%define volume 127	; not used on dosbox (optimization)
%define instrument 11
%define scale_mod -19*32*4; 
%define time_mask 7
%define targetFPS 35
%define tempo 1193182/256/targetFPS		
%define sierp_color 0x2A
%define tunnel_base_color 20
%define tunnel_pattern 6
%define tilt_plate_pattern 4+8+16
%define circles_pattern 8+16

org 100h
s:
%ifdef freedos
	mov fs,ax
	mov [fs:0x46c],ax
%endif
	mov al,0x13
	int 0x10	 
	xchg bp,ax
	push 0xa000-10
	pop es
%ifndef freedos
	mov ax,0x251c
	%ifdef safe_dx	
		mov dx,timer	
	%else ; assume DH=1, mostly true on DosBox
		mov dl,timer
	%endif
	int 0x21
%endif
top:
%ifdef freedos
	mov bp,[fs:0x46c]
%endif	
	mov ax,0xcccd
	mul di
	add al,ah
	xor ah,ah
	add ax,bp
	shr ax,9
	and al,15
	xchg bx,ax
	mov bh,1
	mov bl,[byte bx+table]
	call bx
	stosb
	inc di
	inc di
	jnz top
	mov al,tempo
	out 40h,al
	in al,0x60
	dec al
	jnz top
sounds:
	db 0xc3	; is MIDI/RET
%ifdef music
	db instrument,0x93
	%ifdef switch_uart
		db volume		; without switch, volume is in table
		db 0x3f 
	%endif
%endif
table: ; first index is volume, change order with care!		    					
	db fx2-s,fx1-s,fx0-s,fx3-s,fx4-s,fx5-s,fx6-s,sounds-s,stop-s
stop:
	pop ax
	ret
timer:
%ifndef freedos
	%ifdef safe_segment
		push cs
		pop ds
	%endif
		inc bp
	%ifdef music	
		test bp, time_mask
		jnz nomuse
		mov dx,0x330
		mov si,sounds
		outsb
		outsb
		outsb
		imul ax,bp,scale_mod
		shr ax,10
		add al,22
		out dx,al
		outsb
		%ifdef switch_uart
			inc dx
			outsb
		%endif
	%endif
nomuse:
	iret
%endif	
fx0: ; tilted plane, scrolling
	mov ax,0x1329
	add dh,al
	div dh
	xchg dx,ax
	imul dl
	sub dx,bp
	xor ah,dl
	mov al,ah
	and al,tilt_plate_pattern
ret
fx2: ; board of chessboards
	xchg dx,ax
	sub ax,bp
	xor al,ah
	or al,0xDB
	add al,13h
ret
fx1: ; circles, zooming
	mov al,dh
	sub al,100
	imul al
	xchg dx,ax
	imul al
	add dh,ah
	mov al,dh
	add ax,bp
	and al,circles_pattern
ret
fx3: ; parallax checkerboards
	mov cx,bp
	mov bx,-16
fx3L:
	add cx,di
	mov ax,819
	imul cx	 
	ror dx,1	 
	inc bx	 
	ja fx3L
	lea ax,[bx+31]	 
ret
fx4: ; sierpinski rotozoomer	
	lea cx,[bp-2048]
	sal cx,3
	movzx ax,dh
	movsx dx,dl
	mov bx,ax
	imul bx,cx
	add bh,dl
	imul dx,cx
	sub al,dh
	and al,bh
	and al,0b11111100
	salc				; VERY slow on dosbox, but ok
	jnz fx4q
	mov al,sierp_color
	fx4q:
ret
fx5: ; raycast bent tunnel
	mov cl,-9
	fx5L: 
	push dx
		mov al,dh
		sub al,100
		imul cl
		xchg ax,dx	
		add al,cl
		imul cl
		mov al,dh
		xor al,ah
		add al,4
		test al,-8
	pop dx
	loopz fx5L
	sub cx,bp
	xor al,cl
	aam tunnel_pattern; VERY slow on dosbox, but ok
	add al,tunnel_base_color
ret
fx6: ; ocean night / to day sky
	sub dh,120
	js fx6q
	mov [bx+si],dx
	fild word [bx+si]
	fidivr dword [bx+si]
	fstp dword [bx+si-1]
	mov ax,[bx+si]
	add ax,bp
	and al,128
	dec ax
fx6q:
ret

مكافأة - NFO / ASCII
                                                             art : hammerfist
         ∂#MW%e                              _d$Ng,
         'B,  ∂b                   _jM@$QZb,cQ"  )@
  ,edRB$b,l@   Wk,yGR$KM&$b,     ,dP"     Wl ]bsd%UR8BG6&$@DSyG#ZKM&$b,
,dP      "T%L  'MGF      "*∂R_   Tg    "*4Zk,#I  YP   W"    7P      "*∂R
4M   gd@    ^   ∂@   d@b   dQ$#@Z@R3L_    "*GMj  'W      ,gd$   d@b   9Q$#%b
W#,  `M          Wb  `*  _4P   `Qk  *#N8L   `H5   @b   'QR7YK   `*  _4F"   Qk
`6@L             dML            '@          ,BK   'M    ∂B  *b,            '#L
  ^QBb,_     _,4&M∞∂@=,_       _dGL       _gQKM    GL    @k  'Mg,_         _dG,
    "*BN5W$2#MNP"   "*G3WRM8&B5P"`Y@QNW3Z5P" ∂#$W8BRM3XZN87    "*GW38M%EBDW5P"`


                              p r e s e n t s

            4
           d@,
         _& `Wl
      _,aP   "#baedM$#@@K JP*"?ML
 ,ad@$#P"         ,d@NEWVB"     X,aQPYb,_
V@Mm,_          ,d@MW#BW'      EMP"   '¶R ,ngBP^fML
 ¶M@N@y        Y#BNW#M"       J9"      `MQ9"      "MgRBq  ,QBMg,
  VN#P` ,d@@    `WM@^                   7f         ¶F` 7kY"   ^G  _.eQNE1.
   ]B _G@MWN$,   `P                     '     4b       QP      ¶w@F*^  ^Qb
   ]O@NRM#W@MNB,         ;                    ^`      j        JP^       Yl
  J#NRNWM@#BcT"^        ,A  _J                     _q@                   `X
 '¶WM#B@WdY`,7        _G#YN#PM                 _,gG"                      M,
  *BN#WP"  dK       ,Q@NRMB"]9       ,      _,M@Q*                        #A
   "U^      V@h,   iNBW#NT  J'      J9     s@QN"         _;               'D,
             ¶RMBv&NMQR@9  .W      .K'     "9`         ,6BA   _JL          ]l
              Y#NE@W#NRP   #[      `¶8               _d@MW#B_jW#W          BN
               "GQ@MR#W    QL_      *B            _,p#NBW#NQMG@WY          3Q
                  "Y@F     ,XW@M%im,_Yb_     _,g5@#MW@QMNE@E@NRMB         ,WM
                    `  _,gP*"#REM#GB@N#MQbnd@N#M@MW#R8QSB^'WQERM@        ;4NB,
                     ,GYKL    ¶E#B8R8QSB@M@#BM#W@MNB"`_  ,  "^` N       ,dW@Ql
                   _Q`'W`*t    '¶@GS#MBQ#E@W#NQBW[     'LvQ_   ,K    _dNABGM#N
                  ,F   '          `^WAB@QGE9*"9^*@L    jP7FY,  ¶h,_.jWM#BR#GBM,
                 J;    ,   _                  '       '   "LL  YxE#B8R8QSBNW@W;
                AP   _,Ag6^          _   J                  ¶A  `"Q#M@MW#R8E#P
               j@   `"XQW[            'LvK,_      'L_,/      @t    Y#NE@WNR"
              :M/     9^*@L           jP7F"       _PYKL     _,A;     ¶RSNQ"
              dKL     '     `        '   "L      "`'W`*t   `"XQb      `W^
              Q`8t            'L_,/         ,   _   '        9^Q
             ,W               _PYKL       _,Ag6^             ' W,     _ ,#N&
             !N  _   J       "`'W`*t     `"XQW[       _  J     N!_JG9^RwQ' *t
             `W,  'LvK,_        '        _gGB8@L   _   'LvK,_ ,WgB'    V    7L
         _.,gm&@B&wBZF"                j@'`  "WL _gML  jZd7Yb lN"          dBWl
      ,g&QB*"^`    `"*G@g, .gR&k,_   ,N"      '@QF  ¶k;gMF  *QvQ     jQ, ,@N@B#,
   .eQF*`              `Yb@"  "*6Qg,gF     ,   7     XMN"    'MNB,    ^¶QWSER@N;
 ,gP"           qy,      W'       ^Q'     &L      ,g@W'       `QMEL     `"WBNWP
g7              ¶9      ,X         M?     9"   _q8MSK           ¶EMt       *@K
Vh   _,m#L             _AH        le         ,GBDNE9^A,          *@F        NMg
 ¶L,qQ@ND           _.m@Bl        We      ,gM@B8#Q'   ¶h_                   lWE,
  W9NHW@`          JWM#B@]        @e     4WR@NGF^      'QL                  dRWl
   VMd*            "@BE@PM        'N      *UP"           VW,               JRSB;
  ,@F       j       `¶WK W,        ¶t                     XNt            _A@E#N
_JP       ,6&         "GLdM         XD,               _.g8NMA@k,_    _,gG#NMGR;
"Z      .JRER           'VMi     _jNB#W&_         _,j@E@W#Nl ¶MBGMNQGNQMG@QBW9
 ¶h   ,G@NRMBl            `"   ,d#R@M$F ¶Mg,_.gp&@@NEWVBWBMG  *QMN8R8SBN$E@WF
  Vb dW#R8QSRb,                 *YM@EQ,_ 'MENBW#NQMG#B@R@MW#l   "BM@QNENRQG'
   *WGS#MBMNEYL                    `^"*8M@Q@NRM#W@BWSNW@QBF"`     `^*@QBF^ [HFT]
    ^M@MW#Q9 ^Wt                           `^¶RQ@W8NQGP*`
     ¶Q#@P     Vk                            lA `"^`
      Y"       `MA                           J#,
                *R@,                        ,MQl
                 Y#Wk,                      GWM8L
                  W8RQSt,_                 AQ@MR#,
                  `@M@#SB@Mbm.,_          QNBW#NW
                    ¶QB8R8SBN$WNRM@#GNtwg@NMQR@B'
                     *MBQ#8R8QS@NE@WNBW#NQMG@NR;
                      `WGS#MBQ#R8QSB@NE@W#NQBW9
                        *OMW@QMNE@E@NRMW@QMB@*
                          `^"YQW@Q#SB#NE@EGP
                               `^"*8R@GBQF`


All Articles