התגובות שלי בפורום
-
מאתתגובות
-
DL!משתתף
עוד נקודה למחשבה:
ב-8086 פקודת
JMP
היא רלטיבית. ז"א, ה"קידוד" שלה בשפת מכונה אומר משהו בסגנון "קפוץ 314 בתים אחורה", ולא "קפוץ לכתובת 0".לכן, הבתים
E9 FD FE
שאתם משתמשים בהם, יקפצו לכתובת 0 רק אם המעבד מריץ אותם מהכתובת 0x100.DL!משתתףהקוד שלכם אינו קוד חוקי באסמבלי 16 ביט (שבו משתמשים בתחרות), כיוון שאין אפשרות לכתוב לזיכרון יותר מ-16 ביט באופקוד בודד.
לכן השורה
mov [0], 0e9fdfeh
אינה חוקית.זה משהו שהקומפיילר / אסמבלר שלכם היה אמור לצעוק עליו.
DL!משתתףהבעיה שלכם היא שהמנוע לא זיהה את השורדים שלכם כשייכים לאותו צוות, ולכן הזיכרון הצוותי שלהם מצביע על מקומות שונים.
הסיבה היא שקבצי השורדים שלכם מכילים סיומת קובץ
cgx
זאת היתה סיומת הקובץ הישנה, של הגירסה הקודמת של המנוע (מלפני שנה).המנוע החדש לא זקוק לסיומת קובץ כדי לזהות את השורדים. הוא פשוט טוען את כל מה שנמצא בספריה
survivorsבקיצור, תשנו את השורדים שלכם ל
DF1, DF2
(ללא סיומת קובץ!)
והכל אמור לעבוד.DL!משתתףקודם כל, תרגעו
תוכלו לפרט מה בדיוק לא עובד לכם ?
האם השורד "מת", או קורה משהו אחר ?המנוע זיהה את שני השורדים שלכם כשייכים לאותו צוות ?
(הם מופיעים באותה עמודה ברישום התוצאות ?)DL!משתתףענינו כבר על השאלה הזו בעבר:
http://codeguru.co.il/CS/forums/109/ShowPost.aspxבכל מקרה, בשלב זה אנחנו לא מתחייבים לגבי נוכחות זומבים בתחרות, ואנחנו שומרים את האפשרות לזרוק לכם זומבי ביום התחרות (אולי אפילו את זה שפורסם), כדי להפוך את המשחק למעניין יותר.
DL!משתתףיש להגיש את השורדים בדיוק כפי שהמנוע מריץ אותם, ז"א את הקוד המקומפל.
אנחנו לא יודעים באיזה אסמבלר השתמשתם, ובטח לא מתכננים לקמפל את הקוד בשבילכם.
גם בבוקר התחרות, הצוותים יקבלו אך ורק את הקוד המקומפל של הצוותים האחרים.DL!משתתףFollowing are the relevant code snippets from the engine:
/** Maximum possible Warrior speed. */
private final int MAX_SPEED = 16; // when Energy = 0xFFFF/**
* Returns the warrior's current speed, using the following formula:
* Speed := Min(MAX_SPEED, 1+Log2(Energy))
*
* This formula forces the warrior to put more and more effort in order to
* increase its speed, i.e. non-linear effort.
*
* @param energy The warrior's Energy value.
* @return the warrior's current speed,
*/
private int calculateWarriorSpeed(int energy) {
if (energy == 0) {
return 0;
} else {
return Math.min(MAX_SPEED, 1 + (int)(Math.log(energy) / Math.log(2)));
}
}/**
* Determines whether or not a given warrior deserves an extra opcode,
* by calculating the warrior's current speed (using its current Energy
* value), and comparing it against a random value.
*
* We use a random-based algorithm (as opposed to a deterministic one) for
* the following reasons:
* a) simple implementation – there is no need to keep record of past
* decisions as our algorithm is stateless.
* b) we want the warrior's speed to vary between x1.0 to x2.0, and this
* solves the issue of determining what to do if the current speed is x1.7
*
* @param warrior The warrior.
* @return true if the warrior deserves an extra opcode, otherwise
* returns false.
*/
private boolean shouldRunExtraOpcode(Warrior warrior) {
int energy = Unsigned.unsignedShort(warrior.getEnergy());
int speed = calculateWarriorSpeed(energy);
return (rand.nextInt(MAX_SPEED) < speed);
}DL!משתתףהתשובה מופיעה באתר:
http://www.codeguru.co.il/Xtreme/tech3.htmDL!משתתףהמקסימום שאתה יכול לשאוף אליו הוא לקבל אופקוד אחד נוסף בכל סיבוב, ז"א במקרה הטוב ביותר תקבל זמן מעבד כפול מהרגיל.
תקרא שוב את הקטע באתר שמסביר את נושא האצת הזמן…DL!משתתףהמימוש הנוכחי משתמש בסגמנט
0x1000
אבל אין שום התחייבות שזה ישאר כך בעתיד (הקרוב או הרחוק).DL!משתתףThe IP register (IP = "Instruction Pointer") always points to the next opcode that the CPU is going to run.
It's not necessarily incremented by 1 every round. For example, running a 3-byte opcode (e.g. "MOV AX, 00000h") causes IP to be incremented by 3. Also, IP can be set to any arbitrary value using the JMP or CALL opcodes.
DL!משתתףלצערי, גם במקרה זה התשובה היא שלילית.
DL!משתתףNo, they were already valid on the 8086.
A good way to find out is to see what the windows "debug.exe" supports (it only supports 8086 opcodes).DL!משתתףFollowing are all 8086 features that aren't supported by the engine:
- segment prefixes: ES:, DS:, SS:, CS:
- ASCII conversion: DAA, DAS, AAA, AAS, AAM, AAD
- bit shifting: ROL, ROR, RCL, RCR, SHL, SHR, SAR
- signed multiplication: IMUL, IDIV
DL!משתתףהתשובה היא שלילית.
-
מאתתגובות