This shows you the differences between two versions of the page.
|
gui_design_by_dak [2010/02/03 11:07] finarfin created |
gui_design_by_dak [2010/02/03 11:10] (current) finarfin |
||
|---|---|---|---|
| Line 90: | Line 90: | ||
| questo scopo esistono pero' vari metodi: | questo scopo esistono pero' vari metodi: | ||
| - | - Switching con Grub | + | ==== Switching con Grub ==== |
| - | Alcuni volenterosi programmatori hanno creato una patch per i sorgenti di grub, che | + | |
| - | permette di fare lo switching alle modalita' vesa tramite il bootloader (http://www.smksoftware.co.za/products/vbe-grub/). | + | Alcuni volenterosi programmatori hanno creato una patch per i sorgenti di grub, che |
| - | Per patchare grub, elenco velocemente i passaggi: | + | permette di fare lo switching alle modalita' vesa tramite il bootloader (http://www.smksoftware.co.za/products/vbe-grub/). |
| - | 1. Scaricate ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz e vbe_grub-0.97.patch (dal link) | + | Per patchare grub, elenco velocemente i passaggi: |
| - | 2. Decomprimete i sorgenti di grub | + | - Scaricate ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz e vbe_grub-0.97.patch (dal link) |
| - | 3. Applicate la patch con | + | - Decomprimete i sorgenti di grub |
| - | patch -i vbe_grub-0.97.patch sorgenti_grub (da verificare) | + | - Applicate la patch con |
| - | 4. Entrate nella cartella dei sorgenti e date un make | + | patch -i vbe_grub-0.97.patch sorgenti_grub (da verificare) |
| + | - Entrate nella cartella dei sorgenti e date un make | ||
| - | Dopo aver messo il grub patchato nella vostra iso, img, o quel che e', sara' necessario aggiungere al file | + | Dopo aver messo il grub patchato nella vostra iso, img, o quel che e', sara' necessario aggiungere al file |
| - | di configurazione di grub (menu.lst) la linea: | + | di configurazione di grub (menu.lst) la linea: |
| + | vbeset modalita' | ||
| - | vbeset modalita' | + | Dove modalita' e' un valore numerico che indica appunto la risoluzione e la profondita' del colore |
| - | + | desiderata (per 800x600x32 il valore e' 0x115). Dovrete ora aggiungere al vostro kernel il supporto | |
| - | Dove modalita' e' un valore numerico che indica appunto la risoluzione e la profondita' del colore | + | per il multiboot header; in particolare i campi del multiboot che ci serviranno saranno: |
| - | desiderata (per 800x600x32 il valore e' 0x115). Dovrete ora aggiungere al vostro kernel il supporto | + | <code c> |
| - | per il multiboot header; in particolare i campi del multiboot che ci serviranno saranno: | + | |
| - | <code c> | + | |
| uint32_t boot_loader_name; ///< Nome del bootloader | uint32_t boot_loader_name; ///< Nome del bootloader | ||
| uint32_t apm_table; ///< Tabella specifiche apm | uint32_t apm_table; ///< Tabella specifiche apm | ||
| Line 118: | Line 118: | ||
| uint32_t vbe_interface_len; ///< Lunghezza interfaccia vesa bios | uint32_t vbe_interface_len; ///< Lunghezza interfaccia vesa bios | ||
| </code> | </code> | ||
| - | In particolare vbe_control_info e vbe_mode_info, che sono due puntatori alle strutture viste in precedenza. | + | In particolare vbe_control_info e vbe_mode_info, che sono due puntatori alle strutture viste in precedenza. |
| - | L'accesso a queste strutture sara' necessario per conoscere la risoluzione, i bit del colore, e l'indirizzo | + | L'accesso a queste strutture sara' necessario per conoscere la risoluzione, i bit del colore, e l'indirizzo |
| - | fisico dove e' mappato il buffer vesa "phys_base_ptr". | + | fisico dove e' mappato il buffer vesa "phys_base_ptr". |
| - | |||
| - | - utilizzare gli interrupt del bios in emulazione della modalita' 8086 | ||
| - | - ... | ||
| - | |||
| - | |||
| - | |||
| ==== Disegniamo ==== | ==== Disegniamo ==== | ||
| Per disegnare un pixel nello schermo, sara' necessario prima di tutto individuare le coordinate | Per disegnare un pixel nello schermo, sara' necessario prima di tutto individuare le coordinate | ||
| x e y del buffer. | x e y del buffer. | ||
| - | x e' uguale alla coordinata x del pixel da disegnare moltiplicata per la dimensione del singolo pixel | + | * x e' uguale alla coordinata x del pixel da disegnare moltiplicata per la dimensione del singolo pixel |
| - | y e' uguale alla coordinata y del pixel da disegnare moltiplicata per il numero di bytes per ogni scan line | + | * y e' uguale alla coordinata y del pixel da disegnare moltiplicata per il numero di bytes per ogni scan line |
| (bytes_per_scan_line). | (bytes_per_scan_line). | ||
| - | + | ||
| - | Per scrivere nella memoria video le info del pixel, sara' necessario scrivere nell'indirizzo "phys_base_ptr" | + | Per scrivere nella memoria video le info del pixel, sara' necessario scrivere nell'indirizzo "phys_base_ptr" |
| - | con un offset di x+y, il valore del colore, nella sequenza r, g e b. | + | con un offset di x+y, il valore del colore, nella sequenza r, g e b. |
| + | ==== Ottimizzare ==== | ||
| - | 4. Ottimizzare | ||
| Per ottimizzare la velocita', conviene allocare un buffer nella ram di dimensione uguale al buffer video, | Per ottimizzare la velocita', conviene allocare un buffer nella ram di dimensione uguale al buffer video, | ||
| scrivere li le informazioni dei pixel, e dopo tutte le operazioni, copiare il buffer in ram nella memoria | scrivere li le informazioni dei pixel, e dopo tutte le operazioni, copiare il buffer in ram nella memoria | ||
| video con memcpy. | video con memcpy. | ||