FORTH.TUTORIAL // C64
‹ AMIGASTORE.IR
🔒
دسترسی قفل است
برای دسترسی به این فصل، رمز ۱۵ کاراکتری همراه کارتریج Final Plus FORTH Compiler را وارد کنید.
رمز همراه کارتریج Final Plus FORTH Compiler ارائه می‌شود.
C64-FORTH TUTORIAL

FORTH

آموزش کامل زبان برنامه‌نویسی فورث روی کمودور ۶۴
ENGLISH REFERENCE
The original C64-FORTH manual by Gregg Harris (1983) is freely available at the Internet Archive:
» Download the original C64-FORTH Main Manual (PDF)

فورث یک زبان برنامه‌نویسی سطح پایین، سریع و منعطف است که در دههٔ ۱۹۷۰ توسط چارلز مور طراحی شد. این آموزش ۱۸ فصل کامل، از مبانی پشته و واژه‌ها تا اسمبلر، گرافیک و اعداد اعشاری را پوشش می‌دهد و هر فصل شامل توضیحات، مثال‌های عملی، جدول‌ها، تمرین و پاسخ است. این دوره بر پایهٔ کتاب «فورث ۶۴ — یک سامانهٔ زبان فورث برای کمودور ۶۴» نوشتهٔ گرگ هریس تدوین شده است؛ کتابی که در سال ۱۹۸۳ توسط شرکت پروداکت‌های میکروی پرفورمنس منتشر شد و راهنمای رسمی نرم‌افزار فورث ۶۴ به شمار می‌رفت. C64Spark محتوای این کتاب — که هم‌اکنون تنها نسخهٔ موجود در آرشیو اینترنت است — را به‌عنوان مرجع اصلی برگزیده و بر اساس آن، این آموزش آنلاین را ساخته است.

CHAPTERS: 18 SECTIONS: 5 FREE: CH 1–3 SYSTEM: C64-FORTH
[01] مقدمات
🔒 ACCESS TO CHAPTERS 4–18

ادامهٔ آموزش با کارتریج Final Plus FORTH Compiler

فصل‌های ۱ تا ۳ رایگان است. برای دسترسی به ۱۵ فصل بعدی، رمز ۱۵ کاراکتری لازم داری که همراه کارتریج Final Plus FORTH Compiler ارائه می‌شود.

چرا کارتریج؟

کامپایلر فورث، یک برنامهٔ تخصصی برای اجرای کد روی کمودور ۶۴ است. بارگذاری آن از نوار کاست یا دیسک کند است و در عمل، تجربهٔ کار روزمره با فورث را محدود می‌کند. اما وقتی این کامپایلر روی کارتریج باشد، به‌محض روشن شدن دستگاه در دسترس است — بدون انتظار، بدون بارگذاری مکرر، بدون دردسر.

Final Plus FORTH Compiler Cartridge
FINAL PLUS FORTH COMPILER

کارتریج Final Plus FORTH Compiler این کامپایلر را در بهترین حالت ممکن ارائه می‌دهد؛ چرا که امکانات حرفه‌ای کارتریج‌های Freezer (از جمله Freeze، Utility و ذخیرهٔ سریع وضعیت برنامه) را نیز در اختیار کاربر قرار می‌دهد. یعنی هم کامپایلر فورث را داری، هم ابزارهای حرفه‌ای کارتریج فاینال ۳ پلاس.

مزایای این کارتریج

  • کامپایلر فورث، همیشه در دسترس از لحظهٔ روشن شدن دستگاه
  • قابلیت‌های Freeze و Utility کارتریج فاینال ۳ پلاس
  • مجموعه‌ای از برنامه‌های کاربردی و سرگرمی
  • رمز دسترسی به ۱۵ فصل باقی‌ماندهٔ این آموزش

اگر فقط کتاب اصلی را می‌خواهی، می‌توانی آن را به‌صورت رایگان از آرشیو اینترنت دریافت کنی.

» Download Original C64-FORTH Manual (PDF)

اگر کارتریج را می‌خواهی، می‌توانی آن را از لینک زیر خریداری کنی:

› خرید کارتریج از AmigaStore.ir
رمز همراه کارتریج، فقط مخصوص این آموزش نیست. با آن، دروازهٔ همهٔ ابزارهای آنلاین آمیگااستور به روی شما باز می‌شود. یک بار تهیهٔ کارتریج، دسترسی کامل به مجموعهٔ امکانات سایت.
[02] مفاهیم میانی
[03] ورودی و خروجی
[04] جزئیات سیستم
[05] ضمیمه‌ها
CHAPTER 01

آغاز کار با FORTH

14 SECTIONS // C64-FORTH

۱.۱ آشنایی با FORTH

FORTH یک زبان برنامه‌نویسی است که در دههٔ ۱۹۷۰ توسط چارلز مور طراحی شد. این زبان برخلاف اکثر زبان‌های رایج، ساختاری متفاوت دارد و همین تفاوت، آن را برای کنترل مستقیم سخت‌افزار و برنامه‌نویسی سریع بسیار مناسب کرده است.

اگر با BASIC آشنایی دارید، FORTH برای شما هم قابل یادگیری است. تنها کافی است با چند مفهوم اصلی آن آشنا شوید:

  • پشته (Stack): محل نگهداری موقت داده‌ها.
  • واژه (Word): معادل دستور یا تابع در زبان‌های دیگر.
  • دیکشنری (Dictionary): فهرست همهٔ واژه‌های تعریف‌شده.
  • حالت مفسر و حالت کامپایلر: دو حالت کاری FORTH.

در ادامه هر یک از این مفاهیم را به‌صورت جداگانه توضیح می‌دهیم.

۱.۲ پشته چیست؟

پشته یکی از مفاهیم بنیادین FORTH است. تصور کنید تعدادی بشقاب روی هم قرار داده‌اید. هر بشقاب جدیدی که اضافه می‌کنید، روی بشقاب‌های قبلی قرار می‌گیرد. هنگام برداشتن نیز، همیشه بشقاب رویی برداشته می‌شود.

پشته در FORTH نیز دقیقاً همین‌گونه عمل می‌کند:

  • هر مقداری که وارد می‌کنید، روی پشته قرار می‌گیرد.
  • هر دستوری که اجرا می‌شود، مقادیر مورد نیاز خود را از روی پشته برمی‌دارد.

به این دو عمل، اصطلاحاً push (قرار دادن) و pop (برداشتن) گفته می‌شود.

مثال عملی

دستور زیر را در نظر بگیرید:

FORTH
3 4 + .

این دستور را می‌توان به این ترتیب تفسیر کرد:

  1. عدد 3 روی پشته قرار می‌گیرد.
  2. عدد 4 روی پشته قرار می‌گیرد.
  3. واژهٔ + اجرا می‌شود؛ عدد ۴ و ۳ را از پشته برمی‌دارد، آن‌ها را جمع می‌کند و حاصل (عدد ۷) را روی پشته قرار می‌دهد.
  4. واژهٔ . (نقطه) اجرا می‌شود؛ عدد ۷ را از پشته برمی‌دارد و آن را چاپ می‌کند.
OUTPUT
7 OK

عبارت OK پیامی از سوی FORTH است که نشان می‌دهد خط وارد‌شده به‌درستی پذیرفته شده است.

۱.۳ واژه‌ها و دیکشنری

در FORTH به هر دستور یا تابع، یک واژه (Word) گفته می‌شود. هر واژه، یک ورودی در جدولی به نام دیکشنری (Dictionary) دارد. هنگامی که نام یک واژه را وارد می‌کنید، FORTH در دیکشنری جستجو می‌کند و در صورت یافتن، آن را اجرا می‌کند.

مجموعهٔ واژه‌های FORTH ثابت نیست. استانداردهای این زبان، حداقلی از واژه‌ها را تعریف می‌کنند، اما کاربر می‌تواند واژه‌های جدید بسازد و زبان را گسترش دهد. همین ویژگی، FORTH را به زبانی منعطف و قابل سفارشی‌سازی تبدیل کرده است.

ساخت واژهٔ جدید

برای ساخت یک واژهٔ جدید، از الگوی زیر استفاده می‌شود:

FORTH
: نام_واژه بدنه ;
  • : نشانهٔ آغاز تعریف است.
  • نام_واژه نامی است که برای واژهٔ جدید انتخاب می‌کنید.
  • بدنه مجموعهٔ واژه‌ها و مقادیری است که واژهٔ جدید را می‌سازند.
  • ; نشانهٔ پایان تعریف است.

مثال

FORTH
: DOUBLE 2 * ;

این تعریف، یک واژهٔ جدید به نام DOUBLE می‌سازد که هر عددی را در ۲ ضرب می‌کند.

استفاده از آن:

FORTH
5 DOUBLE .
OUTPUT
10 OK

توضیح: عدد ۵ روی پشته قرار می‌گیرد. سپس واژهٔ DOUBLE اجرا می‌شود که معادل 2 * است. عدد ۲ روی پشته قرار می‌گیرد و سپس ضرب انجام می‌شود. حاصل، عدد ۱۰ است که با واژهٔ . چاپ می‌شود.

۱.۴ حالت‌های کاری FORTH

FORTH در دو حالت کار می‌کند:

حالت مفسر (Interpreter)

در این حالت، FORTH هر واژه‌ای را که وارد می‌کنید، بلافاصله جستجو و اجرا می‌کند. این حالت شبیه کار با BASIC در حالت مستقیم است.

حالت کامپایلر (Compiler)

هنگامی که در حال تعریف یک واژهٔ جدید با : هستید، FORTH وارد حالت کامپایلر می‌شود. در این حالت، واژه‌ها بلافاصله اجرا نمی‌شوند؛ بلکه به‌عنوان بخشی از تعریف جدید، در حافظه ذخیره می‌شوند. پس از وارد کردن ;، FORTH به حالت مفسر بازمی‌گردد.

نکته: برای اجرای یک واژهٔ تعریف‌شده، تنها کافی است نام آن را وارد کنید. FORTH به‌طور خودکار آن را جستجو و اجرا می‌کند.

۱.۵ قواعد نگارش

سه قاعدهٔ مهم در نوشتن دستورات FORTH وجود دارد:

قاعدهٔ اول: فاصله

هر واژه، عدد یا نماد باید با حداقل یک فاصله از مورد بعدی جدا شود. FORTH تنها از طریق تشخیص فاصله می‌فهمد که یک واژه کجا پایان می‌یابد و واژهٔ بعدی از کجا آغاز می‌شود.

این دستور نادرست است:

WRONG
3+4.

و این دستور درست است:

CORRECT
3 + 4 .

قاعدهٔ دوم: ترتیب نوشتن

در FORTH، ابتدا مقادیر و پارامترها نوشته می‌شوند و سپس نام واژه‌ای که باید آن‌ها را پردازش کند. به همین دلیل، FORTH را زبانی با نماد پسوندی می‌نامند.

مثال:

FORTH
3 4 + .

در اینجا، ابتدا دو مقدار نوشته شده و سپس واژهٔ + که آن‌ها را جمع می‌کند.

قاعدهٔ سوم: نام‌گذاری

نام هر واژه می‌تواند تا ۳۱ کاراکتر طول داشته باشد. برای حفظ سازگاری با سایر سیستم‌های FORTH، بهتر است تنها از کاراکترهای استاندارد ASCII استفاده کنید و از کاراکترهای گرافیکی خاص کمودور بپرهیزید.

۱.۶ صفحه‌ها (Screens)

در FORTH، سورس‌کد برنامه‌ها به‌صورت یک فایل پیوسته ذخیره نمی‌شود. به‌جای آن، از مفهوم صفحه (Screen) استفاده می‌شود.

هر صفحه، بلوکی شامل ۱۰۲۴ بایت داده است که به‌عنوان یک واحد، از دیسک یا نوار کاست خوانده یا روی آن نوشته می‌شود. هنگامی که یک صفحه LOAD می‌شود، FORTH آن را به‌عنوان جریان ورودی در نظر می‌گیرد؛ یعنی همان‌طور که گویی شما ۱۰۲۴ کاراکتر را در پاسخ به نشانگر چشمک‌زن وارد کرده‌اید.

کاربردهای صفحه‌ها

  • ذخیرهٔ سورس‌کد تعریف واژه‌های جدید
  • ذخیرهٔ آرایه‌ها و جداول داده
  • ذخیرهٔ زیرروال‌های کد ماشین
  • ذخیرهٔ دستورات غیرمستقیم

با ویرایشگر C64-FORTH می‌توانید محتوای صفحه‌ها را ویرایش کنید. هر صفحه می‌تواند صفحهٔ دیگری را نیز بارگذاری کند؛ به این ترتیب، یک برنامهٔ کامل می‌تواند از چندین صفحه تشکیل شود و تنها با یک دستور بارگذاری گردد.

۱.۷ بارگذاری C64-FORTH

برای بارگذاری این زبان روی کمودور ۶۴، مراحل زیر را انجام دهید:

  1. مطمئن شوید که هم کمودور ۶۴ و هم درایو دیسک روشن هستند.
  2. دیسک C64-FORTH را در درایو قرار دهید.
  3. دستور زیر را وارد کنید:
BASIC
LOAD"C64FORTH",8
  1. پس از پایان بارگذاری، دستور زیر را وارد کنید:
BASIC
RUN

پس از چند لحظه، پیام کپی‌رایت و شمارهٔ سریال روی صفحه ظاهر می‌شود و نشانگر چشمک می‌زند. اگر چنین نشد، دیسک را خارج کنید، برق هر دو دستگاه را خاموش کنید، چند ثانیه صبر کنید و مراحل را تکرار کنید.

ساخت نسخهٔ پشتیبان

پس از نخستین ورود به C64-FORTH، بلافاصله از دیسک اصلی نسخهٔ پشتیبان تهیه کنید. برای این کار:

  1. دیسک اصلی را در درایو قرار دهید.
  2. دستور زیر را وارد کنید:
FORTH
2 LOAD
توجه: وجود فاصله میان 2 و LOAD ضروری است.
  1. یک برنامهٔ پشتیبان‌گیری از دیسک بارگذاری می‌شود. دستورالعمل‌های روی صفحه را دنبال کنید.
  2. پس از پایان، یک نسخهٔ دقیقاً مشابه از دیسک در اختیار خواهید داشت.

از این پس، دیسک اصلی را در جای امنی نگه دارید و تنها از نسخهٔ پشتیبان استفاده کنید.

۱.۸ نخستین تجربه‌ها

پس از بارگذاری موفق، دستورات زیر را وارد کنید و نتیجهٔ هر یک را مشاهده کنید.

جمع دو عدد

FORTH
3 4 + .
OUTPUT
7 OK

تفریق

FORTH
10 3 - .
OUTPUT
7 OK

ضرب

FORTH
6 7 * .
OUTPUT
42 OK

تقسیم

FORTH
20 4 / .
OUTPUT
5 OK

ترکیب چند عمل

FORTH
3 4 + 2 * .
OUTPUT
14 OK

توضیح: ابتدا 3 4 + محاسبه می‌شود (نتیجه: ۷)، سپس 7 2 * محاسبه می‌شود (نتیجه: ۱۴).

۱.۹ دستورات پرکاربرد

جدول زیر برخی از دستورات پرکاربرد FORTH را معرفی می‌کند:

دستورکاربرد
.چاپ مقدار رویی پشته و حذف آن
+جمع دو مقدار رویی پشته
-تفریق دو مقدار رویی پشته
*ضرب دو مقدار رویی پشته
/تقسیم دو مقدار رویی پشته
DUPتکرار مقدار رویی پشته
SWAPجابه‌جایی دو مقدار رویی پشته
DROPحذف مقدار رویی پشته
CRانتقال نشانگر به خط جدید

مثال‌هایی از این دستورات

FORTH
5 DUP . .
OUTPUT
5 5 OK
FORTH
1 2 SWAP . .
OUTPUT
1 2 OK

توضیح: ابتدا ۲ و سپس ۱ روی صفحه چاپ می‌شوند، زیرا SWAP جای دو مقدار را عوض کرده است.

۱.۱۰ نخستین برنامه

برنامهٔ زیر الفبای انگلیسی را چاپ می‌کند:

FORTH
: ALPHA 91 65 DO I EMIT LOOP ;
ALPHA
OUTPUT
ABCDEFGHIJKLMNOPQRSTUVWXYZ

توضیح دستور

  • : آغاز تعریف واژهٔ جدید
  • ALPHA نام واژه
  • 91 مقدار پایانی حلقه به‌اضافهٔ یک
  • 65 مقدار آغازین (کد ASCII حرف A)
  • DO آغاز حلقه
  • I قرار دادن مقدار شمارندهٔ فعلی روی پشته
  • EMIT تبدیل مقدار عددی به کاراکتر و چاپ آن
  • LOOP پایان حلقه
  • ; پایان تعریف

معادل این برنامه در BASIC چنین است:

BASIC
10 FOR I = 65 TO 90
20 PRINT CHR$(I);
30 NEXT I

۱.۱۱ تغییر رنگ حاشیهٔ صفحه

یکی از قابلیت‌های جالب FORTH، دسترسی مستقیم به حافظهٔ سخت‌افزار است. دستور زیر رنگ حاشیهٔ صفحه را به رنگ قرمز تغییر می‌دهد:

FORTH
4 53280 C!

توضیح:

  • 4 کد رنگ قرمز
  • 53280 نشانی حافظه‌ای که رنگ حاشیه را نگه می‌دارد
  • C! ذخیرهٔ مقدار در آن نشانی

برای بازگرداندن رنگ حاشیه به حالت اولیه:

FORTH
14 53280 C!

۱.۱۲ اشتباهات رایج

هنگام کار با FORTH، ممکن است با خطاهای زیر روبه‌رو شوید:

خطای اول: نبود فاصله

این دستور کار نمی‌کند:

WRONG
3+4.

باید نوشت:

CORRECT
3 + 4 .

خطای دوم: نبود داده روی پشته

اگر دستور زیر را وارد کنید:

WRONG
+ .

FORTH پیام خطا می‌دهد، زیرا پشته خالی است و نمی‌تواند دو مقدار را جمع کند.

خطای سوم: واژهٔ تعریف‌نشده

اگر نام یک واژه که تعریف نشده است را وارد کنید:

WRONG
FOO .

FORTH پیام زیر را نمایش می‌دهد:

ERROR
? CAN'T FIND FOO

۱.۱۳ تمرین‌ها

برای تسلط بر مفاهیم این فصل، تمرین‌های زیر را انجام دهید:

EXERCISE 01
دو عدد ۱۵ و ۲۵ را جمع کنید و نتیجه را چاپ کنید.
FORTH
15 25 + .
OUTPUT
40 OK
EXERCISE 02
واژه‌ای به نام TRIPLE تعریف کنید که هر عددی را در ۳ ضرب کند.
FORTH
: TRIPLE 3 * ;
7 TRIPLE .
OUTPUT
21 OK
EXERCISE 03
واژه‌ای به نام ALPHA5 تعریف کنید که تنها پنج حرف نخست الفبای انگلیسی را چاپ کند.
FORTH
: ALPHA5 70 65 DO I EMIT LOOP ;
ALPHA5
OUTPUT
ABCDE
EXERCISE 04
رنگ حاشیهٔ صفحه را به رنگ سبز (کد رنگ ۵) تغییر دهید.
FORTH
5 53280 C!
EXERCISE 05
عدد ۱۰۰ را روی پشته قرار دهید، آن را تکرار کنید و سپس هر دو مقدار را چاپ کنید.
FORTH
100 DUP . .
OUTPUT
100 100 OK

۱.۱۴ خلاصهٔ فصل

نکات کلیدی این فصل

  • پشته: محلی برای نگهداری موقت داده‌ها
  • واژه: معادل دستور یا تابع در زبان‌های دیگر
  • دیکشنری: فهرست واژه‌های تعریف‌شده
  • حالت مفسر و کامپایلر: دو حالت کاری FORTH
  • قواعد نگارش: استفاده از فاصله، رعایت ترتیب نوشتن، رعایت طول نام
  • صفحه‌ها: بلوک‌های ۱۰۲۴ بایتی برای ذخیرهٔ سورس‌کد
  • نحوهٔ بارگذاری و تهیهٔ نسخهٔ پشتیبان
  • دستورات پرکاربرد مانند +، -، *، /، DUP، SWAP و DROP
CHAPTER 02

عملیات پایه روی پشته

12 SECTIONS // C64-FORTH

۲.۱ مرور مفهوم پشته

در فصل پیشین با مفهوم پشته آشنا شدید. در این فصل، به‌طور کامل و کاربردی به عملیات روی پشته می‌پردازیم.

یادآوری می‌کنیم که پشته مانند دسته‌ای از بشقاب‌های روی‌هم‌چیده است. هر مقداری که وارد می‌کنید، روی پشته قرار می‌گیرد و هر دستوری که اجرا می‌شود، مقادیر مورد نیاز خود را از روی پشته برمی‌دارد.

علامت‌گذاری در این کتاب

برای سهولت در توضیح، از این پس از علامت‌گذاری زیر استفاده می‌کنیم:

NOTATION
n1  n2  n3  ---  نتیجه
  • مقادیری که در سمت چپ --- نوشته می‌شوند، مقادیر موجود روی پشته پیش از اجرای واژه هستند.
  • مقادیری که در سمت راست --- نوشته می‌شوند، مقادیر موجود روی پشته پس از اجرای واژه هستند.
  • n1 به معنای عدد اول، n2 به معنای عدد دوم و به همین ترتیب است.
  • اگر n2 سمت راست n1 نوشته شده باشد، به این معناست که n2 بالاتر از n1 روی پشته قرار دارد.

مثال:

NOTATION
DUP   n1 --- n1 n1

این یعنی واژهٔ DUP، مقدار رویی پشته را می‌گیرد و دو نسخه از آن روی پشته می‌گذارد.

۲.۲ انواع اعداد در FORTH

FORTH دو نوع عدد صحیح را پشتیبانی می‌کند:

الف) عدد صحیح علامت‌دار (Signed Single Precision Integer)

عددی است در بازهٔ ‎-۳۲۷۶۸‎ تا ‎۳۲۷۶۷‎. این اعداد می‌توانند مثبت یا منفی باشند.

ب) عدد صحیح بدون علامت (Unsigned Single Precision Integer)

عددی است در بازهٔ ‎۰‎ تا ‎۶۵۵۳۵‎. این اعداد تنها مثبت هستند و برای نمایش آدرس‌های حافظه یا مقادیر دودویی مناسب‌اند.

نکتهٔ مهم: مقدار بدون علامت ‎۶۵۵۳۵‎ با مقدار علامت‌دار ‎-۱‎ برابر است. به همین ترتیب، ‎۶۵۵۳۴‎ برابر ‎-۲‎ و ‎۳۲۷۶۸‎ برابر ‎-۳۲۷۶۸‎ است. اینکه یک مقدار علامت‌دار تفسیر شود یا بدون علامت، بستگی به واژه‌ای دارد که آن را پردازش می‌کند.

وارد کردن عدد روی پشته

برای وارد کردن عدد روی پشته، تنها عدد را تایپ کنید و کلید RETURN را بزنید. FORTH با پیام OK تأیید می‌کند که عدد پذیرفته شده است.

FORTH
142

نتیجه:

OUTPUT
OK

اکنون عدد ۱۴۲ روی پشته قرار دارد.

۲.۳ چاپ مقدار رویی پشته

دستور نقطه (.)

برای چاپ مقدار رویی پشته به‌صورت عدد صحیح علامت‌دار، از واژهٔ . استفاده کنید. این واژه مقدار رویی را از پشته برمی‌دارد و آن را چاپ می‌کند.

FORTH
142 .
OUTPUT
142 OK

اگر چند عدد روی پشته باشد، هر بار . مقدار رویی را چاپ می‌کند.

FORTH
-7 678 10426 -32000

اکنون روی پشته چهار عدد قرار دارد. با تکرار . می‌توان آن‌ها را چاپ کرد:

FORTH
.
OUTPUT
-32000 OK
FORTH
.
OUTPUT
10426 OK
FORTH
.
OUTPUT
678 OK
FORTH
.
OUTPUT
-7 OK

توجه کنید که مقادیر از بالا به پایین چاپ می‌شوند؛ یعنی آخرین مقداری که وارد کرده‌اید، نخستین مقداری است که چاپ می‌شود.

پیام EMPTY STACK

اگر پس از چاپ همهٔ مقادیر، دوباره . را وارد کنید، پیام زیر ظاهر می‌شود:

FORTH
.
OUTPUT
EMPTY STACK

این پیام به معنای خالی بودن پشته است.

دستور U.

برای چاپ مقدار رویی پشته به‌صورت عدد صحیح بدون علامت، از واژهٔ U. استفاده کنید.

FORTH
-1 U.
OUTPUT
65535 OK

زیرا عدد ‎-۱‎ در نمایش بدون علامت، معادل ‎۶۵۵۳۵‎ است.

۲.۴ دستکاری آیتم‌های پشته

FORTH مجموعه‌ای غنی از واژه‌ها برای تکرار، حذف یا جابه‌جایی آیتم‌های پشته در اختیار شما می‌گذارد.

۱) واژهٔ DUP

مقدار رویی پشته را تکرار می‌کند.

NOTATION
DUP   n1 --- n1 n1

مثال:

FORTH
37 DUP . .
OUTPUT
37 37 OK

۲) واژهٔ SWAP

جای دو مقدار رویی پشته را با هم عوض می‌کند.

NOTATION
SWAP   n1 n2 --- n2 n1

مثال:

FORTH
123 19 SWAP . .
OUTPUT
123 19 OK

توضیح: ابتدا عدد ۱۹ چاپ می‌شود، زیرا SWAP جای دو مقدار را عوض کرده است.

۳) واژهٔ DROP

مقدار رویی پشته را حذف می‌کند.

NOTATION
DROP   n1 ---

مثال:

FORTH
42 12 DROP .
OUTPUT
42 OK

۴) واژهٔ OVER

مقدار دوم پشته را روی آن کپی می‌کند.

NOTATION
OVER   n1 n2 --- n1 n2 n1

مثال:

FORTH
78 6 OVER . . .
OUTPUT
78 6 78 OK

۵) واژهٔ ROT

سه مقدار رویی پشته را می‌چرخاند.

NOTATION
ROT   n1 n2 n3 --- n2 n3 n1

مثال:

FORTH
10 20 30 ROT . . .
OUTPUT
10 30 20 OK

۶) واژهٔ PICK

مقدار n‌اُم پشته را (بدون شمارش خودِ n) روی پشته کپی می‌کند.

FORTH
10 20 30 40 4 PICK . . . . .
OUTPUT
10 40 30 20 10 OK
نکته: 1 PICK معادل DUP است و 2 PICK معادل OVER.

۷) واژهٔ ROLL

n مقدار رویی پشته را می‌چرخاند.

FORTH
10 20 30 40 4 ROLL . . . .
OUTPUT
10 40 30 20 OK
نکته: 3 ROLL معادل ROT است.

۲.۵ عملیات حسابی

انجام عملیات حسابی روی مقادیر پشته بسیار ساده است. کافی است همهٔ مقادیر مورد نیاز پیش از اجرای عملگر روی پشته باشند.

FORTH
3 17 + .
OUTPUT
20 OK
FORTH
20 32 - .
OUTPUT
-12 OK
FORTH
7 8 * .
OUTPUT
56 OK
FORTH
204 17 / .
OUTPUT
12 OK

آزادی در نوشتن دستورات

FORTH زبانی با قالب آزاد است. می‌توانید در یک خط یک عمل یا چند عمل بنویسید. همچنین می‌توانید زمان انجام عمل را خودتان کنترل کنید، به شرطی که تعداد مقادیر لازم روی پشته موجود باشد.

FORTH
3 7 2 8 + + + .
OUTPUT
20 OK
FORTH
3 7 + 2 + 8 + .
OUTPUT
20 OK

می‌توانید یک دستور را نیمه‌کاره رها کنید و در خط بعد ادامه دهید:

FORTH
3 7 + 2

اکنون روی پشته مقادیر ۱۰ و ۲ قرار دارند. می‌توانید ادامه دهید:

FORTH
8 + + .
OUTPUT
20 OK

ترتیب اجرای عملیات

عملیات به همان ترتیبی که نوشته می‌شوند، انجام می‌شوند:

FORTH
3 7 8 + * .
OUTPUT
45 OK

توضیح: ابتدا 7 8 + محاسبه می‌شود (نتیجه: ۱۵)، سپس 3 15 * محاسبه می‌شود (نتیجه: ۴۵).

FORTH
3 7 8 * + .
OUTPUT
59 OK

توضیح: ابتدا 7 8 * محاسبه می‌شود (نتیجه: ۵۶)، سپس 3 56 + محاسبه می‌شود (نتیجه: ۵۹).

واژه‌های تکمیلی

علاوه بر چهار عمل اصلی، واژه‌های زیر نیز در FORTH موجودند:

واژهکاربرد
*/ضرب و تقسیم با دقت مضاعف
*/MODضرب و تقسیم با باقی‌مانده
/MODتقسیم با باقی‌مانده
MODباقی‌مانده تقسیم
1+افزودن یک
1-کاستن یک
2+افزودن دو
2-کاستن دو
2*ضرب در دو
2/تقسیم بر دو
ABSقدر مطلق
MAXبزرگ‌ترین دو عدد
MINکوچک‌ترین دو عدد
NEGATEقرینه کردن

مثال‌هایی از این واژه‌ها:

FORTH
-5 ABS .
OUTPUT
5 OK
FORTH
3 7 MAX .
OUTPUT
7 OK
FORTH
3 7 MIN .
OUTPUT
3 OK
FORTH
5 NEGATE .
OUTPUT
-5 OK
FORTH
17 5 MOD .
OUTPUT
2 OK

۲.۶ کار در مبناهای مختلف عددی

اعداد در مبنای ۱۰ (دستگاه ده‌دهی) برای کامپیوتر طبیعی نیستند. رابطهٔ میان آدرس‌ها، الگوهای بیتی و محتوای حافظه زمانی بهتر درک می‌شود که در مبنای دیگری کار کنید. برای زبان‌هایی مانند FORTH یا اسمبلر که کنترل بیشتری روی سخت‌افزار می‌دهند، مبنای ۱۶ (شانزده‌شانزدهی یا HEX) معنادارتر است.

متغیر BASE

BASE یک متغیر FORTH است که مبنای عددی فعلی را در خود نگه می‌دارد. تمام تبدیل‌های ورودی و خروجی (کاراکتر به مقدار دودویی و برعکس) بر اساس مبنای فعلی انجام می‌شوند.

دستور DECIMAL

مبنا را به ۱۰ تنظیم می‌کند.

FORTH
DECIMAL 8 9 + .
OUTPUT
17 OK

دستور HEX

مبنا را به ۱۶ تنظیم می‌کند.

FORTH
HEX 8 9 + .
OUTPUT
11 OK
FORTH
HEX 1A C + .
OUTPUT
26 OK

تغییر مبنا به روش مستقیم

می‌توانید مقدار BASE را مستقیماً تغییر دهید. مثلاً برای کار در مبنای ۸ (اکتال):

FORTH
8 BASE !

اکنون در مبنای ۸ هستید:

FORTH
7 6 + .
OUTPUT
15 OK

توضیح: عدد ۱۵ در مبنای ۸ معادل ۱۳ در مبنای ۱۰ است، اما به‌صورت ۱۵ نمایش داده می‌شود.

مبنای ۲ (دودویی)

FORTH
2 BASE !

از این پس همهٔ اعداد بر اساس مبنای ۲ تفسیر می‌شوند.

برای بازگشت به مبنای ۱۰:

FORTH
DECIMAL

۲.۷ ثابت‌ها و متغیرها

در BASIC، یک ثابت متغیری است که مقدارش در طول برنامه تغییر نمی‌کند. در FORTH، ثابت‌ها و متغیرها دو نوع داده‌ای کاملاً متفاوت هستند.

الف) ثابت (Constant)

ثابت و متغیر، هر دو ورودی‌هایی در دیکشنری هستند. هنگامی که نام یک ثابت اجرا می‌شود، مقدار آن روی پشته قرار می‌گیرد.

اعداد 0، 1، 2 و 3 نیز به‌عنوان ثابت تعریف شده‌اند، زیرا بسیار پرکاربردند.

برای ساخت یک ثابت جدید، از واژهٔ CONSTANT استفاده کنید:

SYNTAX
<مقدار اولیه> CONSTANT <نام ثابت>

مثال:

FORTH
7 CONSTANT DAYS/WK

این دستور یک ورودی جدید به نام DAYS/WK در دیکشنری می‌سازد و مقدار ۷ را به آن نسبت می‌دهد. از این پس، هر بار DAYS/WK اجرا شود، عدد ۷ روی پشته قرار می‌گیرد:

FORTH
DAYS/WK .
OUTPUT
7 OK

ب) متغیر (Variable)

متغیرها در FORTH بسیار پرکاربردند. هنگامی که نام یک متغیر اجرا می‌شود، نشانی محتوای آن روی پشته قرار می‌گیرد (نه خود مقدار).

برای ساخت متغیر:

SYNTAX
VARIABLE <نام متغیر>

مثال:

FORTH
VARIABLE #OFERRORS

