تعتمد مراجعات Agon Light ومراجعات Agon Platform الأخرى على معالج Zilog eZ80. يحتوي جهاز eZ80 على مساحة عنوان 24 بت تدعم 16 ميجابايت من الذاكرة، مقارنة بـ 64 كيلو بايت في Z80 الأصلي. يحتوي eZ80 على وضعين للتشغيل: وضع Z80 القياسي، الذي يحتوي على سجلات 16 بت مما يجعل من السهل معالجة 64 كيلو بايت من الذاكرة، ولكنه يتطلب استخدام "الخدمات المصرفية" للوصول إلى أكثر من 64 كيلو بايت من الذاكرة؛ ونمط تشغيل ADL (بيانات العنوان الطويلة)، الذي يوسع السجلات إلى 24 بت، مما يسهل الوصول إلى مساحة العنوان بالكامل.
عندما نفكر في لغات البرمجة عالية المستوى، هناك عدد متاح لـ Z80، ولكنها تقتصر على 64 كيلو بايت من الذاكرة أو لديها طرق تبديل بنكية غير ملائمة للوصول إلى ذاكرة أكبر.
بالنظر إلى لغات البرمجة C، هناك عدد من مترجمات C-Z80 المتاحة. حتى الآن، ركز مجتمع Agon على اثنين:
بيئة تطوير Zilog ZDS II التي يمكنها إنتاج كود eZ80 ADL. كانت هذه هي المجموعة الأصلية من الأدوات التي يستخدمها مطورو Agon، ولكنها مغلقة المصدر، وتعمل على نظام التشغيل Windows فقط، وتدعم فقط معيار البيانات C89
SDCC (مترجم C للأجهزة الصغيرة) ، وهو خيار شائع لأجهزة الكمبيوتر 8 بت، وتكييفه مع Agon كان محط اهتمام عدد من الأشخاص في كمبيوتر Agon. يعد هذا مترجمًا جيدًا لـ Z80، ولكنه يدعم فقط Z80 وليس وضع ADL.
كبديل، سلسلة أدوات CEdev C/C++ عبارة عن مترجم مفتوح المصدر يمكنه إنتاج كود ADL. إنه يستهدف الآلة الحاسبة TI-84 Plus CE (المعتمدة على معالج eZ80) ولديه مجتمع ذو حجم معقول. يعتمد CEdev على إصدارات eZ80 من مترجم LLVM ومجمع fasmg. وينتج رمز ADL بمؤشرات 24 بت، وأعداد صحيحة 24 بت، وأطوال 32 بت، وشورتات 16 بت، وعائمات 32 بت. هناك أيضًا مكتبة واسعة جدًا لبرامج C وC++ (على الرغم من أنها ليست متوافقة مع ISO... حتى الآن).
AgDev هو نتيجة جهد لتعديل CEdev لاستيعاب مجموعة الميزات وتصميم الأجهزة الخاصة بمنصة Agon. والنتيجة هي سلسلة أدوات أكثر قوة وقدرة على استخدام لغة C++، مقارنة بالخيارات الأخرى لـ Agon.
قم بتنزيل إصدار الإصدار أو البناء من المصدر بنفسك. ضع البناء في دليل من اختيارك.
بعد ذلك، تأكد من إمكانية العثور على المجلد /bin
في PATH
؛ إذا كنت تستخدم نظام التشغيل Windows، فاتبع هذا الدليل، أو يمكنك تشغيل cedev.bat وتنفيذ الأوامر من هناك بدلاً من ذلك. في نظام التشغيل Linux، قم بتشغيل export PATH=/<insert path here>/bin:$PATH
في نافذة طرفية.
يتبع هذا نفس النهج المتبع في سلسلة أدوات CE الأصلية (انظر أسفل صفحة بدء CEdev). تم تعديل عملية الإنشاء لتتوقف عند إنشاء ملف .bin
. هذا هو Agon Light القابل للتنفيذ.
أوصي باستخدام:
جعل نظيفة جعل الخامس = 1
يمكن استخدام الأمر make clean
لحذف نتائج المجموعات السابقة وبالتالي فرض إعادة الترجمة.
تمر عملية البناء بالخطوات التالية:
تجميع ملفات مصدر .c إلى رمز بت LLVM (.bc) باستخدام ez80-clang
ربط كود LLVM باستخدام ez80-link
. يتضمن ذلك تحسين وقت الارتباط
إنشاء رمز التجميع eZ80 (.src) للبرامج المصدر باستخدام ez80-clang
تجميع وربط رمز التجميع الذي تم إنشاؤه (من الخطوة 3) مع المكتبات ووقت تشغيل المترجم باستخدام fasmg
- يتضمن ذلك إنشاء الملف القابل للتنفيذ الذي يستهدف موقع ذاكرة محدد. هذا هو الجزء الرئيسي من عملية الإنشاء الذي يحتاج إلى تعديل.
راجع ملاحظة تطبيق Zilog "استدعاء C من asm.pdf".
يجب الحفاظ على سجل ومكدس IX فقط من خلال وظائف تسمى.
يتم دفع الوسائط من الأخير إلى الأول المتوافق مع النموذج الأولي للغة C. في eZ80، يتم دائمًا دفع 3 بايت إلى المكدس بغض النظر عن الحجم الفعلي. ومع ذلك، يجب أن تكون وظيفة التجميع حريصة على استخدام البايتات الصالحة التي يتم دفعها فقط. على سبيل المثال، إذا تم استخدام نوع قصير ، فإن البايت العلوي من القيمة المدفوعة على المكدس سوف يحتوي على بيانات عشوائية. يسرد هذا الجدول المواقع المتعلقة بـ sp من داخل الوظيفة المطلوبة. لاحظ أن sp + [0,2]
يحتوي على عنوان المرسل.
النوع سي/سي++ | مقاس | موقع المكدس |
---|---|---|
شار | 1 بايت | س + [3] |
قصير | 2 بايت | س + [3,4] |
كثافة العمليات | 3 بايت | س + [3,5] |
طويل | 4 بايت | س + [3,6] |
طويلة طويلة | 8 بايت | س + [3,10] |
يطفو | 4 بايت | س + [3,6] |
مزدوج | 4 بايت | س + [3,6] |
المؤشر | 3 بايت | س + [3,5] |
لاحظ أن eZ80 يمثل نقطة نهاية صغيرة - أي يتم تخزين البايت الأقل أهمية أولاً.
يسرد هذا الجدول السجلات المستخدمة لإرجاع القيم من دالة. لا تؤثر علامة النوع على السجلات المستخدمة، ولكنها قد تؤثر على القيمة التي يتم إرجاعها. يقع LSB في السجل في أقصى يمين التعبير، على سبيل المثال، يشير E:UHL
إلى أن السجل L
يخزن LSB.
النوع سي/سي++ | سجل العودة |
---|---|
شار | أ |
قصير | هل |
كثافة العمليات | UHL |
طويل | ه: UHL |
طويلة طويلة | قبل الميلاد:UDE:UHL |
يطفو | ه: UHL |
مزدوج | ه: UHL |
المؤشر | UHL |
غير متوافق مع ISO!
يتكون مما يلي:
إدخال الملف:
fopen()
، freopen(),
fclose()
fputc()
، fputs()
fgetc()
، ungetc()
، fgets()
feof()
, ferror()
, fflush()
fread()
، fwrite()
fseek()
، rewind()
، ftell()
clearerr()
remove()
ستدين / ستدوت IO:
putchar()
، puts()
getchar()
، gets_s()
الإخراج المنسق
printf()
(و vprintf()
)
sprintf()
(و vsprintf()
)
snprintf()
(و vsnprintf()
)
المدخلات المنسقة
scanf()
sscanf()
توجد بعض الأشياء الأخرى هنا - مثل stdint
وما شابه - ولكن يجب أن تتوافق في الغالب مع توقعات المكتبة القياسية العادية. في الغالب.
stdio
يمكن إعادة توجيه الإخراج باستخدام freopen()
على stdout
أو stderr
:
putchar()
- الإخراج إلى outchar()
ما لم تتم إعادة توجيه الإخراج، وفي هذه الحالة يتم الإخراج إلى fputc()
puts()
- يستدعي putchar()
printf()
(و vprintf()
) - يستدعي npf_putc_std()
، الذي يستدعي putchar()
في nanoprintf.c
fputc()
- يستدعي mos_fputc()
ما لم يتم استدعاؤه على stdout
عند استدعاء outchar()
- يتجنب استدعاء putchar()
بحيث لا يوجد خطر من تكرار حلقات استدعاء الوظيفة
يمكن إعادة توجيه الإدخال باستخدام freopen()
على stdin
:
getchar()
- يستدعي inchar()
للحصول على الحرف و outchar()
لتكرار الحرف (حتى لو تمت إعادة توجيه الإخراج). إذا لم تتم إعادة توجيه الإخراج، فاستدعاء fgetc()
ولا يردد الحرف.
gets_s()
- يستدعي getchar()
إذا لم تتم إعادة توجيه الإدخال (يتم إنهاء الخط بـ CR). تمت إعادة توجيه مكالمات الإدخال fgets()
(يتم إنهاء الخطوط بزوج CR/LF).
scanf()
- يستدعي getchar()
في uscan.c
(لا يحتاج إلى تحديث)
fgetc()
- يستدعي mos_fgetc()
ما لم يتم استدعاؤه على stdin عند استدعاء inchar()
والصدى مع outchar()
- يتجنب استدعاء getchar()
بحيث لا يوجد خطر من تكرار حلقات استدعاء الوظائف
يتطلب FILE *
، وهو مؤشر إلى مقبض الملف الذي تم إرجاعه بواسطة fopen
وتمريره إلى إجراءات الإدخال/الإخراج للملف للإشارة إلى الملف الذي سيتم تنفيذ الإجراء عليه.
ملفات أخرى ذات صلة:
stdio.h
- ملفات الرأس العادية، التي تحدد الوظائف المختلفة وtypedef FILE
files.c
- يقوم بإنشاء مثيل لتخزين مقابض الملفات بما في ذلك: stdout، stderr، stdin.
يتم تعريف مقابض الملفات القياسية التالية:
stdout
- الإخراج الافتراضي
stderr
- الإخراج الافتراضي لرسالة الخطأ
stdin
- الإدخال الافتراضي
لا يقوم MOS بتنفيذ إعادة توجيه الإدخال/الإخراج، لذلك يستخدم كل منهم وحدة التحكم بشكل افتراضي.
يتوفر خياران لمعالجة سطر الأوامر.
يتم تضمين هذا تلقائيًا إذا تم تعريف الوظيفة الرئيسية على أنها
int الرئيسي (int argc, char* argv[])
يقوم بتقسيم سطر الأوامر باستخدام المسافة كمحدد. تتوفر خيارات سطر الأوامر في المصفوفة argv[]
كالمعتاد.
يتم تضمين هذا اختياريًا إذا كان ملف إنشاء التطبيق يتضمن:
LDHAS_ARG_PROCESSING = 1
هذا يدعم
الاقتباس مع علامات الاقتباس المزدوجة
إعادة توجيه الإدخال / الإخراج
>out_file.txt
- يعيد توجيه stdout إلى out_file.txt
، مما يؤدي إلى إنشاء ملف جديد
>>out_file.txt
- يعيد توجيه stdout إلى out_file.txt
، مع إلحاقه بنهاية الملف
<in_file.txt
- يعيد توجيه stdin ليكون من in_file.txt
للحصول على الوثائق الحالية حول أوامر MOS، راجع وثائق Agon Console8.
يوفر MOS (نظام تشغيل الجهاز) واجهة لنظام ملفات Agon وبعض الأجهزة الطرفية، مثل الماوس. فهو يحتفظ بمعلومات عن متغيرات النظام في بنية SYSVAR
كبيرة يمكن الوصول إليها من جانب Z80. بشكل عام، سيُعلن كود C الخاص بك عن مؤشر لهذه البنية، ويتم تهيئته على النحو التالي:
ثابت متطاير SYSVAR * sv؛ sv = vdp_vdu_init();
لمزيد من المعلومات راجع <mos_api.h>
.
للحصول على الوثائق الحالية حول أوامر VDU، راجع وثائق Agon Console8.
يقبل VDP (معالج عرض الفيديو) دفقًا نصيًا من MOS، ويعمل كمحطة نصية/رسومية. يمكن أن يحتوي دفق النص على:
نص عادي
تسلسلات / أوامر الهروب للتحكم في العرض وإرسال أوامر الرسومات / الصوت / إلخ
عندما يتم إرجاع النتائج بواسطة MOS نتيجة لإرسال أمر، يتم تخزينها في SYSVAR
ولا يتم إرجاعها مباشرة استجابة للأمر. الاستجابة غير متزامنة - للتحقق من إرجاع النتيجة:
اضبط vdp_pflags
في SYSVAR
على الصفر
قم بإصدار أمر VDU
انتظر حتى يتم تعيين البت ذي الصلة في vdp_pflags
- راجع <mos_api.h>
للتعرف على أقنعة البت
يمكن إرسال الأوامر عن طريق:
putch()
- حرف واحد (هذا ليس جزءًا من مكتبة C القياسية)
mos_puts()
- سلسلة متعددة الأحرف
يتم إخراج كل منهما مباشرة إلى MOS/VDP - لاحظ أنهما ليسا جزءًا من مكتبة STDIO ولا يخضعان لترجمة CR/LF أو إعادة التوجيه.
يتم توفير وظائف ملائمة للعديد من أوامر VDU في AgDev. على سبيل المثال، لتغيير وضع الشاشة إلى 3، يستدعي C vdp_mode(3);
سوف يرسل 22,3
بايت واحد إلى الإخراج، أي ما يعادل putch(22); putch(3);
للحصول على قائمة بهذه الوظائف، راجع <vdp_vdu.h>
. توجد وظائف إضافية تتعلق بالتعامل مع لوحة المفاتيح في <vdp_key.h>
.