Запись непосредственно в видеопамять

Я слышал, что 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
Другие вопросы по тегам