هنگامی که #OFERRORS اجرا شود، نشانی مقدار فعلی آن روی پشته قرار می‌گیرد. هنگام ساخت متغیر، مقدار اولیهٔ آن تصادفی است. برای مقداردهی، باید مقداری در آن ذخیره کنید.

ج) متغیرهای کاربر (User Variables)

در FORTH متغیرهای خاصی وجود دارند که به آن‌ها متغیرهای کاربر گفته می‌شود؛ مانند BASE و BORDER. محتوای این متغیرها بلافاصله پس از هدر در حافظه ذخیره نمی‌شود؛ بلکه در جدولی به نام ناحیهٔ کاربر (User Area) که در بالای حافظهٔ مورد استفادهٔ FORTH قرار دارد، ذخیره می‌شود.

از نظر عملکردی، این متغیرها با متغیرهای معمولی تفاوتی ندارند، اما هنگام اجرا، نشانی آن‌ها در ناحیهٔ کاربر روی پشته قرار می‌گیرد.

۲.۸ واکشی و ذخیره‌سازی

دو واژهٔ مهم برای خواندن و نوشتن در حافظه وجود دارد:

واژهٔ @ (واکشی)

این واژه محتوای ۱۶ بیتی نشانی رویی پشته را می‌خواند و آن را جایگزین نشانی می‌کند.

FORTH
641 @ .
OUTPUT
2048 OK

معادل این دستور در BASIC:

BASIC
PRINT (PEEK(642)*256 + PEEK(641))

از آنجا که اجرای نام یک متغیر، نشانی آن را روی پشته می‌گذارد، می‌توان با @ محتوای متغیر را خواند.

مثال:

FORTH
#OFERRORS @ .

نتیجه ممکن است 0 یا مقداری تصادفی باشد، زیرا متغیر #OFERRORS هنوز مقداردهی نشده است.

واژهٔ ! (ذخیره‌سازی)

این واژه یک مقدار ۱۶ بیتی را در نشانی مشخصی از حافظه می‌نویسد. دو مقدار روی پشته لازم است:

  • مقدار رویی: نشانی مقصد
  • مقدار دوم: مقداری که باید ذخیره شود

مثال:

FORTH
513 1142 !

این دستور مقدار ۱۱۴۲ را در نشانی ۵۱۳ ذخیره می‌کند.

تغییر مقدار یک متغیر:

FORTH
10 BASE !

این دستور مقدار ۱۰ را در متغیر BASE ذخیره می‌کند.

۲.۹ واکشی و ذخیره‌سازی بایت‌ها

واژه‌های @ و ! برای مقادیر ۱۶ بیتی به کار می‌روند. اما پردازندهٔ ۶۵۰۲ یک پردازندهٔ ۸ بیتی است. بنابراین واژه‌هایی نیز برای کار با بایت‌ها وجود دارد.

واژهٔ C@ (واکشی بایت)

یک بایت از نشانی رویی پشته می‌خواند.

FORTH
53280 C@ .
OUTPUT
14 OK

این دستور رنگ حاشیهٔ فعلی صفحه را چاپ می‌کند.

واژهٔ C! (ذخیره‌سازی بایت)

یک بایت در نشانی مشخص می‌نویسد.

FORTH
4 53280 C!

این دستور رنگ حاشیهٔ صفحه را به رنگ قرمز (کد ۴) تغییر می‌دهد.

بازگرداندن رنگ حاشیه

متغیر BORDER مقدار رنگی را نگه می‌دارد که C64-FORTH هنگام راه‌اندازی برای حاشیه تنظیم می‌کند.

FORTH
BORDER C@ 53280 C!

این دستور رنگ حاشیه را به مقدار اصلی بازمی‌گرداند.

۲.۱۰ اعداد دقت دوگانه

چرا اعداد دقت دوگانه؟

هر جای پشته می‌تواند یک مقدار ۱۶ بیتی را نگه دارد. بنابراین بازهٔ اعداد محدود به ‎-۳۲۷۶۸‎ تا ‎۶۵۵۳۵‎ است. این بازه برای برخی کاربردها کافی نیست. به همین دلیل، FORTH مجموعه‌ای از واژه‌ها را برای گسترش این بازه ارائه می‌دهد.

به این اعداد، اعداد صحیح دقت دوگانه (Double Precision Integers) گفته می‌شود. بازهٔ مؤثر آن‌ها از ‎-۲,۱۴۷,۴۸۳,۶۴۸‎ تا ‎۲,۱۴۷,۴۸۳,۶۴۷‎ است. هر عدد دقت دوگانه، ۳۲ بیت (۴ بایت) از فضای پشته را اشغال می‌کند.

وارد کردن عدد دقت دوگانه

برای وارد کردن عدد دقت دوگانه، کافی است یک نقطه اعشار درون عدد قرار دهید:

FORTH
1234.567

مهم نیست نقطه اعشار کجا قرار گیرد؛ مقدار یکسان روی پشته قرار می‌گیرد. اما محل نقطه در متغیر DPL ذخیره می‌شود.

چاپ عدد دقت دوگانه

برای چاپ مقدار دقت دوگانه رویی پشته، از واژهٔ D. استفاده کنید:

FORTH
1234.567 D.
OUTPUT
1234567 OK

بررسی محل نقطه:

FORTH
DPL @ .
OUTPUT
3 OK

تبدیل عدد دقت ساده به دوگانه

برای تبدیل یک عدد صحیح مثبت به دقت دوگانه، کافی است یک صفر روی پشته قرار دهید. برای عدد منفی، عدد ۶۵۵۳۵ را روی پشته بگذارید.

واژهٔ S->D این کار را به‌طور خودکار انجام می‌دهد و علامت عدد را نیز در نظر می‌گیرد.

تبدیل عدد دقت دوگانه به ساده

برای تبدیل عدد دقت دوگانه به عدد ساده، واژهٔ DROP را اجرا کنید تا ۱۶ بیت بالایی حذف شود.

واژه‌های پشته‌ای دقت دوگانه

بیشتر واژه‌های دستکاری پشته، معادل دقت دوگانه نیز دارند. این واژه‌ها با پیشوند 2 مشخص می‌شوند:

واژهکاربرد
2!ذخیره عدد دقت دوگانه
2@واکشی عدد دقت دوگانه
2DUPتکرار عدد دقت دوگانه
2DROPحذف عدد دقت دوگانه
2SWAPجابه‌جایی دو عدد دقت دوگانه
2OVERکپی دومین عدد دقت دوگانه
2ROTچرخش سه عدد دقت دوگانه

ثابت‌ها و متغیرهای دقت دوگانه

FORTH
8732109. 2CONSTANT BIGNUM

از این پس هر بار BIGNUM اجرا شود، مقدار 8732109. روی پشته قرار می‌گیرد.

FORTH
2VARIABLE BNUM

این دستور یک متغیر دقت دوگانه می‌سازد.

عملیات حسابی دقت دوگانه

عملیات حسابی دقت دوگانه معمولاً با حرف D آغاز می‌شوند:

واژهکاربرد
D+جمع
D-تفریق
DABSقدر مطلق
DMAXبزرگ‌ترین
DMINکوچک‌ترین
DNEGATEقرینه

واژه‌های دیگری نیز وجود دارند که هم با اعداد ساده و هم با اعداد دقت دوگانه کار می‌کنند:

واژهکاربرد
D+-ترکیب
M*ضرب با نتیجهٔ دقت دوگانه
M/تقسیم با نتیجهٔ دقت دوگانه
M/MODتقسیم با باقی‌مانده
S->Dتبدیل ساده به دوگانه
U*ضرب بدون علامت
U/تقسیم بدون علامت

۲.۱۱ تمرین‌های فصل

EXERCISE 01
عدد ۵۰ را روی پشته قرار دهید و سه نسخه از آن روی پشته بسازید، سپس هر سه را چاپ کنید.
FORTH
50 DUP DUP . . .
OUTPUT
50 50 50 OK
EXERCISE 02
دو عدد ۱۵ و ۲۵ را وارد کنید، جای آن‌ها را عوض کنید و سپس تفریق انجام دهید. نتیجه را چاپ کنید.
FORTH
15 25 SWAP - .
OUTPUT
10 OK

توضیح: پس از SWAP، ترتیب مقادیر ‎۲۵‎ و ‎۱۵‎ می‌شود. با تفریق، حاصل ۱۰ به دست می‌آید.

EXERCISE 03
باقی‌ماندهٔ تقسیم ۲۳ بر ۷ را محاسبه کنید.
FORTH
23 7 MOD .
OUTPUT
2 OK
EXERCISE 04
ثابتی به نام HOURS/DAY با مقدار ۲۴ تعریف کنید. سپس مقدار آن را چاپ کنید.
FORTH
24 CONSTANT HOURS/DAY
HOURS/DAY .
OUTPUT
24 OK
EXERCISE 05
در مبنای ۱۶، حاصل جمع 2A و 5F را محاسبه کنید.
FORTH
HEX 2A 5F + DECIMAL .
OUTPUT
137 OK
EXERCISE 06
یک عدد دقت دوگانهٔ 987654.321 را وارد کنید و آن را با D. چاپ کنید.
FORTH
987654.321 D.
OUTPUT
987654321 OK
EXERCISE 07
مقدار کنونی رنگ پس‌زمینه را بخوانید و آن را روی صفحه چاپ کنید. سپس رنگ پس‌زمینه را به رنگ سیاه (کد ۰) تغییر دهید.
FORTH
53281 C@ .

نتیجه کد رنگ فعلی پس‌زمینه را چاپ می‌کند. برای تغییر رنگ به سیاه:

FORTH
0 53281 C!

۲.۱۲ خلاصهٔ فصل

نکات کلیدی این فصل

  • انواع اعداد در FORTH: علامت‌دار و بدون علامت
  • چاپ مقدار پشته با . و U.
  • دستکاری پشته با واژه‌های DUP، SWAP، DROP، OVER، ROT، PICK و ROLL
  • عملیات حسابی پایه و تکمیلی
  • کار در مبناهای مختلف عددی با BASE، DECIMAL و HEX
  • تعریف ثابت و متغیر با CONSTANT و VARIABLE
  • واکشی و ذخیره‌سازی مقادیر ۱۶ بیتی با @ و !
  • واکشی و ذخیره‌سازی بایت‌ها با C@ و C!
  • اعداد دقت دوگانه و واژه‌های مربوط به آن‌ها
CHAPTER 03

ورود دستورات در سیستم FORTH

12 SECTIONS // C64-FORTH

۳.۱ مقدمه

در فصل‌های پیشین با مفهوم پشته، واژه‌ها و نحوهٔ کار سادهٔ FORTH آشنا شدید. در این فصل، به‌طور دقیق بررسی می‌کنیم که چگونه می‌توان دستورات را در سیستم FORTH وارد کرد و چه قواعدی بر این کار حاکم است.

درک این فصل بسیار مهم است، زیرا بدون آگاهی از قواعد ورود دستورات، ممکن است برنامه‌های شما به‌درستی اجرا نشوند و پیام‌های خطا دریافت کنید.

۳.۲ تفاوت FORTH با زبان‌های دیگر

در زبان‌های برنامه‌نویسی رایج، ساختار یک دستور معمولاً از سه بخش تشکیل می‌شود:

  • دستورالعمل (Instruction): عملی که باید انجام شود.
  • عملوندها (Operands): مقادیری که دستور روی آن‌ها عمل می‌کند.
  • عملگرها (Operators): نمادهایی مانند + و = که نوع عملیات را مشخص می‌کنند.

برای مثال، در BASIC می‌نویسید:

BASIC
PRINT 3 + 4

در اینجا:

  • PRINT دستورالعمل است.
  • 3 و 4 عملوندها هستند.
  • + عملگر است.

اما در FORTH، چنین ساختاری وجود ندارد. در FORTH تنها دو چیز وجود دارد:

  • واژه‌ها (Words)
  • مقادیر عددی (Numeric Values)

هر واژه، یک ورودی در دیکشنری است. هنگامی که نام یک واژه را وارد می‌کنید، بخشی از کد که به آن واژه مربوط است، اجرا می‌شود. بنابراین، برای اجرای یک دستور، تنها کافی است نام واژه را در جریان ورودی وارد کنید.

می‌توانید نام چند واژه را همزمان در یک خط وارد کنید، یا هر واژه را در خطی جداگانه بنویسید. هر تابعی که در FORTH وجود دارد، یک ورودی در دیکشنری دارد و تنها با وارد کردن نام آن فراخوانی می‌شود.

۳.۳ جریان ورودی (Input Stream)

هنگامی که کلید RETURN را فشار می‌دهید، همهٔ کاراکترهای موجود در خط جاری به‌عنوان جریان ورودی به FORTH تحویل داده می‌شوند.

جریان ورودی، همان خط فرمان یا مقادیر عددی است که در پاسخ به نشانگر چشمک‌زن وارد کرده‌اید.

FORTH این جریان را کلمه‌به‌کلمه می‌خواند، هر واژه را در دیکشنری جستجو می‌کند و در صورت یافتن، آن را اجرا می‌کند. اگر کلمه‌ای در دیکشنری پیدا نشود، FORTH تلاش می‌کند آن را به عدد تبدیل کند و در صورت موفقیت، روی پشته قرار دهد.

۳.۴ نقش فاصله در جداسازی واژه‌ها

مهم‌ترین قاعدهٔ نگارش در FORTH این است:

هر واژه، عدد یا نماد باید با حداقل یک فاصله از مورد بعدی جدا شود.

FORTH تنها از طریق تشخیص کاراکتر فاصله می‌فهمد که نام یک واژه کجا پایان می‌یابد و واژهٔ بعدی از کجا آغاز می‌شود. همچنین تشخیص می‌دهد که یک نمایش عددی کجا شروع و کجا تمام می‌شود.

مثال درست

CORRECT
3 4 + .

در اینجا، بین هر عدد و نماد، فاصله وجود دارد. FORTH به‌درستی این دستور را اجرا می‌کند.

مثال نادرست

WRONG
3+4.

در اینجا هیچ فاصله‌ای وجود ندارد. FORTH کل عبارت 3+4. را به‌عنوان یک واژه در نظر می‌گیرد، آن را در دیکشنری پیدا نمی‌کند و پیام خطا می‌دهد.

قاعدهٔ کلی

از آنجا که عملگرهایی مانند * (ضرب) در FORTH به‌عنوان واژه تعریف شده‌اند، باید حداقل یک فاصله بین اعداد و نمادهایی مانند +، *، - و / وجود داشته باشد.

توصیه: برای جلوگیری از خطا، همیشه بین واژه‌ها و مقادیر، یک فاصله بگذارید. حتی اگر FORTH بتواند در برخی موارد بدون فاصله کار کند، عادت کردن به این قاعده، از بروز اشتباهات جلوگیری می‌کند.

۳.۵ کاراکترهای مجاز در نام واژه‌ها

پرسشی که ممکن است پیش بیاید این است: در نام یک واژه، از چه کاراکترهایی می‌توان استفاده کرد؟

پاسخ: هر کاراکتر قابل چاپ روی صفحه می‌تواند در نام یک واژه به کار رود.

با این حال، برای حفظ سازگاری با سایر سیستم‌های FORTH، توصیه می‌شود:

  • از کاراکترهای گرافیکی خاص کمودور در نام واژه‌ها استفاده نکنید.
  • تنها از کاراکترهای استاندارد ASCII استفاده کنید.

طول نام واژه

نام هر واژهٔ FORTH می‌تواند حداکثر ۳۱ کاراکتر طول داشته باشد.

مثال

این نام‌ها معتبرند:

FORTH
: COUNTER 0 ;
: PRINT-NAME ." Ali" ;
: CALCULATE.SUM + + ;

۳.۶ نوشتن توضیحات (کامنت)

برای نوشتن توضیحات میان دستورات FORTH، از پرانتز استفاده کنید.

قاعده

توضیح را درون پرانتز قرار دهید:

FORTH
( این یک توضیح است )
نکتهٔ مهم: باید حداقل یک فاصله بین علامت ( و آغاز توضیح وجود داشته باشد. علت این است که ( خودش یک واژه است؛ یک ورودی در دیکشنری که هنگام اجرا، جریان ورودی را می‌خواند تا نخستین ) را پیدا کند.

مثال

FORTH
( این برنامه دو عدد را جمع می‌کند )
3 4 + .

هشدار

در FORTH، توضیحات تودرتو مجاز نیستند. به این معنا که نمی‌توانید درون یک توضیح، توضیح دیگری بنویسید.

WRONG
( این توضیح ( تودرتو ) غلط است )

این دستور خطا می‌دهد، زیرا FORTH تا نخستین ) می‌خواند و سپس بخش غلط است ) را به‌عنوان دستور تلقی می‌کند.

۳.۷ نماد پسوندی (Postfix Notation)

FORTH را زبانی با نماد پسوندی می‌نامند. این اصطلاح به چه معناست؟

به این معنا که هر پارامتر، توصیف‌کننده یا مقدار عددی که یک واژه به آن نیاز دارد، باید پیش از اجرای واژه روی پشته قرار گیرد.

مقایسه با BASIC

در BASIC، نخست دستور را می‌نویسید، سپس پارامترها را:

BASIC
PRINT 3 + 4

در FORTH، نخست همه‌چیز را می‌نویسید، سپس نام واژه‌ای که باید اجرا شود:

FORTH
3 4 + .

قاعدهٔ طلایی

در FORTH ابتدا همه‌چیز را مشخص کنید، سپس نام واژه‌ای را که می‌خواهید اجرا شود، بنویسید.

این قاعده در تمام طول کار با FORTH برقرار است. حتی در تعریف واژه‌های جدید نیز همین اصل حاکم است.

۳.۸ مقایسهٔ ساختار دستورات در FORTH و BASIC

جدول زیر تفاوت ساختار دستورات را در دو زبان نشان می‌دهد:

کارBASICFORTH
چاپ عدد ۵PRINT 55 .
جمع دو عددPRINT 3+43 4 + .
ضربPRINT 6*76 7 * .
چاپ متنPRINT "HELLO"." HELLO"
تعریف متغیرA = 55 VARIABLE A
حلقهFOR I=1 TO 10 ... NEXT: LOOP 11 1 DO ... LOOP ;

همان‌طور که مشاهده می‌کنید، ترتیب نوشتن در FORTH غالباً معکوس BASIC است.

۳.۹ نکات تکمیلی

۳.۹.۱ خط فرمان و خط خالی

اگر خطی خالی وارد کنید (یعنی فقط RETURN را بزنید)، FORTH پیام OK را چاپ می‌کند. این رفتار طبیعی است و خطایی محسوب نمی‌شود.

FORTH
<RETURN>
OK

۳.۹.۲ خطاهای رایج در ورود دستورات

خطای اول: نبود فاصله

WRONG
3+4.

نتیجه: خطا. باید بنویسید:

CORRECT
3 + 4 .

خطای دوم: واژهٔ ناشناخته

WRONG
FOO

نتیجه:

ERROR
? CAN'T FIND FOO

این پیام زمانی ظاهر می‌شود که FORTH واژه‌ای با این نام در دیکشنری پیدا نکند و نتواند آن را به عدد تبدیل کند.

خطای سوم: پشتهٔ خالی

WRONG
+ .

نتیجه: خطا، زیرا پشته خالی است و + نمی‌تواند دو عدد را جمع کند.

۳.۹.۳ پیام OK

پس از هر خط ورودی، اگر دستور به‌درستی اجرا شود، FORTH پیام OK را چاپ می‌کند. این پیام نشان می‌دهد که FORTH آمادهٔ دریافت خط بعدی است.

۳.۹.۴ پیام ?

اگر در دستور خطایی وجود داشته باشد، FORTH به‌جای OK پیام ? به‌همراه توضیح خطا را چاپ می‌کند:

ERRORS
? CAN'T FIND FOO
? EMPTY STACK
? USE ONLY WHEN LOADING

۳.۱۰ مثال‌های عملی

مثال ۱: جمع دو عدد

FORTH
3 4 + .
OUTPUT
7 OK

مثال ۲: تعریف یک واژه

FORTH
: DOUBLE 2 * ;
OUTPUT
OK

سپس استفاده از آن:

FORTH
5 DOUBLE .
OUTPUT
10 OK

مثال ۳: کامنت‌گذاری

FORTH
( این برنامه یک عدد را دو برابر می‌کند )
5 DOUBLE .
OUTPUT
10 OK

مثال ۴: خطای نبود فاصله

FORTH
3+4.
ERROR
? CAN'T FIND 3+4.

مثال ۵: خطای کامنت تودرتو

WRONG
( این توضیح ( تودرتو ) غلط است )

نتیجه: خطا.

۳.۱۱ تمرین‌ها

EXERCISE 01
دستور زیر را به شکل صحیح بنویسید (با رعایت فاصله‌ها): 5*6.
FORTH
5 * 6 .
EXERCISE 02
توضیحی به زبان فارسی برای برنامهٔ زیر بنویسید: : GREET ." Salam" ;
FORTH
( برنامه‌ای که کلمه «سلام» را چاپ می‌کند )
: GREET ." Salam" ;
EXERCISE 03
برنامه‌ای بنویسید که دو عدد را از پشته بردارد، آن‌ها را جمع کند و نتیجه را چاپ کند.
FORTH
: SUM + . ;
15 25 SUM
OUTPUT
40 OK
EXERCISE 04
مشخص کنید کدام‌یک از نام‌های زیر برای یک واژهٔ FORTH معتبرند: COUNTER، PRINT NAME، 123NAME، A-VERY-LONG-NAME-WITH-MANY-CHARS
  • COUNTER — معتبر
  • PRINT NAME — نامعتبر (فاصله در نام مجاز نیست)
  • 123NAME — نامعتبر (شروع با عدد توصیه نمی‌شود)
  • A-VERY-LONG-NAME-WITH-MANY-CHARS — نامعتبر (بیش از ۳۱ کاراکتر)
EXERCISE 05
کامنت زیر را اصلاح کنید: ( این کامنت ( تودرتو ) است )

کامنت تودرتو در FORTH مجاز نیست. باید دو کامنت جدا نوشت:

FORTH
( این کامنت اول است ) ( این کامنت دوم است )

۳.۱۲ خلاصهٔ فصل

نکات کلیدی این فصل

  • در FORTH تنها دو نوع ورودی وجود دارد: واژه‌ها و مقادیر عددی.
  • جریان ورودی خطی است که پس از زدن RETURN به FORTH تحویل داده می‌شود.
  • فاصله مهم‌ترین قاعدهٔ نگارش است؛ بین هر واژه و عدد باید فاصله باشد.
  • نام واژه‌ها می‌تواند تا ۳۱ کاراکتر باشد.
  • توضیحات درون پرانتز نوشته می‌شوند و توضیحات تودرتو مجاز نیستند.
  • FORTH از نماد پسوندی استفاده می‌کند؛ ابتدا پارامترها، سپس نام واژه.
  • پس از هر دستور موفق، پیام OK و در صورت خطا، پیام ? چاپ می‌شود.
CHAPTER 04

پرچم‌ها و مقایسه‌ها

10 SECTIONS // C64-FORTH

۴.۱ مقدمه

در فصل‌های پیشین، با پشته، واژه‌ها و نحوهٔ ورود دستورات آشنا شدید. در این فصل، با یکی از مفاهیم بنیادین FORTH آشنا می‌شوید که در تمام برنامه‌نویسی شرطی و تصمیم‌گیری به کار می‌آید: پرچم (Flag).

پرچم‌ها در FORTH بسیار پرکاربردند. بدون درک درست آن‌ها، نمی‌توانید از ساختارهای شرطی مانند IF...ELSE...THEN استفاده کنید. بنابراین، این فصل یکی از مهم‌ترین فصل‌های این کتاب است.

۴.۲ پرچم (Flag) چیست؟

پرچم در FORTH، در واقع یک مقدار عددی است که روی پشته قرار می‌گیرد و وضعیتی را نشان می‌دهد. پرچم می‌تواند یکی از دو حالت زیر را داشته باشد:

  • پرچم نادرست (False Flag): اگر مقدار روی پشته صفر باشد.
  • پرچم درست (True Flag): اگر مقدار روی پشته غیرصفر باشد.

معمولاً پرچم درست مقدار 1 است، اما همیشه این‌طور نیست. در بسیاری از موارد، هر مقدار غیرصفر به‌عنوان پرچم درست در نظر گرفته می‌شود.

چرا پرچم مهم است؟

بسیاری از روال‌های FORTH یک شرط را بازمی‌گردانند که درست یا نادرست بودن آن را نشان می‌دهد. مثلاً:

  • آیا یک مقدار در بازهٔ مشخصی قرار دارد؟
  • آیا یک عمل موفق انجام شد؟
  • آیا یک کلید فشرده شد؟

ساختارهای شرطی و حلقه‌ای که در فصل بعدی خواهید آموخت، مقدار پرچم را بررسی می‌کنند و بر اساس آن تصمیم می‌گیرند.

۴.۳ مقایسه‌های تک‌مقداری

در FORTH چند واژه برای مقایسهٔ یک مقدار وجود دارد. این واژه‌ها یک پرچم روی پشته قرار می‌دهند.

۱) واژهٔ 0=

این واژه بررسی می‌کند که مقدار رویی پشته برابر صفر است یا نه.

NOTATION
0=   n --- flag
  • اگر n برابر صفر باشد، پرچم درست (مقدار 1) روی پشته قرار می‌گیرد.
  • اگر n برابر صفر نباشد، پرچم نادرست (مقدار 0) قرار می‌گیرد.

مثال:

FORTH
1 0= .
OUTPUT
0 OK

توضیح: عدد 1 برابر صفر نیست، پس پرچم نادرست (0) است.

FORTH
0 0= .
OUTPUT
1 OK

توضیح: عدد 0 برابر صفر است، پس پرچم درست (1) است.

کاربرد ویژهٔ 0=

از 0= می‌توان برای معکوس کردن یک پرچم استفاده کرد. اگر پرچمی روی پشته باشد و 0= را اجرا کنید:

  • اگر پرچم درست بود، پرچم نادرست می‌شود.
  • اگر پرچم نادرست بود، پرچم درست می‌شود.

واژهٔ NOT نیز دقیقاً همین کار را انجام می‌دهد.

۲) واژهٔ 0<

بررسی می‌کند که مقدار رویی پشته کوچک‌تر از صفر است یا نه.

NOTATION
0<   n --- flag

فرض بر این است که n یک عدد صحیح علامت‌دار است.

مثال:

FORTH
-2 0< .
OUTPUT
1 OK
FORTH
28 0< .
OUTPUT
0 OK

۳) واژهٔ 0>

بررسی می‌کند که مقدار رویی پشته بزرگ‌تر از صفر است یا نه.

NOTATION
0>   n --- flag

مثال:

FORTH
28 0> .
OUTPUT
1 OK
FORTH
65530 0> .
OUTPUT
0 OK

توضیح: عدد 65530 اگر به‌عنوان عدد علامت‌دار تفسیر شود، منفی است. بنابراین بزرگ‌تر از صفر نیست.

۴.۴ مقایسه‌های دومقداری

چهار واژه برای مقایسهٔ دو مقدار روی پشته وجود دارد:

واژهکاربرد
<کوچک‌تر (با علامت)
=مساوی
>بزرگ‌تر (با علامت)
U<کوچک‌تر (بدون علامت)

قاعدهٔ مقایسه

رابطهٔ مقایسه به این شکل است:

FORTH
<مقدار دوم> <عملگر مقایسه> <مقدار رویی>

به این معنا که مقدار دوم (پایین‌تر روی پشته) با مقدار رویی (بالاتر روی پشته) مقایسه می‌شود.

مثال

FORTH
3 18 > .
OUTPUT
0 OK

توضیح: آیا 3 بزرگ‌تر از 18 است؟ نه. بنابراین پرچم نادرست است.

FORTH
18 3 > .
OUTPUT
1 OK

توضیح: آیا 18 بزرگ‌تر از 3 است؟ بله.

واژهٔ <

FORTH
3 18 < .
OUTPUT
1 OK

توضیح: آیا 3 کوچک‌تر از 18 است؟ بله.

واژهٔ =

FORTH
5 5 = .
OUTPUT
1 OK
FORTH
5 6 = .
OUTPUT
0 OK

واژهٔ U<

این واژه دو مقدار را بدون در نظر گرفتن علامت مقایسه می‌کند. برای مقایسهٔ آدرس‌های حافظه کاربرد دارد.

FORTH
65530 5 U< .
OUTPUT
0 OK

توضیح: بدون علامت، 65530 بزرگ‌تر از 5 است.

۴.۵ مقایسه‌های دقت دوگانه

همان‌طور که در فصل دوم دیدید، FORTH از اعداد دقت دوگانه (۳۲ بیتی) پشتیبانی می‌کند. برای مقایسهٔ این اعداد، واژه‌های زیر وجود دارند:

واژهکاربرد
D0=بررسی برابری با صفر
D<کوچک‌تر (با علامت)
D=مساوی
D>بزرگ‌تر (با علامت)
DU<کوچک‌تر (بدون علامت)

این واژه‌ها مانند معادل‌های سادهٔ خود عمل می‌کنند، با این تفاوت که با اعداد ۳۲ بیتی سر و کار دارند.

مثال

FORTH
123. 456. D< .
OUTPUT
1 OK

توضیح: آیا 123 کوچک‌تر از 456 است؟ بله.

۴.۶ کاربردهای عملی پرچم

۴.۶.۱ تصمیم‌گیری

در فصل بعدی، خواهید آموخت که چگونه با استفاده از پرچم و ساختار IF...ELSE...THEN، برنامه‌های تصمیم‌گیر بنویسید.

نمونهٔ ساده:

FORTH
: CHECK-ZERO 0= IF ." ZERO" ELSE ." NOT ZERO" THEN ;
0 CHECK-ZERO
OUTPUT
ZERO OK
FORTH
5 CHECK-ZERO
OUTPUT
NOT ZERO OK

۴.۶.۲ حلقه‌های شرطی

در ساختار BEGIN...UNTIL، پرچم تعیین می‌کند که حلقه ادامه یابد یا پایان پذیرد.

FORTH
: WAIT-FOR-Y BEGIN GET 89 = UNTIL ;

این برنامه آن‌قدر منتظر می‌ماند تا کلید Y فشرده شود (کد ASCII کلید Y برابر 89 است).

۴.۶.۳ ترکیب شرط‌ها

می‌توانید چند شرط را با واژه‌های منطقی ترکیب کنید. FORTH واژه‌های AND، OR و XOR را برای عمل‌های بیتی دارد که در ترکیب پرچم‌ها نیز مفید هستند.

FORTH
: BOTH-POSITIVE 0> SWAP 0> AND ;
5 10 BOTH-POSITIVE .
OUTPUT
1 OK

توضیح: هر دو عدد مثبت هستند، پس پرچم درست است.

FORTH
5 -10 BOTH-POSITIVE .
OUTPUT
0 OK

۴.۷ پرچم‌های غیراستاندارد

گاهی واژه‌ها پرچمی بازمی‌گردانند که فقط 0 یا 1 نیست؛ بلکه ممکن است هر مقدار غیرصفر باشد. این نکته را در نظر داشته باشید که:

هر مقدار غیرصفر به‌عنوان پرچم درست تلقی می‌شود.

بنابراین، به‌جای بررسی flag = 1، بهتر است بنویسید flag <> 0. در FORTH، این کار با 0= و سپس 0= دیگر (یا NOT) انجام می‌شود.

۴.۸ مثال‌های عملی

مثال ۱: بررسی مثبت بودن عدد

FORTH
: POSITIVE? 0> IF ." YES" ELSE ." NO" THEN ;
5 POSITIVE?
OUTPUT
YES OK
FORTH
-3 POSITIVE?
OUTPUT
NO OK

مثال ۲: مقایسهٔ دو عدد

FORTH
: BIGGER? > IF ." FIRST IS BIGGER" ELSE ." SECOND IS BIGGER OR EQUAL" THEN ;
10 5 BIGGER?
OUTPUT
FIRST IS BIGGER OK

مثال ۳: بررسی برابری رشته‌ها

در فصل دهم، واژه‌های $=، $< و $> را خواهید آموخت که برای مقایسهٔ رشته‌ها به کار می‌روند.

۴.۹ تمرین‌ها

EXERCISE 01
مشخص کنید حاصل هر یک از دستورات زیر چه پرچمی است: 5 0= .، -7 0< .، 42 0> .، 8 3 < .، 3 8 > .
  • 5 0= . → 0
  • -7 0< . → 1
  • 42 0> . → 1
  • 8 3 < . → 0
  • 3 8 > . → 0
EXERCISE 02
برنامه‌ای بنویسید که بررسی کند آیا یک عدد زوج است. (راهنمایی: از 2 MOD 0= استفاده کنید.)
FORTH
: EVEN? 2 MOD 0= ;
4 EVEN? .
OUTPUT
1 OK
EXERCISE 03
برنامه‌ای بنویسید که دو عدد را دریافت کند و بررسی کند که آیا هر دو مثبت هستند.
FORTH
: BOTH-POSITIVE 0> SWAP 0> AND ;
5 10 BOTH-POSITIVE .
OUTPUT
1 OK
EXERCISE 04
دستور زیر را تحلیل کنید و نتیجه را پیش‌بینی کنید: 10 20 SWAP > .

