x86 сборка VGA графика с глюком NASM? - PullRequest
0 голосов
/ 07 июня 2018

Я заранее извиняюсь, если этот вопрос кажется немного глупым ...

В настоящее время я занимаюсь разработкой простой 16-битной ОС в реальном режиме, используя сборку x86 (NASM) с Ubuntu Mate Linux 16.04.3 LTS в качестве моегоплатформа разработки и Virtualbox для отладки системы.Загрузчик и базовый код ядра, написанный до сих пор, работают нормально, однако, похоже, у меня возникли некоторые проблемы с графическим кодом, который я пишу.Я переключился на SVGA с разрешением 640x480x256 через INT10h:

Services.screen_textmode.enter_svga:
    pusha

    mov ax, 4F02h
    mov bx, 101h
    int 10h

    popa
    ret

Затем управление передается обратно в ядро, которое сохраняет цвет пикселей для следующей функции (с которой у меня проблемы) вdl регистрируется и вызывает функцию:

mov dl, 2
call Services.svga.draw_background

Теперь проблема, с которой я сталкиваюсь, заключается в том, что при запуске следующего кода каждый раз, когда переключается банк видеопамяти, кажется, что он затемняет байт, что dlрегистр удерживает, и это меняет цвет каждого банка, или весь экран полностью черный.Вот код:

Services.svga.draw_background:
    pusha

    xor cx, cx
    xor dx, dx
    mov word [svga_bank], dx

    mov ax, 0A000h
    mov es, ax

.start_bank:
    mov di, cx
    mov [es:di], dl

.finish_bank:
    inc cx
    mov di, cx
    mov [es:di], dl

    cmp cx, 65535
    je .switch_bank
    jmp .finish_bank

.switch_bank:
    xor cx, cx

    mov word dx, [svga_bank]
    inc dx
    mov word [svga_bank], dx

    push ax
    push bx

    mov ax, 4F05h
    xor bx, bx
    int 10h

    pop ax
    pop bx

    cmp dx, 5
    je .done
    jmp .start_bank

.done:
    popa
    ret

Идея, по которой я хочу установить dl перед запуском функции Services.svga.draw_background, заключается в том, что ОС в конечном итоге сможет загружать файлы конфигурации, которые будут настраивать цветовую схему.для приложений и меню, делая систему более настраиваемой.

Я перепробовал все: разные способы, которые я нашел для переключения банков, прямой установки dl в .start_bank и т. Д. Ничего не работает, и я не могу ничего найти после исчерпывающего исследования.Очевидно, что если я не сохраню значение dx во время переключения банков, оно никогда не изменится, даже если присутствует инструкция «inc dx», которая заставляет систему войти в бесконечный цикл, а когда переключение банков работает должным образом, происходит изменение значенияиз dx как-то меняет и значение dl ... Кто-нибудь знает, как это исправить?

1 Ответ

0 голосов
/ 10 июня 2018

Поскольку DL уже является частью DX, вы не можете одновременно использовать DL для удержания цвета и DX для хранения номера банка.Это было уже замечено Шутом

Ваше усилие поместить цвет в регистр BL вместо , также не удалось из-за дополнительной проблемы в Services.svga.draw_background рутина.

push ax
push bx
mov ax, 4F05h
xor bx, bx
int 10h
pop ax
pop bx

Этот фрагмент неправильно восстанавливает регистры!pop должны быть в порядке, обратном push.

push ax
push bx
...
pop  bx
pop  ax

xor dx, dx
mov word [svga_bank], dx

Недостаточно для перемещения нуля в этом svga_bank и начните запись в 1-й банк.Выбор физического банка может указывать на любой другой банк.например, в конце этой процедуры Services.svga.draw_background физический банк имеет значение 5, номер банка, который даже не действителен (допустимый диапазон здесь [0,4])!


Я написал это для вашего удобства.Я поместил цвет в CL.

Services.svga.draw_background:
    pusha
    push ds
    mov  ax, 0A000h
    mov  ds, ax          ; DS:DI is start of video
    xor  di, di
    mov  ch, cl          ; CL holds the color [0,255]
    xor  dx, dx          ; Initial bank
  .again:
    mov  ax, 4F05h       ; VESA.SelectBank 0, 1, 2, 3
    xor  bx, bx
    int  10h
  .color:
    mov  [di], cx
    add  di, 2
    jnz  .color

    inc  dx
    cmp  dx, 4
    jb   .again

    mov  ax, 4F05h       ; VESA.SelectBank 4
    xor  bx, bx
    int  10h
  .LastBank:
    mov  [di], cx
    add  di, 2
    cmp  di, 45056
    jb   .LastBank

    pop  ds
    mov  word [svga_bank], dx
    popa
    ret

Разрешение 640 x 480 дает 307200 байт.Это в 4 раза больше 65536 байт и остаток 45056 байт.

Совет
Вы можете ускорить это, написав слова (ECX) вместо слов (CX)!

...