ABA


"שאלה בקשר לרוזולוציות / צבעים ב VESA (שפת C)"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #8300 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 8300
Fenoman

   19:33   14.11.02   
אל הפורום  
  שאלה בקשר לרוזולוציות / צבעים ב VESA (שפת C)  
 
   עבר עריכה לאחרונה בתאריך 14.11.02 בשעה 19:35
 
בניתי לעצמי מנוע גראפי קטן על בסיס VESA. כל מה שיש בו זה הצבה / מחיקה של נקודה מהמסך ושינוי ערכי RGB של צבעים.
ת'כלס זה עובד וזה עובד די טוב. העניין הוא שאני מצליח להפעיל את זה רק ברזולוציה של 800X600 עם 256 צבעים, וזה לא ממש מספק אותי. הייתי רוצה להגיע לרמה גבוהה יותר של צבעים, ואני יודע שעם VESA זה אפשרי. בסופו של דבר אני רוצה להפעיל מנוע גראפי פשוט, אבל שיתמוך ב 32bit צבעים
רזולוציה לא חשובה 640X480... 800X600 ... לא משנה, העיקר 32bit צבעים.
אני מכיר רק mod אחד לצערי של VESA שהוא 0x103.
מצאתי כמה טבלאות של מודים ברחבי האינטרנת שבה מצוין למשל מוד 0x115 שהוא 800X600X32 אבל זה לא עובד... האם מישהו מכיר רשימה של מודים תקינה? או איזה מוד באמת תומך ב 32bit צבעים ?
את יצירת ה VESA עשיתי באופן הבא ב C:
(לפונקציה זו אני קורה עם ערך 0x103)

void Initialize(short a)
{
short y;

asm{
mov ax, 0x4f02
mov bx, a
int 0x10
}

currentBank^=currentBank;
SetBank(currentBank);

for (y = 0; y < Y_RES; y++)
lYTable = (long )y * X_RES;
}


תודה רבה מראש.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תגיד אתה יכול בבקשה להרחיב על הנושא של הVESA Quant86 14.11.02 20:02 1
     מאיזו בחינה להרחיב על VESA? Fenoman 14.11.02 20:53 2
  אני בזמנו שהתעסקתי עם זה הגעתי רק ל24 ביט dryice 14.11.02 21:31 3
     גם אני Michael 14.11.02 21:56 4
         הבחור דיבר על לכתוב לבד, dryice 14.11.02 22:10 5
         מיכאל, תודה על העזרה והקבצים... Fenoman 14.11.02 23:34 8
     אחרי כמה חיפושים/מחשבה הבנתי שהתוכנית לא בסדר Fenoman 14.11.02 23:33 7
         תעלה את כל הקוד, dryice 15.11.02 14:41 9
             הנה הקוד Fenoman 15.11.02 16:54 10
                 אין בעיה: dryice 15.11.02 21:30 11
                     אותה הבעיה. Fenoman 16.11.02 02:26 13
  קצת חומר על VESA dryice 14.11.02 22:58 6
     אתם תותחים Quant86 16.11.02 00:23 12
  פתרתי!, הפעם זה יעבוד! dryice 16.11.02 14:47 14
     :) Fenoman 16.11.02 21:54 15

       
Quant86

   20:02   14.11.02   
אל הפורום  
  1. תגיד אתה יכול בבקשה להרחיב על הנושא של הVESA  
בתגובה להודעה מספר 0
 
   לפי נסיון אישי הדרייבר לא עובד בXP:/
