1 Я пишу в TASM 3.0 на DosBox 0.74, и я пытаюсь писать в Режим x (настроенный 13h, режим без цепочки 13 ), и Я столкнулся с проблемой, как вы можете видеть на изображении, каждая строка печатается, но в каждой строке, каждая группа из четырех пикселей печатается только цвет первого пикселя, это после печати изображения в другом месте в VRAM для двойной буферизации, поэтому все четыре плоскости имеют данные первой плоскости.
Так должно быть напечатано изображение (это прямая печать без двойного буфера, да, есть проблема с таймером, но это не имеет значения)
Так распечатывается изображение с двойной буферизацией
Я действительно считаю, что проблема в том, что данные отличаются от чтения для записи в портах VGA, когда дело доходит до режима x, вот код выбора Плоскость VGA
proc VGAPlaneSelect
push ax
push dx
push cx
mov al, 02h
mov dx, 03C4h
out dx, al
VGAPlaneSelect_start:
mov ax, 1
mov cl, [VGAPlane]
shl ax, cl
cmp [VGAPlane], 4
jne VGAPlaneSelect_end
mov [VGAPlane], 0
jmp VGAPlaneSelect_start
VGAPlaneSelect_end:
mov dx, 03C5h
out dx, al
pop cx
pop dx
pop ax
ret
endp VGAPlaneSelect
А если выходы n Не проблема здесь в коде передачи памяти:
proc DoubleBuffer
mov ax, 0A000h
mov es, ax
mov [VGAPlane], 0
call VGAPlaneSelect
cli
mov cx, 4
DoubleBuffer_loop:
xor di, di
xor si, si
push cx
mov cx, 16000
DoubleBuffer_loop_plane:
push di
push si
shr di, 2
shr si, 2
add si, NON_VISABLE_PLANE_OFFSET
mov al, [es:si]
stosb
pop si
pop di
add di, 4
add si, 4
loop DoubleBuffer_loop_plane
inc [VGAPlane]
call VGAPlaneSelect
pop cx
loop DoubleBuffer_loop
sti
ret
endp pageFlipping