《30天自制操作系统》笔记(04)——显示器256色
生活随笔
收集整理的這篇文章主要介紹了
《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號顏色為#FFFFFF,2號顏色為#FFFFCC,……”,顯卡會保存這些設置。需要用的時候,我說“把位置A設置為x號顏色(1≤x≤256),把位置B設置為y號顏色(1≤y≤256),……”。
?
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 }?
總結
效果如下圖所示。
這只是一個小練筆,以后會用真正的操作系統功能(內存管理、多任務、窗口)代替這個調色板demo。
點此查看下一篇《《30天自制操作系統》筆記(05)——啟用鼠標鍵盤》
?
轉載于:https://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-03-256color-palette.html
總結
以上是生活随笔為你收集整理的《30天自制操作系统》笔记(04)——显示器256色的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word 文档操作类,可以读出word中
- 下一篇: 2014-2015-1学期使用的教材