不愛我,放了我 <Engin.bbs@bbs.cs.tku.edu.tw> wrote:
> 請問各位高手:
> 要如何在DOS下把螢幕規劃為320x200x256
> 兩頁以上的模式呢??
> 又,要如何切換顯示頁呢?? 是不是要使用
> 0x3d4 port啊??
> 請各位幫忙!!
請參考: http://www.cs.nthu.edu.tw/~mr864346/work/xmode.txt
大致上你這樣做就可以了:
mov ax,13h ;先切到標準的mode13
int 10h
mov al,4
mov dx,3C4h
out dx,al
inc dx
in al,dx
and al,11110111b
out dx,al
mov al,14h
mov dx,3D4h
out dx,al
inc dx
in al,dx
and al,10111111b
out dx,al
mov al,17h
mov dx,3D4h
out dx,al
inc dx
in al,dx
or al,01000000b
out dx,al
mov ah,00001111b
mov al,2
mov dx,3C4h
out dx,ax ;以上都是切換模式的部份
至於這幾個暫存器幹什麼用的, 因為年代久遠我已經不記得了, VGA 的書
也不在身邊.
這樣你可以規劃出 320x200x256 四個頁. 要記得控制四個不同的色平面,
這點不同於 chain-four mode ..
> -------------------------------------------------------------------------- <
發信人: Huangs.bbs@bbs.ntu.edu.tw (瀟洒不羈), 看板: Programming
標 題: Re: 請問如何規劃320x200x256的頁數??
發信站: 台大計中椰林風情站 (Thu Jan 21 02:23:36 1999)
轉信站: Ptt!news.ntu!Palmarama
==> Engin.bbs@bbs.cs.tku.edu.tw (不愛我,放了我) 提到:
> 請問各位高手:
> 要如何在DOS下把螢幕規劃為320x200x256
> 兩頁以上的模式呢??
> 又,要如何切換顯示頁呢?? 是不是要使用
> 0x3d4 port啊??
> 請各位幫忙!!
BIOS裡的13h繪圖模式只提供了一頁
所以想要多一頁須得自行new一塊記體
其大小為320*200*1byte,剛好放得進一塊節區
後一切的繪圖動作都在這塊記體上進行
最後再用memcpy((unsigned char *)0xa0000000,buffer,320*200);
將影像 呈現在螢幕上即可
不此方法較慢,且只能作單向切換,一般是用來防止
更新畫面時所帶來的閃爍,又稱虛擬螢幕。
--
☆ [Origin:椰林風情] [From: TS2-PPP-03.fju.edu.tw] [Login: 5] [Post: 4]
> -------------------------------------------------------------------------- <
發信人: Philosopher.bbs@cszone.cc.ntu.edu.tw (阿哲), 看板: Programming
標 題: Re: 請問如何規劃320x200x256的頁數??
發信站: 程式設計樂園(CSZone) (Thu Jan 21 08:17:05 1999)
轉信站: Ptt!news.ntu!CSZone
※ 引述《Huangs.bbs@bbs.ntu.edu.tw (瀟洒不羈)》之銘言:
: > 又,要如何切換顯示頁呢?? 是不是要使用
: > 0x3d4 port啊??
: > 請各位幫忙!!
: BIOS裡的13h繪圖模式只提供了一頁
: 所以想要多一頁須得自行new一塊記體
: 其大小為320*200*1byte,剛好放得進一塊節區
: 後一切的繪圖動作都在這塊記體上進行
: 最後再用memcpy((unsigned char *)0xa0000000,buffer,320*200);
: 將影像 呈現在螢幕上即可
: 不此方法較慢,且只能作單向切換,一般是用來防止
: 更新畫面時所帶來的閃爍,又稱虛擬螢幕。
這種方法並沒有用到切換顯示頁的技巧
而且應該也不叫做 virtual screen :b
virtual screen 通常是要利用到 video memory 才算
切換顯示頁可參考 Michael Abrash 的書
核心的 code:
WaitDE:
in al,dx
test al,01h
jnz WaitDE ;display enable is active low (0 = active)
; Set the start offset in display memory of the page to display.
mov dx,CRTC_INDEX
mov ax,bx
out dx,ax ;start address low
mov ax,cx
out dx,ax ;start address high
; Now wait for vertical sync, so the other page will be invisible when
; we start drawing to it.
mov dx,INPUT_STATUS_1
WaitVS:
in al,dx
test al,08h
jz WaitVS ;vertical sync is active high (1 = active)
--
※ Origin: 程式設計樂園 ◆ From: ppp14.ee.ntu.edu.tw