.TH XA "1" "5 March 2024" .SH "نام (NAME)" xa \- کراس‌اسمبلر 6502/R65C02/65816 .SH "خلاصه دستور (SYNOPSIS)" .B xa [\fIOPTION\fR]... \fIFILE\fR .SH "توضیحات (DESCRIPTION)" .B xa یک کراس‌اسمبلر چندگذر (multi-pass) برای پردازنده‌های ۸ بیتی از سری 6502 (مانند 6502، 65C02، 6504، 6507، 6510، 7501، 8500، 8501 و 8502)، Rockwell R65C02، و پردازندهٔ ۱۶ بیتی 65816 است. برای توضیحات مربوط به نحو، بخش .B ASSEMBLER SYNTAX را در ادامهٔ این صفحهٔ راهنما ببینید. .SH "گزینه‌ها (OPTIONS)" .TP .B \-E پس از ۲۰ خطا متوقف نشو، بلکه تمام خطاها را نمایش بده. .TP .B \-v خروجی پرجزئیات (verbose). .TP .B \-C کدهای دستوری (opcodes) مربوط به CMOS غیرفعال شود (حالت پیش‌فرض اجازه دادن به کدهای دستوری R65C02 است). .TP .B \-W کدهای دستوری 65816 غیرفعال شود (پیش‌فرض). .TP .B \-w کدهای دستوری 65816 مجاز باشند. .TP .B \-B خطوط باز/بسته شدن بلوک نمایش داده شوند (بخش .BR PSEUDO-OPS را ببینید). .TP .B \-c تولید فایل‌های شیء o65 به‌جای فایل‌های اجرایی (هیچ پیوندزدنی انجام نمی‌شود)؛ ممکن است فایل‌ها حاوی ارجاعات تعریف‌نشده باشند. .TP .B \-o filename تنظیم نام فایل خروجی. پیش‌فرض .B a.o65 است؛ از نام فایل ویژهٔ .B \- برای فرستادن خروجی به خروجی استاندارد استفاده کنید. .TP .B \-P filename تنظیم نام فایل فهرست‌بندی (listing). پیش‌فرض هیچ است؛ از نام فایل ویژهٔ .B \- برای چاپ فهرست‌بندی در خروجی استاندارد استفاده کنید. .TP .B \-F format تنظیم قالب فهرست‌بندی؛ پیش‌فرض .B plain است. تنها قالب دیگری که در حال حاضر پشتیبانی می‌شود .B html است. .TP .B \-e filename تنظیم نام فایل گزارش خطا (errorlog)؛ پیش‌فرض هیچ است. .TP .B \-l filename تنظیم نام فایل فهرست برچسب‌ها (labellist)؛ پیش‌فرض هیچ است. این همان جدول نمادها است و می‌تواند توسط دیزاسمبلرهایی مانند .BR dxa (1) برای بازسازی کد مبدأ استفاده شود. .TP .B \-r افزودن فهرست ارجاع متقابل (cross-reference) به فهرست برچسب‌ها (نیازمند .BR \-l است). .TP .B \-Xcompatset تنظیمات سازگاری را برای سازگاری بیشتر (نه کامل!) با سایر اسمبلرها و پایگاه‌های کد 6502 فعال می‌کند. مجموعه‌های سازگاری پشتیبانی‌شده در حال حاضر عبارتند از .BR MASM ، .B CA65 و .BR C ، به همراه .B XA23 که به‌عنوان گزینه‌ای منسوخ‌شده برای پایگاه‌های کدی که به سازگاری با نسخهٔ قبلی .B xa وابسته‌اند در دسترس است. می‌توان چندین مجموعهٔ سازگاری را مشخص و با یکدیگر ترکیب کرد؛ مانند: .B \-XMASM .BR \-XXA23 . .IP .B \-XMASM اجازه می‌دهد برای سازگاری با MASM، دو‌نقطه در کامنت‌ها ظاهر شود. این امر بر تفسیر دو‌نقطه در جاهای دیگر تأثیر نمی‌گذارد و ممکن است در نسخه‌های بعدی به حالت پیش‌فرض تبدیل شود. .IP .B \-XCA65 قابلیت‌های نحوی سازگارتری با .BR ca65 (1) اضافه می‌کند. این گزینه امکان استفاده از .B := را برای تعریف برچسب‌ها (به‌جای .B = ساده) فراهم می‌کند، و پشتیبانی از برچسب‌های بی‌نام و برچسب‌های محلی «ارزان» با استفاده از نویسهٔ .B @ را اضافه می‌کند، اما کاربرد دیگر آن را برای حالت ۲۴ بیتی غیرفعال می‌سازد (بخش .B ASSEMBLER .B SYNTAX را ببینید). .IP .B \-XC امکان استفاده از شیوه‌های کدگذاری عددی به سبک C مانند .B 0xHEX و .B 0OCTAL را فعال می‌کند. .IP .B \-XXA23 سازگاری جزئی با .B xa نسخهٔ 2.3.x را بازمی‌گرداند. به‌ویژه، از .B ^ برای تولید نویسه‌های کنترلی استفاده می‌کند، نویسه‌های گریز (escaped characters) با .BR \e را غیرفعال می‌سازد، کامنت‌های چندخطی تودرتو را مجاز می‌کند و تمام ماکروهای پیش‌پردازندهٔ ازپیش‌تعریف‌شدهٔ .B xa را غیرفعال می‌نماید. گرچه بخش‌هایی از این گزینه همچنان نحو پشتیبانی‌شده باقی می‌مانند، اما خود این گزینه ذاتاً منسوخ شده است و ممکن است در انتشار بعدی 2.x یا 3.x حذف شود. .TP .B \-a پشتیبانی از برچسب‌های بی‌نام با استفاده از دو‌نقطه به سبک .BR ca65 (1)\c ، اما بدون باقی قابلیت‌های پشتیبانی‌شدهٔ .BR ca65 (1). برای نمونه، این امر اجازه می‌دهد از آن‌ها در حالت 65816 استفاده شود. این گزینه مستلزم .B -XMASM است. .TP .B \-M این گزینه منسوخ شده است و در نسخه‌های آینده حذف خواهد شد؛ به‌جای آن از .B \-XMASM استفاده کنید. این گزینه اجازه می‌دهد برای سازگاری با MASM، دو‌نقطه در کامنت‌ها ظاهر شود. این امر بر تفسیر دو‌نقطه در جاهای دیگر تأثیر نمی‌گذارد و ممکن است در نسخه‌های آینده به پیش‌فرض تبدیل شود. .TP .B \-k به نویسهٔ هشتک .RB ( ^ ) اجازه می‌دهد یک نویسه را با $1f/31 ماسک کند. این قابلیت می‌تواند به‌عنوان میانبری برای نویسه‌های کنترلی استفاده شود، مانند .B "^m^j" که به یک بازگشت به ابتدای سطر (carriage return) به همراه سطر جدید (linefeed) تبدیل می‌شود. .TP .B \-R اجرای اسمبلر در حالت بازنشانی (relocating mode)، یعنی استفاده از قطعه‌ها (segments). .TP .B \-U غیرمجاز بودن برچسب‌های تعریف‌نشده در حالت بازنشانی. .TP .B \-Llabel برچسب .B label را حتی هنگام پیوندزدن (linking)، به‌عنوان یک برچسب مطلق (اما تعریف‌نشده) تعریف می‌کند. .TP .B \-b? addr پایهٔ قطعه (segment base) را برای قطعهٔ .B ? روی نشانی .BR addr \& تنظیم می‌کند. .B ? باید برای قطعه‌های text، data، bss یا zero به‌ترتیب t، d، b یا z باشد. .TP .B \-A addr قطعهٔ text را در نشانی‌ای آغاز می‌کند که وقتی فایل در نشانی .B addr آغاز شود، نیازی به بازنشانی نباشد. این گزینه بر .B \-bt مقدم است؛ سایر قطعه‌ها همچنان باید با .B \-b \& تنظیم شوند. .TP .B \-G جلوگیری از نمایش فهرست نمادهای سراسری (globals) صادرشده. .TP .B \-DDEF=TEXT تعریف یک ماکروی پیش‌پردازنده در خط فرمان (بخش .B PREPROCESSOR را ببینید). .TP .B \-I dir افزودن دایرکتوری .B dir به مسیر شمول (include path) (پیش از .BR XAINPUT ؛ بخش .B ENVIRONMENT را ببینید). .TP .B \-O charset تعریف مجموعه نویسه (charset) خروجی برای رشته‌های نویسه‌ای. موارد پشتیبانی‌شده در حال حاضر عبارتند از ASCII (پیش‌فرض)، PETSCII (اسکی کمودور)، PETSCREEN (کدهای صفحه نمایش کمودور) و HIGH (تنظیم بیت بالا روی تمام نویسه‌ها). .TP .B \-p? تنظیم نویسهٔ جایگزین پیش‌پردازنده به .BR ? . این گزینه زمانی مفید است که بخواهید هم‌زمان از .BR cpp (1) و پیش‌پردازندهٔ توکار استفاده کنید (بخش .B PREPROCESSOR را ببینید). ممکن است لازم باشد نویسه‌ها برای شل شما درون گیومه قرار گیرند (مثال: .B \-p'~' )..TP .B \-\-help نمایش خلاصه‌ای از گزینه‌ها .RB ( -? مترادف آن است). .TP .B \-\-version نمایش نسخه برنامه. .SH "نحو اسمبلر (ASSEMBLER SYNTAX)" مقدمه‌ای بر برنامه‌نویسی به زبان اسمبلی 6502 و نمادهای دستوری (mnemonics) فراتر از دامنه این صفحه راهنما است. از شما دعوت می‌کنیم تا کتاب‌های عالی متعددی را در این زمینه بررسی کنید؛ یک عنوان مفید «Machine Language For Beginners» اثر Richard Mansfield (انتشارات !COMPUTE) است که سیستم‌های ۸ بیتی Atari، Commodore و Apple را پوشش می‌دهد و به طور گسترده در بازار دست دوم موجود است. .LP برنامه .B xa هم از کدهای دستوری (opcodes) استاندارد NMOS 6502 و هم از کدهای دستوری Rockwell CMOS استفاده‌شده در 65C02 (R65C02) پشتیبانی می‌کند. با گزینه .B \-w برنامه .B xa کدهای دستوری 65816 را نیز خواهد پذیرفت. کدهای دستوری ثبت‌نشده (undocumented) در NMOS 6502 عمداً پشتیبانی نمی‌شوند و باید به صورت دستی با استفاده از شبه‌دستور .B \.byte وارد شوند (بخش .BR PSEUDO-OPS را ببینید). به دلیل تداخل میان مجموعه‌های دستورالعمل R65C02 و 65816 با دستورالعمل‌های ثبت‌نشده در NMOS 6502، استفاده از آن‌ها توصیه نمی‌شود. .LP به طور کلی، .B xa قالب کم‌وبیش استاندارد اسمبلر 6502 را که توسط MASM و TurboAssembler رایج شد، می‌پذیرد. مقادیر و آدرس‌ها می‌توانند به صورت مقادیر صریح (literals) یا به عنوان عبارت‌ها (expressions) بیان شوند؛ بدین صورت: .TP 10 .B 123 مقدار ده‌دهی (decimal) .TP .B $234 مقدار هگزادسیمال (hexadecimal) .RB ( 0x234 با .BR \-XC پذیرفته می‌شود) .TP .B &123 اکتال (octal) .RB ( 0123 با .BR \-XC پذیرفته می‌شود) .TP .B %010110 باینری (binary) .TP .B * مقدار فعلی شمارنده برنامه (program counter) .LP مقدار ASCII هر نویسه درون علامت نقل‌قول مستقیماً در متن برنامه درج می‌شود (مثال: .B """A""" بایت "A" را در جریان خروجی درج می‌کند)؛ همچنین بخش .B PSEUDO-OPS را ببینید. این رفتار تحت تأثیر مجموعه نویسه (character set) انتخاب‌شده فعلی (در صورت وجود) قرار می‌گیرد. .LP .B برچسب‌ها (Labels) مکان‌هایی را در متن برنامه مشخص می‌کنند، درست مانند سایر اسمبلرهای چندگذره (multi-pass). برچسب با هر چیزی که یک کد دستوری نباشد تعریف می‌شود؛ برای مثال، خطی مانند .IP .B label1 lda #0 .LP مکان فعلی شمارنده برنامه (و در نتیجه آدرس کد دستوری .BR LDA ) را به عنوان .B label1 تعریف می‌کند. یک برچسب می‌تواند به طور صریح با اختصاص دادن مقدار یک عبارت به آن تعریف شود، مانند .IP .B label2 = $d000 .LP که .B label2 را برابر با آدرس $d000، یعنی شروع بلوک ثبات VIC-II در رایانه‌های Commodore 64 تعریف می‌کند. شمارنده برنامه .B * نوع خاصی از برچسب در نظر گرفته می‌شود و می‌توان با دستوراتی مانند .IP .B * = $c000 .LP به آن مقدار اختصاص داد که شمارنده برنامه را روی مکان ده‌دهی 49152 تنظیم می‌کند. در صورت مشخص شدن گزینه .B \-XCA65 می‌توانید علاوه بر .BR = از .B := نیز استفاده کنید. .LP به استثنای شمارنده برنامه، برچسب‌ها را نمی‌توان چندین بار مقداردهی کرد. برای اعلان صریح بازتعریف یک برچسب، یک خط فاصله (-) پیش از آن قرار دهید، مانند: .IP .B \-label2 = $d020 .LP که .B label2 را روی ثبات رنگ حاشیه Commodore 64 تنظیم می‌کند. حوزه دید (scope) یک برچسب تحت تأثیر بلوکی است که در آن قرار دارد (دستورالعمل‌های بلوک را در .B PSEUDO-OPS ببینید). یک برچسب را می‌توان با گزینه خط فرمان .B \-L نیز به صورت ثابت و صریح تعیین کرد. .LP بازتعریف یک برچسب، کدهای قبلاً اسمبل‌شده‌ای را که از مقدار پیشین استفاده کرده‌اند تغییر نمی‌دهد. بنابراین، از آنجا که شمارنده برنامه نوع خاصی از برچسب است، تغییر شمارنده برنامه به مقداری کمتر، ترتیب کدهایی را که پیش‌تر اسمبل شده‌اند تغییر نمی‌دهد و تغییر آن به مقداری بیشتر نیز فاصله‌گذاری (padding) برای قرار دادن کدهای بعدی در مکان جدید ایجاد نمی‌کند. این رفتاری عمدی برای تسهیل تولید کدهای جابه‌جاشونده (relocatable) و مستقل از مکان (position-independent) است، اما ممکن است با سایر اسمبلرهایی که از این رفتار برای پیوند دادن (linking) استفاده می‌کنند متفاوت باشد. با این حال، می‌توان از شبه‌دستورها برای شبیه‌سازی رفتار سایر اسمبلرها و استفاده از .B xa به عنوان یک پیونددهنده (linker) استفاده کرد؛ بخش‌های .B PSEUDO-OPS و .BR LINKING را ببینید. .LP اگر .B \-XCA65 یا .B \-a مشخص شده باشد، برچسب‌های «بی‌نام» را می‌توان با .B : تعیین کرد (یعنی بدون نام برچسب، فقط یک دونقطه)؛ سپس پرش‌ها و انشعاب‌ها می‌توانند با یک دونقطه و علامت‌های مثبت برای انشعاب رو به جلو یا علامت‌های منفی برای انشعاب رو به عقب به این برچسب‌های بی‌نام ارجاع دهند. برای مثال (از مستندات .BR ca65 (1)): .LP : lda (ptr1),y ; #1 .BR cmp (ptr2),y .BR bne :+ ; -> #2 .BR tax .BR beq :+++ ; -> #4 .BR iny .BR bne :- ; -> #1 .BR inc ptr1+1 .BR inc ptr2+1 .BR bne :- ; -> #1 .BR .BR : bcs :+ ; #2 -> #3 .BR ldx #$FF .BR rts .BR .BR : ldx #$01 ; #3 .BR : rts ; #4 .LP علاوه بر این، در حالت .BR \-XCA65 ، می‌توان از برچسب‌های محلی «ارزان» (cheap) که با پیشوند .B @ مشخص می‌شوند استفاده کرد. این برچسب‌های موقت تنها میان دو برچسب عادی وجود دارند و با رسیدن به برچسب عادی بعدی به طور خودکار از حوزه دید خارج می‌شوند. این ویژگی امکان می‌دهد تا با دقتی معقول، نام‌های متداول برچسب مانند "loop" را دوباره استفاده کرد. .LP برای آن دسته از دستورالعمل‌هایی که انباره (accumulator) آرگومان ضمنی آن‌ها است (مانند .B asl و .BR lsr ؛ .B inc و .B dec در R65C02 و غیره)، شیوه تعیین صریح انباره با .B a ضرورتی ندارد، زیرا در صورت نبود آرگومان صریح، ساختار مناسب انتخاب خواهد شد. در واقع، جهت سازگاری با نحوه مدیریت برچسب‌ها، اگر برچسبی به نام .B a وجود داشته باشد، کدی تولید می‌شود که به آن برچسب به عنوان یک مکان حافظه ارجاع می‌دهد نه به انباره؛ در غیر این صورت، اسمبلر خطا خواهد گرفت. .LP برچسب‌ها و کدهای دستوری می‌توانند .B عبارت‌ها (expressions) را به عنوان آرگومان‌های خود بپذیرند تا مقادیر محاسباتی را مجاز سازند، و خود نیز می‌توانند به سایر برچسب‌ها و/یا شمارنده برنامه ارجاع دهند. یک عبارت مانند .B lab1+1 (که روی مقدار فعلی برچسب .B lab1 عمل کرده و یک واحد به آن می‌افزاید) می‌تواند از عملوندهای زیر استفاده کند که از بالاترین اولویت به پایین‌ترین اولویت مرتب شده‌اند:.TP 8 .B * ضرب (اولویت ۱۰) .TP .B / تقسیم صحیح (اولویت ۱۰) .TP .B + جمع (اولویت ۹) .TP .B \- تفریق (۹) .TP .B << شیفت به چپ (۸) .TP .B >> شیفت به راست (۸) .TP .B >= => بزرگ‌تر یا مساوی (۷) .TP .B > بزرگ‌تر (۷) .TP .B <= =< کوچک‌تر یا مساوی (۷) .TP .B < کوچک‌تر (۷) .TP .B = مساوی با (۶)؛ .B == نیز پذیرفته می‌شود .TP .B <> >< نامساوی (۶)؛ .B != نیز پذیرفته می‌شود .TP .B & عملگر AND بیتی (۵) .TP .B ^ عملگر XOR بیتی (۴) .TP .B | عملگر OR بیتی (۳) .TP .B && عملگر AND منطقی (۲) .TP .B || عملگر OR منطقی (۱) .LP پرانتزها معتبر هستند. هنگام بازتعریف یک برچسب (label)، ترکیب عملگرهای حسابی یا بیتی با عملگر مساوی (=) مانند .B += و نظایر آن معتبر است؛ برای مثال: .IP .B \-redeflabel += (label12/4) .LP به‌طور معمول، .B xa تلاش می‌کند مقدار عملوند را تشخیص دهد و (هنگام ارجاع به یک مکان از حافظه) در صورت تناسب و پشتیبانی توسط کد دستور (opcode) خاص، از آدرس‌دهی صفحه صفر (zero page)، ۱۶ بیتی یا (برای 65816) ۲۴ بیتی استفاده کند. این کار کدی کوچک‌تر و سریع‌تر تولید می‌کند و تقریباً همیشه ارجح است. .LP با این وجود، می‌توانید از این عملگرهای پیشوندی برای اجبار در تفسیر خاصی از عملوند استفاده کنید. مواردی که نتیجه‌ای هشت‌بیتی تولید می‌کنند می‌توانند در حالت‌های آدرس‌دهی ۸ بیتی، مانند فوری (immediate) و صفحه صفر (zero page) نیز به کار روند. .TP .B < بایت پایین (low byte) عبارت؛ برای مثال: .B lda # بایت بالا (high byte) عبارت .TP .B ! در شرایطی که عبارت می‌تواند هم به‌عنوان یک مقدار مطلق (absolute) و هم صفحه صفر (zero page) درک شود، برای آن دسته از کدهای دستوری که از آن پشتیبانی می‌کنند، تلاشی برای بهینه‌سازی به یک آرگومان صفحه صفر انجام نده (یعنی به‌صورت کلمه ۱۶ بیتی نگه‌دار) .TP .B @ تفسیر به‌صورت مقدار ۲۴ بیتی برای 65816، حتی اگر از ۲۴ بیت کوچک‌تر باشد (باید گزینه خط فرمان .B \-w مشخص شده باشد و نباید .BR \-XCA65 مشخص شده باشد) .TP .B ` اجبار به بهینه‌سازی بیشتر، حتی اگر طول دستورالعمل به‌طور مطمئن قابل تعیین نباشد (ببینید .BR NOTES'N'BUGS ) .LP عبارت‌ها می‌توانند به‌عنوان آرگومان‌های کدهای دستور (opcodes) یا در پیش‌پردازنده بیایند (برای نحوه نحو به .B PREPROCESSOR مراجعه کنید). برای مثال: .IP .B lda label2+1 .LP مقدار موجود در .B label2+1 را می‌گیرد (با در نظر گرفتن مقدار برچسب قبلی ما، این مقدار $d021 خواهد بود)، و به‌صورت .B $ad $21 $d0 روی دیسک اسمبل می‌شود. به همین ترتیب، .IP .B lda # ، .BR >= ، .B != و .BR <> . .TP .B \.include "filename" فایل دیگری را به جای این شبه‌دستور وارد می‌کند، گویی پیش‌پردازنده این کار را با دستورالعمل .B #include انجام داده است (به .B PREPROCESSOR مراجعه کنید)، اما در مرحله اسمبلر، پس از آن‌که پیش‌پردازش قبلاً انجام گرفته است. .LP شبه‌دستور زیر برای حالت فهرست‌سازی (listing) اعمال می‌شود. .TP .B \.listbytes number در خروجی فهرست‌سازی، حداکثر تعداد بایت‌های هگزادسیمال را که باید در فهرست برای شبه‌دستورهایی مانند .BR .byt چاپ شوند تعیین می‌کند؛ که مقدار پیش‌فرض آن ۸ است. آرگومان ویژه .B unlimited هیچ حد بالایی تعیین نمی‌کند. اگر حالت فهرست‌سازی غیرفعال باشد، این شبه‌دستور هیچ تأثیر قابل مشاهده‌ای ندارد. .LP شبه‌دستورهای زیر در درجه اول برای اشیاء جابجایی‌پذیر .B .o65 اعمال می‌شوند. بحث کامل در مورد قالب جابجایی‌پذیر خارج از محدوده این صفحه راهنما است؛ برای جدیدترین مشخصات به .B http://www.6502.org/users/andre/o65 مراجعه کنید. .TP .B .text .data .bss .zero این شبه‌دستورها بین بخش‌های مختلف جابجا می‌شوند؛ .B .text بخش کد واقعی است، .B .data بخش داده است، .B .bss فضای برچسب مقداردهی‌نشده برای تخصیص است و .B .zero فضای صفحه صفر (zero page) مقداردهی‌نشده برای تخصیص است. در .B .bss و .BR .zero ، فقط برچسب‌ها ارزیابی می‌شوند. این شبه‌دستورها در حالت‌های جابجایی‌پذیر و مطلق معتبر هستند..TP .B .code برای سازگاری با .BR ca65 ، این دستور در حال حاضر به .B .text نگاشت شده است. .TP .B .zeropage برای سازگاری با .BR ca65 ، این دستور در حال حاضر به .B .zero نگاشت شده است. .TP .B .align value قطعهٔ (segment) فعلی را به یک مرز بایتی (۲، ۴ یا ۲۵۶) همان‌طور که توسط .B value مشخص شده تراز می‌کند (و هنگامی که حالت بازآرایی [relocating] فعال باشد، آن را در سرایند قرار می‌دهد). مقادیر دیگر باعث ایجاد خطا می‌شوند. .TP .B .fopt type, value1, value2, value3, ... مانند .B .byt/.asc عمل می‌کند، با این تفاوت که مقادیر به عنوان گزینه‌های فایل در فایل شیء تعبیه می‌شوند. آرگومان .B type برای مشخص کردن گزینهٔ فایلِ مورد ارجاع به کار می‌رود. جدولی از این گزینه‌ها در توصیف قالب فایل بازآرایی‌پذیر o65 آمده است. سایر گزینه‌ها به عنوان مقادیری برای درج تفسیر می‌شوند. هر تعداد مقداری را می‌توان تعیین کرد که می‌توانند رشته نیز باشند. .TP .B .import label1, label2, label3, ... برچسب‌های مشخص‌شده را به عنوان برچسب‌های سراسری تعریف می‌کند که در طول مرحلهٔ پیوند (link) همانند پارامتر خط فرمان .B \-L وارد (import) و حل (resolve) می‌شوند. .TP .B .importzp label1, label2, label3, ... مشابه .BR .import ، با این تفاوت که تنها برچسب‌های zeropage (یعنی مقادیر بایتی) را وارد می‌کند. .SH "پیش‌پردازنده (PREPROCESSOR)" .B xa پیش‌پردازنده‌ای بسیار شبیه به پیش‌پردازندهٔ زبان C یعنی .BR cpp (1) را پیاده‌سازی می‌کند و بسیاری از جزئیات و ریزه‌کاری‌ها برای هر دو صدق می‌کنند. برای نمونه، همانند C، استفاده از .B /* */ برای نشانگرهای توضیحات در .B xa نیز پشتیبانی می‌شود و همچنین استفاده از اسلش دوگانهٔ .B // برای توضیحات مجاز است. پیش‌پردازنده همچنین از خطوط ادامه‌دار پشتیبانی می‌کند، یعنی خطوطی که به یک بک‌اسلش (\e) ختم می‌شوند؛ در این حالت خط بعدی به آن متصل می‌شود، گویی هیچ خط جدید جداکننده‌ای وجود ندارد. این مورد نیز در سطح پیش‌پردازنده مدیریت می‌شود. .LP به دلایل محدودیت حافظه و پیچیدگی، تمام گسترهٔ نحو .BR cpp (1) به‌طور کامل پشتیبانی نمی‌شود. به‌ویژه، تعاریف ماکرو نمی‌توانند ارجاع به جلو داشته باشند (یعنی یک تعریف ماکرو تنها می‌تواند به ماکرویی ارجاع دهد که قبلاً تعریف شده است)، به جز ماکروهای تابعی که ارزیابی بازگشتی در آن‌ها پشتیبانی می‌شود؛ برای مثال، برای .B #define WW AA ، .B AA باید از پیش تعریف شده باشد. برخی دستورات (directive) دیگر پشتیبانی نمی‌شوند، اکثر ماکروهای پیش‌تعریف‌شدهٔ استاندارد نیز موجود نیستند، و محدودیت‌های دیگری نیز بر ارزیابی و طول خط اعمال شده است. از آنجا که نگه‌دارندگان .B xa می‌دانند برخی فایل‌ها به پیش‌تجزیهٔ پیچیده‌تری نسبت به آنچه پیش‌پردازندهٔ داخلی می‌تواند ارائه دهد نیاز دارند، این پیش‌پردازنده خروجیِ خط/نام‌فایل/پرچم‌های سبک .BR cpp (1) را می‌پذیرد. هنگامی که این خطوط در فایل ورودی دیده شوند، .B xa با آن‌ها همان‌گونه رفتار می‌کند که .B cc رفتار می‌کرد، با این تفاوت که پرچم‌ها نادیده گرفته می‌شوند. .B xa به دلایل مربوط به تجزیه، فایل‌ها را از ورودی استاندارد نمی‌پذیرد، بنابراین باید خروجی .BR cpp (1) خود را در یک فایل موقت میانی ذخیره کنید، مانند .IP .B cc -E test.s > test.xa .br .B xa test.xa .LP نیازی به ارسال آرگومان‌های ویژه به .B xa نیست؛ وجود خروجی .BR cpp (1) به‌طور خودکار تشخیص داده می‌شود. .LP توجه داشته باشید که عبور دادن فایل شما از .BR cpp (1) ممکن است با دستورات پیش‌پردازندهٔ خودِ .B xa تداخل ایجاد کند. در این صورت، برای پنهان کردن دستورات از .BR cpp (1)، از گزینهٔ .B \-p برای تعیین نویسه‌ای جایگزین به‌جای .B # استفاده کنید، مانند مدک (تایلد) (مثلاً .BR \-p\(aq~\(aq ). با مشخص کردن این گزینه و آرگومان، برای نمونه به جای .BR #include ، علاوه بر .B #include می‌توانید از .B ~include نیز استفاده کنید (که با فرض باقی ماندن پس از عبور از .BR cpp (1)، همچنان توسط پیش‌پردازندهٔ .B xa پذیرفته خواهد شد). هر نویسه‌ای را می‌توان استفاده کرد، هرچند انتخاب‌های واقعاً نامتعارف ممکن است در حین تجزیه منجر به اشکالات عجیب یا کلافه‌کننده‌ای شوند. همچنین می‌توانید از این گزینه برای به تعویق انداختن دستورات پیش‌پردازنده‌ای که ممکن است .BR cpp (1) خیلی زود آن‌ها را تفسیر کند استفاده کنید تا فایل واقعاً جهت پردازش به خودِ .B xa برسد. .LP ماکروهای پیش‌تعریف‌شدهٔ زیر پشتیبانی می‌شوند، مگر اینکه .B \-XXA23 مشخص شده باشد: .TP .B XA_MAJOR نسخهٔ اصلی (major) فعلی .BR xa . .TP .B XA_MINOR نسخهٔ فرعی (minor) فعلی .BR xa . .LP دستورات پیش‌پردازندهٔ زیر پشتیبانی می‌شوند: .TP .B #include """filename""" محتویات فایل .B filename را در این موقعیت درج می‌کند. اگر فایل پیدا نشود، با استفاده از مسیرهای تعیین‌شده توسط گزینهٔ خط فرمان .B \-I یا متغیر محیطی .B XAINPUT (به بخش مربوطه مراجعه کنید) جستجو می‌شود. پس از درج، این فایل نیز برای یافتن دستورات پیش‌پردازنده تجزیه خواهد شد. .TP .B #echo comment توضیح .B comment را در فایل گزارش خطا (errorlog) که با گزینهٔ خط فرمان .B \-e تعیین می‌شود، درج می‌کند. .TP .B #print expression مقدار عبارت .B expression را محاسبه کرده و در فایل گزارش خطا چاپ می‌کند. .TP .B #error message پیام را به عنوان یک خطا نمایش داده و فرایند اسمبل کردن را متوقف می‌کند. .TP .B #define DEFINE text ماکروی .B DEFINE را با متن .B text برابر قرار می‌دهد، به‌طوری که هر جا .B DEFINE در کد منبع اسمبلی ظاهر شود، .B text به جای آن جایگزین می‌گردد (درست مانند رفتاری که .BR cpp (1) دارد). علاوه بر این، .B #define می‌تواند همانند .BR cpp (1) ماکروهای تابعی را مشخص کند، به‌گونه‌ای که دستوری مانند .B #define mult(a,b) ((a)*(b)) نتیجهٔ مورد انتظار را در هر جایی که عبارتی به فرم .B mult(a,b) در کد منبع بیاید تولید کند. این مورد را می‌توان در خط فرمان نیز با گزینهٔ .B \-D مشخص کرد. آرگومان‌های یک ماکروی تابعی، برخلاف دیگر .BR #define ها، می‌توانند به‌طور بازگشتی ارزیابی شوند؛ پیش‌پردازنده پیش از اعلام خطا، تا ده بار تلاش می‌کند هر آرگومانی را که به تعریف پیش‌پردازندهٔ دیگری ارجاع می‌دهد، مجدداً ارزیابی کند. .LP دستورات زیر شرطی هستند. اگر شرط برقرار نباشد، کد منبع بین دستور و .B #endif پایانی آن حذف شده و اسمبل نمی‌شود. تا پانزده سطح تو در تویی پشتیبانی می‌شود. .TP .B #ifdef DEFINE تنها در صورتی درست (True) است که ماکروی .B DEFINE تعریف شده باشد..TP .B #ifndef DEFINE حالت معکوس؛ تنها در صورتی درست (true) است که ماکروی .B DEFINE قبلاً تعریف نشده باشد. .TP .B #if expression در صورتی درست است که عبارت .B expression به مقداری غیرصفر ارزیابی شود. .B expression می‌تواند به ماکروهای دیگر نیز ارجاع دهد. .TP .B #iflused label در صورتی درست است که برچسب .B label استفاده شده باشد (اما لزوماً با یک مقدار مقداردهی نشده باشد). .I این دستور روی برچسب‌ها کار می‌کند، نه ماکروها! .TP .B #ifldef label در صورتی درست است که برچسب .B label تعریف شده .I و مقداری به آن اختصاص یافته باشد. .I این دستور روی برچسب‌ها کار می‌کند، نه ماکروها! .TP .B #else مسیر جایگزین را برای یک بلوک شرطی پیاده‌سازی می‌کند. .TP .B #endif یک بلوک شرطی را می‌بندد. .LP بلوک‌های شرطی بسته‌نشده در انتهای فایل‌های ضمیمه‌شده (included) هشدار تولید می‌کنند؛ بلوک‌های شرطی بسته‌نشده در انتهای فرایند اسمبل، خطا ایجاد می‌کنند. .LP .B #iflused و .B #ifldef برای ساختن یک کتابخانه بر پایهٔ برچسب‌ها مفید هستند. برای نمونه، ممکن است از چیزی شبیه به این در کد کتابخانهٔ خود استفاده کنید: .IP .B #iflused label .br .B #ifldef label .br .B #echo label already defined, library function label cannot be inserted .br .B #else .br .B label /* your code */ .br .B #endif .br .B #endif .SH "پیوند دادن (LINKING)" .B xa به سمت تولید باینری‌های ترتیبی گرایش دارد. کدها دقیقاً به ترتیب خارج می‌شوند، حتی اگر شمارندهٔ برنامه (program counter) روی مکانی پایین‌تر از کدهای اسمبل‌شدهٔ قبلی تنظیم شده باشد، و در صورتی که شمارندهٔ برنامه روی مکان بالاتری تنظیم شود، فاصله‌گذاری (padding) به‌طور خودکار درج نمی‌شود. تغییر مکان برنامه تنها برچسب‌های جدید را برای کدهایی که پس از آن تولید می‌شوند تغییر می‌دهد؛ کدهای تولیدشدهٔ قبلی بدون تغییر باقی می‌مانند. خوشبختانه، برای بسیاری از فایل‌های شیء این قواعد اثری بر روند تولید آن‌ها ندارد. .LP با این حال، ممکن است برخی کاربردها نیازمند تولید یک فایل شیء ساخته‌شده از چندین مؤلفه و/یا زیرماژول قبلاً تولیدشده باشند که باید در مکان‌های خاصی از حافظه قرار گیرند. با مقدار کمی مشخصات اضافی، می‌توان از .B xa برای این منظور نیز استفاده کرد. .LP اولین روش برای انجام این کار، استفاده از قالب o65 برای ساخت اشیاء با قابلیت جابه‌جایی (relocatable) است که به‌نوبهٔ خود می‌توانند توسط .BR ldo65 (1) (رجوع شود به آن) پیوند داده شوند. .LP روش دوم شامل کدهای اسمبل‌شده، یا درج فایل‌های شیء یا داده‌ای از قبل ساخته‌شده با .BR .bin است، که در آن از شبه‌دستورهای .B .dsb با آرگومان‌های عبارتی محاسباتی برای درج هرگونه فاصله‌گذاری لازم بین آن‌ها، به ترتیبی که قرار است در حافظه قرار گیرند، استفاده می‌شود. این مثال را در نظر بگیرید: .LP .br .word $1000 .br * = $1000 .br .br ; this is your code at $1000 .br part1 rts .br ; this label marks the end of code .br endofpart1 .br .br ; DON'T PUT A NEW .word HERE! .br * = $2000 .br .dsb (*-endofpart1), 0 .br ; yes, set it again .br * = $2000 .br .br ; this is your code at $2000 .br part2 rts .br .LP این مثال، که برای ریزرایانه‌های Commodore با استفاده از آدرس شروع ۱۶ بیتی نوشته شده است، شامل دو «ماژول» است: یک بلوک کد در $1000 (4096)، که با کد میان برچسب‌های .B part1 و .BR endofpart1 مشخص شده است، و یک بلوک دوم در $2000 (8192) که از برچسب .BR part2 آغاز می‌شود. .LP فاصله‌گذاری توسط شبه‌دستور .B .dsb بین دو ماژول محاسبه می‌شود. توجه داشته باشید که شمارندهٔ برنامه بر روی آدرس جدید تنظیم شده و سپس یک عبارت محاسباتی، تعداد بایت‌های پرکننده مناسب را از انتهای کد اسمبل‌شده در بخش ۱ تا آدرس جدید شمارندهٔ برنامه درج می‌کند. از آنجا که این کار خود شمارندهٔ برنامه را به جلو می‌برد، شمارندهٔ برنامه دوباره بازنشانی شده و فرایند اسمبل ادامه می‌یابد. .LP هنگامی که شیءِ تولیدشده توسط این فایل مبدأ بارگذاری می‌شود، یک دستورالعمل .B rts در آدرس 4096 و دستور دیگری در آدرس 8192 وجود خواهد داشت که بایت‌های تهی (null) بین آن‌ها قرار گرفته‌اند. .LP اگر لازم باشد یکی از این نواحی به جای کد اسمبلی شامل یک فایل از قبل ساخته‌شده باشد، کافی است از شبه‌دستور .B .bin برای بارگذاری هر بخش از فایل که مورد نیاز است در خروجی استفاده کنید. محاسبهٔ آدرس‌ها و تعداد بایت‌های پرکنندهٔ لازم نیز به همان روش انجام می‌شود. .LP اگرچه در این مثال از خود شمارندهٔ برنامه برای محاسبهٔ تفاوت بین آدرس‌ها استفاده شد، اما می‌توانید از هر برچسبی برای این منظور استفاده کنید؛ البته با این یادآوری که تنها شمارندهٔ برنامه تعیین می‌کند که آدرس‌های نسبی در داخل کد اسمبل‌شده در کجا حل‌وفصل شوند..SH "محیط (ENVIRONMENT)" .B xa در صورت وجود متغیرهای محیطی زیر، از آن‌ها استفاده می‌کند: .TP .B XAINPUT مسیر فایل‌های include؛ اجزا باید با «,» از یکدیگر جدا شوند. .TP .B XAOUTPUT مسیر فایل خروجی. .SH "نکات و باگ‌ها (NOTES'N'BUGS)" دستورالعمل‌های R65C02 یعنی .B ina (که اغلب به‌صورت .B inc .BR a نمایش داده می‌شود) و .B dea .RB ( dec .BR a ) باید به ترتیب به‌صورت دستورالعمل‌های ساده‌ی .B inc و .B dec نوشته شوند. .LP دستورالعمل‌های 65816 یعنی .B mvn و .B mvp از دو پارامتر هشت بیتی استفاده می‌کنند؛ این‌ها تنها دستورالعمل‌ها در کل مجموعه‌دستورالعمل هستند که چنین رفتاری دارند. نسخه‌های قدیمی‌ترِ .B xa یک مقدار مطلق ۱۶ بیتی می‌گرفتند. از نسخه 2.4.0، این نحو قدیمی دیگر پذیرفته نیست. .LP برچسب‌های تعریف‌شده رو به جلو \-\- یعنی برچسب‌هایی که پس از پردازش دستورالعمل جاری تعریف می‌شوند \-\- حتی اگر در نهایت در مکانی از صفحه‌صفر (zero page) تعریف شوند، نمی‌توانند به دستورالعمل‌های صفحه‌صفر بهینه‌سازی شوند، زیرا اسمبلر در گذر اول که طول دستورالعمل محاسبه می‌شود، مقدار برچسب را از پیش نمی‌داند. در گذر دوم، در صورتی که دستوری به دلیل این محدودیت نتوانسته بهینه‌سازی شود در حالی که امکانش بود، یک هشدار صادر خواهد شد. (بدیهی است که این موضوع برای دستورالعمل‌های انشعاب یا پرش صدق نمی‌کند زیرا به هر حال قابل بهینه‌سازی نیستند، و آن دسته از دستورالعمل‌هایی که .I فقط می‌توانند یک پارامتر ۸ بیتی بگیرند، همواره به یک مقدار ۸ بیتی تبدیل خواهند شد.) اگر تعریف برچسب پیش از دستورالعمل به شکل دیگری ممکن نباشد، تا زمانی که دستورالعمل پشتیبانی کند، می‌توان از پیشوند بک‌تیک .B ` برای اجبار بهینه‌سازی بیشتر، صرف‌نظر از محل تعریف برچسب، استفاده کرد. با این حال، اجبار بی‌رویه می‌تواند خطرات زیادی به همراه داشته باشد و توصیه نمی‌شود؛ برای جلوگیری از این کار، اسمبلر در موقعیت‌های حالت آدرس‌دهی که هیچ ابهامی در آن‌ها وجود ندارد، مانند شاخص‌دار غیرمستقیم (indirect indexed)، انشعاب و غیره، به استفاده از آن اعتراض خواهد کرد. .SH "همچنین ببینید (SEE ALSO)" .BR file65 (1), .BR ldo65 (1), .BR reloc65 (1), .BR uncpk (1), .BR dxa (1) .SH "نویسندگان (AUTHORS)" این صفحه راهنما توسط David Weinehall ، Andre Fachat و Cameron Kaiser نوشته شده است. بسته اصلی xa کپی‌رایت (C)1989-1997 متعلق به Andre Fachat است. تغییرات تکمیلی (C)1989-2024 متعلق به Andre Fachat، Jolse Maginnis، David Weinehall و Cameron Kaiser است. نگهدارنده رسمی Cameron Kaiser است. .SH "بیش از ۳۰ سال با XA (OVER 30 YEARS OF XA)" هورا برای ما؟ .SH "وب‌گاه (WEBSITE)" http://www.floodgap.com/retrotech/xa