במצב הגרפי הבסיסי VGA 13h, אין לי שום בעייה, והשתמשתי, כאמור, בבאפר חיצוני אליו אני מכניס נקודות. העדכון מתבצע כך שמועתק תוכנות של הבאפר אל כתובת המסך.במקרה של VESA, זה לא כל כך הולך לי... כלומר אני לא כל-כך מבין את העניין של ה-Banks.
כשאני שם נקודות ישר לזיכרון המסך, אני משתמש בפונקציה שמעדכנת את ה-Bank המתאים, וזה עובד.
עכשיו, נניח שיש לי פונקציה שנקראת (set_bank(int, שמשנה את ה-bank הנוכחי.
ללא באפר, בכל נקודה שציירתי על המסך, חישבתי את ה-Bank שהיה עלי להגדיר, ושיניתי לפיו, והכל עבד מצויין.
כשיש לי באפר, ויש לי פונקציה שנקראת (update_buffer(void, שאומרה להציג את תוכן הבאפר על המסך, אז מה אני צריך לעשות?
בתחילה, פשוט העתקתי את כל תוכן הבאפר לזיכרון של המסך, ואז קיבלתי, כנראה, רק bank אחד. אחר כך, עשיתי לולאה שמעתיקה את כל תוכן הבאפר n פעמים, כאשר אני משנה את ה-Bank לפי n, וקיבלתי, כאמור, מין שורות (די עבות, כמו שציינתי, בערך 2/3 Bank... לפי ראות עיני, ולא במדוייק, וזה גם לא רלוונטי), בגובה של בערך 1/8 מגובה המסך, כל אחת... כאשר הן לא צמודות... כלומר, שורה בצבע כלשהו, שורה שחורה, שורה בצבע כלשהו, שורה שחורה...
אחר-כך ניסיתי ע"י הגדרת פוינטר לפוינטר שמצביע על הבאפר, שאותו אני מקדם כל פעם ב-64KB, ומעתיק לפי השיטה האחרונה רק את התוכן שבו... זה בכלל לא עבד.
בקיצור... איך צריכה להיות בנויה הפונקציה update_buffer?
תבנית:
void update_buffer(void) { while(inportb(INPUT_STATUS_0) & 8); while(!(inportb(INPUT_STATUS_0) & 8)); . . . setbank(איזשהו מספר); . . . _fmemcpy(video_mem, video_buffer, video_size); }
|
בבקשה תעזרו לי...
Dudenland