2013-06-18 3 views
0

Я работаю над проектом в 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. Линия в середине появилась только после случайного клика

+0

Что расположения вашей видеопамяти? B800: xxxx является обычным выходом – ady

+0

ret 2 - что это значит? pop bx ax bp выглядит удобно, не видел, что до – ady

+0

Вы не показываете нам, где вы присваиваете значения 'es', поэтому трудно сказать, будет ли оно иметь определенное значение в определенный момент в программа. Кстати, вы можете упростить процедуру 'FillScreen' довольно много, используя' REP STOSB'. – Michael

ответ

-1

Если вы придерживаетесь B800 в эс и использовать ди, не BX, вы можете иметь немного больше удач

mov es:[di], al 
    inc di 
    cmp di, 0ffffh 

также может помочь остановить на F9FF, не FFFF, (возможно, потребуется покачивания это число)

Я протестировал нижнюю часть вашего кода, и это нормально, если вы настроить его, есть цвет заставки на экран

mov bx,B800      
mov es,bx      
mov bp,sp      
ss:mov al,[bp+4]     
mov di,0       
NextPixel      
es:mov [di],al     
inc di       
cmp di,FFF      
jb NextPixel      
mov ax,1200      
mov bl,36      
int 10       

реф реш привал немного, однако сделали странные вещи, и я исключил его

Если вы застряли A000 памяти, то достаточно справедливо, но эс: ди является спариванием

+1

OP использует режим _graphics_, где сегмент экрана равен 0A000h, поэтому использование сегмента текстового режима, такого как 0B800h, делает не имеет смысла. – Michael

+0

ES: DI - обычное соглашение в манипуляции с памятью ядра из-за использования строковых инструкций, однако я видел, что ES: BX используется в графическом коде совсем немного. –