2011-04-01 58 views
2

我正在使用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 
+6

我想添加標籤'computer-archaeology' ... :) – 2011-04-01 14:12:54

+0

你從哪裏複製那些東西?必須是一位非常古老的編輯。 – DarkDust 2011-04-01 14:15:02

+1

這是一個非常糟糕的設計,幾乎在任何現代機器上都是無用的。 – 2011-04-01 14:25:43

回答

3
  • 廣告返回顯存
  • 波什翻譯斧,y位置到內存中的絕對位置的起始地址(假設80個字符寬度)
  • 寫把字符ch在在x,y位置
  • WRITEA設置字體顏色在x,y位置
+1

具體來說,POS轉換假定80列顯示。 – lefticus 2011-04-01 14:10:57

+1

關於WriteA的一點是錯誤的 - 請參閱其他答案 – 2011-04-01 14:13:36

+0

你是對的,我剛剛編輯! – 2011-04-01 14:51:33

4

天哪,這就像1990年一遍...

  • Ad是視頻卡(在文本模式下)映射到其字符生成器的內存部分的地址。所以如果你給*廣告寫一個ASCII'A',那麼你會在屏幕左上角得到一個'A'。
  • Pos是一個宏,用於計算x,y位置屏幕左上角的偏移量。 (這是一個危險的碎宏,因爲沒有()周圍的「X」。)
  • 寫寫入一個char到(X,Y)的位置
  • WRITEA寫人物屬性(顏色等)到( x,y)位置。

我不想苛刻,但如果你在這個層面上掙扎,你會努力編寫一個文本編輯器。

6

回到控制檯程序的黑暗時代,人們通過直接寫入屏幕緩衝區來輸出文本。

控制檯屏幕緩衝器被組織爲字節對的連續陣列,描述顯示的字符和它的屬性(顏色,背景顏色,並最終閃爍)。

在你的情況下,屏幕緩衝區似乎在0xb800000(Ad)。 Pos平移屏幕位置(y,x)到存儲器在屏幕緩衝區偏移,假定80.

Write屏幕寬度變化在指定的位置顯示的字符,而WriteA改變字符的顏色。

+0

在我的第一臺家用計算機上,控制檯屏幕緩衝區每個位置只有一個字節。它甚至不是一個完整的字節,因爲缺少一點。孩子們這些天。 – 2011-04-01 14:36:55

3

你不想使用它們。

這些宏是舊的硬件,在屏幕上可直接訪問。

  • 第一宏只是指定屏幕的基地址(和far不是由標準C識別)
  • 第二宏轉換的屏幕的位置的偏移
  • 的第三人寫的字符屏幕
  • 4人寫的彩色屏幕

再次,你不想使用這些宏

+0

您仍然可以在現代硬件上使用這些硬件,而不是隻使用現代操作系統。 – 2011-04-01 14:14:22

+0

嗯...... BIOS POST直接寫入0xb8000000 ......有趣的疑問:剛剛爲週末做了些事情:) – pmg 2011-04-01 14:19:23

+0

0xb8000000與b800:0000不一樣。後者是用於VGA文本存儲器的分段16位地址,映射到0x000b8000。 – 2011-04-01 14:27:09