مراحل:

  • 10 20 → پشته: 10 20
  • SWAP → پشته: 20 10
  • > → آیا 20 بزرگ‌تر از 10 است؟ بله.
  • نتیجه: 1 OK
EXERCISE 05
بررسی کنید که آیا عدد 100 بزرگ‌تر از عدد 99 است.
FORTH
100 99 > .
OUTPUT
1 OK

۴.۱۰ خلاصهٔ فصل

نکات کلیدی این فصل

  • پرچم (Flag): یک مقدار عددی که وضعیتی را نشان می‌دهد.
  • پرچم نادرست: مقدار صفر.
  • پرچم درست: هر مقدار غیرصفر (معمولاً 1).
  • مقایسه‌های تک‌مقداری: 0=، 0<، 0>.
  • مقایسه‌های دومقداری: <، =، >، U<.
  • مقایسه‌های دقت دوگانه: D0=، D<، D=، D>، DU<.
  • کاربرد پرچم در تصمیم‌گیری و حلقه‌های شرطی.
  • ترکیب شرط‌ها با واژه‌های منطقی مانند AND و OR.
CHAPTER 05

حلقه‌ها و شاخه‌ها

15 SECTIONS // C64-FORTH

۵.۱ مقدمه

در فصل پیشین با پرچم‌ها و مقایسه‌ها آشنا شدید. اکنون زمان آن رسیده است که از این مفاهیم در برنامه‌های واقعی استفاده کنید. در این فصل، با ساختارهای حلقه و شاخه در FORTH آشنا می‌شوید.

این ساختارها به شما امکان می‌دهند:

  • بخشی از کد را چند بار تکرار کنید.
  • بر اساس یک شرط، بخشی از کد را اجرا یا از آن صرف‌نظر کنید.
  • حلقه‌هایی بسازید که تا وقوع یک رویداد خاص ادامه یابند.
نکتهٔ مهم: تمام ساختارهای حلقه و شاخه در FORTH فقط داخل تعریف کولون قابل استفاده هستند. اگر بخواهید آن‌ها را در حالت مفسر (خط فرمان) به کار ببرید، با خطا روبه‌رو می‌شوید. علت این است که این ساختارها در زمان کامپایل، ساختار حلقه یا شاخه را در حافظه می‌سازند و در زمان اجرا آن را به کار می‌اندازند.

۵.۲ حلقهٔ DO...LOOP

۵.۲.۱ مفهوم حلقهٔ DO

حلقهٔ DO...LOOP در FORTH معادل حلقهٔ FOR...NEXT در BASIC است. در این حلقه، سه مقدار نقش دارند:

  • مقدار آغازین (Starting Value): مقداری که شمارنده از آن آغاز می‌شود.
  • مقدار پایانی (Limit): مقداری که حلقه در آن متوقف می‌شود.
  • شمارنده (Index): مقداری که در هر تکرار تغییر می‌کند.

۵.۲.۲ ساختار حلقه

FORTH
... <Limit+1> <Starting> DO ... کد حلقه ... LOOP

توجه کنید که ابتدا مقدار Limit+1 (یعنی مقدار پایانی به‌اضافهٔ یک) روی پشته قرار می‌گیرد، سپس مقدار آغازین.

۵.۲.۳ نکتهٔ مهم دربارهٔ Limit

مقدار Limit باید یک واحد بیشتر از مقداری باشد که می‌خواهید حلقه در آن متوقف شود. علت این است که شمارنده پیش از مقایسه با Limit، افزایش می‌یابد. بنابراین اگر می‌خواهید حلقه از عدد ۱ تا ۵ اجرا شود، باید Limit را برابر ۶ قرار دهید.

۵.۲.۴ مثال: چاپ پنج حرف نخست الفبا

FORTH
: ALPHA5 70 65 DO I EMIT LOOP ;
ALPHA5
OUTPUT
ABCDE OK

توضیح مثال:

  • 70 مقدار پایانی به‌اضافهٔ یک. حرف E کد ASCII آن 69 است؛ پس 70 می‌شود حد نهایی.
  • 65 مقدار آغازین. حرف A کد ASCII آن 65 است.
  • DO آغاز حلقه.
  • I مقدار شمارندهٔ فعلی را روی پشته قرار می‌دهد.
  • EMIT مقدار را به کاراکتر تبدیل و چاپ می‌کند.
  • LOOP پایان حلقه.

معادل BASIC:

BASIC
10 FOR I = 65 TO 69
20 PRINT CHR$(I);
30 NEXT I

۵.۳ حلقه‌های تودرتو

حلقه‌های DO می‌توانند تودرتو باشند:

FORTH
DO ... DO ... DO ... LOOP ... LOOP ... LOOP

دسترسی به شمارندهٔ حلقه‌های بیرونی

  • I مقدار شمارندهٔ حلقهٔ جاری را روی پشته می‌گذارد.
  • J مقدار شمارندهٔ حلقهٔ بیرونی بعدی را روی پشته می‌گذارد.
  • K مقدار شمارندهٔ حلقهٔ سوم از بیرون را روی پشته می‌گذارد.

مثال

FORTH
: LOOPTEST 3 0 DO 2 0 DO CR ." I=" I . ." J=" J . LOOP LOOP ;
LOOPTEST
OUTPUT
I=0 J=0
I=1 J=0
I=0 J=1
I=1 J=1
I=0 J=2
I=1 J=2 OK

معادل BASIC:

BASIC
10 FOR J = 0 TO 2
20 FOR I = 0 TO 1
30 PRINT "I="; I; "J="; J
40 NEXT I
50 NEXT J

۵.۴ حلقه با گام متغیر: +LOOP

واژهٔ LOOP در هر تکرار، مقدار 1 به شمارنده می‌افزاید. اگر می‌خواهید گام متفاوتی داشته باشید (مثلاً -10)، از واژهٔ +LOOP استفاده کنید.

ساختار

FORTH
: نام <Limit+1> <Starting> DO ... <گام> +LOOP ;

واژهٔ +LOOP مقدار رویی پشته را از پشته برمی‌دارد و آن را به شمارنده می‌افزاید.

مثال: شمارش نزولی

FORTH
: MINUSSTEP -1 100 DO CR I . -10 +LOOP ;
MINUSSTEP
OUTPUT
100
90
80
...
0 OK

معادل BASIC:

BASIC
10 FOR I = 100 TO 0 STEP -10
20 PRINT I
30 NEXT I
هشدار مهم: هر دو واژهٔ LOOP و +LOOP بر اساس حساب علامت‌دار کار می‌کنند. به این معنا که حلقه یا با عبور از حد مجاز پایان می‌یابد، یا با سرریز حسابی. بنابراین اگر Limit را منفی مشخص کنید و شمارنده را در جهت مثبت افزایش دهید، حلقه پس از یک تکرار پایان می‌یابد.

۵.۵ خروج زودهنگام از حلقه: LEAVE

گاهی لازم است حلقه پیش از رسیدن به Limit پایان یابد. برای این کار از واژهٔ LEAVE استفاده کنید.

نکتهٔ مهم: واژهٔ LEAVE شمارندهٔ جاری را با Limit برابر می‌کند، اما حلقه تا رسیدن به نقطهٔ LOOP پایان نمی‌یابد. بنابراین LEAVE را معمولاً درون ساختار شرطی قرار می‌دهند:
FORTH
DO ... <flag> IF LEAVE ELSE ... THEN LOOP

مثال

FORTH
: SEARCH 100 0 DO I 50 = IF LEAVE THEN I . LOOP ;
SEARCH

نتیجه: اعداد از 0 تا 49 چاپ می‌شوند و سپس حلقه پایان می‌یابد.

۵.۶ حلقه با آدرس مطلق: /LOOP

واژهٔ LOOP و +LOOP بر اساس حساب علامت‌دار کار می‌کنند. این بدان معناست که برای شمارش آدرس‌های حافظه که از مرز 32768 عبور می‌کنند، نمی‌توانید از آن‌ها استفاده کنید.

برای رفع این مشکل، واژهٔ /LOOP پیشنهاد شده است که بر اساس حساب بدون علامت کار می‌کند.

مثال

FORTH
... 8020 7FF0 DO I C@ FF XOR I C! 3 /LOOP ...

این دستور هر بایت سوم در بازهٔ 7FF0 تا 801F را معکوس می‌کند.

FORTH
... 77FF 8FFF DO 0 I C! -1 /LOOP ...

این دستور همهٔ بایت‌های بازهٔ 8FFF تا 7800 را از بالا به پایین صفر می‌کند.

۵.۷ ساختار شرطی: IF...ELSE...THEN

۵.۷.۱ مفهوم

در FORTH، ساختار IF...ELSE...THEN برای تصمیم‌گیری به کار می‌رود:

FORTH
<flag> IF بخش درست ELSE بخش نادرست THEN
  • اگر پرچم درست باشد، بخش میان IF و ELSE اجرا می‌شود.
  • اگر پرچم نادرست باشد، بخش میان ELSE و THEN اجرا می‌شود.
  • پس از پایان ساختار، اجرا از بعد از THEN ادامه می‌یابد.

۵.۷.۲ نکتهٔ مهم

ساختار IF...ELSE...THEN فقط داخل تعریف کولون کار می‌کند.

۵.۷.۳ مثال

FORTH
: TESTFLAG IF ." FLAG IS TRUE" ELSE ." FLAG IS FALSE" THEN ;
0 TESTFLAG
OUTPUT
FLAG IS FALSE OK
FORTH
1 TESTFLAG
OUTPUT
FLAG IS TRUE OK

معادل BASIC:

BASIC
10 IF C = 0 THEN 40
20 PRINT "C IS TRUE"
30 GOTO 50
40 PRINT "C IS FALSE"
50 REM ادامه برنامه

۵.۸ ساختار شرطی ساده: IF...THEN

اگر می‌خواهید بخشی از کد فقط در صورتی اجرا شود که پرچم درست باشد، می‌توانید ELSE را حذف کنید:

FORTH
<flag> IF ... THEN

مثال

FORTH
: TEST1 IF ." FLAG IS TRUE " THEN ." THIS IS COMMON CODE" ;
0 TEST1
OUTPUT
THIS IS COMMON CODE OK
FORTH
1 TEST1
OUTPUT
FLAG IS TRUE THIS IS COMMON CODE OK

۵.۹ حلقهٔ BEGIN...UNTIL

این ساختار برای تکرار یک بخش از کد تا وقوع یک شرط خاص به کار می‌رود:

FORTH
BEGIN ... کد حلقه ... <flag> UNTIL
  • کد حلقه حداقل یک بار اجرا می‌شود.
  • در پایان هر تکرار، یک پرچم روی پشته قرار می‌گیرد.
  • اگر پرچم نادرست باشد، حلقه به ابتدای BEGIN بازمی‌گردد.
  • اگر پرچم درست باشد، حلقه پایان می‌یابد.

مثال

FORTH
: BTEST BEGIN GET 89 = UNTIL ;

توضیح:

  • BEGIN آغاز حلقه.
  • GET منتظر فشرده شدن یک کلید می‌ماند.
  • 89 = بررسی می‌کند که آیا کد ASCII کلید فشرده‌شده برابر 89 (کلید Y) است.
  • UNTIL پایان حلقه.

معادل BASIC:

BASIC
10 GET A$
20 IF A$ <> "Y" THEN 10

۵.۱۰ حلقهٔ بی‌نهایت: BEGIN...AGAIN

این ساختار یک حلقهٔ بی‌نهایت ایجاد می‌کند:

FORTH
BEGIN ... کد حلقه ... AGAIN

کد حلقه به‌طور نامحدود اجرا می‌شود. این ساختار در برنامه‌های کنترل فرایند و سیستم‌های مستقل (Turnkey) کاربرد دارد.

۵.۱۱ حلقهٔ شرطی: BEGIN...WHILE...REPEAT

این ساختار ترکیبی از حلقه و شرط است:

FORTH
BEGIN ... بخش اول ... <flag> WHILE ... بخش دوم ... REPEAT
  • بخش اول (اگر وجود داشته باشد) اجرا می‌شود.
  • پرچم بررسی می‌شود.
  • اگر پرچم درست باشد، بخش دوم اجرا می‌شود و کنترل به ابتدای BEGIN بازمی‌گردد.
  • اگر پرچم نادرست باشد، حلقه پایان می‌یابد و اجرا از بعد از REPEAT ادامه می‌یابد.

۵.۱۲ تودرتویی ساختارهای حلقه

ساختارهای حلقه و شاخه می‌توانند تودرتو شوند، به شرطی که هر ساختار کاملاً درون ساختار دیگر قرار گیرد.

ساختارهای غیرمجاز

WRONG
DO ... IF ... LOOP THEN        ❌ مجاز نیست
BEGIN ... IF ... UNTIL THEN    ❌ مجاز نیست
IF ... BEGIN ... THEN ... UNTIL ❌ مجاز نیست

ساختارهای مجاز

CORRECT
BEGIN ... IF ... ELSE ... THEN ... UNTIL
DO ... BEGIN ... WHILE ... REPEAT ... LOOP
IF ... DO ... BEGIN ... UNTIL ... LOOP ... THEN

۵.۱۳ مثال‌های عملی

مثال ۱: شمارش از ۱ تا ۱۰

FORTH
: COUNT10 11 1 DO I . LOOP ;
COUNT10
OUTPUT
1 2 3 4 5 6 7 8 9 10 OK

مثال ۲: چاپ اعداد زوج

FORTH
: EVENS 20 0 DO I . 2 +LOOP ;
EVENS
OUTPUT
0 2 4 6 8 10 12 14 16 18 OK

مثال ۳: بررسی بزرگ‌تر بودن

FORTH
: CHECK > IF ." BIGGER" ELSE ." NOT BIGGER" THEN ;
10 5 CHECK
OUTPUT
BIGGER OK

مثال ۴: شمارش معکوس

FORTH
: COUNTDOWN 0 10 DO I . -1 +LOOP ;
COUNTDOWN
OUTPUT
10 9 8 7 6 5 4 3 2 1 OK

۵.۱۴ تمرین‌ها

EXERCISE 01
برنامه‌ای بنویسید که اعداد ۱ تا ۵ را چاپ کند.
FORTH
: PRINT1TO5 6 1 DO I . LOOP ;
PRINT1TO5
OUTPUT
1 2 3 4 5 OK
EXERCISE 02
برنامه‌ای بنویسید که اعداد زوج از ۰ تا ۱۰ را چاپ کند.
FORTH
: EVENS 11 0 DO I . 2 +LOOP ;
EVENS
OUTPUT
0 2 4 6 8 10 OK
EXERCISE 03
برنامه‌ای بنویسید که بررسی کند آیا یک عدد بزرگ‌تر از ۱۰۰ است.
FORTH
: BIG? 100 > IF ." YES" ELSE ." NO" THEN ;
150 BIG?
OUTPUT
YES OK
EXERCISE 04
برنامه‌ای بنویسید که تا فشرده شدن کلید Space (کد ASCII 32) صبر کند.
FORTH
: WAITSPACE BEGIN GET 32 = UNTIL ;
WAITSPACE
EXERCISE 05
برنامه‌ای بنویسید که حروف الفبا را به‌صورت معکوس چاپ کند (Z تا A).
FORTH
: REVALPHA 64 90 DO I EMIT -1 +LOOP ;
REVALPHA
OUTPUT
ZYXWVUTSRQPONMLKJIHGFEDCBA OK
EXERCISE 06
برنامه‌ای بنویسید که با استفاده از حلقه‌های تودرتو، جدول ضرب ۱ تا ۳ را چاپ کند.
FORTH
: MULTABLE 4 1 DO 4 1 DO I J * . LOOP CR LOOP ;
MULTABLE
OUTPUT
1 2 3
2 4 6
3 6 9 OK

۵.۱۵ خلاصهٔ فصل

نکات کلیدی این فصل

  • حلقهٔ DO...LOOP برای تکرار با شمارنده.
  • حلقه‌های تودرتو و دسترسی به شمارنده‌های بیرونی با I، J و K.
  • حلقهٔ +LOOP برای گام‌های متغیر.
  • واژهٔ LEAVE برای خروج زودهنگام از حلقه.
  • واژهٔ /LOOP برای کار با آدرس‌های مطلق حافظه.
  • ساختار IF...ELSE...THEN برای تصمیم‌گیری.
  • ساختار IF...THEN برای شرط ساده.
  • حلقهٔ BEGIN...UNTIL برای تکرار تا وقوع شرط.
  • حلقهٔ BEGIN...AGAIN برای تکرار بی‌نهایت.
  • حلقهٔ BEGIN...WHILE...REPEAT برای تکرار شرطی.
  • تودرتویی ساختارها با رعایت قواعد.
CHAPTER 06

آرایه‌ها

10 SECTIONS // C64-FORTH

۶.۱ مقدمه

در فصل‌های پیشین با پشته، پرچم‌ها، مقایسه‌ها و ساختارهای حلقه و شاخه آشنا شدید. در این فصل، با یکی از مفاهیم مهم برنامه‌نویسی یعنی آرایه آشنا می‌شوید.

آرایه‌ها در FORTH به شکلی متفاوت از زبان‌های دیگر ساخته می‌شوند. در BASIC یا پاسکال، ساختار آرایه از پیش تعریف شده است. اما در FORTH، شما خودتان با استفاده از واژه‌های تعریف‌کننده، آرایه می‌سازید. همین انعطاف، یکی از ویژگی‌های قدرتمند FORTH است.

در این فصل، ابتدا با ساخت آرایه‌های ساده آشنا می‌شوید، سپس ساختار پیشرفته‌تر CREATE...DOES> را بررسی می‌کنید.

۶.۲ مفهوم آرایه در FORTH

برای ساخت و استفاده از یک آرایه در FORTH، سه کار باید انجام شود:

۱) رزرو فضا در دیکشنری

باید فضای لازم در دیکشنری رزرو شود تا FORTH محتوای آرایه را بازنویسی نکند.

۲) اختصاص هدر و نام به آرایه

آرایه باید یک هدر و نام داشته باشد تا بتوان نشانی شروع داده‌ها را به دست آورد.

۳) مقداردهی یا تغییر آسان عناصر

باید امکان مقداردهی اولیه یا تغییر آسان عناصر آرایه وجود داشته باشد.

۶.۳ واژهٔ CREATE

واژهٔ CREATE برای ساخت یک هدر جدید، اختصاص نام به آن، و اتصال به یک روال کد به کار می‌رود. هنگامی که این واژه اجرا می‌شود، نشانی نخستین بایت بدنه روی پشته قرار می‌گیرد.

ساختار

FORTH
CREATE <نام_تعریف>

توضیح

  • یک تعریف جدید به نام <نام_تعریف> به انتهای دیکشنری اضافه می‌شود.
  • این تعریف به واژگان جاری متصل می‌شود.
  • هیچ فضایی برای بدنهٔ <نام_تعریف> اختصاص نمی‌یابد.
  • بعداً، هنگام اجرای <نام_تعریف>، نشانی نخستین بایت پس از هدر، روی پشته قرار می‌گیرد.

۶.۴ تخصیص فضا با ALLOT

واژهٔ ALLOT برای رزرو فضا در دیکشنری به کار می‌رود. این واژه یک عدد می‌گیرد و آن را به اشاره‌گر انتهای دیکشنری می‌افزاید.

ساختار

FORTH
<تعداد_بایت> ALLOT
نکتهٔ مهم: محتوای فضایی که ALLOT اختصاص می‌دهد، مقداردهی اولیه نمی‌شود. یعنی مقادیر آن تصادفی است و شما باید خودتان آن‌ها را مقداردهی کنید.

مثال

FORTH
CREATE BUFFER 100 ALLOT

این دستور یک واژه به نام BUFFER می‌سازد و ۱۰۰ بایت فضا برای آن رزرو می‌کند.

۶.۵ کامپایل مقادیر با C, و ,

علاوه بر ALLOT، می‌توانید مقادیر مشخصی را در حافظه کامپایل کنید. این کار با دو واژه انجام می‌شود:

  • C, (سی کاما): یک بایت را در حافظه کامپایل می‌کند و اشاره‌گر دیکشنری را یک واحد جلو می‌برد.
  • , (کاما): یک مقدار ۱۶ بیتی را کامپایل می‌کند و اشاره‌گر دیکشنری را دو واحد جلو می‌برد.

مزیت

با C, و , می‌توانید هم فضا اختصاص دهید و هم مقداردهی اولیه کنید.

مثال: ساخت جدول مربع‌ها

فرض کنید می‌خواهید جدولی از مربع‌های اعداد ۱ تا ۱۰ بسازید.

در BASIC می‌نویسید:

BASIC
10 DIM A(10)
20 FOR X = 0 TO 9
30 READ N : A(X) = N
40 NEXT X
1000 DATA 1, 4, 9, 16, 25, 36, 49, 64, 81, 100

در FORTH می‌نویسید:

FORTH
CREATE SQUARES
1 C, 4 C, 9 C, 16 C, 25 C, 36 C, 49 C, 64 C, 81 C, 100 C,

دسترسی به عناصر جدول

هنگام اجرای SQUARES، نشانی نخستین بایت روی پشته قرار می‌گیرد. می‌توانید با افزودن مقدار به این نشانی، به عناصر دیگر دسترسی پیدا کنید.

FORTH
SQUARES 2 + C@ .
OUTPUT
9 OK

توضیح: عنصر سوم جدول (اندیس ۲) برابر 9 است.

FORTH
SQUARES 9 + C@ .
OUTPUT
100 OK

توضیح: عنصر دهم جدول برابر 100 است.

تغییر مقدار یک عنصر

FORTH
150 SQUARES 8 + C!

این دستور مقدار 150 را در عنصر نهم ذخیره می‌کند.

بررسی تغییر

FORTH
SQUARES 8 + C@ .
OUTPUT
150 OK

۶.۶ جدول با مقادیر ۱۶ بیتی

اگر جدول شما به مقادیر ۱۶ بیتی نیاز دارد، از , به‌جای C, استفاده کنید:

FORTH
CREATE BIGTABLE
1000 , 2000 , 3000 , 4000 ,

جدول بدون مقداردهی

اگر جدول نیازی به مقداردهی اولیه ندارد و بعداً پر می‌شود، از ALLOT استفاده کنید:

FORTH
CREATE TABLE 20 ALLOT

۶.۷ ساختار CREATE...DOES>

۶.۷.۱ مفهوم

واژه‌های CONSTANT، VARIABLE و : سه واژهٔ تعریف‌کننده هستند؛ یعنی واژه‌هایی که تعریف‌های جدید در دیکشنری می‌سازند.

ساختار CREATE...DOES> ابزاری پیشرفته‌تر است که به شما امکان می‌دهد انواع جدید واژه بسازید. این ساختار، معادل تعریف یک «نوع دادهٔ جدید» در زبان‌هایی مانند پاسکال است.

نکته: این بخش برای کاربران تازه‌کار ممکن است پیچیده باشد. می‌توانید در ابتدا از آن صرف‌نظر کنید و بعداً به آن بازگردید.

۶.۷.۲ ساختار

FORTH
: <نام_نوع> CREATE ... بخش اول ... DOES> ... بخش دوم ... ;

توضیح:

  • <نام_نوع> نام واژهٔ تعریف‌کنندهٔ جدید است.
  • بخش اول (میان CREATE و DOES>): هنگام ساخت یک نمونهٔ جدید از این نوع، اجرا می‌شود.
  • بخش دوم (میان DOES> و ;): هنگام اجرای نمونهٔ ساخته‌شده، اجرا می‌شود.

۶.۷.۳ مثال: بازتعریف CONSTANT

حتی اگر واژهٔ CONSTANT از پیش وجود داشته باشد، می‌توانید آن را بازتعریف کنید:

FORTH
: CONSTANT CREATE , DOES> @ ;

توضیح گام‌به‌گام:

FORTH
12 CONSTANT MON/YR
  • 12 روی پشته قرار می‌گیرد.
  • CONSTANT اجرا می‌شود؛ هدر جدید به نام MON/YR ساخته می‌شود.
  • بخش میان CREATE و DOES> اجرا می‌شود؛ واژهٔ , مقدار 12 را روی پشته برمی‌دارد و کامپایل می‌کند.

اکنون هنگام اجرای MON/YR:

  • نشانی نخستین بایت بدنه روی پشته قرار می‌گیرد.
  • بخش میان DOES> و ; اجرا می‌شود؛ واژهٔ @ محتوای آن نشانی را می‌خواند.
FORTH
MON/YR .
OUTPUT
12 OK

۶.۷.۴ بازتعریف VARIABLE

به همین ترتیب، VARIABLE را می‌توان چنین تعریف کرد:

FORTH
: VARIABLE CREATE 0 , DOES> ;

در اینجا بخش میان DOES> و ; وجود ندارد؛ بنابراین هیچ کاری روی نشانی انجام نمی‌شود و تنها نشانی روی پشته باقی می‌ماند.

۶.۷.۵ ساخت واژهٔ ARRAY

حالا با استفاده از CREATE...DOES> یک واژهٔ تعریف‌کننده می‌سازیم که بتواند آرایه بسازد:

FORTH
: ARRAY CREATE 0 DO C, LOOP DOES> + 1- ;

توضیح گام‌به‌گام:

FORTH
100 81 64 49 36 25 16 9 4 1 10 ARRAY SQUARES
  • 10 تعداد عناصر آرایه است.
  • هدر جدید به نام SQUARES ساخته می‌شود.
  • مقدار رویی پشته (10) به‌عنوان حد حلقهٔ DO در نظر گرفته می‌شود.
  • حلقه اجرا می‌شود و هر بار یک مقدار از پشته برداشته و کامپایل می‌شود.
  • در نتیجه، ده عنصر آرایه با مقادیر داده‌شده مقداردهی می‌شوند.

دسترسی به عناصر

FORTH
6 SQUARES C@ .
OUTPUT
36 OK

توضیح:

  • هنگام اجرای 6 SQUARES، نخست نشانی نخستین عنصر روی پشته قرار می‌گیرد.
  • سپس بخش میان DOES> و ; اجرا می‌شود.
  • واژهٔ + مقدار 6 را با نشانی جمع می‌کند.
  • واژهٔ 1- یک واحد از نشانی کم می‌کند (زیرا عنصر اول در نشانی+۰ قرار دارد).
  • نشانی نهایی، محل عنصر ششم است.

۶.۷.۶ مثال دیگر: تعداد روزهای هر ماه

FORTH
31 30 31 30 31 31 30 31 30 31 28 31 12 ARRAY DAYS/MONTH

اکنون تعداد روزهای هر ماه در دسترس است:

FORTH
4 DAYS/MONTH C@ .
OUTPUT
30 OK

توضیح: ماه چهارم (آوریل) ۳۰ روز دارد.

۶.۷.۷ آرایه بدون مقداردهی

اگر می‌خواهید آرایه‌ای بسازید که نیازی به مقداردهی اولیه ندارد:

FORTH
: ARRAY CREATE ALLOT DOES> + 1- ;

استفاده:

FORTH
10 ARRAY TEMPVALS

این دستور یک آرایه با ۱۰ عنصر می‌سازد که مقداردهی نشده است.

۶.۸ مثال‌های عملی

مثال ۱: ذخیرهٔ پنج عدد

FORTH
CREATE NUMS 5 ALLOT
10 NUMS 0 + C!
20 NUMS 1 + C!
30 NUMS 2 + C!
40 NUMS 3 + C!
50 NUMS 4 + C!

برای خواندن:

FORTH
NUMS 0 + C@ .
OUTPUT
10 OK

مثال ۲: مجموع عناصر آرایه

FORTH
: SUMARRAY 0 5 0 DO NUMS I + C@ + LOOP ;
SUMARRAY .
OUTPUT
150 OK

مثال ۳: آرایه با مقدار اولیه

FORTH
CREATE EVENS 2 C, 4 C, 6 C, 8 C, 10 C,
EVENS 3 + C@ .
OUTPUT
8 OK

۶.۹ تمرین‌ها

EXERCISE 01
آرایه‌ای بسازید که شامل اعداد ۱ تا ۵ باشد. سپس عنصر سوم را چاپ کنید.
FORTH
CREATE NUMS 1 C, 2 C, 3 C, 4 C, 5 C,
NUMS 2 + C@ .
OUTPUT
3 OK
EXERCISE 02
آرایه‌ای با ۲۰ عنصر بسازید که مقداردهی نشده باشد.
FORTH
CREATE BIG 20 ALLOT
EXERCISE 03
آرایه‌ای از اعداد فرد (۱، ۳، ۵، ۷، ۹) بسازید و مجموع آن‌ها را محاسبه کنید.
FORTH
CREATE ODDS 1 C, 3 C, 5 C, 7 C, 9 C,
: SUMODDS 0 5 0 DO ODDS I + C@ + LOOP ;
SUMODDS .
OUTPUT
25 OK
EXERCISE 04
با استفاده از CREATE...DOES>، واژه‌ای به نام TABLE بسازید که آرایه‌ای با ابعاد مشخص ایجاد کند.
FORTH
: TABLE CREATE ALLOT DOES> + 1- ;
10 TABLE MYTABLE
EXERCISE 05
آرایه‌ای از روزهای هفته بسازید (کد ASCII) و آن‌ها را روی صفحه چاپ کنید.
FORTH
CREATE DAYS 77 C, 84 C, 87 C, 84 C, 70 C, 83 C, 83 C,
: PRINTDAYS 7 0 DO DAYS I + C@ EMIT LOOP ;
PRINTDAYS
OUTPUT
MTWTFSS OK

۶.۱۰ خلاصهٔ فصل

نکات کلیدی این فصل

  • واژهٔ CREATE برای ساخت هدر جدید.
  • واژهٔ ALLOT برای رزرو فضا در دیکشنری.
  • واژه‌های C, و , برای کامپایل مقادیر در حافظه.
  • دسترسی به عناصر آرایه با استفاده از نشانی و افزودن مقدار.
  • ساختار CREATE...DOES> برای ساخت واژه‌های تعریف‌کننده.
  • ساخت آرایه با CREATE...DOES> و مثال‌های کاربردی.
CHAPTER 07

ساخت تعریف‌های جدید

10 SECTIONS // C64-FORTH

۷.۱ مقدمه

در فصل‌های پیشین با پشته، پرچم‌ها، حلقه‌ها و آرایه‌ها آشنا شدید. اکنون زمان آن رسیده است که با یکی از مهم‌ترین و پرکاربردترین قابلیت‌های FORTH آشنا شوید: ساخت واژه‌های جدید.

رایج‌ترین روش برای افزودن دستورات جدید به سیستم FORTH، استفاده از تعریف کولون (Colon Definition) است. بیشتر واژه‌های موجود در دیکشنری پایهٔ FORTH نیز به‌صورت تعریف کولون ساخته شده‌اند.

در این فصل، به‌طور کامل با این ساختار آشنا می‌شوید و یاد می‌گیرید که چگونه واژه‌های سفارشی خود را بسازید.

۷.۲ تعریف کولون چیست؟

۷.۲.۱ مفهوم

یک تعریف کولون، در اصل فهرستی از اشاره‌گرها به واژه‌های پیش‌تر تعریف‌شده است. هنگامی که FORTH به‌ظاهر واژه‌ای را که با تعریف کولون ساخته شده است «اجرا» می‌کند، در واقع کد (یا تعریف کولون) مشخص‌شده توسط هر اشاره‌گر در بدنهٔ تعریف را اجرا می‌کند.

۷.۲.۲ ساختار

FORTH
: <نام> ... <بدنه> ... ;
  • : نشانهٔ آغاز تعریف است.
  • <نام> نامی است که به واژهٔ جدید اختصاص می‌یابد.
  • بدنه از واژه‌های پیش‌تر تعریف‌شده ساخته می‌شود.
  • ; نشانهٔ پایان تعریف است.

۷.۲.۳ مثال

FORTH
: CLRSCREEN 147 EMIT ;

این تعریف، یک واژهٔ جدید به نام CLRSCREEN به دیکشنری اضافه می‌کند.

برای مشاهدهٔ آن، می‌توانید از VLIST استفاده کنید. واژهٔ CLRSCREEN اکنون در بالای واژگان جاری قرار دارد.

اجرای واژه

FORTH
CLRSCREEN

هنگامی که CLRSCREEN تایپ می‌شود، بدنهٔ تعریف اسکن و اجرا می‌شود:

  • ابتدا مقدار 147 روی پشته قرار می‌گیرد.
  • سپس روال EMIT اجرا می‌شود.
  • EMIT مقدار رویی پشته را برمی‌دارد و آن را به‌عنوان یک کاراکتر چاپ می‌کند.
  • چاپ مقدار 147 (کد ASCII مربوط به پاک کردن صفحه) باعث پاک شدن صفحه می‌شود.

۷.۳ حالت کامپایلر و مفسر

۷.۳.۱ نکتهٔ مهم

هنگام تعریف CLRSCREEN، صفحه پاک نشد. علت این است که FORTH در آن لحظه در حالت کامپایلر بود، نه مفسر.

۷.۳.۲ رفتار FORTH

در حالت عادی (مفسر)، اگر دستور زیر را وارد کنید:

FORTH
147 EMIT

صفحه پاک می‌شود. زیرا FORTH هر واژه را بلافاصله اجرا می‌کند.

