نوستالژی: زمانی که مردها هنوز مرد بودند! (بخش پایانی- هک‌های عمیق‌تر)

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


برنامه‌نویسی پیشرفته با Commodore 64 Programmers Reference Guide

در کلاس‌های مدرسه و زمانی که با دوستان در مورد کامپیوترهای‌مان و بازی‌ها و غیره حرف می‌زدیم، یکی از دوستان به کتاب «پیشرفته‌ای» اشاره کرده که به تازگی به دستش رسیده بود و دانش برنامه‌نویسی او را چندین پله ارتقا داده بود. با هزار خواهش و التماس توانستم آن را برای یکی دو روز امانت بگیرم. کتابی واقعی در کار نبود. کتاب واقعی را با فناوری فتوکپی (هنوز دستگاه به اصطلاح زیراکس که کیفیت بالاتری داشت همه‌گیر نشده بود و هزینه یک برگ زیراکس بیش از دو برابر فتوکپی بود!) تکثیر کرده بودند و در نبود صحافی‌های سیمی و فنری، آن را با منگنه کتاب دوخته بودند. شما فقط باید تصور کنید که از جلدی که در تصویر زیر می‌بینید، چه اثر سیاه و سفیدی بر روی یک مقوای کرم رنگ نقش می‌بندد!

c64-ProgrammersReferenceGuide

اما برخلاف ظاهر بدترکیب و مدت کوتاهی (کمتر از یک هفته) که آن را در اختیار داشتم، این کتاب تاثیر بسیار شدیدی روی دانش من از کامپیوتر (در مقیاس آن دوران) گذاشت. Commodore 64 Programmers Reference Guide در واقع کتاب مقدس برنامه‌نویسان کمودور بود:

مرجعی کامل برای درک کامل یک کامپیوتر.

چیزی که بعید می‌دانم در دنیای کنونی ما برای یک گوشی کوچک موبایل هم وجود داشته باشد. با این کتاب تازه فهمیدم که چیزی به اسم زبان ماشین هم وجود دارد. مفهوم IRQ و عملکردهای بیتی AND و OR را فهمیدم و مفاهیم پوینتر و ذخیره آدرس دو بایتی و بسیاری چیزهای دیگر را درک کردم. بارهای اولی که بازی‌های کمودور را LOAD می‌کردم با تصور این‌که با خواندن کد برنامه می‌توانم آن را درک کنم و تغییر دهم، دستور LIST را اجرا می‌کردم تا برنامه بازی را ببینم و غالبا تنها با یک خط روبرو می‌شدم:

10 SYS 2061

بعد از خواندن کتاب تازه فهمیدم کل برنامه بازی به زبان ماشین در حافظه سیستم بار شده و این دستور تنها کنترل اجرا را به روالی در آدرس 2061 منتقل می‌کند. اما چرا 2061؟

صرفه‌جویی در حافظه، برنامه‌ای که خودش را تغییر می‌داد

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

10 FOR I=1 TO 100

به جای این‌که با احتساب فضاهای خالی ۱۷ کاراکتر جا بگیرد، تبدیل می‌شد به ۹ بایت کد. دو بایت برای شماره خط، دو بایت برای آدرس شروع خط بعدی، یک بایت کد FOR، یک بایت I، یک بایت علامت مساوی، یک بایت عدد ۱، یک بایت کد TO و یک بایت هم ۱۰۰. وقتی این را فهمیدم به این فکر افتادم که احتمالا می‌شود با چند دستور POKE و عوض کردن خانه‌های مناسب حافظه، خود کدهای برنامه در حال اجرا را عوض کرد به گونه‌ای که در هر بار اجرا عملکردی متفاوت داشته باشد.

escher-hands

برنامه‌ای برای این کار نوشتم و آنقدر با شماره خط‌ها و علامت‌های «:» اضافی (جدا کردن دستورات در یک خط) بازی کردم تا بالاخره تغییر محتویات آدرس‌ها Syntax برنامه را خراب نمی‌کرد. حالا برنامه‌ای داشتم که در یک بار اجرا عدد ۱ را چاپ می‌کرد و بار دوم عدد ۲ را و این کار را با متغیرها انجام نمی‌داد. سورس برنامه عوض می‌شد و اگر از آن LIST می‌گرفتم، هر بار لیستی جدید را به نمایش می‌گذاشت! البته هیچ کاربردی برای این برنامه متصور نبودم، اما همین الان با خواندن مطلب ویکی‌پدیا در مورد self-modifying code فهمیدم که چنین برنامه‌هایی می‌توانند کاربردهای جالبی داشته باشند!

