الخلفية

قام Kay Savetz بإعداد Apple II bot والذي يعيش على Twitter وسيأخذ 280 حرفًا تغريدة ترسلها وتشغيلها في Applesoft BASIC على محاكي Apple II.

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


Flame Demo (64 -بايت التجمع)


حلقة الوصل

كانت فكرتي الأولى هي معرفة ما إذا كان بإمكاننا تشغيل بعض لغات التجميع ، لذا من الجيد المحاولة هي 64B Flame Demo .

تستخدم هذه المحاولة الأولى الطريقة التقليدية لإدخال لغة التجميع من BASIC عبر Applesoft: لديك عبارات DATA تحتوي على بيانات 8 بت أولية للغة 6502 Machine Language ، تقرأ القيم ثم قم بتجميعها في مساحة خالية من الذاكرة (غالبًا 300 دولار (وهو 768 في النظام العشري ، على 6502 آلة دولار يستخدم ليعني سداسي عشري)) ثم اتصل به.

لاحظ أن هذا الرمز أطول من 256 حرفًا مما يعني أنه على الرغم من كونه برنامجًا صالحًا لـ Applesoft ، فلا يمكنك كتابته في Apple II لأنها ستتجاوز المخزن المؤقت لإدخال لوحة المفاتيح. ومع ذلك ، يمكنك ترميزه وتحميله من القرص ، وهو ما يجب أن يفعله روبوت Apple II. 1 لـ X=768TO832: اقرأ أ: POKE X التالي: CALL 768: DATA 44،80،192،44،82،192،32،112،252،169،255،145،42،136،16،251،169،22،133،37،32،34،252،160،39،104،240،5،10،240،410،297،2 ، 40،41،7،170،189،57،3،145،40،136،16،230،198،37،16،221،48،205،0،187،0،170،0،153،0،221 نجح هذا ، ولكن بعد الرابعة صباحًا جعلني أفكر في طرق أكثر إحكاما لمحاولة ملاءمة البرامج الأكبر حجمًا. لقد بحثت في الطريقة التي فعل بها سلام أبراهام الأشياء من خلال دخوله “Mesmerizer Exorciser” Kansasfest 2020 Hackfest ، لكن اتضح أن هذا أكبر قليلاً من أن يتناسب مع تغريدة.

تقوم محاولتي التالية بتحميل برنامج لغة تجميع قصير يقوم بعد ذلك بفك تشفير سلسلة. السلسلة هي لغة الآلة مع كل بايت مقسم إلى قيمتين: الأولى تم إزاحتها إلى اليسار بمقدار ثلاثة ثم xored مع الثانية للحصول على القيمة.

لماذا لا تقوم فقط بتضمين قيم 8 بت خام؟ على Twitter ، سنفترض أنه يمكنك فقط تمرير نص ASCII ، بحيث يحدك من قيم 7 بت. بالإضافة إلى ذلك ، لا يمكنك إرسال أحرف تحكم (أول 32 قيمة) وفي Apple II + لا يمكنك إرسال أحرف صغيرة ، مما يقلل من الأشياء. في النهاية ، أنت مقيد إلى حد ما بحوالي 6 بت (64 قيمة) وعليك إنشاء رمز الجهاز من ذلك.

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

1 لـ X=768TO789: اقرأ أ: POKE X ، A: NEXT: CALL768: DATA162،0،189،106،8،48،12،10،10،10،93،171،8،157،0،12،232،208،239،76،0،12 9 “MBPMBPLFW] WZMYJW] JXLLLW LEVHIVHZHO_] ح 9] 9] 9] L’Y ^ TY ^ I : @ A DY .JY A JY A I ^ “) ^ 1 ^ A ^ *!” JI ، HI TG ([] I I (5] 3 P “) 90’6” F)=8KBI.) H٪ 1 @ & 1F1WA6٪=: S50 @ “E، 2FORI=0TO116: C=INT ((نظرة خاطفة (2171 + I / 3) -32) / 4 ^ (I-INT (I / 3) 3)): POKE768 + I ، ((نظرة خاطفة (2054 + I) – 32) 4) + C-INT (C / 4) 4: التالي: CALL768


