我正在开发一个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一样。中间的线只出现在意外点击后答案 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是配对