《30天自制操作系統》筆記(04)——顯示器256色


30天自制操作系統》筆記(04)——顯示器256

進度回顧

從最開始的(01)上一篇為止,已經解決了開發環境問題和OS項目的頂層設計問題。

本篇做一個小練習:設置顯卡顯示256色。

原理

設置顯卡模式

調用BIOS中斷命令INT 0x10,設置顯卡模式為VGA圖形模式,320*200*8位彩色模式,調色板模式。代碼如下。

 

1         MOV        AL,0x13            ; VGA圖形模式,320*200*8位彩色模式
2         MOV        AH,0x00
3         INT        0x10

 

 

 

設置調色板

256色的調色板是這樣一個東西:有256個編號,每個編號對應一個顏色。設置的時候,我說“1號顏色為#FFFFFF2號顏色為#FFFFCC,……”,顯卡會保存這些設置。需要用的時候,我說“把位置A設置為x號顏色(1x256),把位置B設置為y號顏色(1y256),……”。

 

  1 void init_palette(void)
  2 {
  3     static unsigned char table_rgb[256 * 3] = {
  4         0xFF, 0xFF, 0xFF,
  5         0xFF, 0xFF, 0xCC,
  6         0xFF, 0xFF, 0x99,
  7         0xFF, 0xFF, 0x66,
  8         0xFF, 0xFF, 0x33,
  9         0xFF, 0xFF, 0x00,
 10         0xFF, 0xCC, 0xFF,
 11         0xFF, 0xCC, 0xCC,
 12         0xFF, 0xCC, 0x99,
 13         0xFF, 0xCC, 0x66,
 14         0xFF, 0xCC, 0x33,
 15         0xFF, 0xCC, 0x00,
 16         0xFF, 0x99, 0xFF,
 17         0xFF, 0x99, 0xCC,
 18         0xFF, 0x99, 0x99,
 19         0xFF, 0x99, 0x66,
 20         0xFF, 0x99, 0x33,
 21         0xFF, 0x99, 0x00,
 22         0xFF, 0x66, 0xFF,
 23         0xFF, 0x66, 0xCC,
 24         0xFF, 0x66, 0x99,
 25         0xFF, 0x66, 0x66,
 26         0xFF, 0x66, 0x33,
 27         0xFF, 0x66, 0x00,
 28         0xFF, 0x33, 0xFF,
 29         0xFF, 0x33, 0xCC,
 30         0xFF, 0x33, 0x99,
 31         0xFF, 0x33, 0x66,
 32         0xFF, 0x33, 0x33,
 33         0xFF, 0x33, 0x00,
 34         0xFF, 0x00, 0xFF,
 35         0xFF, 0x00, 0xCC,
 36         0xFF, 0x00, 0x99,
 37         0xFF, 0x00, 0x66,
 38         0xFF, 0x00, 0x33,
 39         0xFF, 0x00, 0x00,
 40         0x66, 0xFF, 0xFF,
 41         0x66, 0xFF, 0xCC,
 42         0x66, 0xFF, 0x99,
 43         0x66, 0xFF, 0x66,
 44         0x66, 0xFF, 0x33,
 45         0x66, 0xFF, 0x00,
 46         0x66, 0xCC, 0xFF,
 47         0x66, 0xCC, 0xCC,
 48         0x66, 0xCC, 0x99,
 49         0x66, 0xCC, 0x66,
 50         0x66, 0xCC, 0x33,
 51         0x66, 0xCC, 0x00,
 52         0x66, 0x99, 0xFF,
 53         0x66, 0x99, 0xCC,
 54         0x66, 0x99, 0x99,
 55         0x66, 0x99, 0x66,
 56         0x66, 0x99, 0x33,
 57         0x66, 0x99, 0x00,
 58         0x66, 0x66, 0xFF,
 59         0x66, 0x66, 0xCC,
 60         0x66, 0x66, 0x99,
 61         0x66, 0x66, 0x66,
 62         0x66, 0x66, 0x33,
 63         0x66, 0x66, 0x00,
 64         0x66, 0x33, 0xFF,
 65         0x66, 0x33, 0xCC,
 66         0x66, 0x33, 0x99,
 67         0x66, 0x33, 0x66,
 68         0x66, 0x33, 0x33,
 69         0x66, 0x33, 0x00,
 70         0x66, 0x00, 0xFF,
 71         0x66, 0x00, 0xCC,
 72         0x66, 0x00, 0x99,
 73         0x66, 0x00, 0x66,
 74         0x66, 0x00, 0x33,
 75         0x66, 0x00, 0x00,
 76         0xCC, 0xFF, 0xFF,
 77         0xCC, 0xFF, 0xCC,
 78         0xCC, 0xFF, 0x99,
 79         0xCC, 0xFF, 0x66,
 80         0xCC, 0xFF, 0x33,
 81         0xCC, 0xFF, 0x00,
 82         0xCC, 0xCC, 0xFF,
 83         0xCC, 0xCC, 0xCC,
 84         0xCC, 0xCC, 0x99,
 85         0xCC, 0xCC, 0x66,
 86         0xCC, 0xCC, 0x33,
 87         0xCC, 0xCC, 0x00,
 88         0xCC, 0x99, 0xFF,
 89         0xCC, 0x99, 0xCC,
 90         0xCC, 0x99, 0x99,
 91         0xCC, 0x99, 0x66,
 92         0xCC, 0x99, 0x33,
 93         0xCC, 0x99, 0x00,
 94         0xCC, 0x66, 0xFF,
 95         0xCC, 0x66, 0xCC,
 96         0xCC, 0x66, 0x99,
 97         0xCC, 0x66, 0x66,
 98         0xCC, 0x66, 0x33,
 99         0xCC, 0x66, 0x00,
100         0xCC, 0x33, 0xFF,
101         0xCC, 0x33, 0xCC,
102         0xCC, 0x33, 0x99,
103         0xCC, 0x33, 0x66,
104         0xCC, 0x33, 0x33,
105         0xCC, 0x33, 0x00,
106         0xCC, 0x00, 0xFF,
107         0xCC, 0x00, 0xCC,
108         0xCC, 0x00, 0x99,
109         0xCC, 0x00, 0x66,
110         0xCC, 0x00, 0x33,
111         0xCC, 0x00, 0x00,
112         0x33, 0xFF, 0xFF,
113         0x33, 0xFF, 0xCC,
114         0x33, 0xFF, 0x99,
115         0x33, 0xFF, 0x66,
116         0x33, 0xFF, 0x33,
117         0x33, 0xFF, 0x00,
118         0x33, 0xCC, 0xFF,
119         0x33, 0xCC, 0xCC,
120         0x33, 0xCC, 0x99,
121         0x33, 0xCC, 0x66,
122         0x33, 0xCC, 0x33,
123         0x33, 0xCC, 0x00,
124         0x33, 0x99, 0xFF,
125         0x33, 0x99, 0xCC,
126         0x33, 0x99, 0x99,
127         0x33, 0x99, 0x66,
128         0x33, 0x99, 0x33,
129         0x33, 0x99, 0x00,
130         0x33, 0x66, 0xFF,
131         0x33, 0x66, 0xCC,
132         0x33, 0x66, 0x99,
133         0x33, 0x66, 0x66,
134         0x33, 0x66, 0x33,
135         0x33, 0x66, 0x00,
136         0x33, 0x33, 0xFF,
137         0x33, 0x33, 0xCC,
138         0x33, 0x33, 0x99,
139         0x33, 0x33, 0x66,
140         0x33, 0x33, 0x33,
141         0x33, 0x33, 0x00,
142         0x33, 0x00, 0xFF,
143         0x33, 0x00, 0xCC,
144         0x33, 0x00, 0x99,
145         0x33, 0x00, 0x66,
146         0x33, 0x00, 0x33,
147         0x33, 0x00, 0x00,
148         0x99, 0xFF, 0xFF,
149         0x99, 0xFF, 0xCC,
150         0x99, 0xFF, 0x99,
151         0x99, 0xFF, 0x66,
152         0x99, 0xFF, 0x33,
153         0x99, 0xFF, 0x00,
154         0x99, 0xCC, 0xFF,
155         0x99, 0xCC, 0xCC,
156         0x99, 0xCC, 0x99,
157         0x99, 0xCC, 0x66,
158         0x99, 0xCC, 0x33,
159         0x99, 0xCC, 0x00,
160         0x99, 0x99, 0xFF,
161         0x99, 0x99, 0xCC,
162         0x99, 0x99, 0x99,
163         0x99, 0x99, 0x66,
164         0x99, 0x99, 0x33,
165         0x99, 0x99, 0x00,
166         0x99, 0x66, 0xFF,
167         0x99, 0x66, 0xCC,
168         0x99, 0x66, 0x99,
169         0x99, 0x66, 0x66,
170         0x99, 0x66, 0x33,
171         0x99, 0x66, 0x00,
172         0x99, 0x33, 0xFF,
173         0x99, 0x33, 0xCC,
174         0x99, 0x33, 0x99,
175         0x99, 0x33, 0x66,
176         0x99, 0x33, 0x33,
177         0x99, 0x33, 0x00,
178         0x99, 0x00, 0xFF,
179         0x99, 0x00, 0xCC,
180         0x99, 0x00, 0x99,
181         0x99, 0x00, 0x66,
182         0x99, 0x00, 0x33,
183         0x99, 0x00, 0x00,
184         0x00, 0xFF, 0xFF,
185         0x00, 0xFF, 0xCC,
186         0x00, 0xFF, 0x99,
187         0x00, 0xFF, 0x66,
188         0x00, 0xFF, 0x33,
189         0x00, 0xFF, 0x00,
190         0x00, 0xCC, 0xFF,
191         0x00, 0xCC, 0xCC,
192         0x00, 0xCC, 0x99,
193         0x00, 0xCC, 0x66,
194         0x00, 0xCC, 0x33,
195         0x00, 0xCC, 0x00,
196         0x00, 0x99, 0xFF,
197         0x00, 0x99, 0xCC,
198         0x00, 0x99, 0x99,
199         0x00, 0x99, 0x66,
200         0x00, 0x99, 0x33,
201         0x00, 0x99, 0x00,
202         0x00, 0x66, 0xFF,
203         0x00, 0x66, 0xCC,
204         0x00, 0x66, 0x99,
205         0x00, 0x66, 0x66,
206         0x00, 0x66, 0x33,
207         0x00, 0x66, 0x00,
208         0x00, 0x33, 0xFF,
209         0x00, 0x33, 0xCC,
210         0x00, 0x33, 0x99,
211         0x00, 0x33, 0x66,
212         0x00, 0x33, 0x33,
213         0x00, 0x33, 0x00,
214         0x00, 0x00, 0xFF,
215         0x00, 0x00, 0xCC,
216         0x00, 0x00, 0x99,
217         0x00, 0x00, 0x66,
218         0x00, 0x00, 0x33,
219         0x00, 0x00, 0x00
220     };
221     set_palette(0, 255, table_rgb);
222     return;
223 
224     /* static char 命令は、データにしか使えないけどDB命令相當 */
225 }
226 
227 void set_palette(int start, int end, unsigned char *rgb)
228 {
229     int i, eflags;
230     eflags = io_load_eflags();    /* 割り込み許可フラグの値を記録する */
231     io_cli();                     /* 許可フラグを0にして割り込み禁止にする */
232     io_out8(0x03c8, start);
233     for (i = start; i <= end; i++) {
234         io_out8(0x03c9, rgb[0] / 4);
235         io_out8(0x03c9, rgb[1] / 4);
236         io_out8(0x03c9, rgb[2] / 4);
237         rgb += 3;
238     }
239     io_store_eflags(eflags);    /* 割り込み許可フラグを元に戻す */
240     return;
241 }
設置調色板

 

設置要顯示的內容 

bootpack.c的主函數里設置內存0x000a0000~0x000affff的內容,顯卡就會對應更新要顯示的內容。

 

 1 void HariMain(void)
 2 {
 3     int i; 
 4     char *p;
 5     int unit = (0xaffff - 0xa0000 + 1) / 256;
 6     int color;
 7     init_palette();
 8 
 9     p = (char *) 0xa0000;
10 
11     for (i = 0; i <= 0xffff; i++) {
12         color = (i + 1) / unit;
13         p[i] = (char)color;
14     }
15 
16     for (;;) {
17         io_hlt();
18     }
19 }

 

總結

效果如下圖所示。

《30天自制操作系統》筆記(04)——顯示器256色

這只是一個小練筆,以后會用真正的操作系統功能(內存管理、多任務、窗口)代替這個調色板demo

點此查看下一篇30天自制操作系統》筆記(05)——啟用鼠標鍵盤》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM