8086装配视频内存差异

时间:2013-06-18 19:56:27

标签: assembly dos video-memory

我正在开发一个16位TASM的项目,其中很大一部分涉及非常广泛地访问视频内存。该项目采用320x200x256 VGA模式,我通过Dosbox运行它

例如,我在程序开头填写/擦除屏幕时有以下一组说明:

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或我的代码中的某些问题,但我必须将这些值保留在某处,以便稍后我可以访问它们。基本上,我的计划到底是什么?

编辑:我没有代表发布图像,所以http://puu.sh/3iKhw.png就像我将F7保持为0x600像素然后放弃颜色0x3B一样。中间的线只出现在意外点击后

1 个答案:

答案 0 :(得分:-1)

如果你坚持使用B800并使用di,而不是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内存那么公平,但es:di是配对