|הדגש|בעיה ב-Protected Mode|סדגש|

MotiAd

New member
|הדגש|בעיה ב-Protected Mode|סדגש|

יש לי בעייה קשה מאוד... אני עובד עם VESA שהוא תקן לגרפיקה ומאפשר שימוש ברזולוציות גבוהות. הכל עובד טוב ויפה עד שמגיעים גם לעומקי צבע מכובדים שבהם גודל סגמנט (64 K) לא מאפשר להדפיס על כל המסך. לשם כך יש טכניקה שנקראת Bank Switching שאם מישהו מוכן להסביר לי איך מביאים אותה לידי יישום באסמבלי אני אשמח מאוד. אבל לא זה מה שחשוב אני עובד על מערכת הפעלה שאמורה לעבוד ב-Protected Mode ו-32 BIT ואז VESA שעובד ע"י שימוש ב-Interrupts כבר לא עובד, משום שאומרים ש-Interrupts לא עובדים ב-Protected Mode לפחות לא אלה של VESA. כל מה שאני רוצה זה לעבוד עם VESA ב-32 BIT. מה אני צריך לעשות? בדוקומנטציה הזכירו שיש מושג שנקרא Entry Point של Protected Mode ובו מגבים את כל ה-BIOS לתוך כתובת מסויימת. ואז פשוט קוראים לקוד שבכתובת המסויימת. איך אני יכול לדעת באיזה סגמנט מצוי הקוד של הפונקציות של VESA? אני קורא להן דרך Int 10h וב-AX אני שם 4F00h נניח, AH מכיל תמיד 4Fh. יש דרך לדעת איפה זה ממוקם כך שאני אוכל לראות את הקוד מקור של אותן פונקיציות? או שמראש הכל אבוד? ולעבוד עם VESA ב-32 BIT זה אבוד? יש מצב שנקרא FLAT כמו TINY COMPACT SMALL HUGE וכו (MODELS). מה המשמעות שלו? משהו?!!!!!
 

voguemaster

New member
אוי מוטי....

