彩色文本模式下,BIOS直接写屏幕缓冲区,不能正常显示。不知道是不是VESA不兼容的问题?请高人进来指点一下。
如题,之前用int10h的0c功能打点的问题已经解决了。现在向缓冲区直接写,可是又碰到这样的问题。
同样的代码在保护模式下可以正常显示(2行字符串均可)。
而在实模式下,只能显示利用int10h,功能13的写字符串。直接写显存不成功。
不知道问题出在哪里,烦请高人指点下!谢谢!
主要代码如下:
;---------------------------------------------------
screen_segment dw0;屏幕缓冲区段地址
screen_offsetdw0;屏幕缓冲区偏移地址
program_screendb'This is a test!'
some_stringdb'This some_string!'
;---------------------------------------------------
;该程序段可直接向屏幕缓冲区写进所要显示的内容
;---------------------------------------------------
write_screenprocnear
movax,3h;设置为80列*25行彩色文本模式
int10h
andal,7fh
movdx,0b800h;b800为彩色图形显示缓冲区的段地址
;将此处改成VESA标准的起始地址0A000h也不行
video_skip:
moves,dx
xordi,di
movah,0feh;获取屏幕地址
int10h
movcs:screen_segment,es;保存屏幕缓冲区的地址
movcs:screen_offset,di
moves,cs:screen_segment;屏幕缓冲区驻留地址
;如果把此处改成b800也不能显示
movdi,cs:screen_offset
movax,code_seg
movds,ax ;程序屏幕的地址
movsi,offset program_screen
movcx,15;要写的屏幕的大小
moval,3h
cld
next_char:
movsb;存储字符的ascii码
stosb;存储所要显示的属性
loopnext_char
;---------------------------------------
;以下为测试是否进入彩色显示模式
;经测试在保护模式/实模式下均可以正常显示
movax,cs
moves,ax
movax,1300h;写串
movbh,0;页号
movbl,13h;字符属性
movcx,17;字符串的长度
movdh,10;起始行
movdl,0;起始列
leabp,some_string;字符串偏移地址
int10h
;---------------------------------------
ret
write_screenendp
cmp word ptr es:[ptr_crtcbase],03b4h
jne __saveparams
mov ax,segb000
__saveparams:
mov screen_segment,ax
mov ax,es:[ptr_curpagestart]
mov screen_offset,ax
pop ds
ret
getvideoparams endp
write_screen proc near
mov ax,3h ;设置为80列*25行彩色文本模式
int 10h
call getvideoparams
mov es,cs:screen_segment ;屏幕缓冲区驻留地址
mov di,cs:screen_offset
mov ax,code
mov ds,ax ;程序屏幕的地址
mov si,offset program_screen
mov cx,15 ;要写的屏幕的大小
mov al,3h
cld
next_char:
movsb ;存储字符的ascii码
stosb ;存储所要显示的属性
loop next_char
;---------------------------------------
mov ax,cs
mov es,ax
mov ax,1300h ;写串
mov bh,0 ;页号
mov bl,13h ;字符属性
mov cx,17 ;字符串的长度
mov dh,10 ;起始行
mov dl,0 ;起始列
lea bp,some_string ;字符串偏移地址
int 10h
;---------------------------------------
ret
write_screen endp
start:
call write_screen
mov ax,4c00h
int 21h
code ends
end start