سفينة فضاء – أبل سوفت قابل للتشكيل


حلقة الوصل
بعد أن تمكنت من التوافق مع الخريف ، تخليت عن لغة التجميع وعدت إلى الترميز في Applesoft. واحد الشيء الذي تقوم به Applesoft هو “Shape Tables” وهي مكتبة رسوم برمجية متجهة مدرجة في ذاكرة القراءة فقط.

لاستخدام جداول الأشكال ، يمكنك رسم المتجهات . يمكنك فقط السحب + تحريك لأعلى / لأسفل / لليسار / لليمين وحركة القلم لأعلى (بدون رسم) لأعلى / لأسفل / لليسار / لليمين. كل عملية هي ثلاث بتات ، يمكنك حزم اثنين أو في بعض الأحيان ثلاثة توجيهات لكل بايت و هناك رأس برقم الشكل s وإزاحة الأشكال.

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

بمجرد الحصول على الأشكال الخاصة بك ، يمكنك رسمها في مكان ما ، أو XDRAW لرسمها (مما يسهل الرسم والمسح). يوجد ROT للتدوير و SCALE على نطاق واسع.

يخبر السطر 2 في الكود شركة Applesoft حيث يكون القابل للتكوين عن طريق POKEing العنوان القابل للتكوين في العنوان الصحيح صفر عناوين الصفحة. يعتمد جدول الشكل في REM على كونه في السطر 5 ، لأننا نعتمد على التخطيط الفعلي لبرنامج BASIC.

نشير القابل للتشكيل إلى معالجة 814 دولارًا. إذا نظرت هناك في الذاكرة تجد القيم

29 08 05 00 B2 37 … إن 29 08 (القليل من Endian) هو في الواقع جزء من القائمة المرتبطة ببرنامج BASIC في الذاكرة مشيرا إلى السطر التالي. 05 00 هو رقم السطر. و B2 هو رمز REM متبوعًا بالبيانات. بالإشارة إلى الرقم 29 ، نقول إن لدينا شكلًا بقيمة 29 دولارًا ، لكن هذا لا يهم لأننا نستخدم الشكل الأول فقط. تم تجاهل القيمة التالية. التالي هو الإزاحة للشكل الأول (من البداية). نظرًا لأن هذا هو 5 ، فإنه يتخطى REM ويذهب إلى البيانات.

والباقي هو مجرد برنامج Applesoft BASIC العادي ، فهو يرسم بعض النجوم العشوائية ، ويحرك سفينة الفضاء ، ويوجه بعض النيران ثم يتكرر. 2 POKE232،20: POKE233،8 5REM7: ‘٪ ٪، 5 ..> ‘


Nyan Cat – جداول الشكل وتقليب الصفحة


حلقة الوصل

أردت أن أفعل شيئًا باستخدام جداول تقليب الصفحات وتشكيلها ، وربما تكون ميزتا الرسومات الوحيدتان اللتان يمكن أن تقدمهما Apple II بشكل أفضل من أجهزة الكمبيوتر الأخرى ذات 8 بت. كنت أفكر في شيء مثل حفلة قابلة للكسر عرض توضيحي.

في النهاية ، كانت محاولة إنشاء جداول بأشكال ASCII معقدة تتطلب الكثير من العمل. ولكن بعد ذلك ، وبشكل غريب ، كان لدي حلم حيث صنعت نسخة HGR من Nyan Cat. لذا ها هو ، برنامج جلب الكثير من الفرح.

ليس هناك الكثير من الإثارة حوله. ، يتم عمل poptart-cat shapetable بشكل أو بآخر كما في المثال السابق. يستخدم HGR: HGR2 لمسح كل من صفحات الرسومات وترك الأشياء على PAGE2. يتم رسم قوس قزح والقط أولاً على PAGE2 (يرسمهم الروتين في السطر 8). ثم يتم سحبهم مرة أخرى بإزاحة مختلفة قليلاً في PAGE1. يخبر POKE 230،32 إجراءات Applesoft أن ترسم إلى PAGE1 (2000 دولار) بدلاً من PAGE2 (4000 دولار). من الناحية المثالية ، سنعود إلى الصفحة 1 حتى نتمكن من رؤية كلاهما يتم رسمهما ، حيث توجد وقفة مزعجة أثناء رسم PAGE1 ولا يمكنك رؤيتها. ومع ذلك ، فقد نفدت الشخصيات التي يجب أن أقلبها قبل الرسم.

