запись непосредственно в видеопамять - PullRequest
0 голосов
/ 20 мая 2018

Я слышал, что 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 Ответ

0 голосов
/ 20 мая 2018

Я нашел обходной путь, но, вероятно, это не лучший способ, вместо использования 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...