精華區beta Programming 關於我們 聯絡資訊
不愛我,放了我 <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