בשנת 2016 לקחתי TOMY Teacher ישן, צעצוע חינוכי ששרד איכשהו במשפחה מאז שנות השמונים, ופענחתי את הדרך שבה המיקרו-בקר העתיק שבפנים יצר מפתח תשובות על סמך קוד צבעים שהודפס על דפי חידות. הנה פוסט הפענוח, ופוסט מאוחר יותר שבו גיליתי קודים נוספים שאף משתמש לא ראה (או לפחות לא אמור היה לראות) מעולם. כל זה היה חידה לוגית נחמדה, אבל תוך כדי פתרונה חשבתי גם על כך שאפשר, בעזרת מיקרו-בקר מודרני, לשחזר בקלות את הפונקציונליות האלקטרונית של הצעצוע כולו.
ככל שהילדים שלי המשיכו לשחק עם הטומי התגברה ההבנה שהוא לא ישרוד לנצח. במקביל, מדי כמה חודשים המשחק הוזכר בפורומי נוסטלגיה ורטרו למיניהם. בעקבות אחד מהאזכורים האלה, לפני כשנה, תפסתי טרמפ על הזמנה עסקית ושלחתי לייצור שני לוחות PCB שתכננתי ברגע האחרון. שני הלוחות ביחד יכולים, לפחות בתיאוריה, לשמש תחליף ל-PCB המקורי הגדול של הטומי. זאת אומרת, מבחינת מיקומי הלחצנים והלדים הם פחות או יותר תואמים, אך כל הרכיבים שעליהם מודרניים ושונים לגמרי מאלה שבמקור. זה אומר שבשביל חיקוי פונקציונלי, הלוחות האלה הם רק בסיס פיזי: צריך גם לכתוב את התוכנה מאפס, וכדי שהיא תהיה נאמנה למקור, עליה לשחזר את כל הפרמטרים של הטומי. לא רק מפתח תשובות, אלא גם ובעיקר זמני המתנה ותגובה לפעולות המשתמש, קצבי הבהוב אורות, תדרי צלילים וכו' וכו'. את כל אלה צריך לברר ולמדוד במדויק.
אז החלטתי שהגיע הזמן ליצור העתק מודרני של האלקטרוניקה והתוכנה של ה-TOMY Teacher הישן והאהוב. חשוב לציין שאין לי שום כוונה לשחזר את הפלסטיקה המקורית, או את חוברות השאלות. בלעדיהן הפרויקט הוא אמנם "חצי עבודה", אבל אני לא בית דפוס, והדחף הנוסטלגי לא מספיק חזק – הטומי היה בכלל של אשתי כשהייתה קטנה, לא שלי. את פרויקט השיחזור תלווה סדרת הפוסטים הזו, "יומני טומי", שבה אפרט על שלבי הפיתוח השונים.
בגדול, הפרויקט מורכב מארבעה חלקים, שלכל אחד מהם יוקדש פוסט נפרד אחד או יותר (לא בהכרח לפי הסדר):
1. ממשק המשתמש
אילו צלילים ומנגינות הטומי משמיע, ומתי? כמה זמן הוא מחכה לתשובה עד שהוא מתייאש ועובר לשאלה הבאה? מה נחשב "הצלחה" בסבב שאלות, ומהו דפוס האורות של הפידבק לשחקן? איך כל אלה משתנים כשהשחקן משנה את מהירות המשחק? הנתונים הללו, וכל שאר הפרמטרים של הממשק, הם שרירותיים – פשוט החלטות של מתכנני המשחק, ואין ברירה אלא לשבת ולתעד אותם אחד אחד. חלק מהמידע אפשר לשאוב מסרטונים ביוטיוב, למשל, וחלק יחייב התחברות ישירה לחומרה המקורית.
2. חומרה
החומרה שהכנתי היא ברמת אבטיפוס, זאת אומרת – במקרה שלנו – הרכיבים מסוגלים בעיקרון לעשות את אותם הדברים כמו המשחק המקורי, אבל לא תואמים במאה אחוזים לכל ה"מסביב". לדוגמה, אי אפשר לחבר את המעגל החשמלי ישירות לבית הסוללות המקורי, שמחזיק 8 סוללות AA במתח מצטבר 12V. כשאכתוב על נושא החומרה אפרט את השיקולים והבחירות מאחוריה, את אופן הפעולה שלה, ואת הדברים שיהיה צריך לשנות בה בעתיד בשביל תאימות מלאה.
3. שכבת הפשטה לחומרה (HAL)
כמו בכל פרויקט אמבדד, כדי שקוד התוכנה יהיה קריא ונוח לשינויים/תיקונים, כדאי "לעטוף" את הפקודות שניגשות ישירות לחומרה בפונקציות מופשטות יותר. לדוגמה, אם כדי להדליק או לכבות את לד מס' 3 על המעגל צריך לשנות את הביט השלישי ברגיסטר PORTA.OUT של המיקרו-בקר, עדיף להכניס את כל הווריאציות והפרטים הקטנים האלה לפונקציה אינטואיטיבית אחת בנוסח "writeToLed(index, value)". פונקציות כאלה נקראות בשם הכללי Hardware Abstraction Layer, והן אמנם לא חלק מה"לוגיקה" של המשחק, אך הן חיוניות לבנייה שלו.
4. קוד המשחק
הקוד יחבר כמובן את כל החלקים לכדי משחק שלם, ויכלול עוד משהו חשוב מאוד, שהמשתמש לא יראה: פלט דיבוג, דרך חיבור תקשורת UART פנימי. הטומי הוא פרויקט קל יחסית לתכנות ולא צפויים בו קשיים, ובכל זאת – בשביל ההרגלים הנכונים ובשביל הקטע הפדגוגי – אני אקים גם בו תשתית בסיסית לפלט נסתר שיפרט מה קורה בתוכנה בכל רגע נתון.
מתחילים
כנקודת פתיחה מסודרת לכתיבת קוד המשחק, הכנתי את תרשים הזרימה הבא, שמתאר באופן כללי מה הטומי עושה. התרשים (לא סופי!) לא נכנס לכל הפרטים הקטנים, זו רק מסגרת שתעזור לי לסדר את הקוד ולוודא ששום דבר לא מתפספס בגלל חוסר תשומת לב זמני.
יש חומרה, יש תוכנית פעולה, סקיצות – הכול מוכן, אפשר לצאת לדרך!