كما أشار البعض ، استخدمت تحسين الاتصال الذيل هنا ، حيث بدلاً من GOSUB9 واحد في المرة الأخيرة في السطر 8 ، انتقلت إلى السطر 9 وأترك ​​العودة من هناك تعود من GOSUB إلى السطر 8. هذا شيء أقوم به كثيرًا في تجميع 6502 ومن الممتع القيام بذلك في BASIC أيضًا.

حلقة العرض الفعلية هي السطر 7 الذي يقلب الصفحات بسرعة. تمت إضافة المكالمة V=0 لإبطاء الرسوم المتحركة قليلاً ، فهي تقريبًا بطيئة مثل GOTO7. حاولت وضع أشياء أبطأ (مثل الجذر التربيعي (SQR)) لإبطائها أكثر ، ولكن عليك أن تضع الأشياء مرتين أو أن الرسوم المتحركة غير متوازنة ولم يكن هناك مساحة كافية لشخصين.

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

2POKE232،20: POKE233،8 5REM $ ،. ، 6> ؟؟؟ $$ – 5 6ROT=0: SCALE=5: P=49236: HGR: HGR2: GOSUB8: Q=1: POKE230،32: GOSUB8 7POKEP + 1،0: V=0: POKEP، 0: GOTO7 8C=5: Y=80: XDRAW1AT134،102 + Q 2: GOSUB9: C=1: GOSUB9: C=6: GOSUB9: C=2 9HCOLOR=C: FORZ=YTOY + 5: FORX=0TO13: Q=NOTQ: HPLOTX 8، Z + QTOX 8 + 7، Z + Q: NEXTX، Z: Y=Z: RETURN


نمط التوظيف المزدوج


حلقة الوصل

كنت مهتمًا برؤية إذا كان بإمكاني الحصول على بعض الألوان الأفضل. لقد قمت بعمل عروض تجريبية Vapor Lock و تبديل وضع الشعاع في منتصف الشاشة لكنني كنت متأكدًا تمامًا من أن المحاكي المستند إلى Linux الذي يستخدمه برنامج Apple II bot لا يمكنه القيام بهذا النوع من حساب الدورة التأثيرات.

يبدو أن المحاكي يقوم بمحاكاة Apple IIe ، والتي فتحت المجال أمام رسومات مزدوجة عالية الدقة. هذه صعبة ولا يمكنك برمجتها بسهولة من Applesoft. لقد حاولت بالفعل في البداية ولكن واجهت بعض المشكلات في مساحة معقولة من الغرفة ، لذا فهي لغة التجميع.

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

