免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 13266 | 回复: 46
打印 上一主题 下一主题

DOS下看真彩BMP位图的小程序(我给加了注释) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-03 23:55 |只看该作者 |倒序浏览
很久以前编的DOS看真彩BMP位图的小程序给贴上来了,有兴趣的就自己编译着玩玩,里边还有我写的一个画直线的算法,不过很笨拙。 初学者可以试着看看源码挺简单的,看到有不少人看这个贴子我就给注释了,不过画直线的函数就不用看了,很乱我自己都懒得看所以就没有注释
另外几个函数的功能在后面的跟贴我简单的介绍了一下



A.c main文件


  1. #include <stdio.h>;
  2. #include <conio.h>;
  3. #include "a.h"

  4. /*extern         void        print();
  5. *extern  void        init(int);
  6. *extern  void        vinfo(int)
  7. *extern  void demo(int,int,int);
  8. *extern  void Pixel16HiC(int,int,int);
  9. *extern         void Pixel24TrC(unsigned long int,int,int);
  10. *extern         void Pixel256C(char,int,int);

  11. *#define         Hi15(R,G,B)
  12. *#define  HiColor(R,G,B)    R*2048+G*32+B
  13. *#define  TrColor(R,G,B)    R*65536+G*256+B
  14. *#define  Tr_HColor(R,G,B)
  15. *#define  H_TColor(RGB)
  16. *#define  T_HColor(RGB)
  17. */



  18. main()
  19. {
  20.         unsigned int i,j,x,y;
  21.         FILE *fp;

  22.         if((fp=fopen("d:\\BC4\\Ship\\24.bmp","rb"))==NULL)/*自己选择路径*/
  23.                 printf("Can't open 256.bmp\n");

  24.         init(Tr800_600);/*初始化显示模式为24位真彩色,800*600分辨率*/

  25.         readpic(fp);/*主函数*/
  26.                 fclose(fp);

  27.         /*for(i=0;i<=767;i++)
  28.          *                line(i,i,1023,0,TrC(i,i*3,i/2));/*这里是画直线函数*/
  29.                  */
  30.                 getch();
  31.         return;
  32. }

复制代码




