تقوم مكتبة Z80 بتنفيذ محاكي سريع وصغير ودقيق من Zilog Z80. إنه يحاكي كل ما هو معروف حتى الآن عن وحدة المعالجة المركزية هذه ، بما في ذلك السلوكيات غير الموثقة ، MEMPTR ، Q وإعادة ضبط خاصة. كما يشرف على أنه كان أول مشروع مفتوح المصدر يقدم مضاهاة كاملة لوضع المقاطعة 0.
تتم كتابة الرمز المصدر في ANSI C لتحقيق أقصى قدر من الحمل ويتم التعليق على نطاق واسع. كان الهدف هو كتابة برامج منظمة جيدة التنظيم وسهلة الفهم ؛ شيء صلب وأنيق يمكن أن يقف لاختبار الوقت دون الحاجة إلى تغييرات كبيرة.
يحتوي محاكي وحدة المعالجة المركزية Z80 هذا على تصميم كلاسيكي مع تفريغ على مستوى التعليمات يقدم أفضل أداء ، مع تقديم مرونة معقولة لتحقيق الدقة وصولاً إلى مستوى T-State.
تشير الحبيبات على مستوى التعليمات إلى أنه ، باستثناء بعض الحالات المحددة جيدًا ، لا يمكن أن يتوقف تنفيذ تعليمات معينة حتى تتم معالجة جميع دورات M الداخلية (أي ، لا تنقسم التعليمات إلى عمليات صغيرة). علاوة على ذلك ، يتم تعديل السجلات مرة واحدة فقط لكل تعليمة ويتم تحديث عداد T-State عادة بعد تنفيذ تعليمات كاملة.
ومع ذلك ، يتم محاكاة التعليمات ، والأعلام ، والوصول إلى الذاكرة ، والمقاطعات ، ودورات الساعة ، وما إلى ذلك ، وفقًا للوثائق التقنية المتاحة ، والنتائج التي تم إجراؤها بعد عقود من البحث على Z80 والمحاكاة الإلكترونية. وبالطبع ، يمر المحاكي الاختبارات الأكثر شمولية المكتوبة حتى الآن ، بما في ذلك جميع أجنحة الاختبار الرئيسية الثلاثة:
تهدف هذه المجموعة من البرامج إلى مساعدة مؤلفي المحاكي على الوصول إلى المستوى المطلوب لأصالة مضاهاة وحدة المعالجة المركزية. يقوم كل من البرامج المضمّنة بإجراء حساب شامل باستخدام كل من تعليمات Z80 المختبرة ، ويقارن النتائج مع القيم التي تم الحصول عليها من طيف Sinclair ZX الحقيقي 48K مع وحدة المعالجة المركزية Zilog Z80 ، وتقارير أي انحرافات تم اكتشافها.
Z80Full.tap يختبر جميع الأعلام والسجلات. | Z80DOC.TAP يختبر جميع السجلات ، ولكن فقط الأعلام موثقة رسميا. |
Z80FLAGS.TAP يختبر جميع الأعلام ، يتجاهل السجلات. | Z80DOCFLAGS.TAP الاختبارات موثقة الأعلام فقط ، تتجاهل السجلات. |
Z80CCF.TAP يختبر جميع الأعلام بعد تنفيذ ccf بعد كل تعليمات تم اختبارها. | Z80Memptr.tap يختبر جميع الأعلام بعد تنفيذ bit N,(hl) بعد كل تعليمات تم اختبارها. |
Z80Full.tap يختبر جميع الأعلام والسجلات. | Z80DOC.TAP يختبر جميع السجلات ، ولكن فقط الأعلام موثقة رسميا. |
Z80FLAGS.TAP يختبر جميع الأعلام ، يتجاهل السجلات. | Z80DOCFLAGS.TAP الاختبارات موثقة الأعلام فقط ، تتجاهل السجلات. |
Z80CCF.TAP يختبر جميع الأعلام بعد تنفيذ ccf بعد كل تعليمات تم اختبارها. | Z80Memptr.tap يختبر جميع الأعلام بعد تنفيذ bit N,(hl) بعد كل تعليمات تم اختبارها. |
يؤدي هذا الجناح سلسلة من الاختبارات للتحقق من وثائق MEMPTR (الإنجليزية ، الروسية) ، والتي هي على الفور ، بالإضافة إلى تشغيل قصير من خلال العديد من نطاقات الرمز OPCODE CBh/DDh/FDh . تتم مقارنة نتائج الاختبار في البرنامج مع تلك الموجودة في وحدة المعالجة المركزية NEC D780C-1 ، لكن سيمون كونواي اختبر العديد من استنساخ Z80 الأخرى ، مما يؤكد نفس النتائج.
Z80Tests.tap | |
تحاول مجموعة تعليمات Z80 الخاصة بـ Frank Cringle تنفيذ كل رمز Opcode Z80 ، ووضعها في دورة من الاختبارات ومقارنة النتائج بالنتائج الفعلية من تشغيل الرمز على Z80 الحقيقي. يتم تزويد التمارين مع Yaze Frank (محاكي Z80 آخر). غالبًا ما يكون من الصعب تعقبه ، لذا فإن جوناثان جراهام هارستون وضعه معًا هنا ، وكذلك بعض التحويلات. أحدث إصدار من Yaze متاح على موقع Andreas Gerlich.
zexdoc.tap الاختبارات موثقة رسميا آثار العلم. | zexall.tap اختبارات كل تغييرات العلم. |
zexfix.tap اختبارات كل تغييرات العلم. | zexbit.tap اختبارات جميع تغييرات العلم في تعليمات bit . |
zexall2.tap |
أولاً ، أضف مستودع zxe وتحديث فهرس الحزمة:
sudo mkdir -pm700 /root/.gnupg
sudo mkdir -pm755 /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/zxe-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys FE214A38D6A0C01D9AF514EE841EA3BD3A7E1487
echo " deb [arch= $( dpkg --print-architecture ) signed-by=/etc/apt/keyrings/zxe-archive-keyring.gpg] https://zxe.io/repos/apt stable main " | sudo tee /etc/apt/sources.list.d/zxe.list
sudo apt updateبعد ذلك ، قم بتثبيت حزمة المكتبة:
sudo apt install libz80في حال كنت بحاجة إلى إنشاء برنامج يتطلب مكتبة Z80 ، قم بتثبيت حزمة التطوير أيضًا:
sudo apt install libz80-dev أولاً ، أضف ومزامنة تراكب zxe :
eselect repository add zxe git https://github.com/redcode/zxe-gentoo-overlay.git
emaint sync --repo zxeثم قم بتثبيت المكتبة:
emerge emulation-libs/z80brew install redcode/zxe/z80تتوفر الثنائيات التي تم تصميمها مسبقًا لنظام التشغيل Windows على صفحة التنزيل.
ستحتاج إلى Cmake v3.14 أو لاحقًا لإنشاء الحزمة ، واختياريًا ، الإصدارات الحديثة من Doxygen و Sphinx والتنفس لتجميع الوثائق. تأكد أيضًا من أن لديك Latex مع دعم PDF مثبت على نظامك إذا كنت ترغب في إنشاء الوثائق بتنسيق PDF.
يتطلب المحاكي بعض الأنواع ووحدات الماكرو المتضمنة في Zeta ، وهي مكتبة خالية من التبعية فقط تستخدم للاحتفاظ بالتوافق مع معظم المترجمين C. قم بتثبيت Zeta أو استخراج رمز المصدر الخاص به إلى الدليل الجذر لمشروع Z80 أو الدليل الأم. زيتا هو التبعية الوحيدة. المحاكي هو تطبيق قائم بذاته ، وبالتالي لا يعتمد على المكتبة القياسية C.
بمجرد الوفاء بالمتطلبات المسبقة ، قم بإنشاء دليل وقم بتشغيل cmake من هناك لإعداد نظام الإنشاء:
mkdir build
cd build
cmake [options] < Z80-project-directory > يمكن تكوين ملفات الإنشاء الناتجة عن طريق تمرير الخيارات إلى cmake . لإظهار قائمة كاملة من تلك المتاحة جنبا إلى جنب مع إعداداتهم الحالية ، اكتب ما يلي:
cmake -LAH -N -B .إذا كنت في شك ، اقرأ وثائق CMAKE لمزيد من المعلومات حول خيارات التكوين. فيما يلي بعض الخيارات القياسية الأكثر صلة بـ CMake:
إنشاء مكتبات مشتركة بدلاً من المكتبات الثابتة.
الافتراضي هو NO .
-DCMAKE_BUILD_TYPE=(Debug|Release|RelWithDebInfo|MinSizeRel)
اختر نوع البناء (التكوين) لإنشاء.
الافتراضي هو Release .
-DCMAKE_INSTALL_NAME_DIR="<path>"
حدد جزء الدليل من اسم تثبيت المكتبة الديناميكية على منصات Apple (للمكتبات المشتركة المثبتة).
لم يتم تعريفه بشكل افتراضي.
-DCMAKE_INSTALL_PREFIX="<path>"
حدد بادئة التثبيت.
الافتراضي هو "/usr/local" (على أنظمة تشغيل UNIX و UNIX).
تسبق الخيارات الخاصة بالحزمة مع Z80_ ويمكن تقسيمها إلى مجموعتين. أول واحد يتحكم في الجوانب لا تتعلق بالرمز المصدر للمكتبة:
-DZ80_DEPOT_LOCATION="<location>"
حدد الدليل أو عنوان URL للمستودع الذي يحتوي على ملفات الاختبار (أي البرامج الثابتة والبرامج المطلوبة بواسطة أداة الاختبار).
الافتراضي هو "http://zxe.io/depot" .
-DZ80_FETCH_TEST_FILES=(YES|NO)
انسخ أو تنزيل ملفات الاختبار من المستودع إلى دليل الإنشاء.
الافتراضي هو NO .
-DZ80_INSTALL_CMAKEDIR="<path>"
حدد الدليل الذي لتثبيت حزمة تهيئة CMake.
الافتراضي هو "${CMAKE_INSTALL_LIBDIR}/cmake/Z80" .
-DZ80_INSTALL_PKGCONFIGDIR="<path>"
حدد الدليل الذي لتثبيت ملف PKG-Config.
الافتراضي هو "${CMAKE_INSTALL_LIBDIR}/pkgconfig" .
-DZ80_NOSTDLIB_FLAGS=(Auto|"[<flag>[;<flag>...]]")
حدد أعلام الرابط المستخدمة لتجنب الربط مع مكتبات النظام.
الافتراضي هو Auto (أعلام التكوين التلقائي). إذا حصلت على أخطاء في الارتباط ، فقم بتعيين هذا الخيار إلى "" .
-DZ80_OBJECT_LIBS=(YES|NO)
بناء المحاكي كمكتبة كائن.
هذا الخيار يأخذ الأسبقية على BUILD_SHARED_LIBS و Z80_SHARED_LIBS . إذا تم التمكين ، فسيتجاهل نظام الإنشاء Z80_WITH_CMAKE_SUPPORT و Z80_WITH_PKGCONFIG_SUPPORT ، حيث لن يتم تثبيت مكتبات أو ملفات دعم.
الافتراضي هو NO .
بناء المحاكي كمكتبة مشتركة ، وليس ثابت.
هذا الخيار يأخذ الأسبقية على BUILD_SHARED_LIBS .
لم يتم تعريفه بشكل افتراضي.
-DZ80_SPHINX_HTML_THEME="[<name>]"
حدد موضوع sphinx للوثائق بتنسيق HTML.
الافتراضي هو "" (استخدم السمة الافتراضية).
-DZ80_WITH_CMAKE_SUPPORT=(YES|NO)
قم بإنشاء وتثبيت حزمة ملف Cmake Config.
الافتراضي هو NO .
-DZ80_WITH_HTML_DOCUMENTATION=(YES|NO)
بناء وتثبيت الوثائق بتنسيق HTML.
يتطلب doxygen ، أبو الهول والتنفس.
الافتراضي هو NO .
-DZ80_WITH_PDF_DOCUMENTATION=(YES|NO)
بناء وتثبيت الوثائق بتنسيق PDF.
يتطلب doxygen ، sphinx ، التنفس ، واللاتكس مع دعم PDF.
الافتراضي هو NO .
-DZ80_WITH_PKGCONFIG_SUPPORT=(YES|NO)
إنشاء وتثبيت ملف PKG-Config.
الافتراضي هو NO .
-DZ80_WITH_STANDARD_DOCUMENTS=(YES|NO)
قم بتثبيت المستندات النصية القياسية الموزعة بالحزمة: AUTHORS ، COPYING ، COPYING.LESSER الخلاص ، HISTORY ، و README THANKS .
الافتراضي هو NO .
-DZ80_WITH_TESTS=(YES|NO)
بناء أداة الاختبار.
الافتراضي هو NO .
تقوم المجموعة الثانية من خيارات الحزمة الخاصة بتكوين الكود المصدري للمكتبة عن طريق تحريك وحدات الماكرو التي تمكن الميزات الاختيارية:
-DZ80_WITH_EXECUTE=(YES|NO)
بناء تنفيذ وظيفة z80_execute .
الافتراضي هو NO .
-DZ80_WITH_FULL_IM0=(YES|NO)
قم ببناء التنفيذ الكامل لوضع المقاطعة 0 بدلاً من الوضع المخفض.
الافتراضي هو NO .
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=(YES|NO)
تمكين الإخطارات الاختيارية لأي تعليمات reti أو retn التي تم تنفيذها أثناء استجابة وضع المقاطعة 0.
الافتراضي هو NO .
-DZ80_WITH_Q=(YES|NO)
بناء تنفيذ Q.
الافتراضي هو NO .
-DZ80_WITH_SPECIAL_RESET=(YES|NO)
بناء تنفيذ إعادة تعيين خاص.
الافتراضي هو NO .
-DZ80_WITH_UNOFFICIAL_RETI=(YES|NO)
تكوين التعليمات غير الموثقة ED5Dh و ED6Dh و ED7Dh كـ reti بدلاً من retn .
الافتراضي هو NO .
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=(YES|NO)
قم ببناء تنفيذ الخلل الذي يؤثر على Zilog Z80 NMOS ، والذي يتسبب في إعادة تعيين علامة P/V عند قبول مقاطعة قابلة للإخفاء أثناء تنفيذ تعليمات ld a,{i|r} .
الافتراضي هو NO .
يتم تشجيع مشرفي الحزم على استخدام الخيارات التالية على الأقل للمكتبة المشتركة:
-DZ80_WITH_EXECUTE=YES
-DZ80_WITH_FULL_IM0=YES
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=YES
-DZ80_WITH_Q=YES
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=YES
أخيرًا ، بمجرد تكوين نظام الإنشاء وفقًا لاحتياجاتك ، قم ببناء وتثبيت الحزمة:
cmake --build . [--config (Debug | Release | RelWithDebInfo | MinSizeRel)]
cmake --install . [--config < configuration > ] [--strip] يعد خيار --config ضروريًا فقط لمولدات CMake التي تتجاهل CMAKE_BUILD_TYPE (على سبيل المثال ، Xcode و Visual Studio). استخدم- --strip لإزالة معلومات تصحيح الأخطاء والرموز غير العامة عند تثبيت بنيات غير Debug للمكتبة المشتركة.
استخدم ما يلي لبناء المحاكي كمكتبة مشتركة وقم بتثبيتها مع ملفات التطوير إلى $HOME/.local :
mkdir work && cd work
git clone https://github.com/redcode/Zeta.git
git clone https://github.com/redcode/Z80.git
cd Zeta
mkdir build && cd build
cmake
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX= " $HOME /.local "
-DZeta_WITH_CMAKE_SUPPORT=YES
-DZeta_WITH_PKGCONFIG_SUPPORT=YES
..
cmake --install . --config Release
cd ../../Z80
mkdir build && cd build
cmake
-DBUILD_SHARED_LIBS=YES
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_NAME_DIR= " $HOME /.local/lib "
-DCMAKE_INSTALL_PREFIX= " $HOME /.local "
-DZ80_WITH_CMAKE_SUPPORT=YES
-DZ80_WITH_PKGCONFIG_SUPPORT=YES
-DZ80_WITH_EXECUTE=YES
-DZ80_WITH_FULL_IM0=YES
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=YES
-DZ80_WITH_Q=YES
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=YES
..
cmake --build . --config Release
cmake --install . --config Release --stripبناء و Z80.SH
تتضمن الحزمة أداة تسمى test-Z80 قادرة على تشغيل إصدارات طيف CP/M و ZX الأكثر صلة بأجنحة الاختبار الرئيسية. قم بتكوين نظام الإنشاء باستخدام -DZ80_WITH_TESTS=YES لتمكين تجميعه و -DZ80_FETCH_TEST_FILES=YES لتنزيل البرامج الثابتة والبرامج المطلوبة. لاحظ أيضًا أنه يجب بناء مكتبة Z80 باستخدام -DZ80_WITH_Q=YES لتكون قادرًا على اجتياز اختبارات باتريك راك.
بمجرد قيامك ببناء الحزمة ، اكتب ما يلي لتشغيل جميع الاختبارات:
./test-Z80 -p depot/firmware -p depot/software/POSIX -p " depot/software/ZX Spectrum " -a تدعم الأداة الخيارات ويمكنها إجراء الاختبارات بشكل فردي (اكتب ./test-Z80 -h للمساعدة). إذا كنت تفضل إجراء جميع الاختبارات من خلال CTEST ، فاستخدم هذا الأمر:
ctest --verbose --build-config (Debug | Release | RelWithDebInfo | MinSizeRel) تتوفر السجلات الكاملة التي تم إنشاؤها بواسطة test-Z80 التي تحاكي متغيرات وحدة المعالجة المركزية المختلفة هنا:
ملحوظة
تعتبر أخطاء CRC في سجلات متغير NEC NMOS طبيعية وتتطابق مع القيم التي تم الحصول عليها على الأجهزة الحقيقية. متغير ST CMOS قيد التحقيق حاليًا.
استخدم ما يلي لبناء المحاكي واختباره:
mkdir work && cd work
git clone https://github.com/redcode/Zeta.git
git clone https://github.com/redcode/Z80.git
cd Z80
mkdir build && cd build
cmake
-DCMAKE_BUILD_TYPE=Release
-DZ80_FETCH_TEST_FILES=YES
-DZ80_WITH_TESTS=YES
-DZ80_WITH_EXECUTE=YES
-DZ80_WITH_FULL_IM0=YES
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=YES
-DZ80_WITH_Q=YES
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=YES
..
cmake --build . --config Release
ctest --verbose --build-config Releaseالبناء والاختبار-Z80.SH البناء والاختبار-Z80.BAT
تتضمن مكتبة Z80 حزمة ملف التكوين للتكامل في المشاريع المستندة إلى CMake والتي يجب تثبيتها للتطوير. استخدم find_package للعثور على حزمة Z80 . هذا ينشئ هدف المكتبة المستوردة Z80 ، والذي يحمل تبعيات الارتباطات الضرورية. اختياريا ، يمكن تحديد طريقة الارتباط من خلال تحديد المكون Shared أو Static .
مثال:
find_package (Z80 REQUIRED Shared)
target_link_libraries (your- target Z80) عندما لا يتم تحديدها كمكون ، يتم تحديد طريقة الارتباط وفقًا لـ Z80_SHARED_LIBS . إذا لم يتم تعريف هذا الخيار ، فإن ملف التكوين يستخدم نوع المكتبة المثبتة على النظام ، وإذا وجد كل من الإصدارات المشتركة والثابتة ، BUILD_SHARED_LIBS تحدد أي واحد يجب ربطه.
لتضمين مكتبة Z80 كحجم فرعي CMAKE ، قم باستخراج كرات رمز المصدر من Zeta و Z80 (أو استنساخ مستودعات كل منهما) إلى دليل فرعي لمشروع آخر. ثم استخدم add_subdirectory في المشروع الأصل لإضافة شجرة رمز المصدر Z80 إلى عملية الإنشاء (NB ، وسيقوم المشاركة الفرعية Z80 تلقائيًا بالعثور على Zeta واستيرادها كمكتبة واجهة).
يُنصح بتكوين مكتبة Z80 في CMakeLists.txt من المشروع الأصل. سيؤدي ذلك إلى منع المستخدم من تحديد خيارات التكوين للمشروع الفرعي Z80 من خلال سطر الأوامر عند إنشاء المشروع الرئيسي.
مثال:
set (Z80_SHARED_LIBS NO CACHE BOOL "" )
set (Z80_WITH_Q YES CACHE BOOL "" )
set (Z80_WITH_ZILOG_NMOS_LD_A_IR_BUG YES CACHE BOOL "" )
add_subdirectory (dependencies/Z80)
target_link_libraries (your- target Z80) من المهم تعيين خيار Z80_SHARED_LIBS . خلاف ذلك ، سيقوم CMake ببناء نوع المكتبة المشار إليه بواسطة BUILD_SHARED_LIBS ، والذي قد لا يكون هو المطلوب.
يمكن تكوين الكود المصدري للمحاكي في وقت الترجمة عن طريق تحريك سلسلة من وحدات الماكرو. كل من Z80.h و Z80.c طاعة أول اثنين موضح أدناه. تكون بقية وحدات الماكرو ذات صلة فقط عند تجميع Z80.c :
#define Z80_EXTERNAL_HEADER "header-name.h"
يحدد الرأس الخارجي الوحيد إلى #include ، ليحل محل جميع الآخرين.
تحدد هذا الماكرو لتوفير ملف رأس يحدد الأنواع الخارجية ووحدات الماكرو المستخدمة من قبل المحاكي ، وبالتالي منع مشروعك من الاعتماد على Zeta. يمكنك استخدام هذا عند تجميع Z80.c كجزء من مشروعك أو (إذا لم تقم الأنواع بتكسير التوافق الثنائي) عند تضمين <Z80.h> وربط مكتبة Z80 تم إنشاؤها مسبقًا.
#define Z80_STATIC
يقيد رؤية الرموز العامة.
مطلوب هذا الماكرو إذا كنت تقوم ببناء Z80.c كمكتبة ثابتة ، أو تجميعها مباشرة كجزء من مشروعك ، أو ربط البرنامج مقابل الإصدار الثابت من مكتبة Z80. في أي من هذه الحالات ، تأكد من تعريف هذا الماكرو قبل تضمين "Z80.h" أو <Z80.h> .
#define Z80_WITH_LOCAL_HEADER
يخبر Z80.c إلى #include "Z80.h" بدلاً من <Z80.h> .
يتم تعطيل الميزات الاختيارية للمحاكي المذكورة في "التثبيت من المصادر" افتراضيًا. إذا قمت بتجميع Z80.c كجزء من مشروعك ، فقم بتمكين تلك الميزات التي تحتاجها من خلال تحريك وحدات الماكرو للتنشيط الخاصة بها. لديهم نفس الاسم مثل ما يعادل Cmake:
#define Z80_WITH_EXECUTE#define Z80_WITH_FULL_IM0#define Z80_WITH_IM0_RETX_NOTIFICATIONS#define Z80_WITH_Q#define Z80_WITH_SPECIAL_RESET#define Z80_WITH_UNOFFICIAL_RETI#define Z80_WITH_ZILOG_NMOS_LD_A_IR_BUG باستثناء Z80_EXTERNAL_HEADER ، يمكن أن تكون وحدات الماكرو أعلاه فارغة ؛ يتحقق رمز المصدر فقط ما إذا كانت محددة.
ملحوظة
يؤثر تنشيط بعض الميزات الاختيارية على سرعة المحاكي بسبب عوامل مختلفة (اقرأ الوثائق لمزيد من التفاصيل).
تم استخدام هذا المحاكي من قبل المشاريع التالية (المدرجة بالترتيب الأبجدي):
شكرا جزيلا للأفراد التاليين (بالترتيب الأبجدي):
ccf/scf .ccf/scf على الأجهزة الحقيقية. 2 ، 3ccf/scf . 5 ، 6ccf/scf . 12out (c),0 على Zilog Z80 CMOS. 16ccf/scf على الأجهزة الحقيقية. 12 ، 23ccf/scf .ccf/scf .ccf/scf . 15 ، 30ccf/scf .ccf/scf . 2 ، 3reti/retn تؤجل قبول المقاطعة القابلة للإخفاء. 34ccf/scf . 36حقوق الطبع والنشر © 1999-2024 Manuel Sainz de Baranda Y Goñi.
هذه المكتبة هي برنامج مجاني: يمكنك إعادة توزيعها و/أو تعديلها بموجب شروط رخصة GNU Lesser العامة العامة كما نشرتها مؤسسة البرمجيات المجانية ، إما الإصدار 3 من الترخيص ، أو (في خيارك) أي إصدار لاحق.
يتم توزيع هذه المكتبة على أمل أن تكون مفيدة ، ولكن بدون أي ضمان ؛ بدون حتى الضمان الضمني للتسويق أو اللياقة لغرض معين . راجع رخصة GNU أقل عامة لمزيد من التفاصيل.
يجب أن تكون قد تلقيت نسخة من رخصة GNU Lesser العامة مع هذه المكتبة. إذا لم يكن كذلك ، راجع https://www.gnu.org/licenses/.
المشاريع التي تمنع فيها شروط رخصة GNU أقل عامة عامة عن استخدام هذه المكتبة ، أو تتطلب نشر غير مرغوب فيه لقواعد المنتجات المصدرية للمنتجات التجارية ، قد تتقدم بطلب للحصول على ترخيص خاص.