0

我正在开发一个 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 或我的代码中的某些东西的问题,但我必须将这些值保存在某个地方,以便以后可以访问它们。基本上,我的程序到底是怎么回事?

编辑:我没有代表发布图像,所以如果我按住 F7 为 0x600 像素然后放开颜色 0x3B,http: //puu.sh/3iKhw.png就是它的样子。中间的那条线是误点击才出现的

4

1 回答 1

-1

If you stick B800 in es and use di, not bx, you may have a bit more luck

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

Might also help to stop at F9FF, not FFFF, (might need to jiggle that number)

I've tested the bottom part of your code and it's fine if you tweak it, there's a colour splash to the screen

 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                          

The refresh halt bit however did weird stuff and I excluded it

If you're stuck with A000 memory then fair enough, but es:di are a pairing

于 2013-06-19T01:50:07.847 回答