احتمالا الان می‌توانید حدس بزنید که ۲۰۶۱ از کجا آمده است. برنامه بیسیک تنها برای این نوشته شده بود که برنامه اصلی بازی به زبان ماشین را صدا بزند. برنامه‌نویسان هم برای حداکثر استفاده از حافظه، روال‌های زبان ماشین را درست از اولین آدرس خالی بعد از کدهای بیسیک ذخیره کرده بودند.

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

کارتریج ACTION-VI : دنیای جدید

در جست‌وجوی یک کارتریج اسمبلر به کارتریج اکشن ۶ برخورد کردم (که باز هم مطابق دید عموم مردم از کمودور ۶۴ به عنوان یک کنسول بازی) برای «نسوز کردن بازی‌ها» مشهور شده بود. اما ابزاری بسیار قدرتمند بود و توانایی‌هایی بسیار بیشتر از اجرا کردن کدهای تقلب بازی‌ها داشت.

 

ActionReplay-6

این کارتریج یک برنامه اسمبلر سریع با خودش داشت. امکاناتی برای فرمت کردن و آماده‌سازی دیسکت‌ها، گرفتن نسخه‌های پشتیبان، دستکاری تنظیمات حافظه و نصب یک Fast Loader فراهم می‌کرد و از همه مهم‌تر سیستمی داشت که می‌توانست محتوای حافظه RAM کمودور را به اصطلاح فریز کرده و بعد از ویرایش خانه‌های دلخواه دوباره کمودور را وادار به ادامه کارش کند. یکی از کلیدهایی که بالای کارتریج می‌بینید (معمولا سمت راستی) دکمه ریست است و دیگری دکمه فریز کردن حافظه. تصویر زیر صفحه آغازین کمودور را هنگام زدن کلید ریست این کارتریج نشان می‌دهد.

ActionReplay6-ScreenShot

در این صفحه من هیچ‌گاه از گزینه CONFIGURE MEMORY سر درنیاوردم و از آن استفاده نکردم. اما در قسمت UTILITIES یک اسمبلر سریع و راحت وجود داشت که با آن اسمبلی را هم کمی تجربه کردم.

بالن هوای گرم، با سرعت نور

اولین برنامه کاملی که با دستورهای اسمبلی نوشتم، اسپرایت بالن مشهور کمودور را در بالا سمت چپ صفحه نمایش می‌داد و سپس در یک حلقه هر بار یک واحد به x و y آن اضافه می‌کرد تا به سمت پایین سمت راست صفحه حرکت کند. البته اول اسپرایت را با برنامه اسپرایت ادیتوری که خودم نوشته بودم، ساختم و در خانه‌های حافظه گذاشتم و بعد با اسمبلر کارتریج مختصات‌دهی آغازین و روال حلقه را پیاده کردم. بار اول با این که برنامه کامل و بی‌اشکال بود هیچ چیزی روی صفحه ظاهر نشد. بعد از چندین بار آزمایش و خطا فهمیدم که سرعت این برنامه به حدی زیاد است که بالن حرکت را انجام می‌دهد، اما من آن را نمی‌بینم.

balloon

برای کند کردن سرعت برنامه دو حلقه تو در توی ۲۵۶ تایی خالی را برای تلف کردن وقت داخل حلقه اصلی بازی گذاشتم تا موفق شدم بالن را ببینم. اما باز هم بالن با سرعت نور قطر صفحه را طی می‌کرد و برنامه تمام می‌شد. به این فکر افتادم که برنامه ۸ وزیر را برای سرعت بالا با اسمبلی بنویسم ولی سواد واقعی من در اسمبلی به چند دستور JMP و CMP و ADD محدود می‌شد که برای برنامه‌ای پر از شرط و محاسبات مانند ۸ وزیر بسیار کم بود.

مالتی تسکینگ واقعی با IRQ

احتمالا می‌دانید که وقفه‌ها یا IRQ (سرنام Interrupt ReQuest) روال‌هایی هستند که به صورت منظم و در فواصل زمانی مشخص توسط پردازنده کامپیوتر اجرا می‌شوند.  دلیل این که وقفه نامیده می‌شوند این است که پردازنده در این فواصل زمانی برنامه در حال اجرا را متوقف کرده و روال‌های IRQ را اجرا می‌کند و دوباره به سراغ برنامه اصلی باز می‌گردد. استفاده از وقفه‌ها بیشتر به دردبرنامه‌نویس‌های سیستم می‌خورد که توسط آن‌ها تمام مدت ابزارهای جانبی را برای دریافت یا ارسال اطلاعات کنترل کنند یا در بازی‌ها و برنامه‌های بی‌درنگ (Real Time) شرط‌های حیاتی را به صورت مداوم چک کنند. مثلا سیستم پیش‌فرض کمودور از یکی ازهمین وقفه‌ها برای نمایش مکان‌نمای چشمک‌زن استفاده می‌کرد.

IRQ