{B10} 1REM (X (V C7PC #PC PJ (AYJ A_J (Y_I _ Y_I_RPT [3$ H H ($] H) C5P (1 C5P (1 B $ 8I_D) R @) _ 8 XP) ٪٪ 1 & 9Z) OF! S +! 7 ‘# 1GA # 2FORI=0TO77: C=INT ((نظرة خاطفة (2132 + I / 3) -32) / 4 ^ (I-INT (I / 3) 3)): POKE768 + I ، ((نظرة خاطفة (2054 + I) -32) 4) + C-INT (C / 4) 4: التالي: CALL768


شريط نقطي مزدوج عالي الدقة (تجميع 126 بايت)


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

لذلك قمت بتحسين حجم الشفرة كالمجانين ، بما في ذلك استخدام خدعة “BIT” لتجنب القفز وأشياء أخرى مختلفة وحصلت عليه وصولا إلى 126 بايت. انتهى هذا النمط إلى كونه غير منطقي إلى حد ما ، حيث كان علي استخدام EOR (xor) لحساب موقع الشريط الثاني ، ولكن هناك أكثر من لون واحد.

ثم قمت بتحسين اللودر الأساسي. لا يزال محمل qkumba 6 + 2 ، لكنني وجدت بعض الأقواس التي يمكنني إزالتها ، وقمت ببعض التغييرات في الجبر وأوامر التشغيل لإزالة المزيد من الأقواس ، وقمت ببعض الحيل باستخدام متغيرات صحيحة. يقوم Applesoft بكل شيء في الفاصلة العائمة ، ولكن يمكنك تحديد قيم عددية 16 بت والتي سيتم اقتطاعها ، مما يلغي الحاجة إلى INT (على الرغم من أن qkumba لاحظ لاحقًا أن ذلك قد لا يكون ضروريًا). 1REM (X (V C7PC # PC P1YJ (+ J! (+ F،! R0L “HR + HBC RTYA_F2 $ JJ! A_I_R! D 2 & 9_JO=A_F2Y_H H ($] H) C5P (؛ C5P (؛ B $ : JQ_ $ R8I_D) R @) _8 $ (، W [_XP) ٪٪: 0’TP! ((Z !!=5! V-AY-4 “0P٪T!T0@QT9X0.Y 2FORI=768TO894: C٪=(PEEK (1924+ I / 3) -32) / 4 ^ (I-INT (I / 3) 3): POKEI ، C٪ + 4 (نظرة خاطفة (1286 + I) -32-INT (C٪ / 4)): التالي : CALL768


اليقطين المرسوم على شكل صندوق


حلقة الوصل

خطرت لي هذه الفكرة أثناء جلوسي في اجتماع طويل حقًا لأعضاء هيئة التدريس. إنها مجرد د تحضير مجموعة من الصناديق. كل صندوق يحتوي على 5 قيم: color and x1، x2 to y1، y2. يتم رسمها في Applesoft مع مكالمات HLIN.

قمت برسم جاك أو فانوس لأنه يبدو أنه الشيء الموسمي الذي يجب القيام به ، كما كان الناس يفعلون ذلك على روبوت أتاري.

0GR: POKE49234،0: FORI=0TO13: READC ، A، B، Q، Z: COLOR=C: FORY=QTOZ: HLINA، BATY: NEXTY، I 9DATA 1،0،39،31،47،9،11،27،10،44،9،8،30 ، 13،42،9،6،32،16،37،9،5،33،20،30،4،17،21،4،9،13،11،15،18،22،13،24،28 ، 18،22،13،10،28،31،34،13،12،26،35،36،9،14،15،31،33،9،22،23،34،36،13،19،20 ، 22،27،13،17،22،26،27 ثم فكرت: هذه مجرد بيانات بسيطة ، والقيمة هي دائمًا من 0 إلى 48 ، فلماذا لا تجعلها مرمزة بـ 6 بت ASCII في عبارة REM؟

يحتوي الكود المحدث على الكثير من نقاط النظرة الخاطفة ، لذلك جربت خدعة جديدة حيث نستخدم تعريف وظيفة DEF FN لتوفير بعض المساحة (وفي نفس الوقت ابحث عن خطأ في أداة Applesoft tokenizer الخاصة بي فيما يتعلق بتحليل رمز DEF). الرمز المحدث أبطأ كثيرًا ، لكنه يجعل مشاهدته أكثر متعة أثناء رسمه. راجع إخلاء المسؤولية القياسي 4 صباحًا)

 {B1} 0REM !  G؟ O) +؛ L) (> - J) & @ 0E)٪ A4> $ 15 $) - + / 26-8 

Box-drawn Person


link

The pumpkin was only 14 boxes, but with the new compressed representationyou can fit up to 30 so I was looking for a more complex image to draw.I thought I'd try to do a person but I underestimated how hard it isto optimally take a complex sprite and translate it into boxes.So it took a while to try to do is manually.

I did not design the sprite myself, it's based on one thatcame up on a google searchfor pixelart here

I optimized the code slightly so you can fit in one more box thanthe previous code.

The below code is slightly better than the one in the actual tweet, it freesup another few bytes and also uses a GET A at the end to pause and notscroll the graphics.

0REM/ G O))>  (O)،؛ $ ') 18 "#، ?(> > BO (((. L 1DEFFNP (X)=نظرة خاطفة (2054 + I 5 + X) -32: GR: POKE49234،0: FORI=0TO29: COLOR=FNP (0): FORY=FNP (3) TOFNP ( 4): HLINFNP (1) ، FNP (2) ATY: NEXTY ، I: GETA  

