עזרה

moshey18

New member
עזרה

אני מנסה להעתיק תמונה מדף וירטואלי למסך בעזרת הפקודה _fmemcpy מהוא הפרמטר שאני צריך לכתוב בכדי שהתמונה תועתק למסך? כדי לפנות למצביע של המסך? אני עובד בסי בדוס מוד 16 צבעים
 

sagsag

New member
אז ככה

הזיכרון עבור מוד 3 (80x25) צבעוני נמצא בכתובת B800:0000. אני בד"כ עובד פשוט עם מערך דו-מימדי בגודל המסך שממוקם אבסולוטית על הכתובת הזו.
 

moshey18

New member
אני עובד ברזולוציה של 640*480

שאם איננטי טועה זהו מוד 12 תודה בכל אופן ואם מישהו אחר יודע זה יעזור מאוד תודה
 

voguemaster

New member
תשובה חלקית

יש כמה שיטות לעבודה ברזולוציה גבוהה. השיטה הראשונה והבסיסית ביותר (ולכן הכי פחות טובה) היא עבודה באמצעות bank switching. ה-buffer שנכתב לזיכרון של כרטיס המסך בכל פעם ממוקם בכתובת A000 (כתובת סגמנט כמובן, היסט 0). בד"כ גודל הבאפר הוא 64K אבל יש כרטיסים שבהם הוא 128K. בכל מקרה, בגלל שמבחינת כמות זיכרון מסך של 640x480 תופס יותר זיכרון מאשר גודל של באפר אחד, אתה צריך לבצע bank switch שממפה את הבאפר הזה למיקום אחר בזיכרון של כרטיס המסך. הבעיה עם כל הדברים האלה שהם מבוצעים בצורה שונה לכל כרטיס מסך. לכן יש את הדרייבר של VESA שפתר את הבעיה. כמובן, עם הזמן התפתחה דרך לפנות אל הזיכרון כגוש רציף (פונקציונליות שיש ב-VESA2 ואילך) וזה הקל לכולם על החיים. אני ממליץ לך להריץ דרייבר של VESA2 וללמוד את ה-interrupts של VESA. הם אומנם איטיים יחסית אבל לא משתמשים בהם בתדירות גבוהה מדי (כך עבדו כל המשחקים בדוס ברזולוציות גבוהות). הדרייבר יספק לך כתובת שאליה תוכל לכתוב שמייצגת את זיכרון כרטיס המסך בצורה לינארית. משם הדרך קצרה אפילו ללא protected mode. שאלות ?
 

voguemaster

New member
ד"א

אפילו אם אתה עובד במוד VGA סטנדטי של 640x480 עם 16 צבעים, הבאפר של ה-64 לא יספיק לך...
 
למעלה