BMP.C 主文件,里边有画直线函数

  1. #include<stdio.h>;
  2. #include<alloc.h>;
  3. #include<dos.h>;
  4. #include"a.h"



  5. unsigned        far* readpic(FILE *fp)
  6. {

  7.         struct bmp_head  far* bhead;
  8.         int        x,y;
  9.         unsigned long size,length,width;
  10.         void far *        farmem;
  11.         unsigned char        far *RGB;
  12.         char        temp[30],over;


  13.         fread(temp,30L,1,fp); /*读BMP文件头信息*/

  14.         bhead=(char far*)temp;

  15.         over=bhead->;width%4;/*BMP格式每行多出的位,我也不清楚为什么要多出这几位,当时我这里让我很头痛费了好大劲才查出来*/

  16.         width=bhead->;width*3+over;/*位图宽*/

  17.         if((farmem=farmalloc(width*10+10))==NULL)/*分配缓冲区因为DOS最大可分配内存是一个段64K字节这里我分配了位图宽度*10 +10*/
  18.                 printf("Not enough Memory\n");

  19.         fseek(fp,bhead->;offset,0);/*读指针跳到位图数据起点*/

  20.         fread(farmem,width,10,fp);/*读位图数据到缓冲区*/
  21.                
  22.         RGB=farmem;/*RGB画像素用的指针,每像素3个字节*/

  23.         for(y=bhead->;hight;y>;=0;y--)/*bhead->;hight 位图高度*/
  24.         {
  25.                 for(x=0;x<bhead->;width;x++)/*bhead->;width 位图宽度*/
  26.                 {
  27.                         Pixel24TrC(TrC(*(RGB+2),*(RGB+1),*RGB),x,y);/*画点*/
  28.                         RGB=RGB+3;/*一个像素点3个字节*/
  29.                         if(FP_OFF(RGB)==width*10+FP_OFF(farmem)||FP_OFF(RGB)==width*10+FP_OFF(farmem)+3)/*FP_OFF取远指针偏移,这个条件语句判断画完一个缓冲区*/
  30.                         {
  31.                                 fread(farmem,width,10,fp);
  32.                                 RGB=farmem;
  33.                         }/*把BMP位图分成缓冲区大小的段*/
  34.                 }
  35.                 RGB=RGB+over;/*每行最后多出over个字节*/
  36.         }
  37.         farfree(farmem);


  38.         return        farmem;

  39. }


  40. /*画直线函数*/

  41. void line(unsigned long left_x,unsigned long left_y,unsigned long right_x,unsigned long right_y,unsigned long color)
  42. {

  43.         unsigned long        x=left_x,y=left_y;
  44.         if(left_x>;right_x)
  45.                 if(left_y>;right_y)
  46.                 {
  47.                         while(left_x-right_x>;left_x-x)
  48.                         {
  49.                                 Pixel24TrC(color,x,y);
  50.                                 if((left_x-right_x)>;(left_y-right_y))
  51.                                         while((left_y-right_y)*(left_x-x)<(left_x-right_x)*(left_y-y))
  52.                                         {
  53.                                                 x--;
  54.                                                 Pixel24TrC(color,x,y);
  55.                                         }
  56.                                 x--;
  57.                                 if(y<=right_y)
  58.                                         continue;
  59.                                 if((left_y-right_y)>;(left_x-right_x))
  60.                                         while((left_y-right_y)*(left_x-x)>;(left_x-right_x)*(left_y-y))
  61.                                         {
  62.                                                 y--;
  63.                                                 Pixel24TrC(color,x,y);
  64.                                         }
  65.                                 y--;
  66.                         };
  67.                         while(y>;right_y)
  68.                         {
  69.                                 Pixel24TrC(color,x,y);
  70.                                 y--;
  71.                         };

  72.                 }
  73.                 else
  74.                 {
  75.                         while(x>;right_x)
  76.                         {
  77.                                 Pixel24TrC(color,x,y);
  78.                                 if((left_x-right_x)>;(right_y-left_y))
  79.                                         while((right_y-left_y)*(left_x-x)<(left_x-right_x)*(y-left_y))
  80.                                         {
  81.                                                 x--;
  82.                                                 Pixel24TrC(color,x,y);
  83.                                         }
  84.                                 x--;
  85.                                 if(!(y<right_y))
  86.                                         continue;
  87.                                 if((right_y-left_y)>;(left_x-right_x))
  88.                                         while((right_y-left_y)*(left_x-x)>;(left_x-right_x)*(y-left_y))
  89.                                         {
  90.                                                 y++;
  91.                                                 Pixel24TrC(color,x,y);
  92.                                         }
  93.                                 y++;
  94.                         };

  95.                         while(y<=right_y)
  96.                         {
  97.                                 Pixel24TrC(color,x,y);
  98.                                 y++;
  99.                         };
  100.                 }

  101.         else
  102.                 if(left_y>;right_y)
  103.                 {
  104.                         while(x<right_x)
  105.                         {
  106.                                 Pixel24TrC(color,x,y);
  107.                                 if((right_x-left_x)>;(left_y-right_y))
  108.                                         while((left_y-right_y)*(x-left_x)<(right_x-left_x)*(left_y-y))
  109.                                         {
  110.                                                 x++;
  111.                                                 Pixel24TrC(color,x,y);
  112.                                         }
  113.                                 x++;
  114.                                 if(left_y-y>;left_y-right_y)
  115.                                         continue;
  116.                                 if((left_y-right_y)>;(right_x-left_x))
  117.                                         while((left_y-right_y)*(x-left_x)>;(right_x-left_x)*(left_y-y))
  118.                                         {
  119.                                                 y--;
  120.                                                 Pixel24TrC(color,x,y);
  121.                                         }
  122.                                 y--;
  123.                         };

  124.                         while(left_y-y<=left_y-right_y)
  125.                         {
  126.                                 Pixel24TrC(color,x,y);
  127.                                 y--;
  128.                         };

  129.                 }
  130.                 else
  131.                 {
  132.                         while(x<right_x)
  133.                         {
  134.                                 Pixel24TrC(color,x,y);
  135.                                 if((right_x-left_x)>;(right_y-left_y))
  136.                                         while((right_y-left_y)*(x-left_x)<(right_x-left_x)*(y-left_y))
  137.                                         {
  138.                                                 x++;
  139.                                                 Pixel24TrC(color,x,y);
  140.                                         }

  141.                                 x++;

  142.                                 if(y>;=right_y)
  143.                                         continue;
  144.                                 if((right_y-left_y)>;(right_x-left_x))
  145.                                         while((right_y-left_y)*(x-left_x)>;(right_x-left_x)*(y-left_y))
  146.                                         {
  147.                                                 y++;
  148.                                                 Pixel24TrC(color,x,y);
  149.                                         }
  150.                                 y++;
  151.                         };

  152.                         while(y<=right_y)
  153.                         {
  154.                                 Pixel24TrC(color,x,y);
  155.                                 y++;
  156.                         };
  157.                 }

  158.         return 0;
  159. }