اما زمانی که واژهٔ : را در جریان ورودی وارد می‌کنید، FORTH:

  • اجرای دستورات را متوقف می‌کند (حالت مفسر).
  • کامپایل یک تعریف جدید را آغاز می‌کند (حالت کامپایلر).

در این حالت:

  • یک هدر (Header) در واژگان جاری ساخته می‌شود.
  • نام پس از : به آن اختصاص می‌یابد.
  • اشاره‌گرهای پیوند (Linkage) اضافه می‌شوند.
  • همهٔ مقادیر عددی و واژه‌های پیش‌تر تعریف‌شده تا رسیدن به ; کامپایل می‌شوند.

۷.۳.۳ معنی «کامپایل شدن»

«کامپایل شدن در تعریف» به این معناست که اشاره‌گری به بدنهٔ تعریف جاری اضافه می‌شود که یا به تعریف دیگری برای اجرا اشاره می‌کند، یا به روالی که در زمان اجرا مقدار عددی مشخصی را روی پشته قرار می‌دهد.

۷.۳.۴ بازگشت به حالت مفسر

با رسیدن به ;، حالت کامپایلر خاموش می‌شود و FORTH به حالت مفسر بازمی‌گردد. از این پس، هر واژه‌ای که در جریان ورودی یافت شود، بلافاصله اجرا می‌شود.

۷.۴ تودرتویی تعریف‌ها

تعریف‌های کولون می‌توانند تا هر عمقی تودرتو شوند. به این معنا که پس از ساخت یک تعریف، می‌توان آن را در بدنهٔ تعریف جدید به کار برد، و آن تعریف جدید را در تعریف جدیدتری، و به همین ترتیب.

مثال

فرض کنید CLRSCREEN را پیش‌تر تعریف کرده‌اید:

FORTH
: 3RDLINE CLRSCREEN CR CR ;

هنگام اجرای 3RDLINE، صفحه پاک می‌شود و نشانگر به خط سوم صفحه منتقل می‌شود.

اکنون 3RDLINE را در تعریف جدید به کار می‌بریم:

FORTH
: SHOWNEST 3RDLINE ." EXAMPLE OF NESTING" ;

هنگام اجرای SHOWNEST:

  1. صفحه پاک می‌شود.
  2. نشانگر به خط سوم می‌رود.
  3. متن «EXAMPLE OF NESTING» چاپ می‌شود.

۷.۵ واژه‌های IMMEDIATE

بیشتر واژه‌های موجود در واژه‌نامهٔ FORTH را می‌توان درون یک تعریف کولون به کار برد. اما برخی واژه‌ها به‌عنوان IMMEDIATE (فوری) طبقه‌بندی می‌شوند.

۷.۵.۱ مفهوم

واژه‌های IMMEDIATE، حالت کامپایلر را نادیده می‌گیرند و بلافاصله اجرا می‌شوند. این واژه‌ها به‌عنوان بخشی از تعریف جاری کامپایل نمی‌شوند؛ بلکه وظیفه‌ای در هنگام کامپایل انجام می‌دهند.

۷.۵.۲ مثال‌ها

  • نام واژگان (مانند ASSEMBLER، EDITOR)
  • ساختارهای کنترل حلقه و شاخه (مانند IF، ELSE، THEN، BEGIN، UNTIL، DO، LOOP)

۷.۵.۳ مثال‌های تعریف

برخی واژه‌های استاندارد FORTH به این شکل تعریف شده‌اند:

FORTH
: DECIMAL 10 BASE ! ;
: HEX 16 BASE ! ;
: PAD HERE 68 + ;
: BLANKS BL FILL ;
: DEFINITIONS CONTEXT @ CURRENT ! ;
: UPDATE PREV @ @ 32768 OR PREV @ ! ;

۷.۶ محدودیت طول خط ورودی

۷.۶.۱ چند واژه می‌توان در یک تعریف به کار برد؟

پاسخ: هر تعداد که بخواهید.

در برنامه‌نویسی FORTH، مرسوم است که تعریف‌ها را کوتاه نگه دارید؛ اما این یک قانون نیست، بلکه یک توصیه است.

۷.۶.۲ محدودیت طول خط

هنگام تایپ یک خط ورودی، حداکثر ۸۰ کاراکتر مجاز است. این محدودیت مربوط به خود دستگاه کمودور ۶۴ است.

۷.۶.۳ تعریف‌های بلندتر از ۸۰ کاراکتر

اگر تعریف جدیدی بیش از ۸۰ کاراکتر باشد، می‌توانید آن را در چند خط وارد کنید. چون FORTH زبانی با قالب آزاد است، می‌توانید تعریف را در چند خط ادامه دهید. پس از رسیدن به ;، FORTH به حالت مفسر بازمی‌گردد و پیام OK را چاپ می‌کند.

۷.۶.۴ نکته

اگر تعریف جدید در چند خط وارد شود، تا زمانی که ; وارد نشود، FORTH پیام OK را چاپ نمی‌کند. این رفتار طبیعی است.

۷.۷ مثال‌های عملی

مثال ۱: تعریف واژهٔ چهار برابر

FORTH
: QUADRUPLE 4 * ;

استفاده:

FORTH
7 QUADRUPLE .
OUTPUT
28 OK

مثال ۲: تعریف واژهٔ چاپ پیام

FORTH
: HELLO ." Salam, Donya!" ;
HELLO
OUTPUT
Salam, Donya! OK

مثال ۳: تعریف واژهٔ محاسبه مربع

FORTH
: SQUARE DUP * ;
5 SQUARE .
OUTPUT
25 OK

مثال ۴: تعریف واژهٔ محاسبه مکعب

FORTH
: CUBE DUP DUP * * ;
3 CUBE .
OUTPUT
27 OK

مثال ۵: تعریف با تودرتویی

FORTH
: CLRSCREEN 147 EMIT ;
: 3RDLINE CLRSCREEN CR CR ;
: SHOWNEST 3RDLINE ." EXAMPLE OF NESTING" ;
SHOWNEST

نتیجه: صفحه پاک می‌شود، نشانگر به خط سوم می‌رود و پیام چاپ می‌شود.

مثال ۶: واژهٔ چاپ چند ستاره

FORTH
: STARS 0 DO 42 EMIT LOOP ;
5 STARS
OUTPUT
***** OK

۷.۸ نکات تکمیلی

۷.۸.۱ نام‌گذاری واژه‌ها

برای نام‌گذاری واژه‌های جدید:

  • از نام‌های کوتاه و معنی‌دار استفاده کنید.
  • از حروف بزرگ برای خوانایی بهتر بهره ببرید.
  • از کاراکترهای خاص کمودور بپرهیزید.
  • نام‌ها را حداکثر تا ۳۱ کاراکتر انتخاب کنید.

۷.۸.۲ توصیه‌های طراحی

  • تعریف‌ها را کوتاه و متمرکز نگه دارید.
  • هر واژه را طوری طراحی کنید که یک وظیفهٔ مشخص انجام دهد.
  • از واژه‌های سطح پایین، واژه‌های سطح بالا بسازید.
  • از کامنت‌گذاری برای توضیح کد استفاده کنید.

۷.۸.۳ خطاهای رایج

خطای اول: فراموش کردن ;

اگر ; را فراموش کنید، FORTH همچنان در حالت کامپایل باقی می‌ماند و منتظر ادامهٔ تعریف است.

خطای دوم: استفاده از واژه‌های تعریف‌نشده

اگر واژه‌ای که در بدنهٔ تعریف به کار برده‌اید تعریف نشده باشد، هنگام کامپایل پیام خطا دریافت می‌کنید.

خطای سوم: استفاده از : درون حالت مفسر

واژه‌های ساختاری مانند IF و DO تنها درون تعریف کولون کار می‌کنند.

۷.۹ تمرین‌ها

EXERCISE 01
واژه‌ای به نام TRIPLE تعریف کنید که هر عددی را در ۳ ضرب کند.
FORTH
: TRIPLE 3 * ;
5 TRIPLE .
OUTPUT
15 OK
EXERCISE 02
واژه‌ای به نام SALAM تعریف کنید که پیام «Salam» را چاپ کند.
FORTH
: SALAM ." Salam" ;
SALAM
OUTPUT
Salam OK
EXERCISE 03
واژه‌ای به نام AVG تعریف کنید که میانگین دو عدد را محاسبه کند.
FORTH
: AVG + 2 / ;
10 20 AVG .
OUTPUT
15 OK
EXERCISE 04
واژه‌ای تعریف کنید که پنج حرف نخست الفبا را چاپ کند.
FORTH
: ALPHA5 70 65 DO I EMIT LOOP ;
ALPHA5
OUTPUT
ABCDE OK
EXERCISE 05
واژه‌ای تعریف کنید که تعداد مشخصی از کاراکتر * را چاپ کند (نام آن را NSTARS بگذارید).
FORTH
: NSTARS 0 DO 42 EMIT LOOP ;
7 NSTARS
OUTPUT
******* OK
EXERCISE 06
واژه‌ای تعریف کنید که مساحت یک مستطیل را محاسبه کند (با دریافت طول و عرض از پشته).
FORTH
: RECTAREA * ;
5 8 RECTAREA .
OUTPUT
40 OK

۷.۱۰ خلاصهٔ فصل

نکات کلیدی این فصل

  • تعریف کولون: روش اصلی افزودن واژه‌های جدید در FORTH.
  • ساختار : ... ;: ساختار پایهٔ تعریف.
  • حالت کامپایلر و مفسر: تفاوت رفتار FORTH در دو حالت.
  • تودرتویی تعریف‌ها: امکان استفاده از تعریف‌های قبلی در تعریف‌های جدید.
  • واژه‌های IMMEDIATE: واژه‌هایی که بلافاصله اجرا می‌شوند.
  • محدودیت طول خط: حداکثر ۸۰ کاراکتر در هر خط.
  • نکات طراحی: تعریف‌های کوتاه، نام‌گذاری مناسب، کامنت‌گذاری.
CHAPTER 08

خروجی متن و عدد

11 SECTIONS // C64-FORTH

۸.۱ مقدمه

در فصل‌های پیشین با ساختارهای داده، حلقه‌ها و تعریف واژه‌های جدید آشنا شدید. اکنون زمان آن رسیده است که با یکی از جنبه‌های کاربردی FORTH آشنا شوید: نمایش اطلاعات روی صفحه.

در هر برنامه‌ای، چه یک بازی ساده باشد و چه یک برنامهٔ محاسباتی پیچیده، نیاز دارید که نتایج را به کاربر نشان دهید. FORTH مجموعه‌ای غنی از واژه‌ها را برای این کار در اختیار شما می‌گذارد.

در این فصل با روش‌های زیر آشنا می‌شوید:

  • نمایش یک کاراکتر تکی روی صفحه
  • نمایش رشته‌های متنی
  • کنترل خط جدید و فاصله‌ها
  • نمایش رشته‌های ذخیره‌شده در حافظه
  • قالب‌بندی اعداد برای نمایش منظم

۸.۲ خروجی کاراکتر تکی: EMIT

۸.۲.۱ مفهوم

واژهٔ EMIT یک مقدار عددی روی پشته را می‌گیرد و آن را به‌عنوان یک کاراکتر ASCII روی صفحه نمایش می‌دهد.

۸.۲.۲ ساختار

FORTH
<مقدار> EMIT

۸.۲.۳ نکته

مقدار روی پشته باید در بازهٔ ۰ تا ۲۵۵ باشد. این بازهٔ معتبر برای کاراکترهای ASCII است.

۸.۲.۴ مثال

FORTH
65 EMIT 67 EMIT
OUTPUT
AC OK

توضیح:

  • 65 کد ASCII حرف A است.
  • 67 کد ASCII حرف C است.
  • EMIT هر مقدار را به کاراکتر تبدیل و چاپ می‌کند.

معادل BASIC:

BASIC
PRINT CHR$(65); CHR$(67);

۸.۳ خروجی متن: ."

۸.۳.۱ مفهوم

برای چاپ یک رشتهٔ متنی، از واژهٔ ." (نقطه-کوتیشن) استفاده کنید.

۸.۳.۲ ساختار

FORTH
." <متن>

۸.۳.۳ نکته مهم

باید بین ." و شروع متن، یک فاصله وجود داشته باشد. متن با کاراکتر " (کوتیشن) پایان می‌یابد.

واژهٔ ." کاراکترهای پس از خود را تا رسیدن به کوتیشن، چاپ می‌کند.

۸.۳.۴ مثال

FORTH
." TEXT STRING OUTPUT TEST"
OUTPUT
TEXT STRING OUTPUT TEST OK

معادل BASIC:

BASIC
PRINT "TEXT STRING OUTPUT TEST";

۸.۳.۵ استفاده در تعریف کولون

واژهٔ ." را می‌توان درون یک تعریف کولون نیز به کار برد:

FORTH
: ASCNUMS CR ." 0123456789" ;
ASCNUMS
OUTPUT
0123456789 OK

توضیح:

  • CR یک خط جدید ایجاد می‌کند.
  • ." 0123456789" رشتهٔ 0123456789 را چاپ می‌کند.

۸.۴ کنترل خط جدید: CR

۸.۴.۱ مفهوم

واژهٔ CR (Carriage Return) نشانگر را به خط جدید منتقل می‌کند. این واژه معادل فشردن کلید RETURN است.

۸.۴.۲ ساختار

FORTH
CR

۸.۴.۳ مثال

FORTH
CR CR CR

نتیجه: سه خط جدید ایجاد می‌شود و نشانگر به خط چهارم منتقل می‌شود.

معادل BASIC:

BASIC
PRINT : PRINT : PRINT

۸.۴.۴ مثال کاربردی

FORTH
: PRINT-TWO CR ." LINE ONE" CR ." LINE TWO" ;
PRINT-TWO
OUTPUT
LINE ONE
LINE TWO OK

۸.۵ فاصله‌ها: SPACE و SPACES

۸.۵.۱ واژهٔ SPACE

واژهٔ SPACE یک فاصله روی صفحه چاپ می‌کند.

FORTH
SPACE

۸.۵.۲ واژهٔ SPACES

واژهٔ SPACES تعداد مشخصی فاصله چاپ می‌کند. تعداد فاصله‌ها روی پشته قرار می‌گیرد.

FORTH
<تعداد> SPACES

۸.۵.۳ مثال‌ها

FORTH
9 SPACES

نتیجه: ۹ فاصله چاپ می‌شود.

FORTH
." ABC" SPACE ." DEF"
OUTPUT
ABC DEF OK

۸.۵.۴ کاربرد

از SPACE و SPACES برای مرتب‌سازی خروجی و ایجاد فاصلهٔ خوانا بین مقادیر استفاده کنید.

۸.۶ چاپ رشته از حافظه: TYPE

۸.۶.۱ مفهوم

FORTH رشته‌های کاراکتری را در حافظه به‌صورت یک رشته از بایت‌های کاراکتری که پیش از آن‌ها یک بایت شمارش (Count Byte) قرار دارد ذخیره می‌کند.

برای چاپ چنین رشته‌ای از حافظه، از واژهٔ TYPE استفاده کنید.

۸.۶.۲ ساختار

FORTH
<نشانی> <تعداد> TYPE
  • نشانی: نشانی نخستین بایت کاراکتری.
  • تعداد: تعداد کاراکترها.

۸.۶.۳ مثال

فرض کنید می‌خواهید یک رشتهٔ کوتاه در حافظه قرار دهید. از بافر EBUF استفاده می‌کنیم که یک بافر ۳۰ بایتی برای نگهداری پیام‌های وضعیت دیسک است.

FORTH
3 EBUF C! 65 EBUF 1+ C! 49 EBUF 2+ C! 33 EBUF 3 + C! OK

توضیح:

  • 3 EBUF C! تعداد کاراکترها (۳) را در نخستین بایت ذخیره می‌کند.
  • 65 EBUF 1+ C! کاراکتر A را در بایت دوم ذخیره می‌کند.
  • 49 EBUF 2+ C! کاراکتر 1 را در بایت سوم ذخیره می‌کند.
  • 33 EBUF 3 + C! کاراکتر ! را در بایت چهارم ذخیره می‌کند.

چاپ رشته

FORTH
EBUF 1+ 3 TYPE
OUTPUT
A1! OK

۸.۷ واژهٔ COUNT

۸.۷.۱ مفهوم

واژهٔ COUNT یک نشانی می‌گیرد، نخستین بایت (شمارش کاراکترها) را می‌خواند، و نشانی نخستین کاراکتر و تعداد آن را روی پشته قرار می‌دهد.

۸.۷.۲ ساختار

FORTH
COUNT   addr --- addr+1 count

۸.۷.۳ مثال

با استفاده از مثال پیشین:

FORTH
EBUF COUNT TYPE
OUTPUT
A1! OK

۸.۷.۴ تعریف داخلی COUNT

FORTH
: COUNT DUP 1+ SWAP C@ ;

توضیح:

  • DUP نشانی را تکرار می‌کند.
  • 1+ یک واحد به یکی از نشانی‌ها می‌افزاید (نشانی نخستین کاراکتر).
  • SWAP ترتیب را عوض می‌کند.
  • C@ نخستین بایت (تعداد) را می‌خواند.

۸.۸ قالب‌بندی اعداد

۸.۸.۱ مفهوم

مقادیر روی پشته را می‌توان به‌سادگی چاپ کرد. واژه‌های .، U. و D. پیش‌تر معرفی شدند. این واژه‌ها عدد را چاپ می‌کنند و پس از آن یک فاصله می‌گذارند.

اما در برخی موارد، نیاز دارید که عدد را در یک میدان مشخص با تراز راست چاپ کنید. FORTH واژه‌های مناسبی برای این کار دارد.

۸.۸.۲ واژهٔ .R

واژهٔ .R یک مقدار را با تراز راست در میدان مشخصی چاپ می‌کند.

FORTH
<عدد> <عرض_میدان> .R

مثال

FORTH
: COLST CR ." VAL1:" 5 .R CR ." VAL2:" 5 .R CR ." VAL3:" 5 .R ;
21367 17 832 COLST
OUTPUT
VAL1:   832
VAL2:    17
VAL3: 21367 OK

توضیح:

  • 21367، 17 و 832 سه مقدار روی پشته هستند.
  • هر مقدار با عرض میدان ۵ و تراز راست چاپ می‌شود.
  • ابتدا مقدار رویی (832) چاپ می‌شود، سپس 17 و در نهایت 21367.

معادل BASIC:

BASIC
100 B$ = STR$(S)
110 PRINT RIGHT$("     " + RIGHT$(B$, LEN(B$)-1), 5)

۸.۸.۳ واژهٔ U.R

واژهٔ U.R مشابه .R است، با این تفاوت که مقدار را به‌صورت بدون علامت چاپ می‌کند.

۸.۸.۴ واژهٔ D.R

واژهٔ D.R مشابه .R است، با این تفاوت که مقدار را به‌صورت دقت دوگانه چاپ می‌کند.

۸.۸.۵ مقایسه

واژهنوع داده
.عدد صحیح علامت‌دار
U.عدد صحیح بدون علامت
D.عدد دقت دوگانه
.Rعدد صحیح علامت‌دار با عرض میدان
U.Rعدد صحیح بدون علامت با عرض میدان
D.Rعدد دقت دوگانه با عرض میدان

۸.۹ مثال‌های عملی

مثال ۱: چاپ نام

FORTH
: GREET ." Salam, Ali!" ;
GREET
OUTPUT
Salam, Ali! OK

مثال ۲: جدول اعداد

FORTH
: TABLE 11 1 DO I . LOOP ;
TABLE
OUTPUT
1 2 3 4 5 6 7 8 9 10 OK

مثال ۳: چاپ معکوس

FORTH
: REVERSE-NAME ." MANI" ;
REVERSE-NAME
OUTPUT
MANI OK

مثال ۴: چاپ عدد در میدان مشخص

FORTH
12345 8 .R
OUTPUT
   12345 OK

مثال ۵: چاپ رشته با فاصله‌گذاری

FORTH
: TABLE2 3 1 DO ." ITEM " I . CR LOOP ;
TABLE2
OUTPUT
ITEM 1
ITEM 2
ITEM 3 OK

۸.۱۰ تمرین‌ها

EXERCISE 01
برنامه‌ای بنویسید که پیام «Hello, World!» را چاپ کند.
FORTH
: HELLO ." Hello, World!" ;
HELLO
OUTPUT
Hello, World! OK
EXERCISE 02
برنامه‌ای بنویسید که سه خط متن چاپ کند، هر خط در یک خط جدید.
FORTH
: THREE-LINES CR ." LINE 1" CR ." LINE 2" CR ." LINE 3" ;
THREE-LINES
OUTPUT
LINE 1
LINE 2
LINE 3 OK
EXERCISE 03
برنامه‌ای بنویسید که اعداد ۱ تا ۵ را با فاصله‌گذاری مناسب چاپ کند.
FORTH
: PRINT-1TO5 6 1 DO I . LOOP ;
PRINT-1TO5
OUTPUT
1 2 3 4 5 OK
EXERCISE 04
عدد 1234 را در میدان با عرض ۱۰ و تراز راست چاپ کنید.
FORTH
1234 10 .R
OUTPUT
      1234 OK
EXERCISE 05
برنامه‌ای بنویسید که یک جدول سه‌ستونی از اعداد ۱ تا ۳ ایجاد کند.
FORTH
: TABLE3 4 1 DO I . I 2* . I 3 * . CR LOOP ;
TABLE3
OUTPUT
1 2 3
2 4 6
3 6 9 OK
EXERCISE 06
با استفاده از EMIT، حروف F، O، R، T، H را چاپ کنید.
FORTH
: FORTH 70 EMIT 79 EMIT 82 EMIT 84 EMIT 72 EMIT ;
FORTH
OUTPUT
FORTH OK

۸.۱۱ خلاصهٔ فصل

نکات کلیدی این فصل

  • واژهٔ EMIT: چاپ یک کاراکتر ASCII روی صفحه.
  • واژهٔ .": چاپ یک رشتهٔ متنی.
  • واژهٔ CR: انتقال نشانگر به خط جدید.
  • واژه‌های SPACE و SPACES: چاپ فاصله.
  • واژهٔ TYPE: چاپ رشته‌ای که در حافظه ذخیره شده است.
  • واژهٔ COUNT: خواندن شمارش از نخستین بایت یک رشته.
  • قالب‌بندی اعداد با .R، U.R و D.R.
CHAPTER 09

ورودی متن و عدد

11 SECTIONS // C64-FORTH

۹.۱ مقدمه

در فصل پیشین با روش‌های نمایش اطلاعات روی صفحه آشنا شدید. اکنون نوبت آن است که یاد بگیرید چگونه از کاربر ورودی دریافت کنید.

در برنامه‌های واقعی، معمولاً نیاز دارید اطلاعاتی را از کاربر بپرسید و بر اساس آن تصمیم بگیرید. FORTH واژه‌های متنوعی برای این کار در اختیار شما می‌گذارد:

  • دریافت یک کاراکتر تکی
  • دریافت یک خط کامل متن
  • دریافت یک مقدار عددی

در این فصل با این روش‌ها به‌طور کامل آشنا می‌شوید.

۹.۲ ورودی تک‌کلید: KEY

۹.۲.۱ مفهوم

واژهٔ KEY یک کاراکتر از کاربر دریافت می‌کند. این واژه منتظر می‌ماند تا کاربر یک خط کامل وارد کند و سپس کلید RETURN را بزند. پس از آن، کاراکترهای وارد‌شده یکی‌یکی بازگردانده می‌شوند.

۹.۲.۲ نکته

اگر بافر کیبورد خالی باشد، کمودور ۶۴ با نشانگر چشمک‌زن منتظر می‌ماند تا RETURN فشرده شود. کد ASCII کلید RETURN برابر 13 است.

۹.۲.۳ استفادهٔ محدود

با توجه به نحوهٔ پیاده‌سازی KEY در کمودور ۶۴، این واژه چندان کاربردی نیست. واژه‌های دیگر که در ادامه معرفی می‌شوند، کاربرد بیشتری دارند.

۹.۳ ورودی فوری: GET

۹.۳.۱ مفهوم

واژهٔ GET یک روال کمودور ۶۴ را فراخوانی می‌کند که کیبورد را برای یافتن یک کلید فشرده‌شده اسکن می‌کند. این واژه بلافاصله بازمی‌گردد، چه کلیدی فشرده شده باشد و چه نشده باشد.

۹.۳.۲ ساختار

FORTH
GET

۹.۳.۳ نتیجه

  • اگر کلیدی فشرده شده باشد، کد ASCII آن کلید روی پشته قرار می‌گیرد.
  • اگر هیچ کلیدی فشرده نشده باشد، مقدار 0 روی پشته قرار می‌گیرد.

۹.۳.۴ معادل BASIC

BASIC
100 GET A$
110 IF A$ = "" THEN A = 0 : GOTO 130
120 A = ASC(A$)

۹.۳.۵ مثال کاربردی

FORTH
: WAIT-KEY BEGIN GET 0 <> UNTIL ;

این برنامه منتظر می‌ماند تا کاربر یک کلید فشرده کند.

۹.۴ انتظار برای کلید: KEYIN

۹.۴.۱ مفهوم

واژهٔ KEYIN یک واژهٔ استاندارد FORTH نیست، اما در C64-FORTH برای راحتی کاربر ارائه شده است. این واژه پیامی روی صفحه چاپ می‌کند، منتظر فشرده شدن یک کلید می‌ماند و سپس کد ASCII آن کلید را روی پشته قرار می‌دهد.

۹.۴.۲ مزیت

هنگامی که KEYIN منتظر است، نشانگر چشمک‌زن روشن است؛ بنابراین کاربر می‌داند که سیستم منتظر ورودی است.

۹.۴.۳ مثال

FORTH
: WAITKEY CR ." PRESS ANY KEY TO CONTINUE" KEYIN ;
WAITKEY

نتیجه: پیام چاپ می‌شود و برنامه منتظر فشرده شدن کلید می‌ماند.

۹.۴.۴ کاربرد

از KEYIN برای مکث کردن برنامه استفاده کنید یا از کاربر بخواهید تصمیمی بگیرد.

۹.۵ مفهوم HERE و PAD

پیش از آشنایی با ورودی متن کامل، باید دو مفهوم مهم را بشناسید:

۹.۵.۱ واژهٔ HERE

واژهٔ HERE نشانی نخستین بایت آزاد پس از انتهای دیکشنری را روی پشته قرار می‌دهد.

۹.۵.۲ واژهٔ PAD

واژهٔ PAD نشانی‌ای را برمی‌گرداند که همیشه ۶۸ بایت پس از HERE قرار دارد.

۹.۵.۳ فضای میان HERE و PAD

فضای میان HERE و PAD برای تبدیل عدد به ASCII استفاده می‌شود؛ مانند چاپ یک مقدار از پشته.

فضای میان PAD و بالاتر برای جریان ورودی استفاده می‌شود؛ یعنی جایی که کاراکترهای وارد‌شده به‌طور موقت نگهداری می‌شوند.

۹.۵.۴ نحوهٔ کار

هر واژه‌ای که در جریان ورودی وارد می‌کنید (و با فاصله از دیگری جدا شده است)، نخست در ناحیه‌ای که از HERE شروع می‌شود، کپی می‌شود. سپس دیکشنری برای یافتن تطابق جستجو می‌شود:

  • اگر تطابق یافت شد، تعریف مربوطه اجرا می‌شود.
  • اگر تطابق یافت نشد، رشته به عدد تبدیل و روی پشته قرار می‌گیرد (در صورت امکان).
  • اگر تبدیل ناموفق بود، پیام خطا صادر می‌شود.

۹.۶ ورودی یک خط متن: EXPECT

۹.۶.۱ مفهوم

واژهٔ EXPECT یک رشته از کاراکترها را از کاربر دریافت می‌کند. این واژه شبیه دستور INPUT در BASIC است.

۹.۶.۲ ساختار

FORTH
<نشانی> <حداکثر_تعداد> EXPECT
  • نشانی: جایی که رشته در حافظه ذخیره می‌شود.
  • حداکثر_تعداد: بیشترین تعداد کاراکتر قابل دریافت.

۹.۶.۳ نکات مهم

  • پیش از اجرای EXPECT، باید نشانی مقصد را مشخص کنید. HERE مکان مناسبی است.
  • EXPECT منتظر می‌ماند تا کاربر RETURN را بزند یا تعداد کاراکترها به حداکثر برسد.
  • EXPECT پس از دریافت، دو کاراکتر NULL (مقدار 0) به انتهای رشته اضافه می‌کند.

۹.۶.۴ مثال

FORTH
: ASKMONTH CR ." ENTER MONTH:" HERE 9 EXPECT
CR ." THE MONTH ENTERED WAS:" HERE 9 TYPE ;
ASKMONTH

خروجی نمونه:

OUTPUT
ENTER MONTH: MEHR
THE MONTH ENTERED WAS: MEHR OK

۹.۶.۵ محدودیت‌ها

  • طول خط ورودی نباید بیش از ۴۰ کاراکتر باشد (به دلیل محدودیت صفحهٔ کمودور ۶۴).
  • اگر ورودی بلندتر باشد، ممکن است پشتهٔ مقادیر خراب شود.

۹.۷ واژهٔ WORD

۹.۷.۱ مفهوم

واژهٔ WORD یک رشتهٔ کاراکتری را از جریان ورودی جدا می‌کند و آن را در HERE قرار می‌دهد.

۹.۷.۲ ساختار

FORTH
<جداکننده> WORD

۹.۷.۳ نتیجه

نشانی رشته روی پشته قرار می‌گیرد. این رشته با یک شمارش بایتی در ابتدا ذخیره می‌شود.

۹.۷.۴ مزیت نسبت به EXPECT

واژهٔ WORD نسبت به EXPECT انعطاف بیشتری دارد:

  • می‌توانید کاراکتر جداکننده را مشخص کنید (مثلاً فاصله، کوتیشن و...).
  • برای دریافت ورودی درون تعریف‌ها مناسب‌تر است.

۹.۷.۵ مثال

FORTH
: PRNTR 34 WORD 4 HERE COUNT PRINT# ;

توضیح:

  • 34 کد ASCII کاراکتر " است.
  • WORD رشتهٔ میان دو کوتیشن را جدا می‌کند.
  • 4 شمارهٔ فایل چاپگر است.
  • HERE COUNT نشانی و طول رشته را روی پشته قرار می‌دهد.
  • PRINT# رشته را به چاپگر می‌فرستد.

۹.۸ ورودی عددی: NUMBER

۹.۸.۱ مفهوم

واژهٔ NUMBER یک رشته از کاراکترهای ASCII را که در حافظه ذخیره شده است، به یک عدد دقت دوگانه تبدیل می‌کند و آن را روی پشته قرار می‌دهد.

۹.۸.۲ ساختار

FORTH
<نشانی> NUMBER

۹.۸.۳ نکات

  • تبدیل بر اساس مبنای جاری (BASE) انجام می‌شود.
  • اگر نقطهٔ اعشاری در رشته باشد، محل آن در متغیر DPL ذخیره می‌شود.
  • اگر علامت منفی در ابتدا باشد، عدد منفی خواهد بود.
  • اگر تعداد کاراکترها در نخستین بایت بیشتر از طول واقعی رشته باشد، EXPECT می‌تواند برای ورودی عددی به کار رود.

۹.۸.۴ مثال کاربردی

FORTH
: INPUT DECIMAL HERE 1+ 10 EXPECT
10 HERE C!
HERE NUMBER ;
INPUT 1234

خروجی:

OUTPUT
1234

توضیح:

  • HERE 1+ نشانی نخستین بایت کاراکتری را مشخص می‌کند.
  • 10 EXPECT تا ۱۰ کاراکتر دریافت می‌کند.
  • 10 HERE C! تعداد را در نخستین بایت ذخیره می‌کند.
  • HERE NUMBER رشته را به عدد تبدیل می‌کند.

۹.۸.۵ تبدیل به عدد صحیح ساده

پس از اجرای INPUT، یک عدد دقت دوگانه روی پشته قرار دارد. برای تبدیل به عدد صحیح ساده، کافی است DROP را اجرا کنید:

FORTH
INPUT 1234
DROP .
OUTPUT
1234 OK

یا می‌توانید DROP را درون تعریف INPUT قرار دهید:

FORTH
: INPUT DECIMAL HERE 1+ 10 EXPECT 10 HERE C! HERE NUMBER DROP ;

۹.۹ مثال‌های عملی

مثال ۱: برنامهٔ پرسش و پاسخ

FORTH
: ASK-NAME CR ." WHAT IS YOUR NAME? " HERE 20 EXPECT
CR ." HELLO, " HERE 20 TYPE ;
ASK-NAME

مثال ۲: دریافت عدد و محاسبه

FORTH
: GET-NUM CR ." ENTER A NUMBER: " HERE 1+ 6 EXPECT
6 HERE C! HERE NUMBER DROP ;
: DOUBLE-IT GET-NUM 2 * . ;
DOUBLE-IT

مثال ۳: انتظار برای کلید خاص

FORTH
: WAIT-Y BEGIN GET 89 = UNTIL ." YOU PRESSED Y" ;
WAIT-Y

۹.۱۰ تمرین‌ها

