2012-11-05 29 views
3

那麼,我在Assembly x86(8086)上製作了一個Space Invaders遊戲,目前它運行的非常好。我在圖形模式下使用匯編13h,這意味着320x200像素和256色。雙緩衝,組裝x86

對於繪圖我使用子功能0ch,這意味着我正在逐個像素地繪製。問題是,屏幕清除速度很快,並導致一些視覺故障。

我已經編程了一些遊戲,解決方案可能是雙緩衝繪圖。 如何在Assembly x86中實現這一點?

編輯

我使用Windows 8 X64,測試和運行我的代碼DOSBox中的便攜式,TASM和TLINK。

+2

這不是一個彙編本身的問題,而是你的代碼將運行在哪個硬件和軟件環境中。你使用的是操作系統嗎?如果是這樣的話? –

+0

這個以前是通過翻頁25年前完成的。他的法拉利得到了John Carmack。那麼,1990年的模型,直到他厭倦了他們,並開始火箭。 –

回答

1

你需要一個RAM中的緩衝區(320 * 200 = 64000字節)。這個緩衝區幾乎填滿了一個段,因此最好確保緩衝區起始地址是「segment:0x0000」。您可以通過在RAM中設置此緩衝區中的像素/字節來繪製圖形。例如,要設置的(x,y)的像素,以顏色C你可能會做:

mov ax,[y] 
mov dx,320 
mul dx    ;dx:ax = y * 320 
mov di,[x]   ;di = x 
add di,ax   ;di = y * 320 + x 
mov bx,[bufferSeg] ;bx = segment of video buffer 
mov es,bx   ;es:di = address of pixel 
mov al,[c]   ;al = colour 
mov [es:di],al  ;Store colour in buffer at (x,y) 

正如你可以看到這種計算是凌亂/慢;你不想爲每一個像素做。幸運的是,您幾乎從不需要繪製單個像素(通常是繪製線條或字符,或「精靈」),通常您可以計算第一個像素的地址,然後添加一些內容以找到下一個像素的地址從頭開始計算下一個像素的地址。例如,對於繪製垂直線,下一個像素的地址是前一個像素的地址+ 320.

對於圖形模式0x13;顯示內存在物理地址0x000A0000(或0xA000:0x0000)。繪製完所有內容後,您需要將所有內容從緩衝區複製到顯示內存。例如:

mov ds,ax    ;ds = segment for buffer 
xor si,si    ;si:si = address for buffer 
mov ax,0xA000   ;ax = segment for display memory 
mov di,ax    ;di = segment for display memory 
mov es,ax    ;es:di = address for display memory 
mov cx,320*200/2  ;cx = number of words to copy 
cld     ;Make sure direction flag is clear 
rep movsw    ;Copy 320*200/2 words from buffer to display memory 
+0

謝謝,這個工程類似於清屏方法,現在確實有道理,謝謝! –

0

mov es,[bufferSeg]起作用。在執行段/內存和內存/段mov時,不需要使用額外的寄存器。

+0

你可以充實一點這個答案,並擴大話題? – 2013-03-21 12:18:59