复制代码



a.h 头文件


  1. #define        LINE        640


  2. #define        C256(R,G,B)                (unsigned char)R*0x20%0x100+(unsigned char)G*0x4%0x20+B

  3. #define         Hi15(R,G,B)                (unsigned)R*0x400%0x8000+(unsigned)G*0x20%0x400+(char)B%0x20

  4. #define        HiC(R,G,B)                 (unsigned)R*0x800%0x10000+(unsigned)G*32%0x800+(char)B%0x20
  5. #define        TrC(R,G,B)                (unsigned long)R*0x10000%0x1000000+(unsigned long)G*0x100%0x10000+(unsigned)B%0x100
  6. #define        Hi-TrC(RGB)           (unsigned long)RGB%0x10000/2048*65536+(unsigned long)RGB%2048/32*256+(unsigned char)RGB%32
  7. #define        Tr-HiC(RGB)                (unsigned long)RGB%0x1000000/65536%32*2048+(unsigned long)RGB%65536/64*32+(unsigned char)(RGB%32)


  8. #define        C256_640_400                0x100
  9. #define        C256_640_480                0x101
  10. #define        C16_800_600                        0x102
  11. #define        C256_800_600                0x103
  12. #define        C16_1024_768                0x104
  13. #define        C256_1024_768                0x105
  14. #define        Hi15_640_480                0x110
  15. #define        Hi640_480                        0x111
  16. #define        Tr640_480         0x112
  17. #define        Hi15_800_600                0x113
  18. #define        Hi800_600                        0x114
  19. #define        Tr800_600                        0x115
  20. #define        Hi15_1024_768                0x116
  21. #define        Hi1024_768                        0x117
  22. #define        Tr1024_768                        0x118




  23. extern        void  Demo(unsigned long,int,int);

  24. extern        void        init(int);
  25. extern      void Pixel16HiC(int,int,int);
  26. extern        void Pixel24TrC(unsigned long,int,int);
  27. extern        void Pixel256C(char,int,int);
  28. extern      void line(unsigned long x1,unsigned long y1,unsigned long x2,unsigned long y2,unsigned long color);

  29. /*seepic*/
  30. extern        unsigned far* readpic(FILE *fp);

  31. extern        void mouse(void);


  32. struct        bmp_head
  33. {
  34.         int         other1;
  35.         unsigned long        length;
  36.         char        other2[4];
  37.         unsigned  int        offset;
  38.         char        other3[6];
  39.         unsigned  int        width;
  40.         char        other4[2];
  41.         unsigned  int        hight;
  42.         char                        other5[4];
  43.         unsigned        char        color;
  44. };
复制代码