EXERCISE 01
برنامه‌ای بنویسید که نام کاربر را بپرسد و سپس آن را روی صفحه چاپ کند.
FORTH
: ASK-NAME CR ." NAME: " HERE 20 EXPECT CR ." HELLO " HERE 20 TYPE ;
ASK-NAME
EXERCISE 02
برنامه‌ای بنویسید که یک عدد از کاربر بگیرد و آن را در ۳ ضرب کند.
FORTH
: ASK-NUM CR ." NUMBER: " HERE 1+ 6 EXPECT 6 HERE C! HERE NUMBER DROP ;
: TRIPLE-IT ASK-NUM 3 * . ;
TRIPLE-IT
EXERCISE 03
برنامه‌ای بنویسید که منتظر فشرده شدن کلید Space (کد ASCII 32) بماند.
FORTH
: WAIT-SPACE BEGIN GET 32 = UNTIL ;
WAIT-SPACE
EXERCISE 04
با استفاده از KEYIN، برنامه‌ای بنویسید که پیام «PRESS ANY KEY» را چاپ کند و منتظر بماند.
FORTH
: WAIT-PRESS CR ." PRESS ANY KEY" KEYIN DROP ;
WAIT-PRESS
EXERCISE 05
برنامه‌ای بنویسید که یک خط متن از کاربر بگیرد و تعداد کاراکترهای آن را چاپ کند.
FORTH
: COUNT-CHARS CR ." TEXT: " HERE 30 EXPECT
CR ." LENGTH: " HERE 30 TYPE ;

۹.۱۱ خلاصهٔ فصل

نکات کلیدی این فصل

  • واژهٔ KEY: دریافت یک کاراکتر با انتظار برای RETURN.
  • واژهٔ GET: دریافت فوری یک کاراکتر بدون انتظار.
  • واژهٔ KEYIN: انتظار برای فشرده شدن کلید با نمایش نشانگر.
  • مفاهیم HERE و PAD: نواحی حافظه برای ذخیرهٔ موقت داده.
  • واژهٔ EXPECT: دریافت یک خط کامل متن.
  • واژهٔ WORD: جداسازی رشته از جریان ورودی.
  • واژهٔ NUMBER: تبدیل رشته به عدد.
CHAPTER 10

مدیریت رشته‌ها

26 SECTIONS // C64-FORTH

۱۰.۱ مقدمه

در فصل پیشین با ورودی و خروجی متن و عدد آشنا شدید. در این فصل، به‌طور کامل با مدیریت رشته‌ها در FORTH آشنا می‌شوید.

رشته‌ها در FORTH به شکلی متفاوت از زبان‌های دیگر ذخیره و پردازش می‌شوند. درک این تفاوت‌ها برای کار مؤثر با رشته‌ها ضروری است.

نکتهٔ مهم: واژه‌های رشته‌ای که در این فصل معرفی می‌شوند، جزو هستهٔ اصلی C64-FORTH نیستند. این واژه‌ها باید از دیسک بارگذاری شوند. برای فعال‌سازی آن‌ها، کافی است دستور زیر را اجرا کنید:
FORTH
20 LOAD

پس از اجرای این دستور، سورس‌کد واژه‌های رشته‌ای از صفحهٔ شمارهٔ ۲۰ بارگذاری می‌شود و این واژه‌ها به سیستم فعلی FORTH اضافه می‌شوند.

۱۰.۲ نحوهٔ ذخیرهٔ رشته در حافظه

۱۰.۲.۱ ساختار پایه

FORTH رشته‌ها را به‌صورت یک رشته از بایت‌های کاراکتری که پیش از آن‌ها یک بایت شمارش (Count Byte) قرار دارد ذخیره می‌کند.

۱۰.۲.۲ ساختار رشته‌ای توسعه‌یافته

در C64-FORTH، ساختار رشته‌ای به شکل زیر است:

STRUCTURE
+----------------+----------------+--------------------------+
|  Max Length    |  Current Len   |  کاراکترها ...           |
|  (1 بایت)      |  (1 بایت)      |                          |
+----------------+----------------+--------------------------+
                 ^
                 |
        نشانی رشته همیشه به این بایت اشاره می‌کند

۱۰.۲.۳ توضیح اجزا

  • Max Length (حداکثر طول): بیشترین تعداد کاراکترهایی که می‌توان در این رشته ذخیره کرد.
  • Current Length (طول فعلی): تعداد کاراکترهای فعلی رشته.
  • کاراکترها: خود کاراکترهای رشته که پس از این دو بایت قرار دارند.

۱۰.۲.۴ حداکثر طول

حداکثر طول مجاز برای هر رشته در C64-FORTH برابر ۲۵۵ کاراکتر است.

۱۰.۲.۵ قابلیت محافظت

هنگامی که یک رشته در حافظه ذخیره می‌شود، بایت Max Length بررسی می‌شود. اگر طول رشتهٔ ورودی از حد مجاز بیشتر باشد، تنها تعداد بایت‌های مجاز پذیرفته می‌شود. این ویژگی از سرریز شدن و بازنویسی بخش‌های دیگر حافظه جلوگیری می‌کند — قابلیتی که بسیاری از پیاده‌سازی‌های FORTH آن را ندارند.

۱۰.۳ واژهٔ " برای ذخیره در PAD

۱۰.۳.۱ مفهوم

واژهٔ " (کوتیشن) مشابه ." است، با این تفاوت که به‌جای چاپ رشته روی صفحه، آن را در ناحیهٔ موقت PAD ذخیره می‌کند.

۱۰.۳.۲ ساختار

FORTH
" <متن>

۱۰.۳.۳ نکته

باید بین " و شروع متن، یک فاصله وجود داشته باشد. متن با کاراکتر " پایان می‌یابد.

۱۰.۳.۴ مثال

FORTH
" ABCDEFG"

پس از اجرا، نشانی رشته در PAD روی پشته قرار می‌گیرد.

۱۰.۴ واژهٔ $. برای چاپ رشته

۱۰.۴.۱ مفهوم

واژهٔ $. یک رشته را از نشانی روی پشته می‌خواند و آن را چاپ می‌کند.

۱۰.۴.۲ ساختار

FORTH
$.   $1 ---

۱۰.۴.۳ مثال

FORTH
TEST $.
OUTPUT
TEST STRING OK

۱۰.۴.۴ نکته

واژهٔ $. نشانی رشته را از پشته برمی‌دارد و آن را چاپ می‌کند.

۱۰.۵ واژهٔ DUMP

۱۰.۵.۱ مفهوم

واژهٔ DUMP بخشی از حافظه را با شروع از یک نشانی مشخص، برای تعداد مشخصی بایت نمایش می‌دهد.

۱۰.۵.۲ ساختار

FORTH
<نشانی> <تعداد> DUMP

۱۰.۵.۳ مثال

FORTH
8 DUMP

نتیجه: ۸ بایت از حافظه با نشانی مشخص، در قالب HEX نمایش داده می‌شود.

۱۰.۵.۴ کاربرد

از DUMP برای بررسی محتوای حافظه و اشکال‌زدایی برنامه‌ها استفاده کنید.

۱۰.۶ متغیر رشته‌ای: $VARIABLE

۱۰.۶.۱ مفهوم

واژهٔ $VARIABLE یک ورودی جدید در دیکشنری می‌سازد و فضایی برای یک رشته با حداکثر طول مشخص رزرو می‌کند.

۱۰.۶.۲ ساختار

FORTH
<حداکثر_طول> $VARIABLE <نام>

۱۰.۶.۳ مثال

FORTH
16 $VARIABLE FILENAME

این دستور یک متغیر رشته‌ای به نام FILENAME می‌سازد که می‌تواند رشته‌ای تا ۱۶ کاراکتر در آن ذخیره شود.

۱۰.۶.۴ مقدار اولیه

هنگام ساخت، محتوای متغیر مقداردهی نمی‌شود و ممکن است مقادیر تصادفی داشته باشد. طول فعلی آن 0 است تا نشان دهد رشته خالی است.

۱۰.۶.۵ دسترسی

هنگام اجرای FILENAME، نشانی رشته روی پشته قرار می‌گیرد.

۱۰.۷ ثابت رشته‌ای: $CONSTANT

۱۰.۷.۱ مفهوم

واژهٔ $CONSTANT مشابه $VARIABLE است، با این تفاوت که رشته را با مقدار مشخصی مقداردهی اولیه می‌کند.

۱۰.۷.۲ ساختار

FORTH
<نشانی_رشته> $CONSTANT <نام>

۱۰.۷.۳ مثال

FORTH
" Press any key to continue..." $CONSTANT PKEY

توضیح:

  • " یک رشته در PAD می‌سازد و نشانی آن را روی پشته قرار می‌دهد.
  • $CONSTANT یک ورودی جدید به نام PKEY می‌سازد و رشته را از PAD به آن منتقل می‌کند.

۱۰.۷.۴ بررسی

FORTH
PKEY $.
OUTPUT
Press any key to continue... OK

۱۰.۸ ذخیره در آدرس: $!

۱۰.۸.۱ مفهوم

واژهٔ $! رشته‌ای را در نشانی مشخصی ذخیره می‌کند.

۱۰.۸.۲ ساختار

FORTH
$1 $2 $!
  • $1: رشتهٔ مبدأ (روی پشته).
  • $2: نشانی مقصد.

۱۰.۸.۳ نکات

  • اگر $2 نشانی PAD باشد، حداکثر طول مقصد ۲۵۵ بایت در نظر گرفته می‌شود.
  • در غیر این صورت، بایت پیش از نشانی مقصد به‌عنوان حداکثر طول در نظر گرفته می‌شود.
  • اگر طول رشتهٔ مبدأ از حداکثر طول مقصد بیشتر باشد، تنها تعداد مجاز منتقل می‌شود.

۱۰.۸.۴ مثال

FORTH
" TESTDATA.DAT" FILENAME $!
FILENAME $.
OUTPUT
TESTDATA.DAT OK

۱۰.۸.۵ محدودیت

اگر رشتهٔ مبدأ از حداکثر طول مقصد بیشتر باشد، بخشی از آن بریده می‌شود:

FORTH
" ABCDEFGHIJKLMNOPQRSTUVWXYZ" FILENAME $!
FILENAME $.
OUTPUT
ABCDEFGHIJKLMNOP OK

توضیح: تنها ۱۶ کاراکتر نخست منتقل می‌شود.

۱۰.۹ الحاق رشته‌ها: $+

۱۰.۹.۱ مفهوم

واژهٔ $+ دو رشته را به هم می‌چسباند.

۱۰.۹.۲ ساختار

FORTH
$1 $2 $+ --- PAD
  • $2 به انتهای $1 افزوده می‌شود.
  • نتیجه در PAD قرار می‌گیرد.

۱۰.۹.۳ مثال

FORTH
" ABCDEF" $CONSTANT TEMP$
" 123456" TEMP$ $+ $.
OUTPUT
123456ABCDEF OK

۱۰.۹.۴ محدودیت

اگر مجموع طول دو رشته از ۲۵۵ کاراکتر بیشتر شود، نتیجه معیوب خواهد بود.

۱۰.۱۰ برش رشته: LEFT$، RIGHT$، MID$

۱۰.۱۰.۱ واژهٔ LEFT$

این واژه n کاراکتر نخست رشته را برمی‌گرداند.

FORTH
$1 n LEFT$ --- PAD

مثال:

FORTH
" 1234567890" 4 LEFT$ $.
OUTPUT
1234 OK

نکته: اگر طول رشتهٔ $1 کمتر از n باشد، کل رشته بازگردانده می‌شود.

۱۰.۱۰.۲ واژهٔ RIGHT$

این واژه n کاراکتر آخر رشته را برمی‌گرداند.

FORTH
$1 n RIGHT$ --- PAD

مثال:

FORTH
TEMP$ 3 RIGHT$ $.
OUTPUT
DEF OK

نکته:

  • اگر n = 0 باشد، رشتهٔ خالی بازمی‌گردد.
  • اگر n بزرگ‌تر از طول رشته باشد، کل رشته بازمی‌گردد.

۱۰.۱۰.۳ واژهٔ MID$

این واژه یک زیررشته از #CHR کاراکتر را با شروع از موقعیت STRTPOS برمی‌گرداند.

FORTH
$1 STRTPOS #CHR MID$ --- PAD

نکته:

  • موقعیت کاراکتر اول 1 است، نه 0.
  • اگر STRTPOS بزرگ‌تر از طول رشته باشد یا #CHR = 0 باشد، رشتهٔ خالی بازمی‌گردد.
  • اگر #CHR از باقی‌ماندهٔ رشته بیشتر باشد، تنها باقی‌مانده بازگردانده می‌شود.

مثال:

FORTH
" 1234567890" 3 4 MID$ $.
OUTPUT
3456 OK
FORTH
" 1234567890" 10 1 MID$ $.
OUTPUT
0 OK

۱۰.۱۱ طول رشته: LEN

۱۰.۱۱.۱ مفهوم

واژهٔ LEN طول فعلی رشته را برمی‌گرداند.

۱۰.۱۱.۲ ساختار

FORTH
$1 LEN --- n

۱۰.۱۱.۳ مثال

FORTH
TEMP$ LEN .
OUTPUT
6 OK

۱۰.۱۲ تبدیل بایت به رشته: CHR$

۱۰.۱۲.۱ مفهوم

واژهٔ CHR$ یک رشتهٔ تک‌کاراکتری از یک مقدار بایتی می‌سازد.

۱۰.۱۲.۲ ساختار

FORTH
b CHR$ --- PAD

۱۰.۱۲.۳ کاربرد

از CHR$ برای درج کاراکترهای کنترلی (مثل Return) در رشته‌ها استفاده کنید.

۱۰.۱۲.۴ مثال

FORTH
TEMP$ 13 CHR$ $+ $.

نتیجه: رشتهٔ TEMP$ به‌همراه یک کاراکتر Return چاپ می‌شود.

۱۰.۱۳ تبدیل رشته به کد اسکی: ASC

۱۰.۱۳.۱ مفهوم

واژهٔ ASC کد ASCII نخستین کاراکتر رشته را برمی‌گرداند.

۱۰.۱۳.۲ ساختار

FORTH
$1 ASC --- b

۱۰.۱۳.۳ مثال

FORTH
" ABCDEF" ASC .
OUTPUT
65 OK

۱۰.۱۳.۴ نکته

اگر رشته خالی باشد، پیام NULL STRING چاپ می‌شود و مقدار 0 بازمی‌گردد.

۱۰.۱۳.۵ رفع مشکل رشتهٔ خالی

برای جلوگیری از پیام خطا، یک رشتهٔ خالی معتبر بسازید:

FORTH
0 CHR$ TEMP$ $!

۱۰.۱۴ تبدیل رشته به عدد: VAL

۱۰.۱۴.۱ مفهوم

واژهٔ VAL یک رشته از کاراکترها را به یک عدد صحیح ساده تبدیل می‌کند.

۱۰.۱۴.۲ ساختار

FORTH
$1 VAL --- n

۱۰.۱۴.۳ نکات

  • تبدیل بر اساس مبنای جاری (BASE) انجام می‌شود.
  • اگر رشته با علامت منفی آغاز شود، عدد منفی خواهد بود.
  • تبدیل در نخستین کاراکتر غیرعددی متوقف می‌شود.

۱۰.۱۴.۴ مثال

FORTH
" -1234" VAL .
OUTPUT
-1234 OK
FORTH
" 65530" TEMP$ $!
TEMP$ VAL .
OUTPUT
-6 OK

توضیح: در مبنای ۱۰، عدد 65530 معادل عدد علامت‌دار -6 است.

۱۰.۱۵ تبدیل رشته به عدد دقت دوگانه: DVAL

۱۰.۱۵.۱ مفهوم

واژهٔ DVAL مشابه VAL است، با این تفاوت که یک عدد دقت دوگانه بازمی‌گرداند.

۱۰.۱۵.۲ مثال

FORTH
" 12345678" TEMP$ $!
TEMP$ DVAL D.
OUTPUT
12345678 OK

۱۰.۱۶ تبدیل عدد به رشته: STR$

۱۰.۱۶.۱ مفهوم

واژهٔ STR$ یک مقدار روی پشته را به رشته تبدیل می‌کند.

۱۰.۱۶.۲ ساختار

FORTH
n STR$ --- PAD

۱۰.۱۶.۳ نکات

  • اگر عدد منفی باشد، رشته با علامت منفی آغاز می‌شود.
  • در غیر این صورت، رشته با یک فاصله آغاز می‌شود.
  • نقطهٔ اعشاری در نتیجه گنجانده نمی‌شود.

۱۰.۱۶.۴ مثال

FORTH
1234 STR$ 8 DUMP

نتیجه: نمایش HEX رشته.

FORTH
-32760 STR$ 8 DUMP

نتیجه: نمایش HEX رشتهٔ منفی.

۱۰.۱۷ تبدیل عدد اعشاری به رشته: DSTR$ و DLRSTR$

۱۰.۱۷.۱ واژهٔ DSTR$

واژهٔ DSTR$ یک عدد دقت دوگانه را به رشته تبدیل می‌کند.

FORTH
d DSTR$ --- PAD

۱۰.۱۷.۲ واژهٔ DLRSTR$

واژهٔ DLRSTR$ یک عدد اعشاری را به رشته‌ای با علامت دلار تبدیل می‌کند.

FORTH
: DLRSTR$ DSTR$ " $" S1 $+ S1 $!
S1 DUP LEN DPL @ - LEFT$ S2 $!
S1 DPL @ RIGHT$ S1 $!
S2 ." " $+ S1 $+ ;

مثال:

FORTH
534.86 DLRSTR$ $.
OUTPUT
$ 534.86 OK

۱۰.۱۸ ورودی رشته: INPUT$

۱۰.۱۸.۱ مفهوم

واژهٔ INPUT$ روشی راحت برای دریافت رشته از کاربر و ذخیرهٔ آن در یک متغیر رشته‌ای است.

۱۰.۱۸.۲ مثال

FORTH
80 $VARIABLE A$
: GETDATE CR ." INPUT TODAY'S DATE: " A$ INPUT$ ;
GETDATE

نتیجه نمونه:

OUTPUT
INPUT TODAY'S DATE: JULY 27, 1983

سپس:

FORTH
A$ $.
OUTPUT
JULY 27, 1983 OK

۱۰.۱۹ جستجو در رشته: POS$

۱۰.۱۹.۱ مفهوم

واژهٔ POS$ نخستین وقوع رشتهٔ $2 را در رشتهٔ $1 جستجو می‌کند.

۱۰.۱۹.۲ ساختار

FORTH
$1 $2 POS$ --- n
  • اگر یافت شود، موقعیت شروع روی پشته قرار می‌گیرد.
  • اگر یافت نشود، مقدار 0 بازمی‌گردد.

۱۰.۱۹.۳ مثال

FORTH
A$ " 27," POS$ .
OUTPUT
6 OK
FORTH
A$ " 1983A" POS$ .
OUTPUT
0 OK

۱۰.۲۰ مقایسهٔ رشته‌ها: $=، $<، $>

۱۰.۲۰.۱ واژهٔ $=

بررسی می‌کند که دو رشته دقیقاً برابرند یا نه.

FORTH
$1 $2 $= --- flag

مثال:

FORTH
" ABCDEFGH" A$ $!
" ABCDEF" A$ $= .
OUTPUT
0 OK
FORTH
" ABCDEFGH" A$ $= .
OUTPUT
1 OK

۱۰.۲۰.۲ واژهٔ $<

بررسی می‌کند که $1 کوچک‌تر از $2 است یا نه (بر اساس طول یا مقدار).

FORTH
$1 $2 $< --- flag

۱۰.۲۰.۳ واژهٔ $>

بررسی می‌کند که $1 بزرگ‌تر از $2 است یا نه.

۱۰.۲۰.۴ واژهٔ $COMPARE

مقایسهٔ دو رشته با بازگشت مقدار عددی:

FORTH
$1 $2 $COMPARE --- flag
  • مقدار مثبت: $1 بزرگ‌تر از $2 است.
  • مقدار صفر: رشته‌ها برابرند.
  • مقدار منفی: $1 کوچک‌تر از $2 است.

۱۰.۲۱ واژهٔ $NUMBER

۱۰.۲۱.۱ مفهوم

واژهٔ $NUMBER مشابه NUMBER است، با این تفاوت که هنگام مواجهه با کاراکتر غیرمنتظره، خطا نمی‌دهد؛ بلکه تبدیل را متوقف می‌کند.

۱۰.۲۱.۲ ساختار

FORTH
$1 $NUMBER --- d

۱۰.۲۱.۳ کاربرد

از این واژه برای پردازش فایل‌های داده‌ای که با BASIC ساخته شده‌اند، استفاده کنید.

۱۰.۲۱.۴ مثال

اگر فایل داده‌ای چنین محتوایی داشته باشد:

DATA
34, 567,JOHN SMITH,1428 ELM ST.,...

می‌توانید با $NUMBER نخستین عدد را استخراج کنید و سپس با MID$ به بقیهٔ محتوا دسترسی پیدا کنید.

۱۰.۲۲ واژهٔ -TEXT

۱۰.۲۲.۱ مفهوم

واژهٔ -TEXT دو رشته را برای طول مشخصی مقایسه می‌کند.

۱۰.۲۲.۲ ساختار

FORTH
addr1 N1 addr2 --- N2
  • اگر رشته‌ها برابر باشند، مقدار 0 بازمی‌گردد.
  • در غیر این صورت، تفاوت میان کاراکترها بازگردانده می‌شود.

۱۰.۲۲.۳ نکته

نشانی‌های ارسالی به -TEXT، نشانی‌های عادی رشته نیستند؛ بلکه نشانی‌های مطلق درون رشتهٔ کاراکترها هستند.

۱۰.۲۳ واژهٔ UMOVE

۱۰.۲۳.۱ مفهوم

واژهٔ UMOVE نسخهٔ عمومی CMOVE و <CMOVE است. این واژه بر اساس همپوشانی مبدأ و مقصد، تعیین می‌کند که کدام نسخه را فراخوانی کند.

۱۰.۲۳.۲ ساختار

FORTH
<fromaddr> <toaddr> <#byte> UMOVE

۱۰.۲۴ مثال‌های عملی

مثال ۱: ذخیره و چاپ نام

FORTH
20 $VARIABLE NAME
" ALI" NAME $!
NAME $.
OUTPUT
ALI OK

مثال ۲: الحاق دو رشته

FORTH
" HELLO " $CONSTANT GREET
" WORLD" GREET $+ $.
OUTPUT
WORLD HELLO OK

مثال ۳: برش رشته

FORTH
" 1234567890" 3 4 MID$ $.
OUTPUT
3456 OK

مثال ۴: جستجو در رشته

FORTH
" HELLO WORLD" "  WORLD" POS$ .
OUTPUT
6 OK

مثال ۵: مقایسهٔ رشته‌ها

FORTH
" ABC" " ABC" $= .
OUTPUT
1 OK

۱۰.۲۵ تمرین‌ها

EXERCISE 01
یک متغیر رشته‌ای به نام CITY با حداکثر طول ۲۰ کاراکتر بسازید و نام یک شهر را در آن ذخیره کنید.
FORTH
20 $VARIABLE CITY
" TEHRAN" CITY $!
CITY $.
OUTPUT
TEHRAN OK
EXERCISE 02
رشتهٔ «HELLO» را در PAD ذخیره کنید و با $. چاپ کنید.
FORTH
" HELLO"
$.
OUTPUT
HELLO OK
EXERCISE 03
دو رشته «SALAM» و «DONYA» را به هم بچسبانید.
FORTH
" SALAM " $CONSTANT S1
" DONYA" S1 $+ $.
OUTPUT
DONYA SALAM OK
EXERCISE 04
چهار کاراکتر نخست رشتهٔ «ABCDEFGH» را استخراج و چاپ کنید.
FORTH
" ABCDEFGH" 4 LEFT$ $.
OUTPUT
ABCD OK
EXERCISE 05
بررسی کنید که آیا دو رشتهٔ «TEST» و «TEST» برابرند.
FORTH
" TEST" " TEST" $= .
OUTPUT
1 OK
EXERCISE 06
موقعیت زیررشتهٔ «LO» را در رشتهٔ «HELLO WORLD» پیدا کنید.
FORTH
" HELLO WORLD" "  LO" POS$ .
OUTPUT
4 OK
EXERCISE 07
طول رشتهٔ «PROGRAMMING» را محاسبه کنید.
FORTH
" PROGRAMMING" LEN .
OUTPUT
11 OK
EXERCISE 08
با استفاده از CHR$، یک رشتهٔ تک‌کاراکتری شامل کاراکتر Return بسازید و به انتهای یک رشتهٔ دیگر بیفزایید.
FORTH
" HELLO" 13 CHR$ $+ $.

نتیجه: «HELLO» به‌همراه Return چاپ می‌شود.

۱۰.۲۶ خلاصهٔ فصل

نکات کلیدی این فصل

  • ساختار ذخیرهٔ رشته در حافظه (بایت حداکثر طول + بایت طول فعلی + کاراکترها).
  • بارگذاری واژه‌های رشته‌ای با 20 LOAD.
  • واژهٔ " برای ذخیره در PAD.
  • واژهٔ $. برای چاپ رشته.
  • واژهٔ DUMP برای نمایش محتوای حافظه.
  • متغیر رشته‌ای با $VARIABLE.
  • ثابت رشته‌ای با $CONSTANT.
  • ذخیره در آدرس با $!.
  • الحاق رشته‌ها با $+.
  • برش رشته با LEFT$، RIGHT$ و MID$.
  • طول رشته با LEN.
  • تبدیل بایت به رشته با CHR$.
  • تبدیل رشته به کد اسکی با ASC.
  • تبدیل رشته به عدد با VAL و DVAL.
  • تبدیل عدد به رشته با STR$، DSTR$ و DLRSTR$.
  • ورودی رشته با INPUT$.
  • جستجو در رشته با POS$.
  • مقایسهٔ رشته‌ها با $=، $<، $> و $COMPARE.
  • تبدیل رشته به عدد با تشخیص خطا با $NUMBER.
  • مقایسه با طول مشخص با -TEXT.
  • انتقال حافظه با UMOVE.
CHAPTER 11

ورودی و خروجی فایل

24 SECTIONS // C64-FORTH

۱۱.۱ مقدمه

در فصل‌های پیشین با پشته، حلقه‌ها، آرایه‌ها و مدیریت رشته‌ها آشنا شدید. اکنون زمان آن رسیده است که با یکی از مهم‌ترین جنبه‌های هر زبان برنامه‌نویسی آشنا شوید: کار با فایل‌ها.

در FORTH، صفحه‌هایی که ساخته می‌شوند، به‌صورت فایل‌های داده‌ای ترتیبی روی دیسک یا نوار کاست ذخیره می‌شوند. روال‌هایی که C64-FORTH برای این کار استفاده می‌کند، در اختیار شما نیز قرار دارند.

با این روال‌ها می‌توانید:

  • فایل ایجاد کنید.
  • داده‌ها را از فایل بخوانید.
  • داده‌ها را در فایل بنویسید.
  • فایل‌ها را ببندید.

در این فصل، تمام این عملیات به‌طور کامل توضیح داده می‌شود.

۱۱.۲ تفاوت روش کار با BASIC

یکی از تفاوت‌های مهم میان C64-FORTH و BASIC در کار با فایل، این است که C64-FORTH داده‌ها را بایت‌به‌بایت روی فایل خارجی می‌خواند و می‌نویسد. تعیین اینکه داده‌ها عددی هستند یا کاراکتری، به عهدهٔ خود شماست.

مزیت: بررسی خطا در FORTH آسان‌تر از BASIC است.

۱۱.۳ متغیر SYSDEV#

۱۱.۳.۱ مفهوم

SYSDEV# یک متغیر در C64-FORTH است که روال‌های ورودی/خروجی از آن استفاده می‌کنند. بیشتر روال‌ها به‌طور خودکار آن را روی شمارهٔ دستگاه جاری تنظیم می‌کنند.

۱۱.۳.۲ نکته

برخی روال‌ها مانند OPEN، CLOSE، GET#، INPUT#، PRINT# و CMD# به‌طور مستقیم از SYSDEV# استفاده نمی‌کنند و شمارهٔ دستگاه را از طریق دستور OPEN دریافت می‌کنند. اما بعضی روال‌های بررسی خطا به آن نیاز دارند.

۱۱.۳.۳ توصیه

پیش از باز کردن هر فایل روی دیسک یا نوار کاست، مقدار SYSDEV# را تنظیم کنید.

۱۱.۳.۴ ساختار

  • بایت پایین: شمارهٔ دستگاه
  • بایت بالا: شمارهٔ درایو (معمولاً 0)

۱۱.۳.۵ کاربرد

واژه‌های SAVESYSTEM و SAVETURNKEY نیاز دارند که SYSDEV# شمارهٔ دستگاهی را که C64-FORTH روی آن ذخیره می‌شود، در خود داشته باشد.

۱۱.۴ متغیر ST

۱۱.۴.۱ مفهوم

ST یک متغیر در C64-FORTH است که وضعیت پایانی هر عملیات ورودی/خروجی را نگه می‌دارد.

۱۱.۴.۲ کاربرد

پس از هر عملیات OPEN، CLOSE، GET#، INPUT# یا PRINT#، وضعیت پایانی در ST قرار می‌گیرد. می‌توانید آن را بررسی کنید.

۱۱.۴.۳ مثال

در BASIC:

BASIC
100 INPUT#2, A$(I), B : REM خواندن رشته و عدد
110 IF ST <> 0 THEN 1000 : REM خط ۱۰۰۰ روال خطاست

در C64-FORTH:

FORTH
... 2 HERE 80 INPUT# ST C@ IF ." I/O STATUS ERROR" ...

۱۱.۵ باز کردن فایل: OPEN

۱۱.۵.۱ مفهوم

هر فایل پیش از دسترسی باید باز شود. پارامترهای مورد نیاز باید به دستور OPEN پاس داده شوند.

۱۱.۵.۲ ساختار

