Я работаю над проектом в 16-битном TASM, и довольно большая его часть связана с широкодоступным видеопамятью. Проект находится в режиме VGA 320x200x256, и я бегу через Dosbox8086 Неисправность видеосъемки сборки
Например, я следующий набор инструкций для заполнения/протирать экран в начале программы:
GFXMode proc ;Initialize 256-Color Graphics Mode [Args: None] [Returns: None]
push ax
mov ax, 0013h
int 10h
mov ax, 0a000h
mov es, ax
pop ax
ret
GFXMode endp
RefreshOff proc ;Disables screen refresh while drawing [Args: None] [Returns: None]
push ax bx
mov ax, 1201h
mov bl, 36h
int 10h
pop bx ax
ret
RefreshOff endp
FillScreen proc ;Fills screen with a certain color [Args: 8-bit Color] [Returns: None]
push bp
mov bp, sp
push ax bx
mov al, ss:[bp + 4] ;Color
mov bx, 0h
_fillScreenNextPixel:
mov es:[bx], al
inc bx
cmp bx, 0ffffh
jb _fillScreenNextPixel
pop bx ax bp
ret 2
FillScreen endp
RefreshOn proc ;Shows changes on screen [Args: None] [Returns: None]
push ax bx
mov ax, 1200h
mov bl, 36h
int 10h
pop bx ax
ret
RefreshOn endp
И функция FillScreen обычно дается 0FFh, поэтому она должна быть белой.
Поскольку я работаю с TASM, я отлаживал работу с Turbo Debugger, так как они собрались вместе. И некоторые действительно странные вещи случались - я могу нажать F7 в отладчике, чтобы продвигаться поочередно, или я могу нажать F9, чтобы пропустить до конца. Таким образом, я смотрю содержимое сегмента es (он устанавливается в A000 в обоих случаях), два отдельных раза один раз, нажимая F9, а затем удерживая F7 (до тех пор, пока я не выдержу больше)
Когда Я нажимаю F9. Все отображается на экране, но ничего не назначается для видеопамяти. Не за что. В конце программы я проверяю, есть ли что-то внутри es, и все это нули.
Когда я удерживаю F7 в течение нескольких минут, я вижу, что значения помещаются в регистр, поэтому я знаю, что они есть, но когда я перестаю удерживать клавишу после нескольких сотен пикселей и просто отпустите ее , значения перестают назначаться. Когда я просматриваю экран, это половина одного цвета и половина другого.
Я не знаю, является ли это проблемой для моего отладчика или с dosbox или что-то в моем коде, но я должен хранить эти значения где-нибудь, чтобы потом получить доступ к ним. В принципе, что, черт возьми, с моей программой?
EDIT: У меня нет изображения для публикации изображения, поэтому http://puu.sh/3iKhw.png - это то, как он выглядит, если я держу F7 за 0x600 пикселей, а затем отпустил цвет 0x3B. Линия в середине появилась только после случайного клика
Что расположения вашей видеопамяти? B800: xxxx является обычным выходом – ady
ret 2 - что это значит? pop bx ax bp выглядит удобно, не видел, что до – ady
Вы не показываете нам, где вы присваиваете значения 'es', поэтому трудно сказать, будет ли оно иметь определенное значение в определенный момент в программа. Кстати, вы можете упростить процедуру 'FillScreen' довольно много, используя' REP STOSB'. – Michael