mybmp.c这是嵌入式汇编的画点函数

  1. void init(int mode)
  2. {
  3.         asm        mov                bx,mode
  4.         asm         mov                ax,4f02h
  5.         asm        int                10h
  6.         return;
  7. }




  8. void Pixel24TrC(unsigned long color,int x,int y)
  9. {

  10.         asm         push                es
  11.         asm        push                di

  12.         asm        mov                ax,4f03h
  13.         asm        int                10h

  14. pi112:
  15.         asm        cmp                 bx,112h
  16.         asm        jnz                pi115

  17.         asm        mov                dx,640
  18.         asm        jmp                write_24t


  19. pi115:
  20.         asm        cmp                bx,115h
  21.         asm        jnz                pi118

  22.         asm        mov                dx,800
  23.         asm        jmp                write_24t

  24. pi118:
  25.         asm        cmp                bx,118h
  26.         asm        jnz                Tr_exit

  27.         asm        mov                dx,1024

  28. write_24t:
  29.         asm        mov                ax,0a000h
  30.         asm        mov                es,ax
  31.         asm        mov                ax,y
  32.         asm        mul                dx
  33.         asm        mov                bx,ax
  34.         asm        mov                cx,dx
  35.         asm        add                ax,bx
  36.         asm        adc                dx,cx
  37.         asm        add                ax,bx
  38.         asm        adc                dx,cx
  39.         asm        add                ax,bx
  40.         asm        adc                dx,cx

  41.         asm        mov                bx,x
  42.         asm        add                bx,x
  43.         asm        add                bx,x
  44.         asm        add                bx,x
  45.         asm        add                ax,bx
  46.         asm        adc                dx,0
  47.         asm        mov                di,ax

  48.         asm        mov                ax,4f05h
  49.         asm        mov                bx,0
  50.         asm        int                10h

  51.         asm        mov                cx,word ptr color
  52.         asm        mov                word ptr es:[di],cx
  53.         asm        add                di,2
  54.         asm        mov                cx,word ptr color+2
  55.         asm        mov                word ptr es:[di],cx

  56. Tr_exit:
  57.         asm        pop                di
  58.         asm        pop                es

  59.         return;
  60. }


  61. void Pixel16HiC(int color,int x,int y)
  62. {
  63.         asm        push                es
  64.         asm        push                di

  65.         asm        mov                ax,4f03h
  66.         asm        int                10h

  67. pi110:
  68.         asm        cmp                bx,110h
  69.         asm        jnz                pi111

  70.         asm        mov                dx,640
  71.         asm        jmp                write_16h



  72. pi111:
  73.         asm        cmp                bx,111h
  74.         asm        jnz                pi113

  75.         asm        mov                dx,640
  76.         asm        jmp                write_16h



  77. pi113:
  78.         asm        cmp                bx,113h
  79.         asm        jnz                pi114

  80.         asm        mov                dx,800
  81.         asm        jmp                write_16h


  82. pi114:
  83.         asm        cmp                bx,114h
  84.         asm        jnz                pi116

  85.         asm        mov                dx,800
  86.         asm        jmp                write_16h


  87. pi116:
  88.         asm        cmp                bx,116h
  89.         asm        jnz                pi117

  90.         asm        mov                dx,1024
  91.         asm        jmp                write_16h


  92. pi117:
  93.         asm        cmp                bx,117h
  94.         asm        jnz                Hi_exit

  95.         asm        mov                dx,1024


  96. write_16h:
  97.         asm        mov                ax,0a000h
  98.         asm        mov                es,ax
  99.         asm        mov                ax,word ptr [y]
  100.         asm        mul                dx
  101.         asm        shl                ax,1
  102.         asm        jc                        a1
  103.         asm        shl                dx,1
  104.         asm        jmp                cont
  105. a1:
  106.         asm        shl                dx,1
  107.         asm        inc                dx

  108. cont:
  109.         asm        shl                word ptr [x],1
  110.         asm        add                ax,word ptr [x]
  111.         asm        adc                dx,0
  112.         asm        mov      di,ax

  113.         asm        mov                ax,4f05h
  114.         asm        mov                bx,0
  115.         asm        int                10h

  116.         asm        mov                cx,word ptr [color]
  117.         asm        mov                word ptr es:[di],cx

  118. Hi_exit:
  119.         asm        pop                di
  120.         asm        pop                es

  121.         return;
  122. }


  123. void Pixel256C(char        color,int x,int y)
  124. {
  125.         asm        push                es
  126.         asm        push                di


  127.         asm        mov                ax,4f03h
  128.         asm        int                10h


  129. pi100:
  130.         asm        cmp                bx,100h
  131.         asm        jnz                pi101

  132.         asm        mov                dx,640
  133.         asm        jmp                write_256

  134. pi101:
  135.         asm        cmp                bx,101h
  136.         asm        jnz                pi103

  137.         asm        mov                dx,640
  138.         asm        jmp                write_256



  139. pi103:
  140.         asm        cmp                bx,103h
  141.         asm        jnz                pi105

  142.         asm        mov                dx,800
  143.         asm        jmp                write_256



  144. pi105:
  145.         asm        cmp                bx,105h
  146.         asm        jnz                exit_256

  147.         asm        mov                dx,1024

  148. write_256:
  149.         asm        mov                ax,0a000h
  150.         asm        mov                es,ax
  151.         asm        mov                ax,word ptr [y]
  152.         asm        mul                dx
  153.         asm        add                ax,word ptr [x]
  154.         asm        adc                dl,0
  155.         asm        mov      di,ax

  156.         asm        mov                ax,4f05h
  157.         asm        mov                bx,0
  158.         asm        int                10h

  159.         asm        mov                cl,byte ptr [color]
  160.         asm        mov                byte ptr es:[di],cl


  161. exit_256:
  162.         asm        pop                di
  163.         asm        pop                es

  164.         return;
  165. }
复制代码



gl.asm 底层画点函数要用TASM编译,不过有上边的嵌入式汇编这个可以不用了


  1. .386

  2.                                         public          _init
  3.                                         public        _Demo
  4.                                         public   _Pixel16HiC
  5.                                         public   _Pixel24TrC
  6.                                         public   _Pixel256C


  7. _ATTRI                     struc

  8. MODE_ATTR           DW                ?
  9. WIN_A_ATTR                DB                ?
  10. WIN_B_ATTR                DB                ?
  11. WIN_GRAN                        DB                ?
  12. WIN_SIZE                        DW                ?
  13. WIN_A_SEG                DW                ?
  14. WIN_B_SEG                DW                ?
  15. WIN_FUNC_PTR   DD                ?
  16. LINE_BYTE                DW                ?

  17. _ATTRI                    ends



  18. mpusha                        macro
  19.                                         push                ax
  20.                                         push                cx
  21.                                         push                dx
  22.                                         push                bx
  23.                                         push                sp
  24.                                         push                bp
  25.                                         push                si
  26.                                         push                di
  27.                                         endm


  28. mpopa                                macro
  29.                                         pop                di
  30.                                         pop                si
  31.                                         pop                bp
  32.                                         pop                sp
  33.                                         pop                bx
  34.                                         pop                dx
  35.                                         pop                cx
  36.                                         pop                ax
  37.                                         endm


  38. DGROUP                        group                  _DATA,_BSS




  39.                                         extrn                _printf:far




  40. _TEXT                                segment        use16 byte public 'code'
  41.                                         assume        cs:_TEXT,ds:DGROUP


  42. ;初始化图型模式
  43. ;入口参数:显示模式压入?

  44. _init                     proc                far

  45.                                         enterw          0,0
  46.                                         mov                bx,[bp+6]
  47.                                         mov                ax,4f02h
  48.                                         int                10h
  49.                                         leavew
  50.                                         ret

  51. _init                      endp


  52. ;画点



  53. _Pixel24TrC         proc                far

  54.                                         enterw        0,0
  55.                                         push                es
  56.                                         push                di

  57.                                         mov                ax,4f03h
  58.                                         int                10h

  59. pi112:                        cmp                 bx,112h
  60.                                         jnz                pi115

  61.                                         mov                dx,640
  62.                                         jmp                write_24t


  63. pi115:         cmp                bx,115h
  64.                                         jnz                pi118

  65.                                         mov                dx,800
  66.                                         jmp                write_24t

  67. pi118:                        cmp                bx,118h
  68.                                         jnz                Tr_exit

  69.                                         mov                dx,1024

  70. write_24t:                mov                ax,0a000h
  71.                                         mov                es,ax
  72.                                         mov                ax,word ptr [bp+12]
  73.                                         mul                dx
  74.                                         mov                bx,ax
  75.                                         mov                cx,dx
  76.                                         add                ax,bx
  77.                                         adc                dx,cx
  78.                                         add                ax,bx
  79.                                         adc                dx,cx
  80.                                         add                ax,bx
  81.                                         adc                dx,cx

  82.                                         mov                bx,word ptr [bp+10]
  83.                                         add                bx,word ptr [bp+10]
  84.                                         add                bx,word ptr [bp+10]
  85.                                         add                bx,word ptr [bp+10]
  86.                                         add                ax,bx
  87.                                         adc                dx,0
  88.                                         mov                di,ax

  89.                                         mov                ax,4f05h
  90.                                         mov                bx,0
  91.                                         int                10h

  92.                                         mov                cx,word ptr [bp+6]
  93.                                         mov                word ptr es:[di],cx
  94.                                         add                di,2
  95.                                         mov                cx,word ptr [bp+8]
  96.                                         mov                word ptr es:[di],cx

  97. Tr_exit:                        pop                di
  98.                                         pop                es

  99.                                         leavew
  100.                                         ret

  101. _Pixel24TrC                endp




  102. _Pixel16HiC         proc                far

  103.                                         enterw        0,0
  104.                                         push                es
  105.                                         push                di

  106.                                         mov                ax,4f03h
  107.                                         int                10h

  108. pi110:                        cmp                bx,110h
  109.                                         jnz                pi111

  110.                                         mov                dx,640
  111.                                         jmp                write_16h



  112. pi111:         cmp                bx,111h
  113.                                         jnz                pi113

  114.                                         mov                dx,640
  115.                                         jmp                write_16h



  116. pi113:         cmp                bx,113h
  117.                                         jnz                pi114

  118.                                         mov                dx,800
  119.                                         jmp                write_16h


  120. pi114:         cmp                bx,114h
  121.                                         jnz                pi116

  122.                                         mov                dx,800
  123.                                         jmp                write_16h


  124. pi116:                        cmp                bx,116h
  125.                                         jnz                pi117

  126.                                         mov                dx,1024
  127.                                         jmp                write_16h


  128. pi117:         cmp                bx,117h
  129.                                         jnz                Hi_exit

  130.                                         mov                dx,1024


  131. write_16h:                mov                ax,0a000h
  132.                                         mov                es,ax
  133.                                         mov                ax,word ptr [bp+10]
  134.                                         mul                dx
  135.                                         shl                ax,1
  136.                                         jc                        a1
  137.                                         shl                dx,1
  138.                                         jmp                cont
  139. a1:                                shl                dx,1
  140.                                         inc                dx

  141. cont:                                shl                word ptr [bp+8],1
  142.                                         add                ax,word ptr [bp+8]
  143.                                         adc                dx,0
  144.                                         mov      di,ax

  145.                                         mov                ax,4f05h
  146.                                         mov                bx,0
  147.                                         int                10h

  148.                                         mov                cx,word ptr [bp+6]
  149.                                         mov                word ptr es:[di],cx

  150. Hi_exit:                        pop                di
  151.                                         pop                es

  152.                                         leavew
  153.                                         ret

  154. _Pixel16HiC                endp




  155. _Pixel256C                 proc                far

  156.                                         enterw        0,0
  157.                                         push                es
  158.                                         push                di


  159.                                         mov                ax,4f03h
  160.                                         int                10h


  161. pi100:                        cmp                bx,100h
  162.                                         jnz                pi101

  163.                                         mov                dx,640
  164.                                         jmp                write_256

  165. pi101:                        cmp                bx,101h
  166.                                         jnz                pi103

  167.                                         mov                dx,640
  168.                                         jmp                write_256



  169. pi103:                        cmp                bx,103h
  170.                                         jnz                pi105

  171.                                         mov                dx,800
  172.                                         jmp                write_256



  173. pi105:         cmp                bx,105h
  174.                                         jnz                exit_256

  175.                                         mov                dx,1024

  176. write_256:                mov                ax,0a000h
  177.                                         mov                es,ax
  178.                                         mov                ax,word ptr [bp+10]
  179.                                         mul                dx
  180.                                         add                ax,word ptr [bp+8]
  181.                                         adc                dl,0
  182.                                         mov      di,ax

  183.                                         mov                ax,4f05h
  184.                                         mov                bx,0
  185.                                         int                10h

  186.                                         mov                cl,byte ptr [bp+6]
  187.                                         mov                byte ptr es:[di],cl


  188. exit_256:                pop                di
  189.                                         pop                es

  190.                                         leavew
  191.                                         ret

  192. _Pixel256C                endp



  193. ;入口参数: ax=要转换的二进制数

  194. ;出口参数  dx:ax=转换十进数?
  195. B_O                                proc                near

  196.                                         enterw          5,0
  197.                                         push                es
  198.                                         push                di
  199.                                         push                si
  200.                                         mov                bx,10
  201.                                         mov                cx,5
  202.                                         mov                di,sp
  203.                                         mov                ax,ss
  204.                                         mov                es,ax

  205. getover:                        div      bx
  206.                                         add                dl,30h
  207.                                         mov                byte ptr           es:[di],dl
  208.                                         dec                cx
  209.                                         jz                        return
  210.                                         inc                di
  211.                                         cmp                ax,0
  212.                                         jnz      getover
  213.                                         mov                byte ptr           es:[di],dl

  214. return:                        xor                dx,dx
  215.                                         xor                ax,ax
  216.                                         std
  217.                                         mov                si,di
  218. relod:              mov                cx,4
  219.                                         lodsb
  220. re:                                shl                dx,1
  221.                                         shl                ax,1
  222.                                         jnc                d0
  223.                                         inc                dx
  224. d0:                 dec                cx
  225.                                         jnz                re

  226.                                         cmp                si,sp
  227.                                         jnz                relod

  228.                                         pop                si
  229.                                         pop                di
  230.                                         pop                es
  231.                                         leavew
  232.                                         ret

  233. B_O                                endp


  234. _Demo                 proc                  far

  235.                                         enterw        0,0
  236.                                         push                es
  237.                                         push                di

  238.                                         mov                ax,0a000h
  239.                                         mov                es,ax
  240.                                         mov                dx,1024
  241.                                         mov                ax,word ptr [bp+12]
  242.                                         mul                dx
  243.                                         mov                bx,ax
  244.                                         mov                cx,dx
  245.                                         add                ax,bx
  246.                                         adc                dx,cx
  247.                                         add                ax,bx
  248.                                         adc                dx,cx
  249.                                         add                ax,bx
  250.                                         adc                dx,cx

  251.                                         mov                bx,word ptr [bp+10]
  252.                                         add                bx,word ptr [bp+10]
  253.                                         add                bx,word ptr [bp+10]
  254.                                         add                bx,word ptr [bp+10]
  255.                                         add                ax,bx
  256.                                         adc                dx,0
  257. ;                                        cmp                ax,0fffdh
  258. ;                                        jnbe                exit_Tr

  259.                                         mov                di,ax

  260.                                         mov                ax,4f05h
  261.                                         mov                bx,0
  262.                                         int                10h

  263.                                         mov                cx,word ptr [bp+6]
  264.                                         mov                word ptr es:[di],cx
  265.                                         add                di,2
  266.                                         mov                cx,word ptr [bp+8]
  267.                                         mov                word ptr es:[di],cx

  268. exit_Tr:                        pop                di
  269.                                         pop                es
  270.                                         leavew

  271.                                         ret

  272. _Demo                                endp


  273. _TEXT                         ends




  274. _DATA                                segment  use16        byte public 'data'

  275. c@                                        label                byte
  276.                                         db                        37
  277.                                         db                        63h
  278.                                         db                        10
  279.                                         db                        0

  280. s@                                        label                byte
  281.                                         db                        37
  282.                                         db                        73h
  283.                                         db                        10
  284.                                         db                        0

  285. d@                                        label                byte
  286.                                         db                        37
  287.                                         db                        64h
  288.                                         db                        10
  289.                                         db                        0

  290. x@                                        label                byte
  291.                                         db                        37
  292.                                         db                        78h
  293.                                         db                        10
  294.                                         db                        0

  295. u@                                        label                byte
  296.                                         db                        37
  297.                                         db                        75h
  298.                                         db                        10
  299.                                         db                        0

  300. o@                                        label                byte
  301.                                         db                        37
  302.                                         db                        6fh
  303.                                         db                        10
  304.                                         db                        0


  305. _DATA               ends




  306. _BSS                                segment        use16        byte public 'data'

  307. attr                                _ATTRI        ?
  308.                                         db                        0f0h dup(0)

  309. _BSS                                ends


  310.                                         end
