日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

30天自制操作系统 pdf_30天自制操作系统:第四天:系统界面绘制

發布時間:2023/12/19 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 30天自制操作系统 pdf_30天自制操作系统:第四天:系统界面绘制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第四天:

OUT:讓cpu給設備發送電信號.

IN:讓cpu從設備獲取電信號.

為了區別不同的設備,要使用設備號碼,用port表示.

pushad: 將所有的32位通用寄存器壓入堆棧

pusha:將所有的16位通用寄存器壓入堆棧

pushfd:然后將32位標志寄存器EFLAGS壓入堆棧

pushf::將第16位標志寄存器EFLAGS壓入堆棧

popad:將所有的32位通用寄存器取出堆棧

popa:將所有的16位通用寄存器取出堆棧

popfd:將32位標志寄存器EFLAGS取出堆棧

popf:將16位標志寄存器EFLAGS取出堆棧

今天比較簡單是在第三天基礎上擴充c語言進行畫圖的.

1.對內存寫入數據

改寫bootpack.c代碼如下:

VRAM:保存的是0xa0000,指的是顯卡內存.這塊內存可以像一般的內存一樣存儲數據,也可以保存畫面上的像素.利用這一點可以在畫面上顯示不同的圖像.

void io_hlt(void);void HariMain(void)
{int i; /*i為DWORD4個字節*/char *p; /* p用于byte類型地址 */
p = (char *) 0xa0000; /* */for (i = 0; i <= 0xffff; i++) {
*(p + i) = i & 0x0f; //這樣對內存進行賦值以后就會顯示出圖案了.
}for (;;) {
io_hlt();
}
}

顯示如下:

2.色號設定

rgb表示一個像素顏色時需要6位十六進制數,也就是24位來指定顏色. 而我們顯示這個虛擬顯示屏只有320*200的8位顏色模式.也就是只能使用0-255的數.

這個8位彩色模式,是由程序員隨意指定0-255的數字所對應的顏色的,比如25號顏色對應#ffffff,26號顏色對應#123456等,這種方式就叫做調色板.

目前需要這16種顏色就夠了.

static unsigned char table_rgb[16 * 3] = {0x00, 0x00, 0x00, /* 0:黑 */0xff, 0x00, 0x00, /* 1:亮紅*/0x00, 0xff, 0x00, /* 2:亮綠*/0xff, 0xff, 0x00, /* 3:亮黃*/0x00, 0x00, 0xff, /* 4:亮藍*/0xff, 0x00, 0xff, /* 5:亮紫 */0x00, 0xff, 0xff, /* 6:淺亮藍*/0xff, 0xff, 0xff, /* 7:白*/0xc6, 0xc6, 0xc6, /* 8:亮灰*/0x84, 0x00, 0x00, /* 9:暗紅*/0x00, 0x84, 0x00, /* 10:暗綠*/0x84, 0x84, 0x00, /* 11:暗黃*/0x00, 0x00, 0x84, /* 12:暗青*/0x84, 0x00, 0x84, /* 13:暗紫*/0x00, 0x84, 0x84, /* 14:淺暗紫*/0x84, 0x84, 0x84 /* 15:暗灰*/
};

這個調色模式在上一節中已經說明,調用bios函數切換顯示模式,

int 0x10 ,
ah=0x00 設置顯卡模式,
al=模式,
0x03:16色字符模式,80×25(最基礎)
0x12: VGA圖形模式,640×480×4位彩色模式,獨特的4面存儲模式.
0x13:VGA圖形模式,320×200×8位彩色模式,調色板模式.
0x6a: 擴展vga圖形模式,800x600x4位彩色模式,獨特的4面存儲模式.
返回值:無

本系統采用0x13。8位彩色模式,就是由程序員隨意指定0~255的數字所對應的顏色。如25號顏色對應#ffffff,26號對應#123456,這種方式叫做調色板palette。

調色板的訪問步驟:

(1)首先在一連串的訪問中屏蔽中斷(比如CLI)。

(2)將想要設定的調色板號碼寫入0x03c8端口,緊接著,按RGB的順序寫入0x03c9。若還想繼續設定下個調色板,就省略調色板的號碼,再按RGB的順序寫入0x03c9就行了。

(3)若想讀出當前調色板的狀態,首先要將調色板的號碼寫入0x03c7,再從0x03c9中讀取3次,順序為RGB。若要繼續讀下一個,則省略調色板號碼設定,繼續按RGB讀出。

(4)若開始執行了CLI,則最后執行STI。

調色板設置代碼如下:

void set_palette(int start, int end, unsigned char *rgb)
{int i, eflags;
eflags = io_load_eflags(); /* 保存EFLAGS寄存器的值 */
io_cli(); /*禁止中斷*/
io_out8(0x03c8, start);for (i = start; i <= end; i++) {
io_out8(0x03c9, rgb[0] / 4); //往指定裝置里傳送數據的函數
io_out8(0x03c9, rgb[1] / 4);
io_out8(0x03c9, rgb[2] / 4);
rgb += 3;
}
io_store_eflags(eflags); /* 恢復EFLAGS寄存器的值 */return;
}

c程序中調用的匯編函數如下:

_io_out8: ; void io_out8(int port, int data);
MOV EDX,[ESP+4] ; port DX寄存器通常被稱為數據寄存器。常用來存放雙字長數據的高16位,或存放外設端口地址。
MOV AL,[ESP+8] ; data
OUT DX,AL
RET
_io_hlt: ; void io_hlt(void);
HLT
RET
_io_cli: ; void io_cli(void);
CLI ;禁止中斷發生
RET
_io_sti: ; void io_sti(void);
STI ;允許中斷發生
RET
_io_load_eflags: ; int io_load_eflags(void);
PUSHFD ; PUSH EFLAGS
POP EAX
RET
_io_store_eflags: ; void io_store_eflags(int eflags);
MOV EAX,[ESP+4]
PUSH EAX
POPFD ; POP EFLAGS
RET

