首页
社区
课程
招聘
[求助]内联汇编-显存存取问题
发表于: 2007-6-11 09:12 6027

[求助]内联汇编-显存存取问题

2007-6-11 09:12
6027
【求助】内联汇编-显存存取问题
    问题1:
    求助,这下面是一段DOS下的显存存取程序,使用的是不知道哪CPU的内联汇编,一点都看不懂啊,现在向高手求助,下面的程序能够改写成在VC++中可以使用的函数吗?如何改?假设端口读写的函数声明是

BYTE InPortB (int Port)
void OutPortB (int Port, BYTE Value)
可以直接使用,

typedef struct BITMAP            /* a bitmap structure */
{
   int w, h;                     /* width and height in pixels */
   int clip;                     /* flag if clipping is turned on */
   int cl, cr, ct, cb;           /* clip left, right, top and bottom values */
   GFX_VTABLE *vtable;           /* drawing functions */
   void (*write_bank)(void);     /* write bank selector, see bank.s */
   void (*read_bank)(void);      /* read bank selector, see bank.s */
   void *dat;                    /* the memory we allocated for the bitmap */
   int bitmap_id;                /* for identifying sub-bitmaps */
   void *extra;                  /* points to a structure with more info */
   int x_ofs;                    /* horizontal offset (for sub-bitmaps) */
   int y_ofs;                    /* vertical offset (for sub-bitmaps) */
   int seg;                      /* bitmap segment */
   unsigned char *line[0];       /* pointers to the start of each line */
} BITMAP;

/*********************************************/
/************ Video memory access ************/
/*********************************************/

#if !defined alleg_vidmem_unused

__INLINE__ unsigned long bmp_write_line(BITMAP *bmp, int line)
{
   unsigned long result;

   asm volatile (
      "  call *%3 "

   : "=a" (result)                     /* result in eax */

   : "d" (bmp),                        /* bitmap in edx */
     "0" (line),                       /* line number in eax */
     "r" (bmp->write_bank)             /* the bank switch routine */
   );

   return result;
}

__INLINE__ unsigned long bmp_read_line(BITMAP *bmp, int line)
{
   unsigned long result;

   asm volatile (
      "  call *%3 "

   : "=a" (result)                     /* result in eax */

   : "d" (bmp),                        /* bitmap in edx */
     "0" (line),                       /* line number in eax */
     "r" (bmp->read_bank)              /* the bank switch routine */
   );

   return result;
}

__INLINE__ void _putpixel(BITMAP *bmp, int x, int y, unsigned char color)
{
#if defined __GNUC__ && defined __i386__
   asm (
      "  movw %w0, %%fs ; "
      "  .byte 0x64 ; "
      "  movb %b3, (%1, %2) "
   :                                   /* no outputs */

   : "rm" (bmp->seg),                  /* segment selector in reg or mem */
     "r" (bmp_write_line(bmp, y)),     /* line pointer in reg */
     "r" (x),                          /* line offset in reg */
     "qi" (color)                      /* the pixel in reg or immediate */
   );
#else
   _farpokeb(bmp->seg, bmp_write_line(bmp, y) + x, color);
#endif
}

__INLINE__ unsigned char _getpixel(BITMAP *bmp, int x, int y)
{
#if defined __GNUC__ && defined __i386__
   unsigned char result;

   asm (
      "  movw %w1, %%fs ; "
      "  .byte 0x64 ; "
      "  movb (%2, %3), %b0"

   : "=q" (result)                     /* result in al, bl, cl, or dl */

   : "rm" (bmp->seg),                  /* segment selector in reg or mem */
     "r" (bmp_read_line(bmp, y)),      /* line pointer in reg */
     "r" (x)                           /* line offset in reg */
   );

   return result;
#else
   return _farpeekb(bmp->seg, bmp_read_line(bmp, y) + x);
#endif
}

#endif

问题2:
    DriectX中对显存的操作比较厉害。怎样使用DriectX读取当前显示器显示的主显存中的图像呢?

    希望各位高手指点。谢谢。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 12
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
问题1:
  也许是 DOS 或者 LINUX 下的东西,读写显存普通的话通过端口就可以了。高分辨率和颜色需要通过VESA接口分页读取,也不太难。具体可以参考某本叫VESA 图像设计(类似名字)的书,不过非常难找。既然是读写端口,就自然无法移植到 VC++ 上,因为windows下不允许,除非你自己写个驱动来读。

问题2:
  DirectX也不能直接读写显存,只能通过它给你的方法去操作,好像是lockrect 还是什么的。
不过 ATI 显卡在窗口模式中一般会出问题。
2007-6-11 12:33
0
雪    币: 225
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
这段内联汇编是什么意思啊,?
2007-6-11 18:10
0
雪    币: 12
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看样子是用分页操作把bmp写进显存中。
2007-6-11 18:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了.仔细研究一下
2007-6-11 18:58
0
游客
登录 | 注册 方可回帖
返回
//