برای امتحان کردن این قابلیت عجیب هم تنها هنری که توانستم به خرج دهم این بود که روالی را به اسمبلی نوشتم که دایما بیت‌های کنترلی کلیدهای SHIFT و CONTROL را تست می‌کرد و در صورت فشرده شدن این کلیدها به ترتیب رنگ زمینه متن و رنگ حاشیه آن را عوض می‌کرد. این چیزی بود که در جمع دوستان هم کسی به سراغش نرفته بود و برای همه‌مان جذاب بود که سیستم در عین حالی که وظایف معمولش را انجام می‌دهد، بدون هیچ کد مریی کار دیگری را هم به صورت همزمان در دست اجرا دارد.

هک آخر، بازی دوست‌داشتنی

و اما آخرین و از دید خودم جذاب‌ترین هکی که انجام دادم، به قابلیت فریز کردن حافظه کمودور توسط کارتریج اکشن ۶ مربوط بود و بازی Arkanoid که در قسمت اول از آن صحبت کردم. اندکی پس از شروع بازی، کلید فریز را می‌زدم و وارد منوهای اکشن ۶ می‌شدم. آن‌جا گزینه‌ای برای نسوز کردن بازی وجود داشت. سیستم کار به این شکل بود که یک بار محتویات حافظه را بررسی (یا ذخیره) می‌کرد. بعد از شما می‌خواست به بازی برگردید و عمدا یک بار ببازید و دوباره حافظه را فریز کنید. وقتی این کار را می‌کردید دوباره حافظه را چک می‌کرد تا ببیند محتویات کدام خانه‌ها عوض شده است. معمولا با همان یک بار و گه‌گاه با دوبار تکرار این فرآیند خانه‌ای که اعداد مربوط به «جان» کاراکتر بازی در آن ذخیره شده بود پیدا می‌شد و کارتریج از آن به بعد محتویات آن خانه را ثابت نگه می‌داشت. یعنی بازی شما دیگر نسوز شده بود!

arkanoid_level_10

اما باز هم بازی کردن ۳۲ مرحله Arkanoid با احتساب هر مرحله ۲ یا ۳ دقیقه، آن هم بدون SAVE کلی زمان می‌برد. هک اصلی این بود که من بعد از نسوز کردن بازی به سراغ محتویات حافظه تصویر می‌رفتم و آن‌ها را پاک می‌کردم. اگر خاطرتان مانده باشد در قسمت قبلی گفتم که پس‌زمینه‌ها و برخی اجزای بازی‌ها با فونت‌ها ساخته می‌شدند. من چیزی مانند دستور cls را اجرا می‌کردم و خلاص! همه آجرها از بین رفته بودند. فقط کافی بود در هر مرحله یک بار فریز کنم، حافظه تصویر را پاک کنم و بعد از برگشت به بازی عمدا بسوزم.

arkanoid_last_level
غول مرحله آخر

جان‌هایم که تمام نمی‌شد، اما بعد از سوختن و شروع مجدد مرحله، کامپیوتر متوجه می‌شد که تمام آجرها پاک شده و من به مرحله بعد می‌رفتم! تنها در برخی مراحل که حریف‌های متحرک هم وجود داشتند، مجبور بودم نهایتا ۵ یا ۶ ضربه موفق (به آن اسپرایت‌ها) بزنم تا آن مرحله هم تمام شود. فقط مرحله آخر بود که در ساخت غول آن از اسپرایت و آجر و غیره خبری نبود و این مرحله را باید حتما به صورت عادی رد می‌کردم. به این ترتیب من تقریبا در ۹۰ درصد اوقات بازی را تا آخر تمام می‌کردم و بلند می‌شدم! باید اعتراف کنم این کار به خصوص در جمع‌های فامیلی، باعث می‌شد حس یک گیک تمام عیار را داشته باشم!

پایان داستان

شاید شما هم کنجکاو باشید که بر سر این ابزار عزیز چه آمد! واقعیت چندان هم جذاب نیست! حدود سال ۸۱ بود، ده سال از خرید کمودور می‌گذشت و در دوران پادشاهی پنتیوم ۲ و ۳ مدت‌ها بود سراغش نرفته بودم. آن زمان هم هیچ‌گاه فکر نمی‌کردم چنین حس نوستالژیکی نسبت به این اولین کامپیوترم پیدا کنم. به همین دلیل آن را با همه کارتریج‌ها و نوارها و دسته‌های بازی در اصفهان به قیمت ۱۰۰۰۰ تومان فروختم. کاری که اکنون حس می‌کنم از انجامش به شدت پشیمانم!

c64_Pack


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

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

تا آن زمان، با ماشین‌های‌تان خوش باشید و لذت ببرید!

12 دیدگاه

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

  1. خوندن این چهار پست شما واقعاً برای من جالب بود. به خاطراتتون حسادت میکنم، کمودور 64 رو در زمانی بسیار دور یادم هست ولی متاسفانه توانایی مالی تهیه اون رو نداشتم. بعدها با میکروکنترلر 8051 وارد دنیای الکترونیک و کامپیوتر شدم و بعد در دانشگاه با Z80! من حتی با آپ‌کد ها برنامه مینوشتم و گاهی مورد تمسخر اطرفیان هم بودم بخاطر این کار. چیزی که این روزها دانشجوهای کامپیوتر هیچ تصوری از اون ندارند!

  2. اقا دست مریزاد .یعنی دقیقا عین شما یکم پیشترفته تر باهاش کارمیکرد باهاش برای دستگاه میکس آنالوگ دمو هم ساختم بعدش comodore 128 شد و بعد آمیگا 500 و بلاخره پی سی .بسیار لذت بردم .آفرین بر شما آفرین.

  3. سلام ، نوشته های شما را در این سایت خواندم ، به خصوص مطالب کمودور64 اش خیلی جالب بود ، دیدم که در یکی
    از مطالبتان به کارتریج اکشن شش اشاره کرده اید ، آیا می دانستید که کارتریجی وجود داشت که هر کاری که اکشن
    انجام می داد، خیلی بهتر انجام می داد ،Final Cartridge III که هر کاری که کارتریج اکشن انجام می داد ، این هم انجام می داد و علاوه بر آن کلی گزینه دیگر هم داشت،در ضمنرابط گرافیکی هم داشت و از موس و جویستیک هم پشتیبانی می کرد که اکشن نه رابط گرافیکی داشت و نه از موس و جویستیک پشتیبانی می کرد ؛ اکشن مونتاژ ایران بود )شرکت تولید کامپیوتر( در حالیکه فاینال کارتریج ساخت هلند بود.فاینال کارتریج را بنده برای فروش دارم .

    1. ممنون از وقتی که گذاشتید و همینطور از پیشنهادتون. متاسفانه خود کمودور رو دیگه ندارم که براش کارتریج بخرم. از قیمت خود دستگاه خبری دارید؟

  4. سلام ؛ این دستگاه c64 ای که در ایسام برای فروش قرار داده شده برای برادر من است ؛ اگر خواستی شماره یا ایمیلش را به شما می دهم.

  5. سلام
    لینک این صفحه را یکی از اقوام برای من ارسال کرد.سال 1367 کمودور64 را به قیمت 26500 تومان خریدم
    با اطلاعاتی که از بیسیک داشتم برنامه نویسی در رشته عمران را با آن ادامه دادم.یکی از برنامه ها(در خصوص
    بهینه سازی برش طولی) بعد از 20 سال تلاش و پیگیری یکی از بهترین برنامه های جهان شد.
    دو بار برد تلویزیون بخاطر بازی شطرنج سوخت.در زمینه آهنگ و ساخت موزیک در زمان خود بهترین بود.
    الان هم دارم ولی پس از چند دقیفه کار کردن صفحه تلویزیون مواج می شود.ظاهرا” منبع تغذیه مشکل دارد و یدکی
    آنهم پیدا نمی شود. ممنون از یاد آوری خاطرات گذشته

  6. سلام عزیزم
    نوشته‌هایتان بسیار زیبا , خاطره انگیز و روان است.دست مریزاد.در لینک این برایتان درخواست فرستادم.🤗

  7. درود آفرین به این هنر نویسندگی همینکه خاطرات دلنشین قدیمی را با مطالب تخصصی اینقدر روان بیان میکنید جای تشکر دارد
    بیشتر افرادی که در این زمینه کار کرده اند نقاط مشترک زیادی دارند
    برای من همینقدر آن دوران جالب بود که الان که به یکی از ساده ترین کارهای برنامه نویسیم نگاه میکنم تعجب میکنم که چطور اسپرایت یک بازی را با موزیک بازی دیگر با برنامه بیسیک خودم ترکیب کردم! آن هم فقط با یک نوارگردان و کارتریج اکشن 4
    انقدر در ان دوران به سیستم نزدیک بودیم که مجبور بودیم بیت به بیت دستگاه را یاد بگیریم اگه فقط کمی کنجکاوی داشتیم
    تقریبا غرق اطلاعات این سیستم شده بودیم که به یکباره همه چیز تغییر کرد…
    موفق باشید

  8. درود.از مطالب شما لذت بردم.من اکثر مدلهای کامپیوترهای خانگی آن دوره شامل کمودور،آمیگا،سینکلر،تگزاس،آتاری و پی سی های نسل اول و همچنین کنسولهای بازی قدیمی را جمع کردم.اگر دوست داشته باشید تو پیچ من retro_malek میتونید بعضی ها را ببینید

پاسخ دادن به مهدی لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *