我正在使用C創建文本編輯器您能解釋這些宏嗎?使用視頻內存的c中的文本編輯器
#define Ad (unsigned char far *)0xb8000000
#define Pos(y,x) (2*((y)*80+x))
#define Write(y,x,ch) *(Ad+Pos(y,x))=ch
#define WriteA(y,x,fb) *(Ad+1+Pos(y,x))=fb
我正在使用C創建文本編輯器您能解釋這些宏嗎?使用視頻內存的c中的文本編輯器
#define Ad (unsigned char far *)0xb8000000
#define Pos(y,x) (2*((y)*80+x))
#define Write(y,x,ch) *(Ad+Pos(y,x))=ch
#define WriteA(y,x,fb) *(Ad+1+Pos(y,x))=fb
具體來說,POS轉換假定80列顯示。 – lefticus 2011-04-01 14:10:57
關於WriteA的一點是錯誤的 - 請參閱其他答案 – 2011-04-01 14:13:36
你是對的,我剛剛編輯! – 2011-04-01 14:51:33
天哪,這就像1990年一遍...
我不想苛刻,但如果你在這個層面上掙扎,你會努力編寫一個文本編輯器。
回到控制檯程序的黑暗時代,人們通過直接寫入屏幕緩衝區來輸出文本。
控制檯屏幕緩衝器被組織爲字節對的連續陣列,描述顯示的字符和它的屬性(顏色,背景顏色,並最終閃爍)。
在你的情況下,屏幕緩衝區似乎在0xb800000(Ad
)。 Pos
平移屏幕位置(y,x)
到存儲器在屏幕緩衝區偏移,假定80.
Write
屏幕寬度變化在指定的位置顯示的字符,而WriteA
改變字符的顏色。
在我的第一臺家用計算機上,控制檯屏幕緩衝區每個位置只有一個字節。它甚至不是一個完整的字節,因爲缺少一點。孩子們這些天。 – 2011-04-01 14:36:55
你不想使用它們。
這些宏是舊的硬件,在屏幕上可直接訪問。
far
不是由標準C識別)再次,你不想使用這些宏。
您仍然可以在現代硬件上使用這些硬件,而不是隻使用現代操作系統。 – 2011-04-01 14:14:22
嗯...... BIOS POST直接寫入0xb8000000 ......有趣的疑問:剛剛爲週末做了些事情:) – pmg 2011-04-01 14:19:23
0xb8000000與b800:0000不一樣。後者是用於VGA文本存儲器的分段16位地址,映射到0x000b8000。 – 2011-04-01 14:27:09
我想添加標籤'computer-archaeology' ... :) – 2011-04-01 14:12:54
你從哪裏複製那些東西?必須是一位非常古老的編輯。 – DarkDust 2011-04-01 14:15:02
這是一個非常糟糕的設計,幾乎在任何現代機器上都是無用的。 – 2011-04-01 14:25:43