2013-06-18 61 views
0

我正在一个项目在16位TASM,其中相当大的一部分涉及访问视频内存相当广泛。该项目是320x200x256 VGA模式,我通过DOSBox中8086大会视频内存差异

例如我有以下的指令集来填充/在节目的开始擦拭屏幕上运行它:

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屏幕上显示的所有内容,但没有任何内容被分配给视频内存。一点也不。在程序结束时,我检查内部是否有任何东西,它全部为零。

当我按住F7几分钟,我可以看到数值被放置在寄存器中,所以我知道它们在那里,但是当我停止按住几百像素之后的按键并放开它时,值不再被分配。当我查看屏幕时,它是一半的颜色和另一半的颜色。

我不知道这是否与我的调试器或与dosbox或我的代码中的东西有问题,但我必须将这些值保留在某处,以便稍后可以访问它们。基本上,我的程序到底是什么?

编辑:我没有代表张贴图像,所以http://puu.sh/3iKhw.png是它看起来像是如果我按住F7 0x600像素,然后放开颜色0x3B。中间线只是一个偶然的点击

+0

不知您对显存的位置? B800:xxxx是通常的输出 – ady

+0

ret 2 - 这是什么意思? pop bx ax bp看起来很方便,在之前没有看到过 – ady

+0

您没有向我们展示您将值分配给'es'的位置,因此很难说它是否预计会在某个特定点处具有某个值程序。顺便说一句,通过使用“REP STOSB”,您可以大量简化“FillScreen”过程。 – Michael

回答

-1

如果在ES和使用双棒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       

裁判然而RESH停止位做了奇怪的东西,我排除它

如果你坚持A000内存中,然后合理,但ES:DI是配对

+1

OP使用_graphics mode_,其中屏幕段为0A000h,所以使用像0B800h这样的文本模式段使得没有意义。 – Michael

+0

ES:由于字符串指令的使用,DI是核心存储器操作中的常见惯例,但是我已经看到ES:BX在图形代码中使用了相当多。 –