Запись непосредственно в видеопамять
Я слышал, что int 10h, ah = 0Ch довольно медленный, и чтобы получить разумную скорость, мне нужно было бы перейти в память и поместить значение в пиксел, который я хочу, я установил свой режим видео на 13h
с int 10h
, Призыв изменить режим видео:
mov ah , 0
mov al , 13h
int 10h
и это процедура, которую я написал, чтобы поместить пиксель в заданные координаты:
drawFaster proc
; bp + 2 - row (dx)
; bp + 4 - column (cx)
; bp + 6 - color
mov bp , sp
pushad
mov ax , 0A000h - presumably the memory address of the screen
mov es , ax
mov ax , [bp + 2]
mov bx , [bp + 4]
mov cx , 320
mul cx
add ax , bx
mov di , ax
mov ax , [bp + 6]
mov [es:di] , al
popad
ret 6
endp
код, который вызывает функцию:
push bp
mov ax , 30
push ax
mov cx , 50
push cx
mov dx , 50
push dx
call drawFaster
pop bp
но по какой-то причине это не дает результатов, я не знаю, является ли адрес памяти неправильным или что-то еще. Мне нужна ваша помощь. Спасибо!
Странно то, что следующий кусок кода работает
mov ax , 0A000H
mov es , ax
mov [es:0] , 30
но следующий фрагмент кода этого не делает:
mov ax , 0A000H
mov bx , 0
mov es , ax
mov [es:bx] , 30
1 ответ
Я нашел обходной путь, но это, вероятно, не лучший способ пойти на это, вместо использования es
(потому что это не работает)
Я изменил адрес сегмента данных, чтобы привести к 0A000H
,
а потом я меняю пиксель с mov [di] , al
и это работает!
Но если вы пытаетесь это сделать, не забудьте переместить адрес сегмента данных на прежнее место.
моя функция в рабочем состоянии, если кому-то интересно
drawFaster proc
; bp + 2 - row (dx)
; bp + 4 - column (cx)
; bp + 6 - color
mov bp , sp ; changing bp to access the stack segment
; pushing the values to not lose them in the process of calling the function
push ax
push bx
push cx
push dx
mov ax, 0A000h ; 0A000h is the video memory address (for some video modes like 13h)
mov ds , ax
mov ax , [bp + 2] ; getting the row ( Y )
mov bx , [bp + 4] ; getting the column ( X )
mov cx , 320 ; multiplying the row by 320 to get the offset, and then adding the column
mul cx
add ax , bx
mov di , ax
mov ax , [bp + 6] ; getting the desired color to paint the pixel in
mov [di] , al ; changing the color of the chosen pixel with the desired color
; changing the data segment's address back to its original state
; VERY CRUCIAL PLEASE DON'T MISS THIS IF YOU DO IT THE SAME WAY
mov ax , @data
mov ds, ax
; changing the values back to what they were
pop dx
pop cx
pop bx
pop ax
ret 6
endp