קודם כל, תן לי להציע לך להפסיק לנסות לעבוד עם החלפת בנקים. כתבתי פעם שיגרה שמציגה ספרייט על המסך תוך שימוש בבנקים, ועם COLOR KEYS וכד´.. זה ממש ממש לא יעיל. כמובן שאז ידעתי אסמבלי קצת פחות טוב, אבל בכל מקרה הנקודה היא שלצייר עם החלפת בנקים הורס את הביצועים. אינטרפטים עובדים אחרת ב-PM, אני כבר לא זוכר איך זה עובד בדיוק, אבל תחפש חומר על תוכניות ב-PM באסמבלי, ואני בטוח שתמצא דוגמאות לעניין. כנראה שצריך לשחק עם ה-IDT או ה-VECTOR TABLE כדי לאפשר גישה.. זה לא אבוד לעבוד עם VESA כי כך עבדו כל המשחקים שתוכנתו ב-PM לפני תקופת WINDOWS. כל משחק DOS שבו מופיע DOS4GW פועל ב-PM. רק לשם הפרוטוקול, DOS4GW הוא מה שנקרא DPMI, שזה DOS PROTECTED MODE INTERFACE. איך שלא יהיה, החל מ-VESA2.0, מציירים למסך בעזרת BUFFER לינארי (VESA ממפה את הזיכרון של כרטיס המסך לכתובת וירטואלית), ולכן די ברור שעובדים עם VESA במצב 32 ביט. בקשר ל-FLAT, לא יודע אם קיבלת את מה ששלחתי לך בזמנו, אבל כל מה שזה עושה זה לאפשר לך לגשת לכל מרחב הזיכרון (4 ג´יגה) בלי PM (לא עובד תחת חלונות, מצד שני לחלונות יש מודל FLAT משלה
). בין אם זה ה-FLAT ששלחתי לך או זה של חלונות (אם אתה כותב באסמבלי ל-WIN32), אתה מסוגל להשתמש בכתובות בצורה חופשית לחלוטין, לדוגמא:
xor ax,ax mov es,ax ; zero out ES mov EDI, 0A0000h ; load offset of graphics buffer mov ECX, <number of DWs to write>; ; counter repnz STOS es:[edi] ; store a DW at EDI and advance​
כמו שאתה רואה, משתמשים ב-EDI (כאשר ES שווה 0, כך הכי קל) כדי לציין כתיבה למסך הגראפי (או לבנק מסוים אם אתה עובד עם בנקים, מה שלא מומלץ..) ואז רק מריצים לולאה על כמה שרוצים לכתוב. אם נניח אתה עובד עם VESA, ואתה מקבל מצביע לזיכרון כרטיס המסך (בד"כ זה יהיה ב-E000000h אבל לא תמיד), אתה יכול להחליף את A0000h בכתובת של זיכרון המסך ופשוט לכתוב לשם
אלי
 

MotiAd

New member
קיבלתי...

קיבלתי את הקוד ל-FLAT אבל אני מעוצבן מאוד על כל הקטע הזה (בצחוק). למה אינטל ממררת לנו את החיים? חשבתי שאולי אם אני אראה את הקוד מקור של הפונקציות של VESA ל-Interrupts אז אני אוכל להמיר אותו ל-PM. אולי XFree מכיל קוד כזה? יש בטח גם דרך כלשהי לחשב באיזה מיקום בזיכרון דרך INT למשל Int 10h בטח ממקום בכתובת מסויימת שאפשר לחשב אותה. בכל אופן במדריך של VESA הצליצו לגבות את הקוד של כל ה-BIOS לתוך כתובת בזיכרון בעלת הרשאות קריאה/כתיבה (ב-PM) ואז למלא איזשהו מבנה שיגיד ל-VESA איפה למצוא את הקוד. זה בעל יישום?
 

MotiAd

New member
דרך אגב...

יש לך יישום למה שנתת לי מקודם בהסבר שלך? אני אודה לך מאוד. יש לי גם שאלה מה עיקרון הפעולה בעצם של ה-FLAT ששלחת לי שאמור לעבוד ב-REAL MODE ? איך הוא עובד בלי להיכנס לתוך PM?
 

voguemaster

New member
כמה דברים

בקשר להודעה הראשונה, צריך לדעתי להעתיק את טבלת האינטרפטים, אבל לא התעסקתי עם זה יותר מדי לכן אני לא יכול לתת לך תשובה החלטית יותר. בקשר ל-FLAG ב-REALMODE. הבחור מסביר למה ואיך זה פועל אבל הסיפור הקצר הוא שברגע שנוצרו מעבדים שיכולים לגשת למרחב כתובות של 4 ג´יגה ע"י מצב מוגן, היו צריכים לבנות תמיכה אחורה במצב REAL הרגיל של DOS. למעשה מה שקורה זה שבטבלאות שמחזיקות את הנתונים לגבי הדפים השונים והסגמנטים השונים יש שדה שלמעשה מגביל את גודל הסגמנט שעובדים איתו. כל מה שהבחור עשה זה לקפוץ למצב מוגן ולשנות את הגבול הזה ל-4 ג´יגה, כלומר המקסימום האפשרי (במצב תאימות עם REALMODE, הגודל הוא 64K). ברגע שביצעת את זה, אין שום בעיה למעבד לתמוך בשבילך בגישה לכל כתובת במרחב הזיכרון. מה שכן, איך שלא תסתכל על זה, SEGMENT:OFFSET עדיין תקף, כלומר אם אתה רוצה לגשת ל-A0000 לדוגמא, אתה צריך ליצור קומבינציה מתאימה, לדוגמא: A000:0000 או אפשר אפילו (רצוי לדעתי):
0000:A0000h​
שים לב שההיסט הוא A0000 (ארבע אפסים!) שזו כבר הכתובת האבסולוטית.. פשוט נוח יותר לעבוד עם סגמנט 0 והיסט ממנו, זה מקל על החיים. אני אגיד רק עוד דבר אחד בהקשר של FLAT: הוא לא רע אם אתה רוצה לכתוב משחקים תחת DOS כי למעשה הוא נותן לך את כל הפונקציונליות שאתה צריך, אבל לכתוב מערכת הפעלה זה לא רעיון טוב. שים לב שהקוד שמבצע את הקפיצה למצב מוגן כדי לשנות את הגבול ולחזור בחזרה, למעשה פועל בתור EXCEPTION HANDLER. קשה להתאים דבר כזה לארכיטקטורה של מערכת הפעלה... לעניות דעתי בכל אופן. אלי נ.ב. בקשר לקוד עובד, נתתי לך דוגמא בסיסית אבל בעיקרון הרעיון דומה. אם נניח אתה עובד עם LINEAR FRAMEBUFFER, אתה פשוט כותב לשם את תוכן המסך (טוב יש שיטות לזה כמובן, כל ספר גרפיקה נורמלי מסביר איך לבצע אנימציה טובה). שוב, לדעתי החלפת בנקים יהיה בזבוז של הזמן היקר שלך, אני ממליץ לא ללכת בכיוון. ולסיכום, כבר המלצתי בעבר לבדוק את קוד המקור של XFREE. ללא ספק שרת ה-SVGA שלהם מבצע את מה שאתה צריך ותוכל ללמוד ממנו המון. הוא גם תומך בכמות לא קטנה של כרטיסים (או יותר נכון, CHIPSETS).
 

MotiAd

New member
או קיי. ונניח...

נניח שאתחלתי את מצב הגרפיקה שאני רוצה לעבוד איתו אחרי Int 10h ועכשיו כל מה שאני עושה זה לכתוב לכתובת 0000:0A0000h ופשוט בכל פעם להגדיל את EDI? כלומר לכתוב בית ל-0000:0A0000h ואחר כך ל-0000:0A0001h וכן הלאה? וכל זה סתם ככה? אינ לא צריך להגדיר איפשהו לאיזה סגמנט אני כותב? והאם ECX יכול לשמש לי כמונה לופים? כמו CX? למרות ששתיהם קיימים?
 

voguemaster

New member
זה בדיוק מה שכתבתי למעלה!

שים לב למבנה של הלולאה שכתבתי בהודעה שלמעלה.
 

MotiAd

New member
אז אם ככה...

התהליך הבא צריך לעבוד:
code segment assume CS:code MAIN proc call FLAT_install mov ax, 4f02h mov bx, 0118h int 10h .386 xor ax, ax mov es, ax mov edi, 000A0000h LOOPSCREEN: cmp edi, 002E0000h je EXIT mov es:[edi], 1fh inc edi jmp LOOPSCREEN EXIT: %out "Bye Bye" MAIN endp code ends end MAIN​
 
בבקשה תן לי קוד לVESA ../images/Emo92.gif../images/Emo53.gif

אני מנסה לעשות תוכנית שעובדת עם VESA והכל מיסתבח ואני לא מציח. בבקשה תפנה אותי לקוד שימושי, אני חייב. עיזרו לי
 

MotiAd

New member
צור איתי קשר...

כתבתי כמה תוכניות פשוטות שמשתמשות בכל רמות הצבע 16 BIT 24 BIT 256 צבעים וכו. שלח לי הודעה.
 
למעלה