FORTH
OPEN   ( file# dev# sa fnptr fnbytcnt --- )
  • file#: شمارهٔ منطقی فایل (۱ تا ۲۵۵)
  • dev#: شمارهٔ دستگاه
  • sa: آدرس ثانویه
  • fnptr: نشانی رشتهٔ نام فایل یا فرمان
  • fnbytcnt: تعداد بایت‌های رشتهٔ نام فایل

۱۱.۵.۳ تفاوت با BASIC

در BASIC، نام فایل اختیاری است. در FORTH، باید شمارش و اشاره‌گر رشتهٔ نام فایل (یا فرمان) حتی در صورت نبود، پاس داده شوند.

۱۱.۵.۴ مثال ۱: باز کردن یک فایل با نام

FORTH
2 (file#)
8 (dev#)
2 (sa)
FNBUF COUNT ( نشانی و تعداد بایت نام فایل )
OPEN

معادل BASIC:

BASIC
OPEN 2, 8, 2, "0:TESTDATA,S,R"

۱۱.۵.۵ مثال ۲: باز کردن دستگاه بدون نام فایل

FORTH
4 (file#)
4 (dev#)
1 (sa)
0 ( مقدار برای متعادل کردن پشته )
DUP ( تعداد بایت نام فایل - در این حالت ۰ )
OPEN

معادل BASIC:

BASIC
OPEN 4, 4, 1

۱۱.۶ بستن فایل: CLOSE

۱۱.۶.۱ مفهوم

هر فایلی که باز شده است، باید به‌درستی بسته شود تا همهٔ داده‌ها روی آن نوشته شود و فضا برای استفاده‌های بعدی آزاد گردد.

۱۱.۶.۲ ساختار

FORTH
CLOSE   ( file# --- )

۱۱.۶.۳ مثال

FORTH
2 CLOSE

معادل BASIC:

BASIC
CLOSE 2

۱۱.۷ خواندن از فایل: INPUT#

۱۱.۷.۱ مفهوم

این واژه آسان‌ترین روش برای خواندن داده‌های کاراکتری از یک فایل روی دیسک یا نوار کاست است.

۱۱.۷.۲ ساختار

FORTH
INPUT#   ( file# addr count --- )
  • file#: شمارهٔ فایل
  • addr: نشانی حافظه برای ذخیرهٔ داده‌ها
  • count: حداکثر تعداد کاراکترها

۱۱.۷.۳ رفتار

  • INPUT# پیش از رسیدن به حداکثر تعداد، در صورت دریافت RETURN (کد ۱۳)، NULL (کد ۰) یا پایان فایل، متوقف می‌شود.
  • تعداد واقعی بایت‌های دریافت‌شده در نشانی مشخص‌شده قرار می‌گیرد.

۱۱.۷.۴ مثال

FORTH
2 HERE 80 INPUT#

این دستور حداکثر ۸۰ کاراکتر از فایل شمارهٔ ۲ می‌خواند و در انتهای دیکشنری ذخیره می‌کند.

معادل BASIC:

BASIC
INPUT#2, A$ یا INPUT#2, C

۱۱.۸ خواندن بایت‌به‌بایت: GET#

۱۱.۸.۱ مفهوم

واژهٔ GET# تعداد مشخصی بایت را از فایل می‌خواند و آن‌ها را به‌صورت یک رشتهٔ FORTH (شمارش بایت + بایت‌ها) در حافظه ذخیره می‌کند.

۱۱.۸.۲ ساختار

FORTH
GET#   ( file# addr count --- )

۱۱.۸.۳ مزیت نسبت به INPUT#

GET# در مواردی که داده‌های ورودی ممکن است شامل مقادیر بایتی 0 یا 13 باشند، بر INPUT# ترجیح داده می‌شود. همچنین برای دریافت چند بایت در یک عملیات، سریع‌تر است.

۱۱.۸.۴ مثال

FORTH
7 HERE 20 GET#

این دستور ۲۰ بایت از فایل شمارهٔ ۷ می‌خواند.

۱۱.۹ نوشتن در فایل: PRINT#

۱۱.۹.۱ مفهوم

واژهٔ PRINT# داده‌ها را به یک فایل خارجی منتقل می‌کند.

۱۱.۹.۲ ساختار

FORTH
PRINT#   ( file# addr count --- )

۱۱.۹.۳ مثال

FORTH
5 HERE COUNT PRINT#

معادل BASIC:

BASIC
PRINT#5, A$

۱۱.۹.۴ نکته مهم

دستور 5 0 0 PRINT# با دستور PRINT#5 در BASIC یکسان نیست. در BASIC، پس از دستور چاپ، به‌طور خودکار RETURN اضافه می‌شود؛ اما در FORTH چنین نیست.

برای افزودن RETURN:

FORTH
13 EBUF C! 5 EBUF 1 PRINT#

۱۱.۱۰ تغییر مسیر خروجی: CMD#

۱۱.۱۰.۱ مفهوم

واژهٔ CMD# مشابه دستور CMD در BASIC است، با یک تفاوت: خروجی از صفحه منحرف نمی‌شود؛ بلکه هم‌زمان با چاپ روی صفحه، به دستگاه خارجی نیز فرستاده می‌شود.

۱۱.۱۰.۲ کاربرد

از این واژه برای چاپ لیست صفحه‌ها روی چاپگر استفاده کنید.

۱۱.۱۰.۳ مثال

برای چاپ صفحه‌های ۶۰ تا ۷۹ روی چاپگر:

FORTH
4 4 0 0 0 OPEN
4 CMD#
60 79 LS
4 CLOSE

۱۱.۱۱ بستن همهٔ فایل‌ها: ABORTIO

۱۱.۱۱.۱ مفهوم

این روال همهٔ فایل‌های باز را می‌بندد و می‌تواند در هر روال FORTH فراخوانی شود.

۱۱.۱۱.۲ کاربرد

در صورت بروز خطای ورودی/خروجی، از ABORTIO برای بستن فایل‌ها استفاده کنید.

۱۱.۱۲ بررسی وضعیت دستگاه: GETDEV

۱۱.۱۲.۱ مفهوم

واژهٔ GETDEV شمارهٔ دستگاه را برای یک فایل مشخص بازمی‌گرداند.

۱۱.۱۲.۲ ساختار

FORTH
GETDEV   ( file# --- dev# )

۱۱.۱۳ بافر خطا: EBUF

۱۱.۱۳.۱ مفهوم

EBUF یک بافر ۳۰ بایتی برای نگهداری پیام‌های وضعیت دیسک است.

۱۱.۱۳.۲ کاربرد

از EBUF در کنار RDSTAT، CKRDSTAT و CKRWSTAT استفاده کنید.

۱۱.۱۴ خواندن وضعیت دیسک: RDSTAT

۱۱.۱۴.۱ مفهوم

واژهٔ RDSTAT وضعیت دیسک را از دستگاه می‌خواند، اما تنها اگر شمارهٔ فایل به یک دستگاه فیزیکی بزرگ‌تر از ۳ اشاره کند.

۱۱.۱۴.۲ هشدار

از این روال روی دستگاه‌هایی که دیسک یا نوار کاست نیستند، استفاده نکنید.

۱۱.۱۴.۳ رفتار

  • اگر دستگاه نوار کاست باشد (شمارهٔ دستگاه کمتر از ۴)، دو کاراکتر ASCII 00 در EBUF+1 و EBUF+2 قرار می‌گیرد.

۱۱.۱۵ بررسی وضعیت: CKST

۱۱.۱۵.۱ مفهوم

واژهٔ CKST وضعیت ورودی/خروجی را پس از یک انتقال بررسی می‌کند.

۱۱.۱۵.۲ ساختار

FORTH
CKST   ( --- flag )

۱۱.۱۵.۳ رفتار

  • اگر بایت وضعیت برابر 0 باشد، پرچم نادرست (0) بازمی‌گردد.
  • اگر وضعیت پایان فایل تشخیص داده شود، پرچم درست (1) بازمی‌گردد.
  • در صورت بروز خطا، CKST پیام خطا چاپ می‌کند و کنترل را به مفسر FORTH بازمی‌گرداند.

۱۱.۱۶ بررسی وضعیت با پیام خطا: CKRDSTAT

۱۱.۱۶.۱ مفهوم

واژهٔ CKRDSTAT نخست CKST را فراخوانی می‌کند، سپس کانال خطا را از دیسک می‌خواند.

۱۱.۱۶.۲ رفتار

  • در صورت موفقیت، پرچم نادرست (0) بازمی‌گردد.
  • در صورت پایان فایل، پرچم درست (1) بازمی‌گردد.
  • در صورت خطا، پیام خطای دیسک چاپ می‌شود و همهٔ فایل‌ها بسته می‌شوند.

۱۱.۱۷ بررسی وضعیت بدون پرچم: CKRWSTAT

۱۱.۱۷.۱ مفهوم

واژهٔ CKRWSTAT مشابه CKRDSTAT است، اما هیچ پرچمی بازنمی‌گرداند. این واژه برای بررسی وضعیت پس از نوشتن به کار می‌رود.

۱۱.۱۸ تشخیص دیسک: ?DISK

۱۱.۱۸.۱ مفهوم

واژهٔ ?DISK بر اساس شمارهٔ دستگاه در SYSDEV# تشخیص می‌دهد که آیا دستگاه دیسک است یا نه.

۱۱.۱۸.۲ ساختار

FORTH
?DISK   ( --- flag )
  • مقدار 0: دستگاه دیسک نیست.
  • مقدار غیرصفر: دستگاه دیسک است.

۱۱.۱۸.۳ معیار

تنها معیار تشخیص این است که شمارهٔ دستگاه بزرگ‌تر یا مساوی ۴ باشد.

۱۱.۱۹ باز کردن کانال خطا: OPENCHN

۱۱.۱۹.۱ مفهوم

OPENCHN کانال خطا را برای دیسک باز می‌کند.

۱۱.۱۹.۲ تعریف داخلی

FORTH
: OPENCHN ?DISK IF 15 SYSDEV# C@ 15 OPEN CKRWSTAT THEN ;

۱۱.۱۹.۳ معادل BASIC

BASIC
10 OPEN 15, 8, 15
20 IF ST <> 0 THEN PRINT "I/O STATUS ERROR:"; ST : STOP
30 GOSUB 1000
1000 INPUT#15, EN, EM$, ET, ES
1010 IF EN = 0 THEN RETURN
1020 PRINT "DISK ERROR ", EN; EM$; ET; ES : STOP

۱۱.۲۰ بستن کانال خطا: CLOSCHN

۱۱.۲۰.۱ مفهوم

CLOSCHN کانال خطایی را که با OPENCHN باز شده بود، می‌بندد.

۱۱.۲۰.۲ تعریف داخلی

FORTH
: CLOSCHN ?DISK IF 15 CLOSE THEN ;

۱۱.۲۱ بررسی وجود فایل: ?FILE

۱۱.۲۱.۱ مفهوم

واژهٔ ?FILE پس از باز کردن یک فایل، بررسی می‌کند که آیا فایل روی دیسک وجود دارد یا نه.

۱۱.۲۱.۲ ساختار

FORTH
?FILE   ( --- flag )
  • مقدار 0: فایل وجود دارد.
  • مقدار 1: فایل وجود ندارد.

۱۱.۲۱.۳ تعریف داخلی

FORTH
HEX : ?FILE CKST DROP ?DISK IF
15 RDSTAT EBUF 1+ @ DUP 3236 = IF
DROP 1 ELSE 3030 - IF
CR EBUF COUNT TYPE
CR ABORTIO 8 ERROR
THEN
ELSE 0 THEN ;

۱۱.۲۲ برنامه‌های نمونه

۱۱.۲۲.۱ مثال ۱: ارسال فرمان به دیسک

FORTH
: DCMD ( $addr --- )
15 SWAP COUNT PRINT#
CKRWSTAT ;

استفاده:

FORTH
" S0:CLIENT1" DCMD

۱۱.۲۲.۲ مثال ۲: چاپ آدرس‌های بارگذاری فایل PRG

FORTH
16 $VARIABLE N$
: LOADADR
CR ." INPUT FILENAME: "
N$ INPUT$
CR ." LOAD ADDRESSES OF " N$ $. ." ARE..." CR
OPENCHN
14 8 14 N$ " ,P,R" $+ COUNT OPEN
?FILE IF
CR ." FILE DOES NOT EXIST"
ELSE
HEX 14 HERE 2 GET#
CR ." STARTING ADR: "
HERE 1+ @ DUP 4 U.R CR
BEGIN
14 HERE 1 GET#
1+
CKST UNTIL
1-
." LAST BYTE ADDR: " 4 U.R
THEN
CR 14 CLOSE CLOSCHN DECIMAL ;

۱۱.۲۲.۳ مثال ۳: کپی صفحه

FORTH
3 $VARIABLE A$ 3 $VARIABLE B$ 10 $VARIABLE C$
: CKFILE ( --- flag )
?FILE IF
CR ." FILE CALLED " PAD $. ." NOT FOUND" 0
ELSE 1 THEN ;

: COPYSCR
CR ." SCREEN # TO COPY FROM: " A$ INPUT$
CR ." SCREEN # TO COPY TO : " B$ INPUT$
OPENCHN
" SCR" A$ $+ C$ $!
14 8 14 C$ " ,S,R" $+ COUNT OPEN
CKFILE IF
" SCR" B$ $+ C$ $!
13 8 13 C$ " ,S,W" $+ COUNT OPEN
14 HERE 1024 GET# CKRWSTAT
13 HERE 1+ 1024 PRINT# CKRWSTAT
THEN
13 CLOSE 14 CLOSE CLOSCHN CR ;

۱۱.۲۳ تمرین‌ها

EXERCISE 01
برنامه‌ای بنویسید که یک فایل به نام TEST.DAT روی دیسک ایجاد کند و متن «HELLO» را در آن بنویسد.
FORTH
: WRITE-TEST
2 8 2 " 0:TEST.DAT,S,W" $+ COUNT OPEN
" HELLO" 2 PRINT#
2 CLOSE ;
WRITE-TEST
EXERCISE 02
فایل TEST.DAT را باز کنید و محتوای آن را روی صفحه چاپ کنید.
FORTH
: READ-TEST
2 8 2 " 0:TEST.DAT,S,R" $+ COUNT OPEN
2 HERE 80 INPUT#
CR HERE 80 TYPE
2 CLOSE ;
READ-TEST
EXERCISE 03
بررسی کنید که آیا فایل TEST.DAT روی دیسک وجود دارد.
FORTH
: CHECK-TEST
OPENCHN
14 8 14 " 0:TEST.DAT,P,R" COUNT OPEN
?FILE IF
CR ." FILE NOT FOUND"
ELSE
CR ." FILE EXISTS"
THEN
14 CLOSE CLOSCHN ;
CHECK-TEST
EXERCISE 04
فایلی با نام DATA.TXT بسازید و اعداد ۱ تا ۵ را در آن بنویسید.
FORTH
: WRITE-NUMS
2 8 2 " 0:DATA.TXT,S,W" $+ COUNT OPEN
6 1 DO I STR$ 2 PRINT# LOOP
2 CLOSE ;
WRITE-NUMS
EXERCISE 05
وضعیت دیسک را پس از یک عملیات بررسی کنید.
FORTH
ST @ .

نتیجه: کد وضعیت آخرین عملیات.

۱۱.۲۴ خلاصهٔ فصل

نکات کلیدی این فصل

  • متغیر SYSDEV#: شمارهٔ دستگاه جاری برای ورودی/خروجی.
  • متغیر ST: وضعیت پایانی آخرین عملیات.
  • واژهٔ OPEN: باز کردن فایل.
  • واژهٔ CLOSE: بستن فایل.
  • واژهٔ INPUT#: خواندن از فایل.
  • واژهٔ GET#: خواندن بایت‌به‌بایت.
  • واژهٔ PRINT#: نوشتن در فایل.
  • واژهٔ CMD#: تغییر مسیر خروجی.
  • واژهٔ ABORTIO: بستن همهٔ فایل‌ها.
  • واژهٔ GETDEV: شمارهٔ دستگاه یک فایل.
  • واژهٔ EBUF: بافر خطا.
  • واژه‌های RDSTAT، CKST، CKRDSTAT و CKRWSTAT: بررسی وضعیت.
  • واژهٔ ?DISK: تشخیص دیسک.
  • واژه‌های OPENCHN و CLOSCHN: باز و بستن کانال خطا.
  • واژهٔ ?FILE: بررسی وجود فایل.
  • برنامه‌های نمونه برای کاربردهای واقعی.
CHAPTER 12

جزئیات سیستم C64-FORTH

21 SECTIONS // C64-FORTH

۱۲.۱ مقدمه

در فصل‌های پیشین با جنبه‌های کاربردی FORTH مانند پشته، حلقه‌ها، رشته‌ها و فایل‌ها آشنا شدید. در این فصل، به بررسی جزئیات داخلی سیستم C64-FORTH می‌پردازیم.

این فصل برای کاربرانی است که می‌خواهند:

  • از سیستم فعلی FORTH نسخهٔ سفارشی بسازند.
  • حافظه را مدیریت کنند.
  • برنامه‌های خود را اشکال‌زدایی کنند.
  • از تمام ظرفیت‌های سیستم بهره ببرند.

برخی از مباحث این فصل ممکن است در ابتدا پیچیده به نظر برسند؛ اما درک آن‌ها برای استفادهٔ حرفه‌ای از FORTH ضروری است.

۱۲.۲ ذخیرهٔ سیستم: SAVESYSTEM

۱۲.۲.۱ مفهوم

هر کاربر FORTH در طول کار خود، واژه‌های سفارشی بسیاری می‌سازد. برای اینکه این واژه‌ها هر بار از ابتدا ساخته نشوند، می‌توانید سیستم فعلی FORTH را به‌همراه همهٔ افزوده‌هایتان روی دیسک ذخیره کنید.

۱۲.۲.۲ ساختار

FORTH
SAVESYSTEM " <نام_فایل>"

۱۲.۲.۳ مراحل کار

  1. دستور SAVESYSTEM را با نام دلخواه وارد کنید.
  2. سیستم از شما می‌خواهد که دیسک اصلی C64-FORTH را در درایو قرار دهید.
  3. سیستم بخشی از آن را می‌خواند.
  4. سپس از شما می‌خواهد که دیسکی که می‌خواهید سیستم روی آن ذخیره شود را قرار دهید.
  5. سیستم فعلی FORTH روی آن دیسک ذخیره می‌شود.

۱۲.۲.۴ استفاده پس از ذخیره

پس از خاموش و روشن کردن دستگاه، کافی است فایل ذخیره‌شده را بارگذاری کنید:

BASIC
LOAD"MYFORTH",8
RUN

با اجرای VLIST، خواهید دید که واژه‌های سفارشی شما جزئی از سیستم FORTH شده‌اند.

۱۲.۲.۵ نکته

رشتهٔ میان دو کوتیشن، مستقیماً به دیسک فرستاده می‌شود؛ بنابراین می‌توانید از توابع جایگزینی فایل نیز استفاده کنید:

FORTH
SAVESYSTEM " @0:FORTH2.EXE"

۱۲.۳ ارسال فرمان به دیسک: DC

۱۲.۳.۱ مفهوم

واژهٔ DC فرمانی را به دیسک می‌فرستد و وضعیت را بازمی‌خواند. این واژه فقط در حالت مفسر کار می‌کند و نمی‌توان آن را درون یک تعریف کولون کامپایل کرد.

۱۲.۳.۲ ساختار

FORTH
DC " <فرمان>"

۱۲.۳.۳ نکته

اگر مقدار وضعیت کمتر از ۲۰ باشد، چاپ نمی‌شود. تنها دو کد وضعیت کمتر از ۲۰ در درایوهای ۱۵۴۱ وجود دارد: OK و FILES SCRATCHED.

۱۲.۳.۴ مثال‌ها

FORTH
DC "N0:FORTHWORK,01"

این دستور دیسکی را فرمت می‌کند.

FORTH
DC "S0:TEMP.DAT"

این دستور یک فایل را پاک می‌کند.

FORTH
DC

این دستور فقط وضعیت را می‌خواند و بررسی می‌کند.

۱۲.۴ نمایش فهرست دیسک: DIR

۱۲.۴.۱ مفهوم

واژهٔ DIR فهرست درایو 0 دیسکی را که در SYSDEV# مشخص شده است، نمایش می‌دهد.

۱۲.۴.۲ کاربرد

برای دیدن فهرست فایل‌های روی دیسک، دستور زیر را وارد کنید:

FORTH
DIR

برای درایو ۱:

FORTH
DC "$1"

۱۲.۴.۳ نکته

  • کلید CTRL برای کُند کردن لیست.
  • کلید STOP برای توقف لیست.
  • DIR فقط در حالت مفسر کار می‌کند.

۱۲.۵ لیست کردن چند صفحه روی چاپگر VIC-1525

۱۲.۵.۱ مفهوم

برای چاپ چند صفحه روی چاپگر VIC-1525، می‌توانید از تعریف زیر استفاده کنید:

FORTH
: LS 1+ SWAP DO I LIST CR CR CR CR LOOP ;

۱۲.۵.۲ استفاده

برای چاپ صفحه‌های ۶۰ تا ۷۹:

FORTH
4 4 0 0 0 OPEN
4 CMD#
60 79 LS
4 CLOSE

۱۲.۶ بافرها: BUFFERS

۱۲.۶.۱ مفهوم

C64-FORTH در آغاز کار، بافرهای ورودی/خروجی بلوکی را در زیر ناحیهٔ کاربر تخصیص می‌دهد. هر بافر ۱۰۲۸ بایت فضا اشغال می‌کند.

۱۲.۶.۲ دستور BUFFERS

دستور BUFFERS تعداد بافرهای مورد نظر را ذخیره می‌کند. اگر فضای کافی موجود باشد، تعداد مشخص‌شده تخصیص می‌یابد.

FORTH
8 BUFFERS

۱۲.۶.۳ نکته مهم

  • اگر بیشترین تعداد بافر تخصیص یابد، نمی‌توانید از افزونه‌های رشته‌ای استفاده کنید (زیرا فضای PAD تا PAD+512 اشغال می‌شود).
  • اگر تعداد درخواستی بیشتر از فضای موجود باشد، سیستم به شما اطلاع نمی‌دهد که چند بافر تخصیص یافته است. با استفاده از مقادیر FIRST و LIMIT می‌توانید تعداد واقعی را محاسبه کنید.

۱۲.۷ کاهش بالای حافظه: MEMTOP

۱۲.۷.۱ مفهوم

واژهٔ MEMTOP بالای مؤثر حافظهٔ سیستم FORTH را کاهش می‌دهد. این واژه برای رزرو بخشی از RAM کاربرد دارد.

۱۲.۷.۲ ساختار

FORTH
<نشانی> MEMTOP

۱۲.۷.۳ محاسبه

برای محاسبهٔ اینکه چقدر می‌توانید بالای حافظه را کاهش دهید:

  1. بالای دیکشنری را با HERE بخوانید.
  2. عدد 840 را به آن بیفزایید.
  3. تعداد بافرهای مورد نظر ضرب در 1028 را اضافه کنید.
  4. حاصل را از D000 (بالای فیزیکی حافظه) کم کنید.

۱۲.۷.۴ مثال

FORTH
HERE 840 + HEX U.

نتیجه در HEX نمایش داده می‌شود.

۱۲.۸ استفاده از RAM موجود

۱۲.۸.۱ پس از راه‌اندازی

C64-FORTH در آغاز:

  • ROMهای BASIC را خاموش می‌کند.
  • بالای حافظهٔ قابل استفاده را CFFF در نظر می‌گیرد.
  • ۵۱۲ بایت برای بافرهای RS-232 رزرو می‌کند.
  • ۱۲۸ بایت برای ناحیهٔ کاربر اختصاص می‌دهد (۶۴ مکان ۱۶ بیتی).

۱۲.۸.۲ تخصیص بافرهای بلوکی

پس از آن، بافرهای ورودی/خروجی بلوکی در زیر ناحیهٔ کاربر تخصیص می‌یابند. تعداد بافرها می‌تواند از ۲ تا هر تعدادی که فضا اجازه دهد، باشد.

۱۲.۹ متغیرهای BORDER، BKGRND و CHRCLR

۱۲.۹.۱ مفهوم

هنگامی که C64-FORTH وارد می‌شود یا COLD/WARM اجرا می‌شود، رنگ‌های حاشیه، پس‌زمینه و کاراکترهای چاپ‌شده بر اساس مقادیر این متغیرها تنظیم می‌شوند.

۱۲.۹.۲ محدودهٔ مقادیر

مقادیر این متغیرها باید در بازهٔ 0 تا 15 باشند.

۱۲.۹.۳ مثال

برای تغییر رنگ حاشیه:

FORTH
5 BORDER C!

یا با ذخیرهٔ مستقیم در حافظه:

FORTH
5 53280 C!

۱۲.۱۰ کلید RESTORE

۱۲.۱۰.۱ مفهوم

کلید RESTORE روی کیبورد کمودور ۶۴، در ترکیب با کلید STOP، سیستم FORTH را دوباره راه‌اندازی می‌کند. این یک «راه‌اندازی گرم» است، یعنی تعریف‌هایی که از زمان راه‌اندازی ساخته شده‌اند، از دست می‌روند.

۱۲.۱۰.۲ محدودیت‌ها

  • اگر هستهٔ FORTH خراب شده باشد، RESTORE کار نمی‌کند.
  • اگر وقفه‌ها در هنگام تنظیم حالت‌های گرافیکی خاموش شده باشند، RESTORE کار نمی‌کند.
  • سرریز پشتهٔ داده یا بازگشت نیز می‌تواند سیستم را خراب کند.

۱۲.۱۰.۳ پیاده‌سازی

C64-FORTH یک روال کوچک مدیریت NMI را در RAM زیر ROM کرنل می‌نویسد تا کلید RESTORE حتی در حالت گرافیکی hi-res نیز کار کند.

۱۲.۱۱ عملکرد DV1 تا DV4

۱۲.۱۱.۱ مفهوم

چهار متغیر برای تعریف ویژگی‌های دستگاه‌های ذخیره‌سازی وجود دارد: DV1، DV2، DV3 و DV4. هر متغیر ۴ بایت داده دارد:

  • دو بایت اول: تعداد صفحه‌هایی که دستگاه می‌تواند نگه دارد.
  • بایت سوم: شمارهٔ دستگاه I/O (تنها ۱ یا ۴ تا ۱۵ معتبر است).
  • بایت چهارم: شمارهٔ درایو (معمولاً 0).

۱۲.۱۱.۲ حالت پیش‌فرض

C64-FORTH با DV1 برابر 100 عرضه می‌شود.

۱۲.۱۱.۳ افزودن دستگاه جدید

اگر یک درایو ۱۵۴۱ دوم (به‌عنوان دستگاه ۹) متصل کرده‌اید و می‌خواهید از آن برای ذخیرهٔ صفحه‌ها استفاده کنید:

FORTH
120 DV2 !
9 DV2 2+ C!
0 DV2 3 + C!
100 DV1 !
0 DV3 !
0 DV4 !

۱۲.۱۱.۴ بررسی تعداد صفحه‌ها

FORTH
DV1 @ U.

این دستور تعداد صفحه‌های مجاز روی دستگاه ۱ را چاپ می‌کند.

۱۲.۱۱.۵ محدودیت فضا

هر صفحه ۵ بلوک دیسک اشغال می‌کند. روی درایو ۱۵۴۱، حداکثر ۱۲۰ صفحه قابل ذخیره است.

۱۲.۱۲ عملکرد SYSDEV#

۱۲.۱۲.۱ مفهوم

SYSDEV# متغیری است که روال‌های ورودی/خروجی C64-FORTH از آن استفاده می‌کنند. هنگام خواندن یا نوشتن بلوک، مقدار این متغیر به‌طور خودکار از DV1 تا DV4 تنظیم می‌شود.

۱۲.۱۲.۲ کاربرد

هنگام اجرای SAVESYSTEM یا SAVETURNKEY، برنامه روی دستگاهی ذخیره می‌شود که SYSDEV# به آن اشاره می‌کند.

۱۲.۱۲.۳ تنظیم دستی

اگر می‌خواهید روی دستگاه دیگری ذخیره کنید، SYSDEV# را تنظیم کنید:

FORTH
8 SYSDEV# ! SAVESYSTEM " CURRENT SYS"

۱۲.۱۳ پرچم نوار کاست: TAPEFLG

۱۲.۱۳.۱ مفهوم

TAPEFLG متغیری است که برای ورودی/خروجی بلوکی نوار کاست به کار می‌رود.

۱۲.۱۳.۲ مسئله

هنگام ویرایش صفحه‌ای که روی نوار کاست وجود ندارد، دیسک وضعیت «فایل وجود ندارد» را بازمی‌گرداند و یک صفحهٔ خالی در حافظه می‌سازد. اما نوار کاست چنین وضعیتی را بازنمی‌گرداند.

۱۲.۱۳.۳ راه‌حل

اگر TAPEFLG برابر 0 باشد، نوار کاست برای صفحهٔ مورد نظر جستجو می‌شود. اگر TAPEFLG بزرگ‌تر از 0 و کمتر از 256 باشد، سؤالی از کاربر پرسیده می‌شود. تنها با فشردن کلید N یک صفحهٔ خالی ساخته می‌شود.

۱۲.۱۴ اعتبارسنجی دیسک صفحه‌ها

۱۲.۱۴.۱ مشکل

صفحه‌های FORTH به‌صورت فایل‌های داده‌ای ترتیبی روی دیسک ذخیره می‌شوند. هنگام ذخیره، فایل در حالت REPLACE ذخیره می‌شود و با @0: نام‌گذاری می‌گردد. این کار در برخی موارد مشکلاتی ایجاد می‌کند.

۱۲.۱۴.۲ راه‌حل

  • اعتبارسنجی دوره‌ای دیسک با DC "V0".
  • تغییر به یک دیسک خالی هنگام پرشدن دیسک قدیمی (حدود ۸۰ تا ۹۰ درصد).

۱۲.۱۴.۳ نکتهٔ مهم

هر بار که یک دیسک جدید می‌سازید، یک کد شناسهٔ دو رقمی منحصر به فرد به آن اختصاص دهید. هرگز از یک کد برای دو دیسک مختلف استفاده نکنید.

۱۲.۱۵ پیام‌های خطا

۱۲.۱۵.۱ شکل پیام

پیام خطا با علامت سؤال ? آغاز می‌شود، پس از آن شماره یا متن اطلاعاتی می‌آید. تا زمانی که واژه‌ای به نام EMSGS در دیکشنری موجود باشد، پیام‌های خطا به‌صورت توصیفی چاپ می‌شوند.

۱۲.۱۵.۲ واژهٔ WHERE

پس از بروز خطا، با اجرای WHERE می‌توانید خطای جاری و محل آن را ببینید.

۱۲.۱۵.۳ خطاهای رایج

  • فراموش کردن فاصله میان واژه‌ها.
  • اشتباه در ساختارهای حلقه و شاخه.
  • باقی‌ماندن مقادیر روی پشته.
  • استفاده از واژه‌های تعریف‌نشده.

۱۲.۱۵.۴ واژهٔ SMUDGE

اگر خطایی در حین تعریف کولون رخ داد و نمی‌توانید تعریف را FORGET کنید، از SMUDGE استفاده کنید. این واژه آخرین هدر را حذف می‌کند.

۱۲.۱۶ استفاده از کارتریج IEEE

۱۲.۱۶.۱ مفهوم

C64-FORTH به‌طور خودکار با درایوهای دیسک سازگار با PET/CBM/VIC/C64 کار می‌کند. اما برای کارتریج‌های IEEE، شرایط متفاوت است.

۱۲.۱۶.۲ نیاز به تغییر

اگر از کارتریج IEEE استفاده می‌کنید:

  • روال‌های ورودی/خروجی کرنل ۶۴ باید تغییر کنند تا فرمان‌ها و داده‌ها از گذرگاه سری به رابط IEEE هدایت شوند.
  • ROM کارتریج در بازهٔ 8000-9FFF غیرقابل دسترس می‌شود.

۱۲.۱۶.۳ راه‌حل

پیش از اجرای C64-FORTH:

BASIC
POKE 2067,255

پس از ورود به C64-FORTH، ROM کارتریج در بازهٔ 8000-BFFF فعال می‌شود. برای جلوگیری از همپوشانی، تعداد بافرها را به ۲ کاهش دهید یا MEMTOP را روی 8000 hex تنظیم کنید.

۱۲.۱۷ ساختار تعریف در حافظه

۱۲.۱۷.۱ ساختار کلی

هر تعریف در حافظه از بخش‌های زیر ساخته شده است:

STRUCTURE
+--------------------+  <-- NFA: Name Field Address
|  Length Byte      |
|  (with flags)     |
|  Name characters  |
+--------------------+
|  Link Field (LFA) |  <-- نشانی تعریف قبلی
+--------------------+
|  Code Field (CFA) |  <-- نشانی روال کد ماشین
+--------------------+
|  Parameter Field  |  <-- PFA: نشانی بدنه
|  (body)           |
+--------------------+

۱۲.۱۷.۲ NFA (Name Field Address)

نشانی آغاز هدر. بایت اول شامل اطلاعات زیر است:

  • ۵ بیت پایین: تعداد کاراکترهای نام.
  • بیت ۷: همیشه 1 است و آغاز هدر را نشان می‌دهد.
  • بیت ۶: IMMEDIATE بودن تعریف را نشان می‌دهد.
  • بیت ۵: SMUDGE بودن تعریف را نشان می‌دهد (تعریف هنوز کامل نشده).

۱۲.۱۷.۳ LFA (Link Field Address)

نشانی‌ای که به تعریف قبلی در همان واژگان اشاره می‌کند. واژهٔ LFA این نشانی را برمی‌گرداند.

۱۲.۱۷.۴ CFA (Code Field Address)

نشانی روال کد ماشین که کار تعریف را انجام می‌دهد.

۱۲.۱۷.۵ PFA (Parameter Field Address)

نشانی بدنهٔ تعریف. برای تعریف کولون، بدنه شامل اشاره‌گرهایی به واژه‌های دیگر است. برای متغیر و ثابت، بدنه دو بایت محتوا دارد.

۱۲.۱۷.۶ SMUDGE

هنگام استفاده از : برای ساخت تعریف کولون جدید، بیت SMUDGE تنظیم می‌شود. تنها با اجرای ; این بیت پاک می‌شود. این کار از اجرای تعریف ناقص جلوگیری می‌کند.

۱۲.۱۸ دیباگ با TRACE

۱۲.۱۸.۱ مفهوم

C64-FORTH یک قابلیت ردیابی (Trace) درون خود دارد که به شما امکان می‌دهد اجرای یک تعریف کولون را تک‌گام پیش ببرید.

۱۲.۱۸.۲ محدودیت

تعریف‌هایی که از کد ماشین ساخته شده‌اند، نمی‌توانند گام‌به‌گام اجرا شوند.

۱۲.۱۸.۳ فعال‌سازی TRACE

با تنظیم بیت ۷ آدرس 132 (یعنی نوشتن 128 در آن)، حالت ردیابی فعال می‌شود. اما واژهٔ TON این کار را به‌سادگی انجام می‌دهد.

۱۲.۱۸.۴ مثال

FORTH
3 7 TON *

این دستور پس از قرار دادن مقادیر 3 و 7 روی پشته، حالت ردیابی را برای اجرای * فعال می‌کند.

۱۲.۱۸.۵ فرمت خطوط TRACE

هر خط TRACE شامل اطلاعات زیر است:

OUTPUT
2031 * /MOD 66 01F3 0006 000A 0003
  • عدد اول: نشانی اشاره‌گر بعدی.
  • نام واژه.
  • شمارندهٔ بازگشت.
  • شمارندهٔ پشتهٔ بازگشت.
  • مقادیر پشتهٔ داده (حداکثر ۴ مقدار).

۱۲.۱۸.۶ کنترل اجرا

پس از هر خط، با فشردن کلیدها می‌توانید اجرا را کنترل کنید:

  • RETURN: گام بعدی.
  • R: اجرای سریع تا پایان.
  • X: توقف و بازگشت به مفسر.
  • B: ورود به مانیتور زبان ماشین.

۱۲.۱۹ نقشهٔ حافظهٔ کمودور ۶۴

جدول زیر نقشهٔ حافظهٔ کمودور ۶۴ را در هنگام کار با C64-FORTH نشان می‌دهد (آدرس‌ها در مبنای ۱۶):

بازهکاربرد
0000-00FFZero page (پشتهٔ داده، متغیرهای سیستم)
0100-01FFپشتهٔ بازگشت
0200-03FFمتغیرها و بافرهای کمودور ۶۴
0400-07FFحافظهٔ نمایش
0800-4xxxبرنامهٔ C64-FORTH
PAD+80 تا BD6FRAM قابل استفاده برای گسترش دیکشنری
BD70-C07Fبافرهای بلوکی
CD80-CDFFناحیهٔ کاربر
CE00-CFFFبافرهای RS-232
D000بالای پیش‌فرض حافظه
D000-DFFFفضای ثبات‌های I/O
E000-FFFFROMهای I/O و نمایش

ROMهای BASIC در بازهٔ A000-BFFF توسط C64-FORTH خاموش می‌شوند و جای آن‌ها RAM استفاده می‌شود. هنگام خروج به BASIC، این ROMها دوباره فعال می‌شوند.

۱۲.۲۰ تمرین‌ها

EXERCISE 01
سیستم فعلی FORTH را روی دیسک ذخیره کنید.
FORTH
SAVESYSTEM " MYFORTH"
EXERCISE 02
فهرست دیسک را نمایش دهید.
FORTH
DIR
EXERCISE 03
تعداد صفحه‌های مجاز روی دستگاه ۱ را چاپ کنید.
FORTH
DV1 @ .
EXERCISE 04
رنگ حاشیه را به رنگ آبی تغییر دهید.
FORTH
6 BORDER C!

یا:

FORTH
6 53280 C!
EXERCISE 05
واژه‌ای تعریف کنید که هنگام بروز خطا، WHERE را اجرا کند.
FORTH
: SHOWERR WHERE ;
EXERCISE 06
با TON، اجرای یک تعریف کولون ساده را ردیابی کنید.
FORTH
: TEST 3 + 2 * ;
5 TON TEST

۱۲.۲۱ خلاصهٔ فصل

نکات کلیدی این فصل

  • SAVESYSTEM: ذخیرهٔ سیستم FORTH روی دیسک.
  • DC: ارسال فرمان به دیسک.
  • DIR: نمایش فهرست دیسک.
  • LS: چاپ صفحه‌ها روی چاپگر.
  • BUFFERS: تخصیص بافرهای بلوکی.
  • MEMTOP: کاهش بالای حافظه.
  • BORDER، BKGRND، CHRCLR: متغیرهای رنگ.
  • RESTORE: راه‌اندازی مجدد.
  • DV1 تا DV4: پیکربندی دستگاه‌های ذخیره‌سازی.
  • SYSDEV#: دستگاه جاری.
  • TAPEFLG: پرچم نوار کاست.
  • اعتبارسنجی دیسک.
  • پیام‌های خطا و WHERE.
  • کارتریج IEEE.
  • ساختار تعریف در حافظه: NFA، LFA، CFA، PFA.
  • TRACE: اشکال‌زدایی گام‌به‌گام.
  • نقشهٔ حافظهٔ کمودور ۶۴.
CHAPTER 13

ساخت برنامهٔ مستقل با SAVETURNKEY

8 SECTIONS // C64-FORTH

۱۳.۱ مقدمه

در فصل پیشین با جزئیات داخلی سیستم C64-FORTH آشنا شدید. در این فصل، با یکی از مهم‌ترین قابلیت‌های این سیستم آشنا می‌شوید که به شما امکان می‌دهد برنامه‌های خود را به‌صورت مستقل روی دیسک ذخیره کنید.

هدف از این کار، ساخت برنامه‌ای است که کاربر نهایی بتواند آن را بدون نیاز به C64-FORTH اجرا کند. این نوع برنامه‌ها را برنامه‌های Turnkey می‌نامند.

۱۳.۲ مفهوم SAVETURNKEY

۱۳.۲.۱ مفهوم

واژهٔ SAVETURNKEY تنها روشی است که به‌وسیلۀ آن می‌توان نسخه‌ای از C64-FORTH را توزیع کرد. این واژه برنامهٔ کاربردی را به‌صورت مستقل روی دیسک ذخیره می‌کند.

۱۳.۲.۲ مزیت

هنگامی که برنامه با SAVETURNKEY ذخیره می‌شود، سیستم FORTH دیگر در دسترس کاربر نهایی نخواهد بود. این ویژگی، برنامه را حرفه‌ای‌تر و امن‌تر می‌کند.

۱۳.۲.۳ رفتار برنامه

پس از بارگذاری از BASIC و اجرای RUN:

  • سیستم راه‌اندازی می‌شود.
  • بلافاصله بالاترین واژه در واژگان FORTH اجرا می‌شود.
  • در صورت بروز خطا، به هستهٔ FORTH بازمی‌گردد.
  • کلید RESTORE نیز به‌درستی کار می‌کند و باعث راه‌اندازی مجدد می‌شود.

۱۳.۳ مراحل ساخت برنامهٔ مستقل

مرحلهٔ ۱: نوشتن و اشکال‌زدایی برنامه

نخست، برنامهٔ کاربردی خود را بنویسید و به‌طور کامل اشکال‌زدایی کنید. این مرحله را نمی‌توان نادیده گرفت؛ برنامه باید بدون خطا کار کند.

مرحلهٔ ۲: حذف بخش‌های غیرضروری

اگر می‌خواهید زمان بارگذاری برنامه را کوتاه کنید، می‌توانید ویرایشگر و پیام‌های خطا را حذف کنید:

FORTH
FORGET EDITOR

اگر به افزونه‌های اعداد اعشاری نیازی ندارید، آن‌ها را نیز حذف کنید:

FORTH
FORGET FPOVER

این کار حدود ۴ کیلوبایت فضا آزاد می‌کند.

مرحلهٔ ۳: بارگذاری برنامه روی سیستم

برنامهٔ خود را روی سیستم فعلی FORTH بارگذاری کنید تا همهٔ تعریف‌های آن به دیکشنری اضافه شوند.

مرحلهٔ ۴: آماده‌سازی دیسک

یک دیسک قالب‌بندی‌شده (NEW) در درایو قرار دهید. متغیر SYSDEV# را روی شمارهٔ دستگاهی که می‌خواهید برنامه روی آن ذخیره شود، تنظیم کنید:

FORTH
8 SYSDEV# !

مرحلهٔ ۵: اجرای SAVETURNKEY

دستور زیر را وارد کنید:

FORTH
SAVETURNKEY " SPACE WIDGETS"

نام میان دو کوتیشن، نام برنامهٔ شماست.

مرحلهٔ ۶: تأیید

SAVETURNKEY بلافاصله از شما می‌پرسد که آیا واقعاً می‌خواهید یک سیستم مستقل بسازید. اگر مطمئن هستید، کلید Y را فشار دهید.

مرحلهٔ ۷: ذخیرهٔ نهایی

سیستم از شما می‌خواهد که دیسک بعدی (قالب‌بندی‌شده) را وارد کنید و کلیدی فشار دهید. برنامه روی دیسک ذخیره می‌شود و این پرسش برای هر تعداد دیسک که می‌خواهید تکرار می‌شود.

نکته: پس از اتمام کار، سیستم FORTH فعلی به‌طور کامل خراب می‌شود و باید C64-FORTH را دوباره از ابتدا راه‌اندازی کنید.

۱۳.۴ مثال کامل

فرض کنید می‌خواهید برنامه‌ای بسازید که پیام «WELCOME TO MY PROGRAM» را چاپ کند و منتظر فشرده شدن کلید بماند.

مرحلهٔ ۱: نوشتن برنامه

FORTH
: WELCOME CR ." WELCOME TO MY PROGRAM" CR KEYIN ;
WELCOME

برنامه را اجرا کنید تا از درستی آن مطمئن شوید.

مرحلهٔ ۲: حذف بخش‌های اضافی

FORTH
FORGET EDITOR
FORGET FPOVER

مرحلهٔ ۳: آماده‌سازی دیسک

دیسک قالب‌بندی‌شده را در درایو قرار دهید و SYSDEV# را تنظیم کنید:

FORTH
8 SYSDEV# !

مرحلهٔ ۴: ذخیره‌سازی

FORTH
SAVETURNKEY " MYPROG"

مرحلهٔ ۵: تأیید

کلید Y را فشار دهید.

مرحلهٔ ۶: تعویض دیسک

سیستم دیسک بعدی را می‌خواهد. هر تعداد که لازم است، دیسک وارد کنید.

مرحلهٔ ۷: استفاده

پس از اتمام، دیسک را در درایو قرار دهید و از BASIC دستور زیر را اجرا کنید:

BASIC
LOAD"MYPROG",8
RUN

برنامه بلافاصله اجرا می‌شود. کاربر نهایی هیچ نیازی به C64-FORTH ندارد.

۱۳.۵ نکات مهم و محدودیت‌ها

۱۳.۵.۱ تخریب سیستم فعلی

پس از اجرای SAVETURNKEY، سیستم FORTH فعلی غیرقابل استفاده می‌شود. باید C64-FORTH را دوباره از دیسک اصلی راه‌اندازی کنید.

۱۳.۵.۲ حذف بخش‌های اضافی

پیش از SAVETURNKEY، توصیه می‌شود ویرایشگر و اعداد اعشاری را حذف کنید تا حجم برنامه کاهش یابد.

۱۳.۵.۳ انتخاب نام برنامه

نام برنامه را کوتاه و معنی‌دار انتخاب کنید. این نام، نام فایلی است که روی دیسک ذخیره می‌شود.

۱۳.۵.۴ حفاظت از برنامه

پس از ذخیره، برنامه روی دیسک قرار می‌گیرد. اگر می‌خواهید از کپی غیرمجاز جلوگیری کنید، می‌توانید از شمارهٔ سریال روی دیسک استفاده کنید.

۱۳.۵.۵ کلید RESTORE

پس از ذخیره، کلید RESTORE روی کیبورد کمودور ۶۴ به‌درستی کار می‌کند و باعث راه‌اندازی مجدد می‌شود.

۱۳.۶ مثال‌های کاربردی

مثال ۱: برنامهٔ محاسبهٔ مساحت

FORTH
: AREA CR ." ENTER LENGTH: " HERE 1+ 6 EXPECT 6 HERE C! HERE NUMBER DROP
CR ." ENTER WIDTH: " HERE 1+ 6 EXPECT 6 HERE C! HERE NUMBER DROP
* CR ." AREA IS: " . CR ;

پس از ذخیره با SAVETURNKEY، کاربر می‌تواند بدون FORTH از این برنامه استفاده کند.

مثال ۲: برنامهٔ بازی ساده

FORTH
: GUESS CR ." GUESS A NUMBER (1-10): " HERE 1+ 3 EXPECT 3 HERE C! HERE NUMBER DROP
5 = IF CR ." CORRECT!" ELSE CR ." WRONG!" THEN ;

مثال ۳: برنامهٔ چاپ جدول ضرب

FORTH
: MULTABLE CR 11 1 DO 11 1 DO I J * . LOOP CR LOOP ;

۱۳.۷ تمرین‌ها

EXERCISE 01
برنامه‌ای بنویسید که نام کاربر را بپرسد و آن را چاپ کند. سپس با SAVETURNKEY آن را روی دیسک ذخیره کنید.
FORTH
: ASKNAME CR ." NAME: " HERE 20 EXPECT CR ." HELLO " HERE 20 TYPE CR ;
SAVETURNKEY " ASKNAME"
EXERCISE 02
برنامه‌ای بنویسید که مجموع اعداد ۱ تا ۱۰ را محاسبه و چاپ کند. سپس آن را مستقل کنید.
FORTH
: SUM10 0 11 1 DO I + LOOP CR ." SUM IS: " . CR ;
SAVETURNKEY " SUM10"
EXERCISE 03
برنامه‌ای بنویسید که رنگ حاشیهٔ صفحه را به رنگ سبز تغییر دهد و منتظر فشرده شدن کلید بماند. سپس آن را مستقل کنید.
FORTH
: GREEN 5 53280 C! CR ." PRESS ANY KEY" KEYIN ;
SAVETURNKEY " GREEN"
EXERCISE 04
برنامه‌ای بنویسید که پنج حرف نخست الفبا را چاپ کند و سپس با SAVETURNKEY آن را ذخیره کنید.
FORTH
: ALPHA5 CR 70 65 DO I EMIT LOOP CR ;
SAVETURNKEY " ALPHA5"
EXERCISE 05
برنامه‌ای بنویسید که جدول ضرب ۱ تا ۵ را چاپ کند و آن را مستقل کنید.
FORTH
: MULTABLE5 CR 6 1 DO 6 1 DO I J * . LOOP CR LOOP ;
SAVETURNKEY " MULT5"

۱۳.۸ خلاصهٔ فصل

نکات کلیدی این فصل

  • مفهوم SAVETURNKEY: ساخت برنامهٔ مستقل برای توزیع.
  • مراحل ساخت برنامهٔ مستقل:
    • نوشتن و اشکال‌زدایی برنامه
    • حذف بخش‌های اضافی
    • بارگذاری برنامه
    • آماده‌سازی دیسک
    • اجرای SAVETURNKEY
    • تأیید و ذخیره
  • نکات مهم: تخریب سیستم فعلی، حذف بخش‌های اضافی، انتخاب نام مناسب.
  • مثال‌های کاربردی برای درک بهتر.
CHAPTER 14

ویرایشگر (EDITOR)

13 SECTIONS // C64-FORTH

۱۴.۱ مقدمه

در فصل‌های پیشین با ساختار زبان FORTH، مدیریت رشته‌ها، فایل‌ها و ساخت برنامهٔ مستقل آشنا شدید. اکنون زمان آن رسیده است که با یکی از ابزارهای مهم C64-FORTH آشنا شوید: ویرایشگر.

ویرایشگر به شما امکان می‌دهد سورس‌کدهای خود را در صفحه‌های FORTH بنویسید، ویرایش کنید و سازمان‌دهی نمایید. بدون ویرایشگر، کار با سورس‌کدهای بلند بسیار دشوار خواهد بود.

در این فصل، با روش‌های کار با ویرایشگر، دستورات اصلی و نکات کلیدی آن آشنا می‌شوید.

۱۴.۲ ویرایشگر چیست؟

۱۴.۲.۱ مفهوم

ویرایشگر C64-FORTH یک ابزار متنی است که به شما امکان می‌دهد محتوای صفحه‌های FORTH را مشاهده و ویرایش کنید.

۱۴.۲.۲ واژگان EDITOR

ویرایشگر در واژگان جداگانه‌ای به نام EDITOR قرار دارد. برای دسترسی به واژه‌های آن، کافی است نام واژگان را وارد کنید:

FORTH
EDITOR

برای بازگشت به واژگان اصلی FORTH:

FORTH
FORTH

۱۴.۲.۳ مشاهدهٔ واژه‌های ویرایشگر

برای دیدن فهرست واژه‌های ویرایشگر:

FORTH
EDITOR VLIST

۱۴.۳ بارگذاری ویرایشگر

۱۴.۳.۱ روش بارگذاری

ویرایشگر معمولاً همراه C64-FORTH از پیش بارگذاری شده است. در غیر این صورت، با وارد کردن نام واژگان EDITOR در دسترس قرار می‌گیرد:

FORTH
EDITOR

۱۴.۳.۲ بازگشت به FORTH

برای بازگشت به واژگان اصلی FORTH:

FORTH
FORTH

۱۴.۴ مفهوم صفحه‌ها

۱۴.۴.۱ ساختار صفحه

هر صفحه در FORTH از ۱۰۲۴ بایت تشکیل شده است که به ۱۶ خط تقسیم می‌شود. هر خط ۶۴ کاراکتر ظرفیت دارد.

۱۴.۴.۲ شماره‌گذاری صفحه‌ها

صفحه‌ها با شماره‌های صحیح از 0 تا N شماره‌گذاری می‌شوند. تعداد کل صفحه‌ها به فضای موجود روی دیسک بستگی دارد.

۱۴.۴.۳ فرمت خطوط

هنگام نمایش یک صفحه، هر خط با یک شماره در ابتدا نمایش داده می‌شود:

SCREEN
 0 : DOUBLE 2 * ;
 1 : TRIPLE 3 * ;
 2 ...

۱۴.۵ دستورات اصلی ویرایشگر

۱۴.۵.۱ دستور LIST

این دستور محتوای یک صفحه را روی صفحه نمایش می‌دهد.

FORTH
<شمارهٔ_صفحه> LIST

مثال:

FORTH
20 LIST

این دستور صفحهٔ شمارهٔ ۲۰ را نمایش می‌دهد.

۱۴.۵.۲ دستور L

این دستور نسخهٔ کوتاه‌شدهٔ LIST است.

FORTH
20 L

۱۴.۵.۳ دستور EDIT

این دستور صفحهٔ مشخص‌شده را در حالت ویرایش باز می‌کند.

FORTH
<شمارهٔ_صفحه> EDIT

مثال:

FORTH
20 EDIT

۱۴.۵.۴ دستور P

این دستور خط جاری را نمایش می‌دهد.

۱۴.۵.۵ دستور T

این دستور متن را در ویرایشگر وارد می‌کند.

۱۴.۵.۶ دستور F

این دستور یک رشته را در صفحه جستجو می‌کند.

۱۴.۵.۷ دستور R

این دستور یک رشته را با رشتهٔ دیگری جایگزین می‌کند.

۱۴.۵.۸ دستور D

این دستور یک خط را حذف می‌کند.

۱۴.۵.۹ دستور I

این دستور یک خط جدید در محل مشخص‌شده درج می‌کند.

۱۴.۵.۱۰ دستور S

این دستور یک خط را با خط دیگری جایگزین می‌کند.

۱۴.۶ ویرایش یک صفحه

۱۴.۶.۱ مراحل ویرایش

  1. دستور EDIT را با شمارهٔ صفحه وارد کنید:
FORTH
20 EDIT
  1. اکنون در حالت ویرایش هستید. برای نوشتن خط جدید، متن را وارد کنید و RETURN را بزنید.
  2. برای پایان ویرایش، کلید ESC یا دستور خروج را وارد کنید.

۱۴.۶.۲ نمایش صفحه

پس از ویرایش، برای دیدن نتیجه:

FORTH
20 LIST

۱۴.۷ جستجو و جایگزینی

۱۴.۷.۱ جستجو

برای جستجوی یک رشته در صفحهٔ جاری:

FORTH
F <رشته>

۱۴.۷.۲ جایگزینی

برای جایگزینی یک رشته با رشتهٔ دیگر:

FORTH
R <رشته_قدیم> <رشته_جدید>

۱۴.۸ جابه‌جایی خطوط

۱۴.۸.۱ دستور کپی

برای کپی یک خط به خط دیگر، از دستور C استفاده کنید.

۱۴.۸.۲ دستور انتقال

برای انتقال یک خط به موقعیت دیگر، از دستور M استفاده کنید.

۱۴.۹ خلاصهٔ دستورات ویرایشگر

جدول زیر خلاصهٔ دستورات اصلی ویرایشگر را نشان می‌دهد:

دستورکاربرد
LIST یا Lنمایش محتوای صفحه
EDITویرایش صفحه
Pنمایش خط جاری
Tورود متن
Fجستجو
Rجایگزینی
Dحذف خط
Iدرج خط
Sجایگزینی خط
Cکپی خط
Mانتقال خط

۱۴.۱۰ مثال‌های عملی

مثال ۱: ساخت یک صفحهٔ جدید

FORTH
: TEST 3 + 2 * ;

این تعریف را در صفحهٔ ۲۰ ذخیره کنید:

FORTH
20 EDIT

سپس متن را وارد کنید:

FORTH
: TEST 3 + 2 * ;

مثال ۲: ویرایش صفحهٔ موجود

FORTH
20 LIST

خروجی:

SCREEN
 0 : TEST 3 + 2 * ;
 1 ...

برای ویرایش خط صفر:

FORTH
20 EDIT
0 S : TEST 3 + 2 * 5 + ;

مثال ۳: جستجو در صفحه

FORTH
20 EDIT
F TEST

این دستور نخستین وقوع رشتهٔ TEST را در صفحهٔ ۲۰ پیدا می‌کند.

۱۴.۱۱ نکات تکمیلی

۱۴.۱۱.۱ محدودیت طول خط

هر خط صفحه حداکثر ۶۴ کاراکتر طول دارد. از این محدودیت فراتر نروید.

۱۴.۱۱.۲ ذخیره‌سازی

پس از ویرایش، تغییرات را با دستورات مربوطه روی دیسک ذخیره کنید:

FORTH
UPDATE SAVE-BUFFERS

۱۴.۱۱.۳ بارگذاری صفحه

برای بارگذاری یک صفحهٔ ذخیره‌شده:

FORTH
20 LOAD

۱۴.۱۱.۴ سازمان‌دهی سورس‌کد

صفحه‌ها را به‌صورت منطقی سازمان‌دهی کنید. مثلاً هر صفحه به یک بخش از برنامه اختصاص یابد.

۱۴.۱۲ تمرین‌ها

EXERCISE 01
صفحهٔ ۲۰ را نمایش دهید.
FORTH
20 LIST
EXERCISE 02
یک برنامهٔ ساده در صفحهٔ ۳۰ بنویسید و ذخیره کنید.
FORTH
30 EDIT

سپس وارد کنید:

FORTH
: HELLO ." Salam" ;
EXERCISE 03
در صفحهٔ ۳۰، یک خط را حذف کنید.
FORTH
30 EDIT
0 D
EXERCISE 04
یک رشتهٔ خاص را در صفحهٔ ۳۰ جستجو کنید.
FORTH
30 EDIT
F HELLO
EXERCISE 05
خطی را در صفحهٔ ۳۰ جایگزین کنید.
FORTH
30 EDIT
0 S : HELLO ." Hi" ;
EXERCISE 06
یک برنامهٔ کامل در چند خط بنویسید و آن را با LOAD اجرا کنید.
FORTH
30 EDIT

وارد کنید:

FORTH
: DOUBLE 2 * ;
: QUADRUPLE DUP DOUBLE DOUBLE ;

سپس:

FORTH
30 LOAD
5 QUADRUPLE .
OUTPUT
20 OK

۱۴.۱۳ خلاصهٔ فصل

نکات کلیدی این فصل

  • مفهوم ویرایشگر: ابزار متنی برای ویرایش صفحه‌های FORTH.
  • واژگان EDITOR: دسترسی به دستورات ویرایشگر.
  • ساختار صفحه: ۱۰۲۴ بایت، ۱۶ خط، هر خط ۶۴ کاراکتر.
  • دستورات اصلی ویرایشگر: LIST، EDIT، P، T، F، R، D، I، S، C، M.
  • نکات مهم: محدودیت ۶۴ کاراکتر، ذخیره‌سازی تغییرات، بارگذاری با LOAD.
CHAPTER 15

اسمبلر (ASSEMBLER)

11 SECTIONS // C64-FORTH

۱۵.۱ مقدمه

در فصل پیشین با ویرایشگر آشنا شدید. اکنون به یکی از پیشرفته‌ترین قابلیت‌های C64-FORTH می‌رسیم: اسمبلر.

اسمبلر به شما امکان می‌دهد کد ماشین پردازندهٔ ۶۵۰۲ را مستقیماً درون FORTH بنویسید. این قابلیت، دسترسی کامل به سخت‌افزار را فراهم می‌کند و سرعت برنامه‌ها را به‌طور چشمگیری افزایش می‌دهد.

این فصل برای کاربرانی است که با اصول زبان اسمبلی ۶۵۰۲ آشنایی دارند یا می‌خواهند با آن آشنا شوند.

۱۵.۲ اسمبلر چیست؟

۱۵.۲.۱ مفهوم

اسمبلر یک ابزار است که کد اسمبلی را به کد ماشین قابل اجرا تبدیل می‌کند. در C64-FORTH، اسمبلر به‌صورت مجموعه‌ای از واژه‌ها پیاده‌سازی شده است که هر یک، یک دستور زبان ماشین را تولید می‌کنند.

۱۵.۲.۲ مزیت

  • سرعت بالا: کد ماشین بسیار سریع‌تر از کد FORTH اجرا می‌شود.
  • کنترل کامل: دسترسی مستقیم به سخت‌افزار.
  • ترکیب با FORTH: می‌توانید کد اسمبلی را درون تعریف‌های FORTH به کار ببرید.

۱۵.۳ بارگذاری اسمبلر

اسمبلر از طریق صفحه‌های ۶ تا ۱۷ روی دیسک C64-FORTH بارگذاری می‌شود. برای فعال‌سازی، دستور زیر را وارد کنید:

FORTH
6 LOAD

پس از بارگذاری، واژگان ASSEMBLER در دسترس قرار می‌گیرد. برای مشاهدهٔ واژه‌های آن:

FORTH
ASSEMBLER VLIST

۱۵.۴ ساختار یک تعریف اسمبلر

۱۵.۴.۱ واژهٔ CODE

برای نوشتن یک تعریف به زبان اسمبلی، از واژهٔ CODE به‌جای : استفاده کنید:

FORTH
CODE <نام>
  ... کد اسمبلی ...
C;
  • CODE: آغاز تعریف اسمبلی.
  • <نام>: نام تعریف.
  • C;: پایان تعریف (معادل ; در تعریف کولون).

۱۵.۴.۲ مثال ساده

FORTH
CODE DOUBLE 2 * C;

توضیح:

  • DOUBLE: نام تعریف.
  • 2 *: کد اسمبلی که عدد رویی پشته را در ۲ ضرب می‌کند.
  • C;: پایان تعریف.

۱۵.۵ واژه‌های اسمبلر

۱۵.۵.۱ دستورات بارگذاری

واژهمعادل اسمبلیتوضیح
LDALDAبارگذاری Accumulator
LDXLDXبارگذاری X
LDYLDYبارگذاری Y
STASTAذخیرهٔ Accumulator
STXSTXذخیرهٔ X
STYSTYذخیرهٔ Y

۱۵.۵.۲ دستورات حسابی و منطقی

واژهمعادل اسمبلی
ADCجمع با Carry
SBCتفریق با Carry
ANDعمل AND
ORAعمل OR
EORعمل XOR
CMPمقایسه
INCافزایش
DECکاهش

۱۵.۵.۳ دستورات پرش و شاخه

واژهمعادل اسمبلی
JMPپرش بی‌قید
JSRپرش به زیرروال
RTSبازگشت از زیرروال
BEQپرش اگر مساوی
BNEپرش اگر نامساوی
BCCپرش اگر Carry صفر
BCSپرش اگر Carry یک
BMIپرش اگر منفی
BPLپرش اگر مثبت

۱۵.۵.۴ دستورات انتقال

واژهمعادل اسمبلی
TAXانتقال A به X
TAYانتقال A به Y
TXAانتقال X به A
TYAانتقال Y به A
TSXانتقال SP به X
TXSانتقال X به SP

۱۵.۵.۵ دستورات پشته

واژهمعادل اسمبلی
PHAPush A
PLAPull A
PHPPush Status
PLPPull Status

۱۵.۵.۶ دستورات کنترلی

واژهمعادل اسمبلی
NOPبدون عملیات
BRKشکست
RTIبازگشت از وقفه
CLCپاک کردن Carry
SECتنظیم Carry
CLDپاک کردن Decimal
SEDتنظیم Decimal
CLIفعال‌سازی وقفه
SEIغیرفعال‌سازی وقفه

۱۵.۵.۷ حالت‌های آدرس‌دهی

واژهحالت آدرس‌دهی
#آدرس‌دهی فوری
,Xآدرس‌دهی اندیس X
,Yآدرس‌دهی اندیس Y
)آدرس‌دهی غیرمستقیم

۱۵.۶ مثال‌های عملی

مثال ۱: جمع دو عدد

FORTH
CODE ADD2 ( n1 n2 --- n1+n2 )
  CLC
  LDA #0
  ADC #0
  C;

مثال ۲: پاک کردن صفحه

FORTH
CODE CLRSCR
  LDA #147
  JSR $FFD2
  C;

مثال ۳: دسترسی به حافظه

FORTH
CODE PEEK ( addr --- byte )
  LDA (SP),Y
  C;

۱۵.۷ استفاده از کد اسمبلی در FORTH

۱۵.۷.۱ فراخوانی

پس از تعریف یک واژهٔ اسمبلی، می‌توانید آن را مانند واژه‌های دیگر FORTH فراخوانی کنید:

FORTH
5 7 ADD2 .

۱۵.۷.۲ ترکیب با تعریف کولون

کد اسمبلی را می‌توانید درون تعریف کولون نیز به کار ببرید:

FORTH
: FAST-ADD ADD2 ;
3 4 FAST-ADD .

۱۵.۸ واژه‌نامهٔ اسمبلر

جدول زیر برخی از واژه‌های مهم اسمبلر C64-FORTH را نشان می‌دهد:

واژهکاربرد
CODEآغاز تعریف اسمبلی
C;پایان تعریف اسمبلی
LDAبارگذاری Accumulator
STAذخیرهٔ Accumulator
ADCجمع
SBCتفریق
JMPپرش
JSRفراخوانی زیرروال
RTSبازگشت
BEQپرش شرطی
BNEپرش شرطی
PHAPush A
PLAPull A
CLCپاک کردن Carry
SECتنظیم Carry
NOPبدون عملیات

۱۵.۹ نکات مهم

۱۵.۹.۱ آشنایی با ۶۵۰۲

پیش از کار با اسمبلر، باید با معماری پردازندهٔ ۶۵۰۲ و مجموعهٔ دستورات آن آشنا باشید.

۱۵.۹.۲ آدرس‌دهی

حالت‌های آدرس‌دهی متفاوتی وجود دارد که هر یک کاربرد خاص خود را دارند.

۱۵.۹.۳ اشکال‌زدایی

اشکال‌زدایی کد اسمبلی دشوار است. از ابزارهایی مانند مانیتور زبان ماشین و TRACE استفاده کنید.

۱۵.۹.۴ ترکیب با FORTH

کد اسمبلی را با FORTH ترکیب کنید. بخش‌های حساس به سرعت را با اسمبلی بنویسید و بقیه را با FORTH.

۱۵.۱۰ تمرین‌ها

EXERCISE 01
با استفاده از اسمبلر، واژه‌ای تعریف کنید که دو عدد را جمع کند.
FORTH
CODE ADD2
  CLC
  ADC
  C;
EXERCISE 02
واژه‌ای تعریف کنید که یک کاراکتر را روی صفحه چاپ کند.
FORTH
CODE EMIT1
  JSR $FFD2
  C;
EXERCISE 03
واژه‌ای تعریف کنید که یک بایت از حافظه بخواند.
FORTH
CODE PEEK1 ( addr --- byte )
  LDA (SP),Y
  C;
EXERCISE 04
واژه‌ای تعریف کنید که رنگ حاشیه را تغییر دهد.
FORTH
CODE SETBORDER ( color --- )
  STA $D020
  C;
EXERCISE 05
یک برنامهٔ ساده بنویسید که از ترکیب FORTH و اسمبلر استفاده کند.
FORTH
: FAST-DOUBLE 2 * ;
CODE FAST-TRIPLE 3 * C;

۱۵.۱۱ خلاصهٔ فصل

نکات کلیدی این فصل

  • مفهوم اسمبلر: ابزار تبدیل کد اسمبلی به کد ماشین.
  • واژهٔ CODE: آغاز تعریف اسمبلی.
  • واژهٔ C;: پایان تعریف اسمبلی.
  • واژه‌های اسمبلر: دستورات بارگذاری، حسابی، پرش، انتقال، پشته و کنترلی.
  • حالت‌های آدرس‌دهی: فوری، اندیسی، غیرمستقیم.
  • ترکیب با FORTH: استفاده از کد اسمبلی درون تعریف‌های FORTH.
  • نکات مهم: آشنایی با ۶۵۰۲، اشکال‌زدایی، ترکیب با FORTH.
CHAPTER 16

گرافیک روی کمودور ۶۴

12 SECTIONS // C64-FORTH

۱۶.۱ مقدمه

در فصل‌های پیشین با ساختار زبان، فایل‌ها، ویرایشگر و اسمبلر آشنا شدید. اکنون به یکی از جذاب‌ترین بخش‌های C64-FORTH می‌رسیم: گرافیک.

کمودور ۶۴ یکی از پیشرفته‌ترین سیستم‌های گرافیکی زمان خود را داشت. با C64-FORTH می‌توانید از این توانایی‌ها به‌طور کامل استفاده کنید و برنامه‌های گرافیکی، نمودارها، بازی‌ها و انیمیشن‌های جذاب بسازید.

در این فصل با روش‌های ترسیم خط، دایره، کمان، مستطیل، کار با اسپرایت‌ها و توابع ریاضی گرافیکی آشنا می‌شوید.

۱۶.۲ آشنایی با گرافیک در C64-FORTH

۱۶.۲.۱ حالت‌های گرافیکی کمودور ۶۴

کمودور ۶۴ از چند حالت گرافیکی پشتیبانی می‌کند:

  • متن (Text): حالت پیش‌فرض، ۴۰ ستون در ۲۵ سطر.
  • گرافیک با وضوح بالا (Hi-Res): ۳۲۰ در ۲۰۰ پیکسل، دو رنگ.
  • گرافیک با وضوح متوسط (Med-Res): ۱۶۰ در ۲۰۰ پیکسل، چهار رنگ.
  • گرافیک چندرنگ (Multi-Color): ترکیبی از دو حالت بالا.

۱۶.۲.۲ مزیت C64-FORTH

C64-FORTH مجموعه‌ای از واژه‌های آمادهٔ گرافیکی را ارائه می‌دهد که کار با این حالت‌ها را بسیار ساده می‌کند.

۱۶.۲.۳ بارگذاری واژه‌های گرافیکی

واژه‌های گرافیکی در ضمیمهٔ C کتاب اصلی قرار دارند و از صفحه‌های مربوطه بارگذاری می‌شوند. برای فعال‌سازی:

FORTH
C LOAD

یا شمارهٔ صفحهٔ مربوطه را وارد کنید.

۱۶.۳ ترسیم خط

۱۶.۳.۱ واژهٔ LINE

واژهٔ LINE یک خط از یک نقطه به نقطهٔ دیگر رسم می‌کند.

FORTH
<X1> <Y1> <X2> <Y2> LINE

مثال:

FORTH
10 10 100 100 LINE

این دستور خطی از نقطهٔ (10,10) به نقطهٔ (100,100) رسم می‌کند.

۱۶.۳.۲ واژهٔ LINETO

واژهٔ LINETO خطی از موقعیت فعلی به نقطهٔ مشخص رسم می‌کند.

FORTH
<X> <Y> LINETO

۱۶.۳.۳ حالت‌های خط

ترسیم خط می‌تواند در یکی از سه حالت زیر انجام شود:

  • SET-BIT: تنظیم بیت‌های پیکسل.
  • CLEAR-BIT: پاک کردن بیت‌های پیکسل.
  • XOR: معکوس کردن بیت‌های پیکسل.

۱۶.۴ ترسیم دایره

۱۶.۴.۱ واژهٔ CIRCLE

واژهٔ CIRCLE یک دایره رسم می‌کند.

FORTH
<X> <Y> <شعاع> CIRCLE

مثال:

FORTH
160 100 50 CIRCLE

این دستور دایره‌ای با مرکز (160,100) و شعاع 50 رسم می‌کند.

۱۶.۴.۲ واژهٔ ARC

واژهٔ ARC یک کمان از دایره رسم می‌کند.

FORTH
<X> <Y> <شعاع> <زاویه_شروع> <زاویه_پایان> ARC

۱۶.۵ ترسیم مستطیل

۱۶.۵.۱ واژهٔ BOX

واژهٔ BOX یک مستطیل رسم می‌کند.

FORTH
<X1> <Y1> <X2> <Y2> BOX

مثال:

FORTH
50 50 200 150 BOX

این دستور مستطیلی از (50,50) تا (200,150) رسم می‌کند.

۱۶.۶ کار با اسپرایت‌ها

۱۶.۶.۱ مفهوم اسپرایت

اسپرایت‌ها اشیای گرافیکی کوچکی هستند که می‌توانند مستقل از هم حرکت کنند. کمودور ۶۴ از هشت اسپرایت سخت‌افزاری پشتیبانی می‌کند.

۱۶.۶.۲ تعریف اسپرایت

می‌توانید شکل اسپرایت را با تعریف بایت‌های مربوطه مشخص کنید.

مثال:

FORTH
HEX CREATE SPR0 SPCODE
00 00 00
00 FF 00
...

۱۶.۶.۳ واژه‌های اسپرایت

  • SPRITE: تعریف اسپرایت.
  • SPRITE-ON: فعال‌سازی.
  • SPRITE-OFF: غیرفعال‌سازی.
  • SPRITE-MOVE: جابه‌جایی.
  • SPRITE-COLOR: تعیین رنگ.

۱۶.۷ توابع سینوس و کسینوس

۱۶.۷.۱ مفهوم

برای محاسبات گرافیکی مانند چرخش و ترسیم منحنی‌ها، به توابع سینوس و کسینوس نیاز دارید.

۱۶.۷.۲ توابع عدد صحیح

C64-FORTH توابع سینوس و کسینوس را به‌صورت عدد صحیح ارائه می‌دهد که بسیار سریع هستند.

مثال:

FORTH
30 SIN .
30 COS .

۱۶.۸ بزرگ‌نمایی و پنجره‌بندی

۱۶.۸.۱ مفهوم

C64-FORTH از بزرگ‌نمایی (Zoom) و پنجره‌بندی (Window) پشتیبانی می‌کند.

۱۶.۸.۲ بزرگ‌نمایی

با تعیین فاکتور بزرگ‌نمایی، می‌توانید کاراکترها را در اندازه‌های مختلف رسم کنید. ۱۶ فاکتور بزرگ‌نمایی موجود است.

۱۶.۸.۳ پنجره‌بندی

می‌توانید یک بخش از صفحه را به‌عنوان پنجرهٔ فعال تعریف کنید و تنها در آن محدوده ترسیم کنید.

۱۶.۹ مثال‌های گرافیکی

مثال ۱: رسم یک خط ساده

FORTH
10 10 200 100 LINE

مثال ۲: رسم یک دایره

FORTH
160 100 50 CIRCLE

مثال ۳: رسم یک مستطیل

FORTH
50 50 250 150 BOX

مثال ۴: رسم یک مثلث

FORTH
100 50 50 150 LINE
50 150 150 150 LINE
150 150 100 50 LINE

مثال ۵: رسم یک ستاره

FORTH
100 50 100 150 LINE
50 100 150 100 LINE

۱۶.۱۰ واژه‌نامهٔ گرافیک

جدول زیر برخی از واژه‌های مهم گرافیکی C64-FORTH را نشان می‌دهد:

واژهکاربرد
LINEترسیم خط
LINETOترسیم خط از موقعیت جاری
CIRCLEترسیم دایره
ARCترسیم کمان
BOXترسیم مستطیل
SPRITEتعریف اسپرایت
SPRITE-ONفعال‌سازی اسپرایت
SPRITE-OFFغیرفعال‌سازی اسپرایت
SPRITE-MOVEجابه‌جایی اسپرایت
SPRITE-COLORتعیین رنگ اسپرایت
SINسینوس
COSکسینوس
SET-BITحالت تنظیم بیت
CLEAR-BITحالت پاک کردن بیت
XORحالت معکوس

۱۶.۱۱ تمرین‌ها

EXERCISE 01
یک خط از نقطهٔ (0,0) به (319,199) رسم کنید.
FORTH
0 0 319 199 LINE
EXERCISE 02
یک دایره به مرکز (160,100) و شعاع 80 رسم کنید.
FORTH
160 100 80 CIRCLE
EXERCISE 03
یک مستطیل از (20,20) تا (300,180) رسم کنید.
FORTH
20 20 300 180 BOX
EXERCISE 04
یک مثلث رسم کنید.
FORTH
100 20 20 180 LINE
20 180 180 180 LINE
180 180 100 20 LINE
EXERCISE 05
یک اسپرایت ساده تعریف کنید و آن را روی صفحه نمایش دهید.
FORTH
HEX CREATE SPR0 SPCODE
00 00 00
00 FF 00
00 FF 00
00 FF 00
00 00 00
00 00 00
00 00 00
EXERCISE 06
با استفاده از SIN و COS، یک دایره ترسیم کنید.
FORTH
: MYCIRCLE 360 0 DO I SIN 100 * 160 + I COS 100 * 100 + LINE LOOP ;

۱۶.۱۲ خلاصهٔ فصل

نکات کلیدی این فصل

  • حالت‌های گرافیکی کمودور ۶۴: متن، Hi-Res، Med-Res و چندرنگ.
  • واژه‌های ترسیم: LINE، LINETO، CIRCLE، ARC، BOX.
  • حالت‌های ترسیم: SET-BIT، CLEAR-BIT، XOR.
  • کار با اسپرایت‌ها: تعریف، فعال‌سازی، جابه‌جایی و رنگ‌آمیزی.
  • توابع سینوس و کسینوس برای محاسبات گرافیکی.
  • بزرگ‌نمایی و پنجره‌بندی.
  • مثال‌های عملی برای رسم اشکال هندسی.
CHAPTER 17

اعداد اعشاری (Floating Point)

11 SECTIONS // C64-FORTH

۱۷.۱ مقدمه

در فصل‌های پیشین با انواع داده‌ای مختلف در FORTH آشنا شدید. تا اینجا، بیشتر با اعداد صحیح (۱۶ بیتی و ۳۲ بیتی) کار کرده‌اید. اما در بسیاری از کاربردها، مانند محاسبات علمی، مهندسی و حتی برخی بازی‌ها، نیاز به اعداد اعشاری دارید.

C64-FORTH مجموعه‌ای کامل از واژه‌ها را برای کار با اعداد اعشاری در اختیار شما می‌گذارد. در این فصل، با این واژه‌ها و روش استفاده از آن‌ها آشنا می‌شوید.

۱۷.۲ آشنایی با اعداد اعشاری

۱۷.۲.۱ مفهوم

عدد اعشاری، عددی است که می‌تواند بخش کسری داشته باشد. برای مثال:

  • 3.14
  • -2.5
  • 1.0
  • 123.456

۱۷.۲.۲ محدودیت اعداد صحیح

اعداد صحیحی که تا کنون دیده‌اید، تنها می‌توانستند اعداد کامل را نمایش دهند. برای کار با اعدادی که بخش کسری دارند، به اعداد اعشاری نیاز دارید.

۱۷.۲.۳ فضای ذخیره‌سازی

هر عدد اعشاری در FORTH، فضای مشخصی روی پشته اشغال می‌کند. این فضا معمولاً با چند بایت نشان داده می‌شود.

۱۷.۲.۴ بارگذاری واژه‌های اعشاری

واژه‌های اعشاری از صفحهٔ مربوطه بارگذاری می‌شوند. برای فعال‌سازی، دستور زیر را وارد کنید:

FORTH
FP LOAD

یا با شمارهٔ صفحهٔ مربوطه.

۱۷.۳ متغیرها و ثابت‌های اعشاری

۱۷.۳.۱ متغیر اعشاری

برای ساخت یک متغیر اعشاری، از واژهٔ FVARIABLE استفاده کنید:

FORTH
FVARIABLE <نام>

مثال:

FORTH
FVARIABLE PI

۱۷.۳.۲ ثابت اعشاری

برای ساخت یک ثابت اعشاری، از واژهٔ FCONSTANT استفاده کنید:

FORTH
<مقدار> FCONSTANT <نام>

مثال:

FORTH
3.14159 FCONSTANT PI

۱۷.۳.۳ دسترسی به متغیر اعشاری

برای ذخیرهٔ یک مقدار در متغیر اعشاری، از F! استفاده کنید:

FORTH
<مقدار> <متغیر> F!

برای خواندن مقدار:

FORTH
<متغیر> F@

۱۷.۴ عملیات حسابی اعشاری

۱۷.۴.۱ دستورات اصلی

C64-FORTH واژه‌های زیر را برای عملیات حسابی اعشاری در اختیار می‌گذارد:

واژهکاربرد
F+جمع
F-تفریق
F*ضرب
F/تقسیم

۱۷.۴.۲ مثال‌ها

FORTH
3.14 2.71 F+ F.
OUTPUT
5.85 OK
FORTH
10.0 3.0 F/ F.
OUTPUT
3.333... OK

۱۷.۵ توابع ریاضی اعشاری

۱۷.۵.۱ توابع موجود

C64-FORTH مجموعه‌ای از توابع ریاضی را برای اعداد اعشاری ارائه می‌دهد:

واژهکاربرد
FABSقدر مطلق
FSQRTجذر
FSINسینوس
FCOSکسینوس
FTANتانژانت
FATANآرک‌تانژانت
FEXPتابع نمایی
FLNلگاریتم طبیعی
FLOGلگاریتم مبنای ۱۰

۱۷.۵.۲ مثال‌ها

FORTH
-3.5 FABS F.
OUTPUT
3.5 OK
FORTH
16.0 FSQRT F.
OUTPUT
4.0 OK
FORTH
0.0 FSIN F.
OUTPUT
0.0 OK
FORTH
1.0 FEXP F.
OUTPUT
2.71828... OK

۱۷.۶ تبدیل بین اعداد صحیح و اعشاری

۱۷.۶.۱ تبدیل عدد صحیح به اعشاری

برای تبدیل عدد صحیح به اعشاری، از S>F استفاده کنید:

FORTH
<عدد_صحیح> S>F

مثال:

FORTH
5 S>F F.
OUTPUT
5.0 OK

۱۷.۶.۲ تبدیل عدد اعشاری به صحیح

برای تبدیل عدد اعشاری به صحیح، از F>S استفاده کنید:

FORTH
<عدد_اعشاری> F>S

مثال:

FORTH
3.7 F>S .
OUTPUT
3 OK

۱۷.۶.۳ تبدیل دقت دوگانه به اعشاری

برای تبدیل عدد دقت دوگانه به اعشاری:

FORTH
<عدد_دوگانه> D>F

۱۷.۶.۴ تبدیل اعشاری به دقت دوگانه

FORTH
<عدد_اعشاری> F>D

۱۷.۷ چاپ اعداد اعشاری

۱۷.۷.۱ واژهٔ F.

برای چاپ عدد اعشاری روی پشته:

FORTH
<عدد_اعشاری> F.

مثال:

FORTH
3.14 F.
OUTPUT
3.14000 OK

۱۷.۷.۲ واژهٔ FE.

برای چاپ به‌صورت نماد علمی:

FORTH
<عدد_اعشاری> FE.

مثال:

FORTH
1234.5 FE.
OUTPUT
1.2345E+03 OK

۱۷.۸ مثال‌های عملی

مثال ۱: محاسبهٔ مساحت دایره

FORTH
3.14159 FCONSTANT PI
: CIRCLE-AREA ( r --- area )
  FDUP F* PI F* ;
5.0 CIRCLE-AREA F.
OUTPUT
78.53975 OK

مثال ۲: محاسبهٔ میانگین

FORTH
: AVG ( a b --- avg )
  F+ 2.0 F/ ;
10.5 20.5 AVG F.
OUTPUT
15.5 OK

مثال ۳: محاسبهٔ فاصله بین دو نقطه

FORTH
: DIST ( x1 y1 x2 y2 --- d )
  F- FDUP F*
  FSWAP F- FDUP F*
  F+ FSQRT ;
0.0 0.0 3.0 4.0 DIST F.
OUTPUT
5.0 OK

مثال ۴: محاسبهٔ سینوس

FORTH
: SIN-DEG ( deg --- sin )
  S>F PI F* 180.0 F/ FSIN ;
30 SIN-DEG F.
OUTPUT
0.5 OK

مثال ۵: لگاریتم

FORTH
100.0 FLOG F.
OUTPUT
2.0 OK

۱۷.۹ واژه‌نامهٔ اعشاری

جدول زیر خلاصهٔ واژه‌های اعشاری C64-FORTH را نشان می‌دهد:

واژهکاربرد
FVARIABLEساخت متغیر اعشاری
FCONSTANTساخت ثابت اعشاری
F@خواندن از متغیر اعشاری
F!ذخیره در متغیر اعشاری
F+جمع
F-تفریق
F*ضرب
F/تقسیم
FABSقدر مطلق
FSQRTجذر
FSINسینوس
FCOSکسینوس
FTANتانژانت
FATANآرک‌تانژانت
FEXPتابع نمایی
FLNلگاریتم طبیعی
FLOGلگاریتم مبنای ۱۰
S>Fتبدیل صحیح به اعشاری
F>Sتبدیل اعشاری به صحیح
D>Fتبدیل دقت دوگانه به اعشاری
F>Dتبدیل اعشاری به دقت دوگانه
F.چاپ اعشاری
FE.چاپ نماد علمی
FDUPتکرار
FDROPحذف
FSWAPجابه‌جایی
FOVERکپی دومین
FROTچرخش

۱۷.۱۰ تمرین‌ها

EXERCISE 01
ثابتی به نام E با مقدار 2.71828 تعریف کنید.
FORTH
2.71828 FCONSTANT E
E F.
EXERCISE 02
مساحت یک دایره با شعاع 10.0 را محاسبه کنید.
FORTH
3.14159 FCONSTANT PI
: AREA ( r --- a ) FDUP F* PI F* ;
10.0 AREA F.
OUTPUT
314.159 OK
EXERCISE 03
جذر عدد 25.0 را محاسبه کنید.
FORTH
25.0 FSQRT F.
OUTPUT
5.0 OK
EXERCISE 04
سینوس زاویهٔ 90 درجه را محاسبه کنید.
FORTH
: SIN90 90 S>F PI F* 180.0 F/ FSIN ;
SIN90 F.
OUTPUT
1.0 OK
EXERCISE 05
میانگین اعداد 15.5 و 24.5 را محاسبه کنید.
FORTH
15.5 24.5 F+ 2.0 F/ F.
OUTPUT
20.0 OK
EXERCISE 06
عدد 2.5 را به عدد صحیح تبدیل کنید.
FORTH
2.5 F>S .
OUTPUT
2 OK
EXERCISE 07
لگاریتم طبیعی عدد 1.0 را محاسبه کنید.
FORTH
1.0 FLN F.
OUTPUT
0.0 OK
EXERCISE 08
فاصلهٔ بین دو نقطهٔ (1,1) و (4,5) را محاسبه کنید.
FORTH
: DIST ( x1 y1 x2 y2 --- d )
  F- FDUP F* FSWAP F- FDUP F* F+ FSQRT ;
1.0 1.0 4.0 5.0 DIST F.
OUTPUT
5.0 OK

۱۷.۱۱ خلاصهٔ فصل

نکات کلیدی این فصل

  • مفهوم اعداد اعشاری و تفاوت آن با اعداد صحیح.
  • بارگذاری واژه‌های اعشاری از صفحهٔ مربوطه.
  • متغیرها و ثابت‌های اعشاری با FVARIABLE و FCONSTANT.
  • دسترسی به متغیر اعشاری با F@ و F!.
  • عملیات حسابی اعشاری: F+، F-، F*، F/.
  • توابع ریاضی اعشاری: FABS، FSQRT، FSIN، FCOS، FTAN، FEXP، FLN، FLOG.
  • تبدیل بین انواع داده: S>F، F>S، D>F، F>D.
  • چاپ اعداد اعشاری با F. و FE..
  • دستورات پشته‌ای اعشاری: FDUP، FDROP، FSWAP، FOVER، FROT.
  • مثال‌های عملی برای محاسبات علمی.
CHAPTER 18

واژه‌نامهٔ کامل C64-FORTH

14 SECTIONS // C64-FORTH

۱۸.۱ مقدمه

در فصل‌های پیشین با جنبه‌های مختلف زبان FORTH و پیاده‌سازی C64-FORTH آشنا شدید. در این فصل پایانی، به واژه‌نامهٔ کامل C64-FORTH می‌پردازیم.

واژه‌نامه، مرجعی است که تمام واژه‌های موجود در سیستم را به‌همراه توضیح، نیازمندی‌های پشته و اثرات آن‌ها فهرست می‌کند. این واژه‌نامه ابزاری ضروری برای برنامه‌نویسان FORTH است.

در این فصل، ساختار واژه‌نامه، نحوهٔ استفاده از آن و دسته‌بندی واژه‌ها را بررسی می‌کنیم.

۱۸.۲ ساختار واژه‌نامه

۱۸.۲.۱ سازمان‌دهی

واژه‌نامهٔ C64-FORTH به چند بخش تقسیم می‌شود:

  • واژه‌های پایهٔ FORTH: واژه‌های اصلی زبان.
  • واژه‌های رشته‌ای: برای کار با رشته‌ها.
  • واژه‌های فایل: برای ورودی/خروجی فایل.
  • واژه‌های گرافیکی: برای ترسیم و کار با تصاویر.
  • واژه‌های اعشاری: برای محاسبات اعشاری.
  • واژه‌های اسمبلر: برای کدنویسی به زبان اسمبلی.
  • واژه‌های ویرایشگر: برای ویرایش صفحه‌ها.

۱۸.۲.۲ ترتیب واژه‌ها

واژه‌ها به‌ترتیب الفبایی مرتب شده‌اند تا جستجو آسان‌تر باشد.

۱۸.۲.۳ ساختار توضیحات

برای هر واژه، اطلاعات زیر ارائه می‌شود:

  • نام واژه
  • نیازمندی‌های پشته (ورودی و خروجی)
  • توضیح کارکرد
  • مثال (در صورت لزوم)

۱۸.۲.۴ علامت‌گذاری پشته

از علامت‌گذاری زیر استفاده می‌شود:

NOTATION
<ورودی> --- <خروجی>

به‌عنوان مثال:

NOTATION
DUP   n1 --- n1 n1

۱۸.۳ نحوهٔ استفاده از واژه‌نامه

۱۸.۳.۱ جستجوی یک واژه

برای یافتن توضیحات یک واژهٔ خاص، آن را در بخش مربوطه جستجو کنید.

۱۸.۳.۲ بررسی نیازمندی‌های پشته

پیش از استفاده از یک واژه، نیازمندی‌های پشتهٔ آن را بررسی کنید تا از بروز خطا جلوگیری شود.

۱۸.۳.۳ مطالعهٔ مثال‌ها

مثال‌های ارائه‌شده در واژه‌نامه، کاربرد واژه را به‌طور عملی نشان می‌دهند.

۱۸.۴ واژه‌های پایهٔ FORTH

۱۸.۴.۱ دستکاری پشته

واژهنیازمندی پشتهکاربرد
DUPn --- n nتکرار مقدار رویی
DROPn ---حذف مقدار رویی
SWAPn1 n2 --- n2 n1جابه‌جایی دو مقدار رویی
OVERn1 n2 --- n1 n2 n1کپی مقدار دوم
ROTn1 n2 n3 --- n2 n3 n1چرخش سه مقدار
PICK... n --- ... n?کپی مقدار n‌اُم
ROLL... n --- ...چرخش n مقدار
2DUPn1 n2 --- n1 n2 n1 n2تکرار دو مقدار
2DROPn1 n2 ---حذف دو مقدار
2SWAPn1 n2 n3 n4 --- n3 n4 n1 n2جابه‌جایی دو جفت
2OVERn1 n2 n3 n4 --- n1 n2 n3 n4 n1 n2کپی جفت دوم

۱۸.۴.۲ عملیات حسابی

واژهنیازمندی پشتهکاربرد
+n1 n2 --- sumجمع
-n1 n2 --- diffتفریق
*n1 n2 --- prodضرب
/n1 n2 --- quotتقسیم
MODn1 n2 --- remباقی‌مانده
/MODn1 n2 --- rem quotتقسیم با باقی‌مانده
*/n1 n2 n3 --- quotضرب و تقسیم با دقت مضاعف
*/MODn1 n2 n3 --- rem quotضرب و تقسیم با باقی‌مانده
1+n --- n+1افزودن یک
1-n --- n-1کاستن یک
2+n --- n+2افزودن دو
2-n --- n-2کاستن دو
2*n --- 2nضرب در دو
2/n --- n/2تقسیم بر دو
ABSn --- |n|قدر مطلق
MAXn1 n2 --- maxبزرگ‌ترین
MINn1 n2 --- minکوچک‌ترین
NEGATEn --- -nقرینه

۱۸.۴.۳ مقایسه‌ها

واژهنیازمندی پشتهکاربرد
0=n --- flagبررسی صفر
0<n --- flagبررسی کوچک‌تر از صفر
0>n --- flagبررسی بزرگ‌تر از صفر
<n1 n2 --- flagکوچک‌تر
=n1 n2 --- flagمساوی
>n1 n2 --- flagبزرگ‌تر
U<u1 u2 --- flagکوچک‌تر بدون علامت

۱۸.۴.۴ حافظه

واژهنیازمندی پشتهکاربرد
@addr --- nواکشی ۱۶ بیتی
!n addr ---ذخیره ۱۶ بیتی
C@addr --- byteواکشی بایت
C!byte addr ---ذخیره بایت
+!n addr ---افزودن به مقدار
2@addr --- n1 n2واکشی دو مقدار
2!n1 n2 addr ---ذخیره دو مقدار

۱۸.۴.۵ ورودی/خروجی

واژهنیازمندی پشتهکاربرد
.n ---چاپ عدد علامت‌دار
U.u ---چاپ عدد بدون علامت
D.d ---چاپ عدد دقت دوگانه
.Rn width ---چاپ با عرض میدان
U.Ru width ---چاپ بدون علامت با عرض
D.Rd width ---چاپ دوگانه با عرض
EMITb ---چاپ کاراکتر
CR---خط جدید
SPACE---یک فاصله
SPACESn ---n فاصله
TYPEaddr count ---چاپ رشته
."---چاپ متن

۱۸.۴.۶ ساختارهای کنترل

واژهکاربرد
IFشرط
ELSEشرط جایگزین
THENپایان شرط
DOآغاز حلقه
LOOPپایان حلقه
+LOOPحلقه با گام متغیر
LEAVEخروج زودهنگام
/LOOPحلقه با آدرس مطلق
BEGINآغاز حلقه
UNTILپایان حلقه شرطی
WHILEشرط حلقه
REPEATبازگشت حلقه
AGAINتکرار بی‌نهایت

۱۸.۴.۷ تعریف واژه

واژهکاربرد
:آغاز تعریف کولون
;پایان تعریف کولون
CREATEساخت هدر جدید
DOES>تعریف رفتار اجرایی
CONSTANTساخت ثابت
VARIABLEساخت متغیر
ALLOTتخصیص فضا
,کامپایل ۱۶ بیتی
C,کامپایل بایت
IMMEDIATEعلامت‌گذاری واژهٔ فوری

۱۸.۵ واژه‌های رشته‌ای

واژهکاربرد
"ذخیره در PAD
$.چاپ رشته
$!ذخیره در آدرس
$+الحاق رشته‌ها
$=مقایسه
$<کوچک‌تر
$>بزرگ‌تر
$COMPAREمقایسهٔ عددی
$NUMBERتبدیل به عدد
$VARIABLEمتغیر رشته‌ای
$CONSTANTثابت رشته‌ای
LEFT$برش چپ
RIGHT$برش راست
MID$زیررشته
LENطول
CHR$بایت به رشته
ASCرشته به کد
VALرشته به عدد
DVALرشته به دقت دوگانه
STR$عدد به رشته
DSTR$دقت دوگانه به رشته
INPUT$ورودی رشته
POS$جستجو
-TEXTمقایسه با طول
UMOVEانتقال حافظه

۱۸.۶ واژه‌های فایل

واژهکاربرد
OPENباز کردن فایل
CLOSEبستن فایل
INPUT#خواندن از فایل
GET#خواندن بایت
PRINT#نوشتن در فایل
CMD#تغییر مسیر خروجی
ABORTIOبستن همهٔ فایل‌ها
GETDEVشمارهٔ دستگاه
EBUFبافر خطا
RDSTATخواندن وضعیت
CKSTبررسی وضعیت
CKRDSTATبررسی با پیام خطا
CKRWSTATبررسی بدون پرچم
?DISKتشخیص دیسک
OPENCHNباز کردن کانال خطا
CLOSCHNبستن کانال خطا
?FILEبررسی وجود فایل

۱۸.۷ واژه‌های گرافیکی

واژهکاربرد
LINEترسیم خط
LINETOترسیم از موقعیت جاری
CIRCLEترسیم دایره
ARCترسیم کمان
BOXترسیم مستطیل
SPRITEتعریف اسپرایت
SPRITE-ONفعال‌سازی
SPRITE-OFFغیرفعال‌سازی
SPRITE-MOVEجابه‌جایی
SPRITE-COLORرنگ
SINسینوس
COSکسینوس
SET-BITتنظیم بیت
CLEAR-BITپاک کردن بیت
XORمعکوس

۱۸.۸ واژه‌های اعشاری

واژهکاربرد
FVARIABLEمتغیر اعشاری
FCONSTANTثابت اعشاری
F@خواندن
F!ذخیره
F+جمع
F-تفریق
F*ضرب
F/تقسیم
FABSقدر مطلق
FSQRTجذر
FSINسینوس
FCOSکسینوس
FTANتانژانت
FATANآرک‌تانژانت
FEXPنمایی
FLNلگاریتم طبیعی
FLOGلگاریتم مبنای ۱۰
S>Fصحیح به اعشاری
F>Sاعشاری به صحیح
D>Fدوگانه به اعشاری
F>Dاعشاری به دوگانه
F.چاپ اعشاری
FE.چاپ علمی
FDUPتکرار
FDROPحذف
FSWAPجابه‌جایی

۱۸.۹ واژه‌های اسمبلر

واژهکاربرد
CODEآغاز تعریف اسمبلی
C;پایان تعریف اسمبلی
LDAبارگذاری Accumulator
STAذخیره Accumulator
LDXبارگذاری X
STXذخیره X
LDYبارگذاری Y
STYذخیره Y
ADCجمع با Carry
SBCتفریق با Carry
ANDAND
ORAOR
EORXOR
CMPمقایسه
INCافزایش
DECکاهش
JMPپرش
JSRفراخوانی زیرروال
RTSبازگشت
BEQپرش شرطی
BNEپرش شرطی
PHAPush A
PLAPull A
CLCپاک کردن Carry
SECتنظیم Carry
NOPبدون عملیات

۱۸.۱۰ واژه‌های ویرایشگر

واژهکاربرد
LIST یا Lنمایش صفحه
EDITویرایش صفحه
Pنمایش خط جاری
Tورود متن
Fجستجو
Rجایگزینی
Dحذف خط
Iدرج خط
Sجایگزینی خط
Cکپی خط
Mانتقال خط

۱۸.۱۱ سیستم و حافظه

واژهکاربرد
HEREنشانی انتهای دیکشنری
PADبافر موقت
ALLOTتخصیص فضا
BASEمبنای عددی
DECIMALمبنای ۱۰
HEXمبنای ۱۶
VLISTنمایش واژه‌ها
FORGETحذف تعریف
SAVESYSTEMذخیره سیستم
SAVETURNKEYساخت برنامهٔ مستقل
DIRفهرست دیسک
DCفرمان به دیسک
BUFFERSتخصیص بافر
MEMTOPکاهش بالای حافظه
BORDERرنگ حاشیه
BKGRNDرنگ پس‌زمینه
CHRCLRرنگ کاراکتر
SYSDEV#دستگاه جاری
TRACEردیابی
TONفعال‌سازی ردیابی

۱۸.۱۲ نمونهٔ استفاده

مثال ۱: تعریف و استفاده

FORTH
: SQUARE DUP * ;
5 SQUARE .
OUTPUT
25 OK

مثال ۲: حلقه

FORTH
: COUNT10 11 1 DO I . LOOP ;
COUNT10
OUTPUT
1 2 3 4 5 6 7 8 9 10 OK

مثال ۳: رشته

FORTH
: HELLO ." Salam, Donya!" ;
HELLO
OUTPUT
Salam, Donya! OK

۱۸.۱۳ نکات پایانی

۱۸.۱۳.۱ تمرین مستمر

تسلط بر FORTH تنها با تمرین مستمر به دست می‌آید. کد بنویسید، آزمایش کنید و از خطاها بیاموزید.

۱۸.۱۳.۲ مطالعهٔ کد دیگران

با مطالعهٔ کدهای نوشته‌شده توسط دیگران، تکنیک‌های جدیدی می‌آموزید.

۱۸.۱۳.۳ استفاده از واژه‌نامه

واژه‌نامه را همیشه در دسترس داشته باشید. این مرجع، بهترین دوست شما در برنامه‌نویسی FORTH است.

۱۸.۱۳.۴ آزمایش

از آزمایش کردن نترسید. FORTH زبانی است که با آزمایش، عمیق‌تر فهمیده می‌شود.

۱۸.۱۴ خلاصهٔ فصل

نکات کلیدی این فصل

  • ساختار واژه‌نامه و نحوهٔ استفاده از آن.
  • واژه‌های پایهٔ FORTH: دستکاری پشته، عملیات حسابی، مقایسه، حافظه، ورودی/خروجی، ساختارهای کنترل، تعریف واژه.
  • واژه‌های رشته‌ای: ذخیره، الحاق، برش، تبدیل، مقایسه.
  • واژه‌های فایل: باز و بستن، خواندن، نوشتن، بررسی وضعیت.
  • واژه‌های گرافیکی: ترسیم، اسپرایت، توابع ریاضی.
  • واژه‌های اعشاری: عملیات، توابع، تبدیل، چاپ.
  • واژه‌های اسمبلر: دستورات و حالت‌های آدرس‌دهی.
  • واژه‌های ویرایشگر: ویرایش صفحه‌ها.
  • واژه‌های سیستم و حافظه: مدیریت، ذخیره‌سازی، دیسک.

پیام پایانی

با مطالعهٔ این هجده فصل، شما با تمام جنبه‌های مهم C64-FORTH آشنا شده‌اید:

  • از مبانی زبان و پشته آغاز کردیم.
  • به حلقه‌ها، شاخه‌ها و آرایه‌ها پرداختیم.
  • ورودی/خروجی، رشته‌ها و فایل‌ها را بررسی کردیم.
  • به جزئیات سیستم، ویرایشگر، اسمبلر، گرافیک و اعداد اعشاری رسیدیم.
  • و در نهایت، واژه‌نامهٔ کامل را مرور کردیم.

اکنون شما ابزار لازم برای نوشتن برنامه‌های کاربردی و حتی حرفه‌ای با C64-FORTH را در اختیار دارید. تمرین کنید، آزمایش کنید و لذت ببرید.

موفق باشید!