Board logo

标题: 如何在djgpp下直接写显存? [打印本页]

作者: Loff     时间: 2004-6-6 00:00    标题: 如何在djgpp下直接写显存?

用djgpp写一个dos图形程序,用10号视频中断设置为图形模式后,打算用直接写显存的方式来画象素点(以前用turboC时一直就是这么做的)。
      显存的首址应该是A0000H吧?以前用turboC时,一句:video_buf = A0000000L就搞定了,但是现在换成DJGPP,确出来了一个“保护错误”!
General Protection Fault at eip=0000177c
eax=a0000000 ebx=000001ed ecx=00000000 edx=00000001 esi=00000054 edi=0004a2d0
ebp=000ca268 esp=000ca260 program=G:\PROJECTS\DJGPP\GIDE\GIDE.EXE
cs: sel=01a7  base=01ed0000  limit=000cffff
ds: sel=01af  base=01ed0000  limit=000cffff
es: sel=01af  base=01ed0000  limit=000cffff
fs: sel=017f  base=0000e2c0  limit=0000ffff
gs: sel=01bf  base=00000000  limit=0010ffff
ss: sel=01af  base=01ed0000  limit=000cffff
App stack: [000ca2d0..0004a2d0]  Exceptn stack: [0004a224..000482e4]

Call frame traceback EIPs:
  0x0000177c
  0x00001858
  0x00005578
难道djgpp下(或者说保护模式下)不允许直接写显存么?
作者: xy_god     时间: 2004-6-6 00:00
保护模式下是不可以调用BIOS中断的,只能通过操作断口来写驱动才行,所以无论是VGA还是
VESA等等中断都不能在保护模式下用,就连磁盘操作的中断也是同样!
但是DJGPP是一个基于DPMI的32位保护模式的开发系统,所以,他在BIOS中断的调用上采取了
一些手段,使得他产生的程序可以调用BIOS中断,但是这些中断的调用是通过DPMI来实现的
,我想可能是DPMI使得DJGPP生成的程序转到保护模式来执行了!
具体如何操作显存,你可以参看我的这篇帖子,
http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardID=6&ID=11734
老王卖瓜了,呵呵,不好意思!
作者: Loff     时间: 2004-6-6 00:00
谢谢啦!不过我直接用内嵌汇编的方法似乎可以直接调用BIOS中断,已经成功地设置了显示模式,现在只是不能写显存。
      同志你的文章非常不错,应该自夸。