ניסיתי בבורלנד סי, כי לא הצלחתי להריץ בכלל את הDGPP :(


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Fenoman

   20:53   14.11.02   
אל הפורום  
  2. מאיזו בחינה להרחיב על VESA?  
בתגובה להודעה מספר 1
 
   אשמח להסביר לך, רק לא הבנתי על בדיוק להרחיב? (מה זה? איך מבצעים? למה זה משמש?...)

אני לא עובד ב DJGPP... אלא ב borland ל dos וזה גם תחת XP
זה עובד די טוב... אם רק הייתי יודע את מספר המוד הנכון...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   21:31   14.11.02   
אל הפורום  
  3. אני בזמנו שהתעסקתי עם זה הגעתי רק ל24 ביט  
בתגובה להודעה מספר 0
 
   הספיק לי להכל.
אני בכלל לא שם לב להבדל בין 24 ל32,
רוב הזמן בכלל עבדתי עם התוכניות שלי ב16 ביט שהם 65K צבעים,
ושם הVESA באמת עבד חלק.
אני יכול למצוא את הדברים שעליהם עבדתי בזמנו,(לא נגעתי בזהכ
כבר כשנתיים וגם אז זה היה מבוסס על קוד ישן עוד יותר ועל כן הדברים
כתובים בפסקל)
אני גם אחפש את המדריך VESA שעבדתי עמו אם זה יעזור.

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Michael

   21:56   14.11.02   
אל הפורום  
  4. גם אני  
בתגובה להודעה מספר 3
 
   ניסתי פעם לעבוד עם VESA אבל נתקלתי במבוי סתום כשניסתי
להוסיף עכבר, וגם סבלתי מהרבה בעיות בעיקר חוסר במשאביים
וכל מיני פונקציות לא עבדו לי ולכן בסוף החלטתי לעזוב את זה.

העלתי כמה מודים של VESA תנסה להשתמש בהם אולי תמצא בהם שימוש




                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   22:10   14.11.02   
אל הפורום  
  5. הבחור דיבר על לכתוב לבד,  
בתגובה להודעה מספר 4
 
   הביא דוגמת קוד.

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Fenoman

   23:34   14.11.02   
אל הפורום  
  8. מיכאל, תודה על העזרה והקבצים...  
בתגובה להודעה מספר 4
 
   אבל אני רוצה לנסות לראות מה לא בסדר בתוכנית שלי...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Fenoman

   23:33   14.11.02   
אל הפורום  
  7. אחרי כמה חיפושים/מחשבה הבנתי שהתוכנית לא בסדר  
בתגובה להודעה מספר 3
 
   מצאתי טבלה שבה כתוב בברור שמוד 0x114 זה 800X600 - 64K color
השתמשתי וראיתי שזה עובד, זאת אומרת הוא מעביר את המסך למצב הזה.
אז מה שנשאר לא בסדר זאת התוכנית (אלא מה???)...
אז נעבור דקה על התיאוריה שמאחורי האלגוריטם..
אנחנו נמצאים במצב של 16bit צבעים, זאת אומרת שכל פיקסל על המסך מיוצג על ידי שני בתים. זה גם אומר שיש לנו 16^2 צבעים שונים (אני טועה בנקודה הזאת?).
אנו יודעים שזכרון המסך מתחיל ב 0xA000 לכן ניצור מצביע למקום זה:

char far *scr = (char far *)MK_FP(0xA000, 0)

אנו גם רוצים להאיץ את מהירות המנוע, לכן ניצור לוח שבו נשמור מראש ערכים מחושבים של y שאותו רוצים לצייר כפול Y_RES שזה 800 וכך נחסוך את פעולת הכפל בכל פעם שנצייר פיקסל

unsigned long lYTable(Y_RES(;

את הקריאה ל VESA ואת חישוב טבלת הערכים נעשה בפונקציה Initialize

void Initialize(short a)
{
short y;

asm{
mov ax, 0x4f02
mov bx, a
int 0x10
}

currentBank^=currentBank;
SetBank(currentBank);

for (y = 0; y < Y_RES; y++)
lYTable(y) = (unsigned long )y * X_RES;
}

כדי לשים פיקסל על המסך, צריכים את המיקום שלו, ואפשר להגיע לכתובת ע"י הוספת ה x של הפיקסל לערך המתאים לו בטבלת הערכים
lAddress = lYTable(y) + x;
מהכתובת אנחנו צריכים את הסגמנט, זה נמצא ב 16 הסיביות העליונות של הכתובת iSegment = lAddress >> 16
וההסת נמצא ב 16 התחתונות iOffset = lAddress & 0x0000FFFF
אחרי שקובעים מיהו הסגמנט, מציבים את הצבע בן ה 16 סיביות בזכרון של המסך לפי ההסת scr(iOffset) = c
בקיצור הכל נראה כך


void SetPixel(unsigned int x, unsigned int y, unsigned int c)
{
unsigned int iSegment;
unsigned int iOffset;
unsigned long lAddress;

lAddress = lYTable(y)+ x; //get adress from calculated table
iSegment = lAddress >> 16; //get higher bits of adress to calc the segment
iOffset = lAddress & 0x0000FFFF; //get lower bits of adress to calculate the offset

if(iSegment != currentBank)
{
currentBank = iSegment;
SetBank(iSegment); //set the bank at the calculated segment
}

scr(iOffset) = c; //set the color on the memory
}

אז הכל נראה כבייכול בסדר...
אבל כשאני מצייר את כל המסך


for(j=0;j<Y_RES;j++)
for(i=0;i<X_RES;i++)
SetPixel(i,j,100);

אני רואה שרק חצי מסך צבוע :(
למה?

אני מצטער אם שיעממתי אותכם עם כל כך הרבה קוד ודיבורים...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   14:41   15.11.02   
אל הפורום  
  9. תעלה את כל הקוד,  
בתגובה להודעה מספר 7
 
   עבר עריכה לאחרונה בתאריך 15.11.02 בשעה 14:47
 
בפרט את הפונקציה שלך לSET-BANK
בעקרון זה נראה דיי נכון, מה שקראתי כאן.

DRYICE

נ.ב ניחוש שלי, אתה לא מתייס נכון לגרעיניות
של הBANKS ולמעשה הבנקים איתם אתה משתמש חופפים,
נסה בקריאה לSETBANK להכפיל הפרמטר שאתה מקבל ב2


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Fenoman

   16:54   15.11.02   
אל הפורום  
  10. הנה הקוד  
בתגובה להודעה מספר 9
 
   עבר עריכה לאחרונה בתאריך 15.11.02 בשעה 16:55
 
אב ניסיתי להכפיל ב2, בהתחלה עשיתי shl לפרמטר בפונקציה SetBank עצמה
ואז כשראיתי שהוא מצייר רשת על כל המסך, כלומר הוא מצייר בנק ראשון, משאיר בנק שני ריק ומצייר את בנק שלישי וכך הלאה עד סוף המסך...
אחר כך הכפלתי בשתיים את הפרמטר בקריאה לפונקציה כי חשבתי אולי אולי אני התבלבלתי וזה ישנה משהו...זה לא שינה כלום, צייר את אותו הדבר...
אז כל הקוד הוא זה:

#include<dos.h>
#include<math.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

#define X_RES 800
#define Y_RES 600

typedef unsigned char byte;
typedef unsigned short word;

char far *scr = (char far *)MK_FP(0xA000, 0); //pointer to the satrt of VESA
//memory screen

unsigned long lYTable; //table of already calculated adresses

short currentBank;

void SetBank(unsigned short iBank)
{
asm {
mov ax, 0x4F05
xor bx, bx
//shl iBanks,1 <--my first change
mov dx, iBank
int 0x10
};
}

void Initialize(short a)
{
short y;

asm{
mov ax, 0x4f02
mov bx, a
int 0x10
}

currentBank^=currentBank;
SetBank(currentBank);

for (y = 0; y < Y_RES; y++)
YTable = (unsigned long )y * X_RES;
}

void SetPixel(unsigned int x, unsigned int y, unsigned int c)
{
unsigned int iSegment;
unsigned int iOffset;
unsigned long lAddress;

lAddress = lYTable + x; //get adress from calculated table
iSegment = lAddress >> 16; //get higher bits of adress to calc the segment
iOffset = lAddress & 0x0000FFFF; //get lower bits of adress to calculate the offset

if(iSegment != currentBank)
{
currentBank = iSegment;
SetBank(iSegment); //set the bank at the calculated segment
}

//set SetBank(iSegment*2) <--- my second change
//(I also got out the if statement and currentBank = iSegment)

scr = c; //set the color on the memory
}

void SetRGB(short c, short r,short g,short b)
{
outp(0x3C8, c);

outp(0x3C9, r);
outp(0x3C9, g);
outp(0x3C9, b);
}

void CloseVesa()
{
asm {
mov ax, 0x4f02
mov bx, 0x108
int 0x10
}
}

void main()
{

int i,j;


Initialize(0x114);

for(j=0;j<Y_RES;j++)
for(i=0;i<X_RES;i++)
SetPixel(i,j,100);


getch();

CloseVesa();

}


תודה על הכל.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   21:30   15.11.02   
אל הפורום  
  11. אין בעיה:  
בתגובה להודעה מספר 10
 
   אז תעשה את השינוי הבא:
במקום:

iSegment = lAddress >> 16;

תכתוב:
iSegment = lAddress >> 15;

הרי ההכפלה ב2 הביאה אותך עד סוף המסך, כלומר אם אתה נותן
מספר בנק נכון, אתה יכול להגיע לכל מקום במסך.

אני מאמין שהתיקון המוצע יעשה את העבודה.

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Fenoman

   02:26   16.11.02   
אל הפורום  
  13. אותה הבעיה.  
בתגובה להודעה מספר 11
 
   עבר עריכה לאחרונה בתאריך 16.11.02 בשעה 02:34
 
מציג אותו הדבר, בנק אחד מלא, בנק אחד ריק...
מה לא ניסיתי, אמרתי אולי זריך להכפיל את גודל ההשמה, אז במקום אותו C בגודל int שאני מציב אותו בזכרון המסך...הכפלתי אותו unsigned long ועדיין... אותו הדבר
הפעם אני באמת לא מבין...

אאאה ומה שמעניין הוא שכאשר עשיתי קצת debug והדפסתי את ערך iSegment
אז הערכים שלו כאשר הוא מדפיס על המסך פסים פסים הולכים ככה
(בהקסה)


1 2 3 4 5 6 7 8 9 a b c d e

ואגב, מספר הפסים, השחורים והצבועים הם 14.... מאוד מוזר... למה הוא מדלג על המספרים הזוגיים?

וכאשר אני משאיר כמו שהיה כאשר הוא צובע רק חצי מסך הערכים שמוצגים הם


1 2 3 4 5 6 7

אני מתחיל להרים ידיים....
:(


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   22:58   14.11.02   
אל הפורום  
  6. קצת חומר על VESA  
בתגובה להודעה מספר 0
 
   פירוט על מודים:
להלן קובץ עם הסברים מקיפים ביותר על VESA
http://rotter.net/User_files/nor/3dd40714417e839c.txt


תנסה לעבוד עם מוד 0x112

וסתם הערות לגבי הקטע קוד שלך, הגימיק עם הXOR אולי חוסך קצת
בעבודה עם אוגרים, עם משתנה רגיל של C, זה סתם גורם לזה להראות
פחות קריא.

הLOOKUP_TABLE בשביל מיקומים של Y זה רעיון נחמד, אני מכיר
שיטה אחרת של לעבוד עם >> ו << במקום הכפלות, זה עשוי להיות
מהיר יותר(עם כי פחות גמיש לרזולוציות גבוהות)

p11
The following VESA mode numbers have been defined:

GRAPHICS TEXT

15-bit 7-bit Resolution Colors 15-bit 7-bit Columns Rows
mode mode mode mode
number number number number
~~~~~~~~~ ~~~~~~~~~~
100h - 640x400 256 108h - 80 60
101h - 640x480 256
109h - 132 25
102h 6Ah 800x600 16 10Ah - 132 43
103h - 800x600 256 10Bh - 132 50
10Ch - 132 60
104h - 1024x768 16
105h - 1024x768 256

106h - 1280x1024 16
107h - 1280x1024 256

VESA Super VGA Standard VS911022-8

10Dh - 320x200 32K (1:5:5:5)
10Eh - 320x200 64K (5:6:5)
10Fh - 320x200 16.8M (8:8:8)
110h - 640x480 32K (1:5:5:5)
111h - 640x480 64K (5:6:5)
112h - 640x480 16.8M (8:8:8)
113h - 800x600 32K (1:5:5:5)
114h - 800x600 64K (5:6:5)
115h - 800x600 16.8M (8:8:8)
116h - 1024x768 32K (1:5:5:5)
117h - 1024x768 64K (5:6:5)
118h - 1024x768 16.8M (8:8:8)
119h - 1280x1024 32K (1:5:5:5)
11Ah - 1280x1024 64K (5:6:5)
11Bh - 1280x1024 16.8M (8:8:8)

p22
DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Quant86

   00:23   16.11.02   
אל הפורום  
  12. אתם תותחים  
בתגובה להודעה מספר 6
 
   גיליתם לי כמה דברים

מממ נראה לי שאני אסתדר עם גוגל אם אני ארצה להתעסק בזה...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

   14:47   16.11.02   
אל הפורום  
  14. פתרתי!, הפעם זה יעבוד!  
בתגובה להודעה מספר 0
 
   גיליתי את ה2 האבוד.

אתה לא הכפלת ב2 עבור 2 בתים לפיקסל.

בשני מקומות אתה צריך את זה, גם בחישוב הlYTable אתה צריך להכפיל
את הכל ב2, וגם בחישוב ה laddres אתה צריך להכפיל את X בשתיים
בגלל שכל פיקסל תופס שני בתים ולא רק 1.

(זה גם יסדר את הצבעים, מן הסתם יצא לך בירוק כאשר 100 אמור להיות
כחול, מה שיצא זה שבמקום 0004 יצא אחד על השני 0404, חלוקת צבעים 5:6:5)

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Fenoman

   21:54   16.11.02   
אל הפורום  
  15. :)  
בתגובה להודעה מספר 14
 
   אין לי מילים
פשוט באמת תודה לך על השקעה שלך בפורום ובבעיות של אנשים אחרים!

בחיים לא הייתי חושב על זה, הייתי כל כך שקוע בבעיה והמוח שלי פשוט נתקע על החלק הטיאורתי...

בכל מקרה, עכשיו אני מנסה לראות אם הוא אכן תומך ב 16bit צבעים


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net