2013-06-18 4 views
0

16 비트 TASM 프로젝트에서 작업 중이며 상당 부분이 비디오 메모리에 상당히 많이 액세스하고 있습니다. 이 프로젝트는 320x200x256 VGA 모드에, 나는 도스 박스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를 눌러 끝까지 건너 뛸 수 있습니다. 그래서 나는 F 세그먼트를 한 번 두 번 눌러 F7을 붙잡고 (나는 더 이상 가질 수 없을 때까지)

언제, es 세그먼트 (두 경우 모두 A000으로 설정)의 내용을보고 있습니다. F9를 누르면 화면에 모든 것이 나타나지만 비디오 메모리에는 아무 것도 지정되어 있지 않습니다. 전혀. 프로그램의 끝에서 나는 es 내부에 아무것도 있는지 확인하고 그것은 모두 0입니다.

몇 분 동안 F7을 길게 누르면 레지스터에 값이 표시되는 것을 볼 수 있으므로 그곳에 있다는 것을 알았지 만 몇 백 픽셀 후에 키를 누르고 그냥 놓아 두지 않으면 , 값 할당이 중지됩니다. 내가 화면을 볼 때 반은 한 색이고 반은 다른 반입니다.

내 디버거에 문제가 있는지, dosbox 또는 내 코드에 무엇이 있는지는 잘 모르겠지만, 나중에이 값에 액세스 할 수 있도록이 값을 어딘가에 유지해야합니다. 근본적으로, 도대체 내 프로그램에 무엇이 있습니까?

편집 : 이미지를 게시 할 담당자가 없으므로 http://puu.sh/3iKhw.png은 0x600 픽셀에 대해 F7을 누른 상태에서 색상 0x3B를 놓으면 모양이 같습니다. 중간에 라인은, 당신은 좀 더 행운도 F9FF에서 중지 도움이 될 수

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

이있을 수 있습니다, 당신은 ES 및 사용 디에 B800 스틱 경우

+0

뭐죠 비디오 메모리 위치입니까? B800 : xxxx는 일반적인 출력입니다. – ady

+0

ret 2 - 그게 무슨 뜻입니까? pop bx ax bp가보기에 편리합니다. 전에 보지 못했습니다. – ady

+0

값을 'es'에 할당하는 위치를 표시하지 않으므로, 특정 위치에 특정 값이있을 것으로 예상되는지 여부를 말하기 어렵습니다. 프로그램. 그런데'REP STOSB'를 사용하면'FillScreen' 과정을 상당히 단순화 할 수 있습니다. – Michael

답변

-1

는 BX없는 실수로 클릭 한 후 나타난 하지 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와 함께 붙어 있다면 나는 그것을

을 제외 : 디가 페어링

+1

OP는 화면 세그먼트 0A000h 인 _graphics 모드 _를 사용하므로 0B800h와 같은 텍스트 모드 세그먼트를 사용하면 말이되지 않는다. – Michael

+0

ES : DI는 문자열을 사용하여 코어 메모리를 조작하는 일반적인 방법이지만 ES : BX는 그래픽 코드에서 상당히 많이 사용됩니다. –