صورة شخصية مرسومة مربع

)
    حلقة الوصل

لا شيء جديد في هذا ، لكنني اعتقدت أنه سيكون من الممتع بطريقة تكرارية أن تجعل AppleIIbot يرسم صورته الذاتية. (نعم ، أعرف أن AppleIIbot هو حقًا Raspberry Pi ، لكن الصورة الرمزية الخاصة به على Twitter هي هذه الصورة).

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

 0REM / GO  ؛ ! K- # 4HI- # 6DG-٪ 7 @ C- (8 ('.CF((2DG(-2??%#4JK%&3LM(47LM(9>  ٪=> CH، 77 "# 1DEFFNP (X)=نظرة خاطفة (2054 + I 5 + X) -32: GR: POKE49234،0: FORI=0TO29: COLOR=FNP (0): FORY=FNP (3) TOFNP (4): HLINFNP (1) ، FNP (2) ATY: NEXTY ، I: GETA  

أسئلة متكررة

س: أيهما أفضل؟ كود بحجم تويتر ، لغة أساسية أم لغة تجميع؟

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

س: هل يمكنك كتابة رمز الآلة 6502 الذي هو v أليد ASCII واقفز إليه؟

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

أ. اتضح أن Applesoft يعتمد على مجموعة من المتغيرات المنتشرة في كل مكان. فوق صفحة الصفر ، لذلك من الصعب الكتابة فوق الأشياء دون تعطل Applesoft قبل أن يتم ذلك. س. هل يمكنك استخدام نوع من خوارزمية الضغط؟ حتى RLE فقط؟

أ. ربما ، ولكن 280 بايت ليس كثيرًا لتبدأ به ، ومعظم الأشياء ، حتى RLE ، تتضمن تحويل بت و إخفاء شيء لا تعتبر Applesoft رائعة حقًا فيه. س. هل هناك أي حيل أساسية سرية لم تستخدمها؟

أ. لا تزال هناك بعض الحيل المتبقية. هناك بعض السحر العميق الذي يمكنك القيام به إذا اتصلت بمترجم Applesoft مباشرة من لغة التجميع. الكثير من المقالات حول هذا من الثمانينيات.

تدعم Applesoft مكالمات مثل USR وإلى جانب CALL to استدعاء لغة التجميع. الأكثر فائدة هو & الذي يفعل قفزة بسيطة إلى $ 3F5. إذا قمت بتحميل التجميع الخاص بك بشكل صحيح ، يمكنك استخدام هذا لحفظ بعض الأحرف الأخرى عن طريق التخلص من CALL768. (أيضًا إذا قمت بتحميل الكود الخاص بك على $ 3F5 ، فيمكنك مشاهدته أثناء فك شفرته أثناء كتابته على صفحة النص بقيمة 400 دولار). س. هل أنت أول شخص يقوم ببعض هذه الحيل؟

أ. ربما لا. يتمتع Apple II بتاريخ طويل وطويل ، وكنت صغيرًا بعض الشيء في الثمانينيات ، لذا لم أتبع جميع الحيل المستخدمة في ذلك الوقت. أنا متأكد من أنه تم التفكير في العديد من هذه الأشياء واستخدامها في مرحلة ما. على سبيل المثال ، توصلت إلى وضع البيانات في عبارات REM بمفردي ، ولكن إذا أجريت بحثًا ، فستجد على الأقل مثال واحد حيث شخص ما آخر كان يفعل ذلك من قبلي وحتى تم تقديمه في Kansasfest / تم نشره في Juiced.GS حول هذا الموضوع قبل أن أتبع تلك الأماكن.


توفر الكود / الأداة

يمكن العثور على الكود والأدوات المساعدة التي استخدمتها في إنشاء هذه على جيثب: https: / /github.com/deater/dos33fsprogs.git


المستقبل

فهل انتهيت الآن؟

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



العودة إلى Apple II Demos ٪٪ item_read_more_button ٪٪

ترك الرد

من فضلك ادخل تعليقك
من فضلك ادخل اسمك هنا