3.繪制矩形

顏色配好了,現在開始畫,在畫面模式中,畫面上有320x200=64000個像素,假設左上角坐標是(0,0),右下角坐標是(319x199),(書里為什么是319x319不明白),那么像素坐標(x,y)對應的VRAM地址應該是

0xa0000+x+y*320

畫矩形框函數如下:

void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
{int x, y;for (y = y0; y <= y1; y++) {for (x = x0; x <= x1; x++)
vram[y * xsize + x] = c; //將某個像素點設置成某個顏色.
}return;
}

4.畫出系統界面的大概輪廓

void HariMain(void)
{char *vram;int xsize, ysize;
init_palette(); //設定調色板
vram = (char *) 0xa0000;
xsize = 320;
ysize = 200;
boxfill8(vram, xsize, COL8_008484, 0, 0, xsize - 1, ysize - 29);
boxfill8(vram, xsize, COL8_C6C6C6, 0, ysize - 28, xsize - 1, ysize - 28);
boxfill8(vram, xsize, COL8_FFFFFF, 0, ysize - 27, xsize - 1, ysize - 27);
boxfill8(vram, xsize, COL8_C6C6C6, 0, ysize - 26, xsize - 1, ysize - 1);
boxfill8(vram, xsize, COL8_FFFFFF, 3, ysize - 24, 59, ysize - 24);
boxfill8(vram, xsize, COL8_FFFFFF, 2, ysize - 24, 2, ysize - 4);
boxfill8(vram, xsize, COL8_848484, 3, ysize - 4, 59, ysize - 4);
boxfill8(vram, xsize, COL8_848484, 59, ysize - 23, 59, ysize - 5);
boxfill8(vram, xsize, COL8_000000, 2, ysize - 3, 59, ysize - 3);
boxfill8(vram, xsize, COL8_000000, 60, ysize - 24, 60, ysize - 3);
boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 24, xsize - 4, ysize - 24);
boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 23, xsize - 47, ysize - 4);
boxfill8(vram, xsize, COL8_FFFFFF, xsize - 47, ysize - 3, xsize - 4, ysize - 3);
boxfill8(vram, xsize, COL8_FFFFFF, xsize - 3, ysize - 24, xsize - 3, ysize - 3);for (;;) {
io_hlt();
}
}

執行效果如下:

總結

以上是生活随笔為你收集整理的30天自制操作系统 pdf_30天自制操作系统:第四天:系统界面绘制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美第一网站 | 91视频在线观看免费 | 国产污网站 | 精品在线观看免费 | av在线精品 | 成人免费视频a | 九九久久精品视频 | 午夜精品亚洲 | 97超碰中文字幕 | www.免费av| 国产美女毛片 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 国产精品人八做人人女人a级刘 | 得得的爱在线视频 | 成人午夜在线免费观看 | a级黄毛片| 老色批影视 | av免费毛片 | 手机在线播放av | 国产三级日本三级在线播放 | 日韩福利在线播放 | 日韩有码一区二区三区 | 日韩人妻无码精品久久久不卡 | 日韩欧美亚洲 | 一区二区三区四区免费观看 | 丰满少妇一级 | 精品久久久久久久 | 69亚洲乱人伦 | eeuss国产一区二区三区 | 国产尤物视频在线 | 国产看片网站 | 一区二区三区日韩 | 成年人看的免费视频 | 天天舔日日操 | 免费精品视频 | 日韩av成人| 女性女同性aⅴ免费观女性恋 | 成年人免费看 | 国产成人精品综合在线观看 | 91蜜桃传媒精品久久久一区二区 | 无遮挡又爽又刺激的视频 | 成人av电影网站 | 婷婷在线网| 日本一区二区三区在线观看视频 | 久久首页 | 欧美射射 | 成年人精品| 日本xx视频免费观看 | 911国产视频| 小蝌蚪av| 亚洲天堂v| 精品福利一区二区三区 | 免费色网址| 欧美成人久久久 | 美女毛片在线观看 | 日本不卡中文字幕 | 极品美女啪啪 | 亚洲第一视频在线观看 | 在线黄网站 | 日韩激情第一页 | 成年人网站免费观看 | 老司机免费在线视频 | 有色影院 | 美女让男生桶 | 都市激情亚洲 | 国产一级在线播放 | 日本美女在线 | 在线观看视频 | 黄色大全免费看 | 手机在线精品视频 | 青青草视频国产 | 欧美日韩小视频 | 三级网站在线免费观看 | wwwxxx在线| 国产伦精品一区二区三区免.费 | 国产精品理论片在线观看 | 全部孕妇毛片丰满孕妇孕交 | 亚洲国产成人精品视频 | 三级视频网站 | 亚洲天堂av片 | 国产成人在线视频 | 国产青青草 | 久久综合五月 | 亚洲丁香 | 97超碰国产在线 | 国产一区黄色 | 亚洲中文无码久久 | 风间由美一区二区 | 在线亚洲一区 | 成人在线观 | 桃色视屏 | 欧美日韩色综合 | 精品国产综合区久久久久久 | 精品无码一区二区三区的天堂 | 57pao国产成永久免费视频 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 色婷婷av国产精品 | 亚洲天堂三区 | 天天摸夜夜操 |