[英]Creating own moveto() function in C for use in 0x13 VGA mode xv6
[英]Copy single byte to multiple memory locations in XV6 8086 Assembly 0x13 VGA (Real Mode)
在有人告訴我這項技術已經過時之前,我知道該項目的 scope 非常具體。
我的要求是通過直接寫入視頻 memory(實模式下為 0x13)來將填充的矩形打印到 output。 我通過沿 x 軸繪制每條線並將顏色字節(在本例中為 11)存儲到 VGA memory 0xa0000 + 偏移量來實現這一點。 然而,這個項目的要求要求一種比循環繪制每個像素更有效的方法,因為我直接處理視頻 memory。
我似乎無法弄清楚是否有辦法跨多個 memory 位置復制單個字節(值:11)。 作為實驗,我嘗試通過將字節乘以 0x01010 來跨寄存器復制字節...然后將整個兩個字節移動到 memory。該實驗成功了,它產生了一條從 memory 位置開始的兩個像素長度的水平線由 0xa0000 + 偏移量定義。
我遇到的問題是,這只是兩位。 0x13 模式的分辨率是 320x200,這樣使用寄存器的效率很低。 我曾考慮過使用 of.string 等,但這也違反了 scope 的要求。繪制一個數組並分配一個總計 64kb 的大小,以防其中一些像素可能被使用,這聽起來也非常低效,即使可能的話在實模式下。 所以這對我來說排除了。
這不起作用的另一個因素是有時可能需要向下而不是水平繪制線,並且不會像存儲從 memory 地址開始的字節塊那樣簡單。
然而話雖如此,如果我能想出一種方法將相同字節的動態數字復制到從給定位置開始的 memory 塊,那么我可以取得巨大進步,所以這就是我當前的目標。
有沒有辦法在不事先分配大量空間的情況下做到這一點? 假設我想畫一條 18 像素長的線,我想將值 11 的字節復制到從給定偏移量開始的段的 18 字節中。
在此先感謝,我希望我的描述已經足夠了。
我的要求是通過直接寫入視頻 memory(實模式下為 0x13)來將填充的矩形打印到 output。
然而,這個項目的要求要求一種比循環繪制每個像素更有效的方法,因為我直接處理視頻 memory。
繪制每個像素確實效率低下。 我在下面顯示的代碼:
我選擇在寄存器中傳遞 arguments,但如果您願意,可以更改它以便它使用堆棧。 這是純 8086 代碼。 如果你針對的是后面cpu的real mode,那么一次至少輸出4個pixel是可以的。
; BL is color [0,255]
; CX is X [0,319]
; DX is Y [0,199]
; SI is width [1,320]
; DI is height [1,200]
; IN (bl,cx,dx,si,di) OUT () MOD (ax,bx,cx,dx)
PaintRectangle:
push es ; DirectionFlag (DF) assumed 0
push di
mov ax, 0A000h ; Video buffer for 256-color mode 13h (320 x 200)
mov es, ax
mov ax, 320 ; BytesPerScanline (BPS)
mul dx ; Y * 320
add ax, cx ; Y * 320 + X
xchg ax, di ; DI is address, AX is height
xchg ax, bx ; BX is height, AL is color
mov ah, al ; AH is color too
.loop:
mov cx, si ; Width 1+
test di, 1
jz .even
stosb ; First/only pixel on an odd offset address
dec cx
.even:
shr cx, 1
rep stosw ; Two pixels together on an even offset address
jnc .done
stosb ; Last pixel on an even offset address
.done:
sub di, si ; Back to left side of rectangle
add di, 320 ; Descending one scanline
dec bx ; Height--
jnz .loop
pop di
pop es
ret
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.