Я заранее извиняюсь, если этот вопрос кажется немного глупым ...
В настоящее время я занимаюсь разработкой простой 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 ... Кто-нибудь знает, как это исправить?