复制代码

论坛徽章:
0
2 [报告]
发表于 2004-03-05 09:18 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

看不懂啊!!

论坛徽章:
0
3 [报告]
发表于 2004-03-05 16:18 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

其实挺挺简单的,你可以不用看汇编写的画点函数,因为涉及到VESA图形接口,得知道VESA BIOS的功能调用还要稍微理解硬件分页映射寄存器的工作原理,如果手头没有这样的书就不用管画点函数了,我当时也是看了一本X86汇编语言程序设计,里边简要的介绍了这部分内容,就编了这么个小程序。除了画点函数程序就非常简单了,就想没必要写上注释,不过可以发到这里有点乱我把几个宏和函数的功能简单的说一下

void init(int);

函数功能:初使化显示模式
参数:Hi800_600 高彩色800*600分辨率、 Tr800_600 真彩色800*600分辨率、Hi1024_768、Tr1024_768

void Pixel16HiC(color,x,y);
函数功能:画16位高位彩色点
参数:color 颜色值,x 轴坐标,y 轴坐标
void Pixel24TrC(color,x,y);
同上

宏Trc(R,G,B)
功能:把红、绿、蓝转换成24位颜色值

struct bmp_head 取是BMP位图的长、宽和颜色等信息

其它的就自己看看吧,程序挺简单的本来是想编个能打开JPG格式图片程序,还有想在保护模式下实现,后来因为找不到JPG格式的资料,还有在保护模式下太麻烦,也就是想编着玩没想在这上面浪费太多的精力。程序打开图片的速度很慢,而且只是简单的打开BMP图片没有实现任何功能,如果能找到硬件加速的资料我想肯定能快多了。有兴趣的可以编译着试试,另外虽然我用的是24位真彩色模式但我是在TNT2显卡下写的画点函数,因为NVIDIA用的32位寄存器(我也不知道多出那8位有什么用,当时多出的这8位让我很痛苦,用24位寄存器画点老是不对,后来我就编了几个宏才测出来我的TNT2用的是32位寄存器),所以其它显卡可能不好使不过只要Nvidia系列的应该都好用,我在Gforce系列的试过也都好用。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-03-05 16:33 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

你用code功能把你的代码编辑一下吧。
这样看着舒服些。

论坛徽章:
0
5 [报告]
发表于 2004-03-06 09:39 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

好亲切!
以前也写过,可是写的没楼主好.输出用的是pattern画线.

论坛徽章:
0
6 [报告]
发表于 2004-03-07 14:18 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

我以前看过清华出的那本计算机图形学的书,本来想奔那方面发展,但是老师看不上我,我也就只好改行了。哈哈

论坛徽章:
0
7 [报告]
发表于 2004-03-08 14:18 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

记得读书的时候我还用C写过一个小游戏,是小飞机的那种,C内有一个函数可以截屏的,然后再内容放在内存中,然再清除,然后再COPY,呵呵,飞机就是这样走动的。。。

想想,毕业后就很少玩C了。唉。。。

论坛徽章:
0
8 [报告]
发表于 2004-03-08 14:36 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

呵呵,弓虽?我用c ,不过对汇编就垃圾的很

论坛徽章:
0
9 [报告]
发表于 2004-03-08 16:22 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

呵呵,那时我编了一个类似DOS的EDIT ,不过是先看了别人的源码再去编的,那时我当时在DOS下编的最大的一个程序,好像是1000多行,不过我用C编的第一个程序是数学表达式的计算,支持加、减、乘、除、括号、等号还有正弦余弦运算,比如输入表达式运算2*(3+5)=然后回车就可以计算出结果,这是我当时学C时编的的第一个非常有成就的程序,为了这个程序我画了整整一大张的流程图,而且时间基本上都是花在画流程图上了,等到写程序的时候基本没有费多大劲,甚至连调试都很少,运行的还很成功,当时的成就感心里那个美啊,现在想起来还……说不出那个心情。那时编的小程序很多,后来学汇编的时候也编过不少小程序,可惜因为硬盘坏了东西全没了,要不我肯定会把我的那个数学表达式的程序给贴上来,虽然那个程序现在看来很幼稚很简单但因为那是我编的第一个程序而且那时没有看过任何程序的源码,所有思路全是自己想出来的,所以很想贴上来给你们看看.上面这个程序是在我学准备学LINUX之前编写的,因为那时实在不知道自己该学什么,在徘徊中时编了这么一个程序解闷,现在手里就这么一个程序了所以就把这个程序给贴了上来

论坛徽章:
0
10 [报告]
发表于 2004-03-09 07:48 |只看该作者

DOS下看真彩BMP位图的小程序(我给加了注释)

呵呵,计数器的程序也是我在学的间断的一个重要的程序,当时好象写了近1200行,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP