לפני הכל!

עמוד זה מפרט את הכללים הטכניים הבסיסיים לכתיבת השורד שלכם.

ההוראות נכתבו תוך הנחה שהקורא הוא בעל ידע בסיסי בתכנות אסמבלי. בניגוד לדעה המקובלת, אסמבלי אינה שפה קשה במיוחד ללמידה וניתן למצוא לה אינספור מדריכים במנועי החיפוש באינטרנט. אפשרות נוספת היא ללמוד דרך הסתכלות על קוד שורדי הדוגמא.

כתיבת השורדים שלכם

שורד cgx הוא למעשה תוכנית אסמבלי מקומפלת. שם השורד המשתתף בתחרות נקבע עפ"י שם הקובץ (ללא הסיומת, כמובן).

על קוד השורד להכיל אך ורק אופקודים הנתמכים ע"י מעבד 8086, ולהשתמש בפקודות 16 ביט בלבד. לאחר כתיבת השורד באסמבלי, יש לקמפל אותו כקובץ com, ולהעתיק אותו לספריה survivors תחת ספרית מנוע המשחק (על מנת שהמנוע ידע לזהות אותו בתור שורד חוקי). מומלץ (אך לא חובה) לשנות את סיומת הקובץ מ-com לסיומת ריקה.

בדומה לקובץ com רגיל, קובץ השורד מכיל את הקוד הסופי בדיוק כפי שיטען לזיכרון ויורץ ע"י מנוע המשחק. יחד עם זאת, בשונה מקובץ com, השורדים אינם יכולים להניח טעינה לכתובות קבועות, כיוון שמנוע המשחק טוען אותם בכל סיבוב לכתובת אקראית. שימו לב: טעות נפוצה היא לקמפל את קוד השורד לקובץ exe, ולנסות לטעון אותו למשחק כך. כיוון שקובץ exe מכיל header בנוסף לקוד עצמו, הרצת שורד שנבנה מקובץ כזה תגרום לתוצאות שגויות ובלתי צפויות.

כל שורד מקבל סט אוגרים (רגיסטרים) מלא משלו, שאינו נגיש לשורדים האחרים. בנוסף, לכל שורד מוגדרת מחסנית "אישית" של 2048 בתים, שגם היא אינה נגישה לשורדים האחרים.

לפני הרצת סיבוב המשחק הראשון, מנוע המשחק מאתחל את כלל הבתים בזירה לבית 0CCh (שימו לב: בית זה מהווה פקודה "בלתי נתמכת" - פרטים בהמשך). לאחר מכן, המנוע טוען כל שורד למיקום אקראי בזיכרון הזירה, ז"א - מעתיק לשם את תוכן קובץ השורד כמו שהוא בדיוק. המרחק בין שני שורדים, וכן המרחק בין השורד לבין קצה הזירה, מובטח להיות לפחות 1024 בתים. גודל השורד המקסימלי המותר הוא 512 בתים.

לפני הסיבוב הראשון, מנוע המשחק מאתחל את האוגרים (של כל שורד) לערכים הבאים:

  • BX,CX,DX,SI,DI,BP - מאופסים.
  • דגלים - מאופסים.
  • AX,IP - מיקום השורד ההתחלתי, ההיסט (offset) האקראי בזירה אליו נטען השורד ע"י מנוע המשחק.
  • CS,DS - מקטע (segment) הזירה המשותף לכלל השורדים.
  • ES - מקטע (segment) לזיכרון המשותף לשורדים מאותה קבוצה (ראה טכניקות מתקדמות).
  • SS - מקטע תחילת המחסנית האישית של השורד.
  • SP - היסט תחילת המחסנית האישית של השורד.

בשלב זה מתחילה התנהלות המשחק בסיבובים, כאשר בכל סיבוב מריץ מנוע המשחק את הפקודה הבאה של כל שורד, עד לסיום המשחק: לאחר 200,000 סיבובים, או כאשר נשאר שורד בודד בזירה. הסדר בו ישחקו השורדים בכל סיבוב נקבע בתחילת המשחק באופן אקראי, ואינו משתנה במהלכו.

שורד נפסל במקרים הבאים:

  • הרצת פקודה בלתי חוקית (לדוגמא: הבית 060h שאינו מתרגם לאף פקודת אסמבלי).
  • הרצת פקודה "בלתי נתמכת" ע"י מנוע המשחק (לדוגמא: "INT 021h"). מנוע המשחק מונע הרצת פקודות המנסות ליזום תקשורת ישירה מול מערכת ההפעלה או חומרת המחשב.
  • ניסיון גישה לזיכרון שאינו בתחומי הזירה, ואינו בתחומי המחסנית ה"אישית" של השורד.

תקיפת שורדים אחרים מתבצעת ע"י כתיבת מידע על הקוד שלהם בזיכרון הזירה (במטרה לגרום להם לבצע אחת משלוש הפעולות הנ"ל), ובעקבות כך לפסילתם. קודם לכן, לפיכך, יש למצוא היכן הם מסתתרים :)

לאחר שתצליחו לכתוב שורד משלכם (ולנצח את שורדי הדוגמה?), תוכלו לקרוא על הטכניקות המתקדמות במשחק.

בהצלחה!