中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
DOS下看真彩BMP位图的小程序(我给加了注释)
作者:未知 时间:2005-09-13 19:28 出处:ChinaUnix.net 责编:chinaitpower
              摘要:DOS下看真彩BMP位图的小程序(我给加了注释)

很久以前编的DOS看真彩BMP位图的小程序给贴上来了,有兴趣的就自己编译着玩玩,里边还有我写的一个画直线的算法,不过很笨拙。 初学者可以试着看看源码挺简单的,看到有不少人看这个贴子我就给注释了,不过画直线的函数就不用看了,很乱我自己都懒得看所以就没有注释
另外几个函数的功能在后面的跟贴我简单的介绍了一下



A.c main文件

[code:1:9253783525]
#include <stdio.h>
#include <conio.h>
#include "a.h"

/*extern  void print();
 *extern  void init(int);
 *extern  void vinfo(int)
 *extern  void demo(int,int,int);
 *extern  void Pixel16HiC(int,int,int);
 *extern  void Pixel24TrC(unsigned long int,int,int);
 *extern  void Pixel256C(char,int,int);

 *#define  Hi15(R,G,B)
 *#define  HiColor(R,G,B)    R*2048+G*32+B
 *#define  TrColor(R,G,B)    R*65536+G*256+B
 *#define  Tr_HColor(R,G,B)
 *#define  H_TColor(RGB)
 *#define  T_HColor(RGB)
 */



main()
{
unsigned int i,j,x,y;
FILE *fp;
 
if((fp=fopen("d:\\BC4\\Ship\\24.bmp","rb"))==NULL)/*自己选择路径*/
printf("Can't open 256.bmp\n");

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

readpic(fp);/*主函数*/
                fclose(fp);

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

[/code:1:9253783525]



BMP.C 主文件,里边有画直线函数
[code:1:9253783525]
#include<stdio.h>
#include<alloc.h>
#include<dos.h>
#include"a.h"



unsigned far* readpic(FILE *fp)
{

struct bmp_head  far* bhead;
int x,y;
unsigned long size,length,width;
void far * farmem;
unsigned char far *RGB;
char temp[30],over;


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

bhead=(char far*)temp;

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

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

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

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

fread(farmem,width,10,fp);/*读位图数据到缓冲区*/

RGB=farmem;/*RGB画像素用的指针,每像素3个字节*/

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


return farmem;

}


/*画直线函数*/

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

unsigned long x=left_x,y=left_y;
if(left_x>right_x)
if(left_y>right_y)
{
while(left_x-right_x>left_x-x)
{
Pixel24TrC(color,x,y);
if((left_x-right_x)>(left_y-right_y))
while((left_y-right_y)*(left_x-x)<(left_x-right_x)*(left_y-y))
{
x--;
Pixel24TrC(color,x,y);
}
x--;
if(y<=right_y)
continue;
if((left_y-right_y)>(left_x-right_x))
while((left_y-right_y)*(left_x-x)>(left_x-right_x)*(left_y-y))
{
y--;
Pixel24TrC(color,x,y);
}
y--;
};
while(y>right_y)
{
Pixel24TrC(color,x,y);
y--;
};

}
else
{
while(x>right_x)
{
Pixel24TrC(color,x,y);
if((left_x-right_x)>(right_y-left_y))
while((right_y-left_y)*(left_x-x)<(left_x-right_x)*(y-left_y))
{
x--;
Pixel24TrC(color,x,y);
}
x--;
if(!(y<right_y))
continue;
if((right_y-left_y)>(left_x-right_x))
while((right_y-left_y)*(left_x-x)>(left_x-right_x)*(y-left_y))
{
y++;
Pixel24TrC(color,x,y);
}
y++;
};

while(y<=right_y)
{
Pixel24TrC(color,x,y);
y++;
};
}

else
if(left_y>right_y)
{
while(x<right_x)
{
Pixel24TrC(color,x,y);
if((right_x-left_x)>(left_y-right_y))
while((left_y-right_y)*(x-left_x)<(right_x-left_x)*(left_y-y))
{
x++;
Pixel24TrC(color,x,y);
}
x++;
if(left_y-y>left_y-right_y)
continue;
if((left_y-right_y)>(right_x-left_x))
while((left_y-right_y)*(x-left_x)>(right_x-left_x)*(left_y-y))
{
y--;
Pixel24TrC(color,x,y);
}
y--;
};

while(left_y-y<=left_y-right_y)
{
Pixel24TrC(color,x,y);
y--;
};

}
else
{
while(x<right_x)
{
Pixel24TrC(color,x,y);
if((right_x-left_x)>(right_y-left_y))
while((right_y-left_y)*(x-left_x)<(right_x-left_x)*(y-left_y))
{
x++;
Pixel24TrC(color,x,y);
}

x++;

if(y>=right_y)
continue;
if((right_y-left_y)>(right_x-left_x))
while((right_y-left_y)*(x-left_x)>(right_x-left_x)*(y-left_y))
{
y++;
Pixel24TrC(color,x,y);
}
y++;
};

while(y<=right_y)
{
Pixel24TrC(color,x,y);
y++;
};
}

return 0;
}


[/code:1:9253783525]


a.h 头文件 

[code:1:9253783525]
#define LINE 640


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

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

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


#define C256_640_400 0x100
#define C256_640_480 0x101
#define C16_800_600 0x102
#define C256_800_600 0x103
#define C16_1024_768 0x104
#define C256_1024_768 0x105
#define Hi15_640_480 0x110
#define Hi640_480 0x111
#define Tr640_480         0x112
#define Hi15_800_600 0x113
#define Hi800_600 0x114
#define Tr800_600 0x115
#define Hi15_1024_768 0x116
#define Hi1024_768 0x117
#define Tr1024_768 0x118




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

extern void init(int);
extern      void Pixel16HiC(int,int,int);
extern void Pixel24TrC(unsigned long,int,int);
extern void Pixel256C(char,int,int);
extern      void line(unsigned long x1,unsigned long y1,unsigned long x2,unsigned long y2,unsigned long color);

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

extern void mouse(void);


struct bmp_head
{
int  other1;
unsigned long length;
char other2[4];
unsigned  int offset;
char other3[6];
unsigned  int width;
char other4[2];
unsigned  int hight;
char other5[4];
unsigned char color;
};
[/code:1:9253783525]


mybmp.c这是嵌入式汇编的画点函数
[code:1:9253783525]
void init(int mode)
{
asm mov bx,mode
asm  mov ax,4f02h
asm int 10h
return;
}




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

asm  push es
asm push di

asm mov ax,4f03h
asm int 10h

pi112:
asm cmp   bx,112h
asm jnz pi115

asm mov dx,640
asm jmp write_24t


pi115:
asm cmp bx,115h
asm jnz pi118

asm mov dx,800
asm jmp write_24t

pi118:
asm cmp bx,118h
asm jnz Tr_exit

asm mov dx,1024

write_24t:
asm mov ax,0a000h
asm mov es,ax
asm mov ax,y
asm mul dx
asm mov bx,ax
asm mov cx,dx
asm add ax,bx
asm adc dx,cx
asm add ax,bx
asm adc dx,cx
asm add ax,bx
asm adc dx,cx

asm mov bx,x
asm add bx,x
asm add bx,x
asm add bx,x
asm add ax,bx
asm adc dx,0
asm mov di,ax

asm mov ax,4f05h
asm mov bx,0
asm int 10h

asm mov cx,word ptr color
asm mov word ptr es:[di],cx
asm add di,2
asm mov cx,word ptr color+2
asm mov word ptr es:[di],cx

Tr_exit:
asm pop di
asm pop es

return;
}


void Pixel16HiC(int color,int x,int y)
{
asm push es
asm push di

asm mov ax,4f03h
asm int 10h

pi110:
asm cmp bx,110h
asm jnz pi111

asm mov dx,640
asm jmp write_16h



pi111:
asm cmp bx,111h
asm jnz pi113

asm mov dx,640
asm jmp write_16h



pi113:
asm cmp bx,113h
asm jnz pi114

asm mov dx,800
asm jmp write_16h


pi114:
asm cmp bx,114h
asm jnz pi116

asm mov dx,800
asm jmp write_16h


pi116:
asm cmp bx,116h
asm jnz pi117

asm mov dx,1024
asm jmp write_16h


pi117:
asm cmp bx,117h
asm jnz Hi_exit

asm mov dx,1024


write_16h:
asm mov ax,0a000h
asm mov es,ax
asm mov ax,word ptr [y]
asm mul dx
asm shl ax,1
asm jc a1
asm shl dx,1
asm jmp cont
a1:
asm shl dx,1
asm inc dx

cont:
asm shl word ptr [x],1
asm add ax,word ptr [x]
asm adc dx,0
asm mov      di,ax

asm mov ax,4f05h
asm mov bx,0
asm int 10h

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

Hi_exit:
asm pop di
asm pop es

return;
}


void Pixel256C(char color,int x,int y)
{
asm push es
asm push di


asm mov ax,4f03h
asm int 10h


pi100:
asm cmp bx,100h
asm jnz pi101

asm mov dx,640
asm jmp write_256

pi101:
asm cmp bx,101h
asm jnz pi103

asm mov dx,640
asm jmp write_256



pi103:
asm cmp bx,103h
asm jnz pi105

asm mov dx,800
asm jmp write_256



pi105:
asm cmp bx,105h
asm jnz exit_256

asm mov dx,1024

write_256:
asm mov ax,0a000h
asm mov es,ax
asm mov ax,word ptr [y]
asm mul dx
asm add ax,word ptr [x]
asm adc dl,0
asm mov      di,ax

asm mov ax,4f05h
asm mov bx,0
asm int 10h

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


exit_256:
asm pop di
asm pop es

return;
}
[/code:1:9253783525]


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

[code:1:9253783525]
.386

public   _init
public _Demo
public   _Pixel16HiC
public   _Pixel24TrC
public   _Pixel256C


_ATTRI      struc

MODE_ATTR    DW ?
WIN_A_ATTR DB ?
WIN_B_ATTR DB ?
WIN_GRAN DB ?
WIN_SIZE DW ?
WIN_A_SEG DW ?
WIN_B_SEG DW ?
WIN_FUNC_PTR   DD ?
LINE_BYTE DW ?

_ATTRI     ends



mpusha macro
push ax
push cx
push dx
push bx
push sp
push bp
push si
push di
endm


mpopa macro
pop di
pop si
pop bp
pop sp
pop bx
pop dx
pop cx
pop ax
endm


DGROUP group    _DATA,_BSS




extrn _printf:far




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


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

_init      proc far

enterw   0,0
mov bx,[bp+6]
mov ax,4f02h
int 10h
leavew
ret

_init       endp


;画点



_Pixel24TrC  proc far

enterw 0,0
push es
push di

mov ax,4f03h
int 10h

pi112: cmp   bx,112h
jnz pi115

mov dx,640
jmp write_24t


pi115:         cmp bx,115h
jnz pi118

mov dx,800
jmp write_24t

pi118: cmp bx,118h
jnz Tr_exit

mov dx,1024

write_24t: mov ax,0a000h
mov es,ax
mov ax,word ptr [bp+12]
mul dx
mov bx,ax
mov cx,dx
add ax,bx
adc dx,cx
add ax,bx
adc dx,cx
add ax,bx
adc dx,cx

mov bx,word ptr [bp+10]
add bx,word ptr [bp+10]
add bx,word ptr [bp+10]
add bx,word ptr [bp+10]
add ax,bx
adc dx,0
mov di,ax

mov ax,4f05h
mov bx,0
int 10h

mov cx,word ptr [bp+6]
mov word ptr es:[di],cx
add di,2
mov cx,word ptr [bp+8]
mov word ptr es:[di],cx

Tr_exit: pop di
pop es

leavew
ret

_Pixel24TrC endp




_Pixel16HiC  proc far

enterw 0,0
push es
push di

mov ax,4f03h
int 10h

pi110: cmp bx,110h
jnz pi111

mov dx,640
jmp write_16h



pi111:         cmp bx,111h
jnz pi113

mov dx,640
jmp write_16h



pi113:         cmp bx,113h
jnz pi114

mov dx,800
jmp write_16h


pi114:         cmp bx,114h
jnz pi116

mov dx,800
jmp write_16h


pi116: cmp bx,116h
jnz pi117

mov dx,1024
jmp write_16h


pi117:         cmp bx,117h
jnz Hi_exit

mov dx,1024


write_16h: mov ax,0a000h
mov es,ax
mov ax,word ptr [bp+10]
mul dx
shl ax,1
jc a1
shl dx,1
jmp cont
a1: shl dx,1
inc dx

cont: shl word ptr [bp+8],1
add ax,word ptr [bp+8]
adc dx,0
mov      di,ax

mov ax,4f05h
mov bx,0
int 10h

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

Hi_exit: pop di
pop es

leavew
ret

_Pixel16HiC endp




_Pixel256C  proc far

enterw 0,0
push es
push di


mov ax,4f03h
int 10h


pi100: cmp bx,100h
jnz pi101

mov dx,640
jmp write_256

pi101: cmp bx,101h
jnz pi103

mov dx,640
jmp write_256



pi103: cmp bx,103h
jnz pi105

mov dx,800
jmp write_256



pi105:         cmp bx,105h
jnz exit_256

mov dx,1024

write_256: mov ax,0a000h
mov es,ax
mov ax,word ptr [bp+10]
mul dx
add ax,word ptr [bp+8]
adc dl,0
mov      di,ax

mov ax,4f05h
mov bx,0
int 10h

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


exit_256: pop di
pop es

leavew
ret

_Pixel256C endp



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

;出口参数  dx:ax=转换十进数
B_O proc near

enterw   5,0
push es
push di
push si
mov bx,10
mov cx,5
mov di,sp
mov ax,ss
mov es,ax

getover: div      bx
add dl,30h
mov byte ptr    es:[di],dl
dec cx
jz return
inc di
cmp ax,0
jnz      getover
mov byte ptr    es:[di],dl

return: xor dx,dx
xor ax,ax
std
mov si,di
relod:       mov cx,4
lodsb
re: shl dx,1
shl ax,1
jnc d0
inc dx
d0:          dec cx
jnz re

cmp si,sp
jnz relod

pop si
pop di
pop es
leavew
ret

B_O endp


_Demo          proc    far

enterw 0,0
push es
push di

mov ax,0a000h
mov es,ax
mov dx,1024
mov ax,word ptr [bp+12]
mul dx
mov bx,ax
mov cx,dx
add ax,bx
adc dx,cx
add ax,bx
adc dx,cx
add ax,bx
adc dx,cx

mov bx,word ptr [bp+10]
add bx,word ptr [bp+10]
add bx,word ptr [bp+10]
add bx,word ptr [bp+10]
add ax,bx
adc dx,0
; cmp ax,0fffdh
; jnbe exit_Tr

mov di,ax

mov ax,4f05h
mov bx,0
int 10h

mov cx,word ptr [bp+6]
mov word ptr es:[di],cx
add di,2
mov cx,word ptr [bp+8]
mov word ptr es:[di],cx

exit_Tr: pop di
pop es
leavew

ret

_Demo endp


_TEXT  ends




_DATA segment  use16 byte public 'data'

c@ label byte
db 37
db 63h
db 10
db 0

s@ label byte
db 37
db 73h
db 10
db 0

d@ label byte
db 37
db 64h
db 10
db 0

x@ label byte
db 37
db 78h
db 10
db 0

u@ label byte
db 37
db 75h
db 10
db 0

o@ label byte
db 37
db 6fh
db 10
db 0


_DATA        ends




_BSS segment use16 byte public 'data'

attr _ATTRI ?
db 0f0h dup(0)

_BSS ends


end
[/code:1:9253783525]

 bierdaci 回复于:2004-03-04 00:56:59
1苛性钾

 arenxl 回复于:2004-03-05 09:18:39
看不懂啊!!

 bierdaci 回复于:2004-03-05 16:18:23
其实挺挺简单的,你可以不用看汇编写的画点函数,因为涉及到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系列的试过也都好用。

 lenovo 回复于:2004-03-05 16:33:01
你用code功能把你的代码编辑一下吧。
这样看着舒服些。

 JohnBull 回复于:2004-03-06 09:39:21
好亲切!
以前也写过,可是写的没楼主好.输出用的是pattern画线. :P

 bierdaci 回复于:2004-03-06 22:57:27
呵呵,其实这个程序挺简单的,楼上的JohnBull是斑竹吧,不知道斑竹说的pattern画线是什么意思呀,是画直线吗?我的那个画直线算法很不好是我自己想出来的因为用到了乘法所以很慢,不过可以优化的只是懒得动弹,后来看到计算机图形学里的画直线算法很好,好像带了点微积分的原理,其实我挺喜欢计算机图形学的本来想看看那本国外的计算机图形学的书,我挺想编游戏的,只是现在正在研究LINUX所以就把编游戏的想法暂时给搁浅了。我看LINUX源码有一年多了,去年看到设备驱动程序的时候编了个管道,效果还可以,目前正在努力实现共享内存,我用的是文件映射的机制,等把共享内存给实现了连同管道也一起贴上来,只是不知道有多少人能看懂因为我不知道这里能有多少人从事内核编程的呵呵

 w25 回复于:2004-03-07 14:18:13
我以前看过清华出的那本计算机图形学的书,本来想奔那方面发展,但是老师看不上我,我也就只好改行了。哈哈

 bierdaci 回复于:2004-03-07 16:45:31
以前一个朋友他们计算机图形学的课程就是用的那本清华大学的,我大体看了一下感觉不太好讲的有点乱,不过我就是从那本书里看到比我的更好的画直线的算法,后来在书店看到一本国外的计算机图形学讲的非常好,内容非常全面而且层次也很分明,我非常喜欢这本书,所以就把这本书买回来收藏准备以后有时间再看,只是因为精力有限所以到现在一直还没有看!呵呵

 阿辉 回复于:2004-03-08 14:18:02
记得读书的时候我还用C写过一个小游戏,是小飞机的那种,C内有一个函数可以截屏的,然后再内容放在内存中,然再清除,然后再COPY,呵呵,飞机就是这样走动的。。。

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

 mzpvsww 回复于:2004-03-08 14:36:20
呵呵,弓虽?我用c ,不过对汇编就垃圾的很

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

 mzpvsww 回复于:2004-03-09 07:48:47
呵呵,计数器的程序也是我在学的间断的一个重要的程序,当时好象写了近1200行,

 bierdaci 回复于:2004-03-09 16:04:55
计数器是个什么程序呀,用来计什么的?

 netkiller 回复于:2004-03-09 22:59:18
我也写过这种程序。但是是显示16色的。
我不知楼是是如何上真采的。1024*768
我是用trubo c 2.0

http://linux.9812.net
上有我的程序。。
我主要是做DOS仿WIN GUI 还有鼠标事件。。。

还有。楼主用没用过UNIX下的图形库。
在UNIX控制台上也可以实现你上面的程序。注不用X
例如:控制台下的汉字系统。
就是用图形库,调用(点阵、失量)汉字库,然后在控制上以画线,画矩形,或画点(画点校率太低:)哈哈)

和UNDOS那东东都差不太多。。
主要是UNIX下要改内核,屏掉ctrl + c,ctrl +d .
因为这个键可退出shell中运行的任何程序。。。

 netkiller 回复于:2004-03-09 23:14:34
[quote:96a63b45eb="mzpvsww"]呵呵,弓虽?我用c ,不过对汇编就垃圾的很[/quote:96a63b45eb]

说到汇编,我一点不会。也没学过。
但我会用联合体调用中断。哈哈。
int 33, 主要是鼠标
int 10,显示
int 13,记得是磁盘吧。哈哈我就记得上时就debug写了一个清空FAT的东。
后来给我们全班第一份。。
一到我们上机。下机后一看,机器全完蛋哈哈。。

 bierdaci 回复于:2004-03-10 00:00:17
那些画点函数是我自己写的啦,TC或BC里不带真彩图形库的,不过我写的那个画点函数实在太慢,打开个大点的图片要老半天才能跑到顶,本来想实现滚屏的功能,可是这个速度连打开都要半天更别想滚屏了了。UNIX我没有接触,我只是在LINUX下编过内核程序,就是上面说的管道了,还没有涉及你说的那些啦呵呵

 mengwg 回复于:2004-03-10 01:00:37
呵呵,看到搂主的代码,让我想起遥远的过去,贴个代码上来。
93-94年自己编写的图形库。当时用的是tasm,现在没什么用了。

[code:1:e47180bf29]
 dosseg

.model large
viewporttype struc
 left dw 0
 top dw 0
 right dw 0
 bottom dw 0
 clip   dw 0
 ends
fillsettingstype struc
pattern dw 0
fillcolor   dw 0
ends

.data
forline dw  0
viewportsetting  viewporttype <0,0,639,479,0>
fillsettings  fillsettingstype <0,0>
mode  db 0
addr  dw 0
x0    dw 0
y0  dw 0
x1  dw 0
y1         dw 0
highh  dw 0
wide  dw 0
color  db 1
bkcolor  db 0
widebyte   dw 0
firstp    dw 0
crease    dw 0
savewritemode  db 0
buf  db  48 dup(0)


hzk db    'c:\service\char.dot'
db    0
ascildot  db  1536d dup (0)
 db  64d dup (255d)    ;定义为96号字符,作覆盖用
openerror db    'char.dot open error!',0dh,0ah,'$'
readerror db    'char.dot read error!',0dh,0ah,'$'
closeerror db    'char.dot close error!',0dh,0ah,'$'

randsi dw 0
int_1c_seg dw 0
int_1c_off dw 0

old_8_bit db 0
old_5_bit db 0


maxtime dw 10d          ;minute*1200
currtime dw 0
rule dw 0

timer db 0
clocker db 0
timeon db 0
offhour db 0
offminute db 0
offsecond db 0
timex dw 0
timey dw 0
timecol dw 0
timebkcol dw 0

clockon db 0
abshour db 0
absminute db 0
abssecond db 0
clockx dw 0
clocky dw 0
clockcol dw 0
clockbkcol dw 0


.code
public  @closegraph$qv
public @initgraph$qv
public  @putpixel$qiii
public @line$qiiii
public @setcolor$qi
public @getcolor$qv
public @setwritemode$qi
public @getwritemode$qv
public @setviewport$qiiiii
public @getviewsettings$qn12viewporttype
public @restoreview$qn12viewporttype
; public @writergb$qiiii
public @bar$qiiii
; public @setfillstyle$qii
public  @rectangle$qiiii
public  @clearviewport$qv
public  @cleardevice$qv
public  @writehz16$qiiinuc
public  @writeascil$qiiii
public  @loadascil$qv

public  @settimeon$qiiii
public  @settimeoff$qv
public  @setclockon$qiiii
public  @setclockoff$qv

public @installclock$qv
public _installclock
public @setmaxtime$qi
public _setmaxtime
public @resetclock$qv
public _resetclock
public @quitclock$qv
public _quitclock
public @timeout$qv
public _timeout
public @M_gettime$qnuc
public _M_gettime
public @M_random$qi
public _M_random


public _initgraph
public  _restoreview
public _closegraph
public _setwritemode
public _putpixel
public _rectangle
public  _bar
public _line
public _setcolor
public _getcolor
public _setviewport
public _getviewsettings
public _getmaxx
public _getmaxy
public _setfillstyle
public  _getfillsettings
public _cleardevice
public _clearviewport
public  _setbkcolor
public _getbkcolor
public _drawpoly
public _setlinestyle
public _floodfill
public _getwritemode
public  _writehz16
public  _writeascil
public  _loadascil

public  _settimeon
public  _settimeoff
public  _setclockon
public  _setclockoff


pushds     macro
push ds
mov ax,@DATA
mov ds,ax
endm

setmode0 macro

mov dx,03c4h
mov al,2
out dx,al
inc dx
mov al,0fh
out dx,al

mov dx,03ceh
mov al,3
out dx,al
inc dx
mov al,0
out dx,al
dec dx
endm

restoremode macro
mov dx,03ceh
mov al,3
out dx,al
inc dx
mov al,[mode]
out dx,al
dec dx
endm

selreg macro num
mov al,num
out dx,al
inc dx
endm

movreg macro num
mov al,num
out dx,al
dec dx
endm


@setbkcolor$qi label far
_setbkcolor proc    far
push bp
mov bp,sp
push es
pushds
push si
push di

mov ax,0a000h
mov es,ax

setmode0

selreg 5
in al,dx
and al,252d
or al,8
out dx,al
dec dx

selreg 2
movreg  [bkcolor]
mov ax,[bp+6]
mov [bkcolor],al
selreg 0
movreg [bkcolor]
selreg 1
movreg 0fh
xor bx,bx
mov di,bx

mov cx,38400d
selreg 8

sblb:
mov al,es:[di]
cmp al,ah
jz ll
mov ah,al
out dx,al
ll:
stosb
loop sblb

restoremode
selreg 1
movreg 00h
selreg 8
movreg  0ffh
selreg 5
in al,dx
and al,247d
out dx,al

pop di
pop si
pop ds
pop es
mov sp,bp
pop bp
ret
_setbkcolor endp


@line$qiiii label far
_line proc    far

cli
push bp
mov bp,sp
push es
pushds
push si
push di

mov ax,0a000h
mov es,ax

mov bx,[bp+6]      ;x0
mov     cx,[bp+10]     ;x1
mov dx,[bp+12]     ;y1
mov ax,[bp+8]      ;y0
push ax
mov ax,cx
and ax,8000h
jz ll01
xor cx,cx
ll01:
mov ax,bx
and ax,8000h
jz     ll02
xor bx,bx
ll02:
pop ax
push bx

mov bx,ax
and bx,8000h
jz ll03
xor ax,ax
ll03:
mov bx,dx
and bx,8000h
jz      ll04
xor dx,dx
ll04:
pop bx

add ax,viewportsetting.top
add bx,viewportsetting.left
add cx,viewportsetting.left
add dx,viewportsetting.top

mov [x0],bx
mov [y0],ax
mov [x1],cx
mov [y1],dx
cmp bx,cx
jbe lb0
mov [x0],cx
mov [x1],bx
mov [y0],dx
mov [y1],ax
lb0:

mov ax,[x0]
cmp ax,viewportsetting.right
jnbe llexit
cmp ax,viewportsetting.left
jnbe ll1
mov ax,viewportsetting.left
mov [x0],ax
ll1:
mov ax,[x1]
cmp ax,viewportsetting.right
jbe ll2
mov ax,viewportsetting.right
mov [x1],ax
ll2:

mov ax,[y0]
mov bx,[y1]
cmp ax,bx
jbe ll3

cmp bx,viewportsetting.bottom
jnbe llexit
cmp bx,viewportsetting.top
jnbe ll4
mov bx,viewportsetting.top
mov [y1],bx
ll4:
cmp ax,viewportsetting.bottom
jbe ll5
mov ax,viewportsetting.bottom
mov [y0],bx
ll5:
jmp ll7

ll3:
cmp ax,viewportsetting.bottom
jnbe llexit
cmp ax,viewportsetting.top
jnbe ll6
mov ax,viewportsetting.top
mov [y0],ax
ll6:
cmp bx,viewportsetting.bottom
jbe ll7
mov bx,viewportsetting.bottom
mov [y1],bx
jmp ll7
llexit:

pop di
pop si
pop ds
pop es
mov sp,bp
pop bp
ret
ll7:

mov cx,[x1]
mov bx,[x0]
sub cx,bx
mov [wide],cx

mov dx,[y1]
mov ax,[y0]

cmp dx,ax
jb lb11
sub     dx,ax
mov [highh],dx
mov ax,80d
mov [crease],ax
jmp lb10
lb11:
sub ax,dx
mov [highh],ax
mov ax,-80d
mov [crease],ax
lb10:

mov ax,[y0]    ;y0
mov bx,[x0]      ;x0
call _getaddr

mov dx,3ceh
selreg 5
movreg 2
selreg 8
movreg cl

mov cx,[wide]
cmp cx,[highh]
jb lb101

mov cx,[wide]
mov dx,0
cmp cx,0
jbe linelb21
mov ah,[color]
linelb2:
add dx,[highh]
shr al,1
cmp al,0
jne l12
mov al,128d
inc bx

l12:
push dx
mov dx,3cfh
out dx,al
pop dx
cmp dx,[wide]
jb l11
sub dx,[wide]
add bx,[crease]
l11:
push ax
mov ah,es:[bx]
pop ax
mov es:[bx],ah
loop    linelb2
linelb21:
jmp lineexit

lb101:
mov cx,highh
mov dx,0
mov ah,[color]
linelb3:
add dx,[wide]
add bx,[crease]

cmp dx,[highh]
jb l21
sub dx,[highh]
shr al,1
cmp al,0
jne l22
mov al,128d
inc bx
l22:
push dx
mov dx,3cfh
out dx,al
pop dx
l21:
push ax
mov ah,es:[bx]
pop ax
mov es:[bx],ah
loop    linelb3
lineexit:

mov dx,3ceh
selreg 5
movreg 0
selreg 8
movreg 0ffh

pop di
pop si
pop ds
pop es
mov sp,bp
pop bp
sti
ret
_line endp


@rectangle$qiiii label far
_rectangle proc    far
push bp
mov bp,sp
push es
pushds
push si
push di

mov ax,0a000h
mov es,ax
mov ax,[bp+8]      ;y0
mov bx,[bp+6]      ;x0
mov     cx,[bp+10]     ;x1
mov dx,[bp+12]     ;y1
add ax,viewportsetting.top
add bx,viewportsetting.left
add cx,viewportsetting.left
add dx,viewportsetting.top

push ax
cmp bx,cx
jbe     r1b1
mov ax,cx
mov cx,bx
mov bx,ax
r1b1:
pop ax
push bx
cmp     ax,dx
jbe r1b2
mov bx,dx
mov dx,ax
mov ax,bx
r1b2:
pop bx

cmp ax,viewportsetting.bottom
jnbe rectexit
cmp dx,viewportsetting.bottom
jbe r1b01
mov dx,viewportsetting.bottom
r1b01:
cmp bx,viewportsetting.right
jnbe rectexit
cmp cx,viewportsetting.right
jbe r1b02
mov cx,viewportsetting.right

jmp r1b02
rectexit:
pop di
pop si
pop ds
pop es
mov sp,bp
pop bp
ret
r1b02:
mov [x0],bx
mov [x1],cx
mov [y1],dx
mov [y0],ax

sub     dx,ax
inc dx
mov [highh],dx

shr bx,1
shr bx,1
shr bx,1
inc bx
shr cx,1
shr cx,1
shr cx,1

xor ax,ax
mov [widebyte],ax
cmp cx,bx
jb      lb001
sub cx,bx
mov [widebyte],cx
lb001:
mov dx,03ceh
selreg 5
movreg 2

mov ax,[y0]      ;y0
mov bx,[x0]      ;x0
call _getaddr

mov dx,03ceh
selreg 8
movreg cl

mov cx,[highh]
dec cx
mov al,[color]
cmp cx,1
jbe lb111
dec cx
lb1:
add bx,80d
mov ah,es:[bx]
mov es:[bx],al
loop    lb1
lb111:

mov ax,[y0]      ;y0
mov bx,[x1]      ;x1
call _getaddr
mov dx,03ceh
selreg 8
movreg cl
mov cx,[highh]
mov al,[color]
dec cx
cmp cx,1
jbe lb21
dec cx
lb2:
add bx,80d
mov ah,es:[bx]
mov es:[bx],al
loop    lb2
lb21:

mov ax,[x0]
mov bx,[x1]
shr ax,1
shr ax,1
shr ax,1
inc ax
shl ax,1
shl ax,1
shl ax,1
cmp ax,bx
jbe     lb201


mov ax,[y0]
mov bx,[x1]
call _getbit
not cx
push cx
mov ax,[y0]
mov bx,[x1]
call _getaddr
pop dx
or dx,cx
push dx
mov ax,[y0]
mov bx,[x0]
call _getbit
pop dx
and dx,cx
mov cl,dl
mov dx,3ceh
selreg 8
movreg cl
mov al,[color]
mov ah,es:[bx]
mov es:[bx],al

mov ax,[y1]
mov bx,[x0]
call _getbit
mov al,[color]
mov ah,es:[bx]
mov es:[bx],al
jmp rbexit

lb201:
mov ax,[y0]      ;y0
mov bx,[x0]      ;x0
call _getbit

mov dx,3ceh
selreg 8
movreg cl
mov al,[color]
mov ah,es:[bx]
mov es:[bx],al
inc bx

mov dx,3ceh
selreg 8
movreg 0ffh
mov cx,[widebyte]
mov al,[color]
cmp cx,0
jbe lb41
lb4:
mov ah,es:[bx]
mov es:[bx],al
inc bx
loop lb4

lb41:

mov ax,[y1]      ;y1
mov bx,[x0]      ;x0
call _getbit
mov dx,3ceh
selreg 8
movreg cl
mov al,[color]
mov ah,es:[bx]
mov es:[bx],al
inc bx
mov dx,03ceh
selreg 8
movreg 0ffh
mov cx,[widebyte]
cmp cx,0
jbe lb51
lb5:
mov al,[color]
mov ah,es:[bx]
mov es:[bx],al
inc bx
loop lb5
lb51:
mov ax,[y0]      ;y0
mov bx,[x1]      ;x1
call _getbit
not cl
mov dx,3ceh
selreg 8
movreg cl
mov al,[color]
mov ah,es:[bx]
mov es:[bx],al

mov ax,[y1]      ;y1
mov bx,[x1]      ;x1
call _getbit
cmp cl,0
je      lb52
not cl
lb52:
mov dx,03ceh
selreg 8
movreg cl
mov al,[color]
mov ah,es:[bx]
mov es:[bx],al
rbexit:
mov dx,03ceh
selreg 5
movreg 0
selreg 8
movreg 0ffh

pop di
pop si
pop ds
pop es
mov sp,bp
pop bp
ret
_rectangle endp



_drawpoly proc    far
push bp
mov bp,sp
push es
pushds

mov ax,[bp+6]
dec ax
mov [forline],ax      ;num of point
inc ax
mov bx,[bp+8]
mov cl,2
mul cl
mul cl
dec ax

; push ss:[bx+3]
; push ss:[bx+1]

add bx,ax
dec bx
mov [addr],bx
mov cx,[forline]
; push ss:[bx]
; push ss:[bx-2]
; call _line


mov [widebyte],bx
dlb:
mov ax,ss:[bx]
push ax
mov ax,ss:[bx-2]
push ax
mov ax,ss:[bx-4]
push ax
mov ax,ss:[bx-6]
push ax
sub bx,4
mov ss:[addr],bx
call _line
mov bx,ss:[addr]
mov cx,[forline]
dec cx
mov [forline],cx
cmp cx,0
jnz dlb

add bx,4
mov ax,ss:[bx-4]
push ax
mov ax,ss:[bx-6]
push ax
mov bx,widebyte
mov ax,ss:[bx]
push ax
mov ax,ss:[bx-2]
push ax
call  _line

pop ds
pop es
mov sp,bp
pop bp
ret
_drawpoly endp

@bar$qiiii label far
_bar proc    far
sti
push bp
mov bp,sp
push es
pushds
push si
push di

mov ax,0a000h
mov es,ax
mov ax,[bp+8]      ;y0
mov bx,[bp+6]      ;x0
mov     cx,[bp+10]     ;x1
mov dx,[bp+12]     ;y1

add ax,viewportsetting.top
add bx,viewportsetting.left
add cx,viewportsetting.left
add dx,viewportsetting.top

push ax
cmp bx,cx
jbe     blrb1
mov ax,cx
mov cx,bx
mov bx,ax
blrb1:
pop ax
push bx
cmp     ax,dx
jbe blrb2
mov bx,dx
mov dx,ax
mov ax,bx
blrb2:
pop bx
cmp ax,viewportsetting.bottom
jnbe barexit1
cmp dx,viewportsetting.bottom
jbe blb01
mov dx,viewportsetting.bottom
blb01:
cmp bx,viewportsetting.right
jnbe barexit1
cmp cx,viewportsetting.right
jbe blb02
mov cx,viewportsetting.right
jmp blb02
barexit1:
pop di
pop si
pop ds
pop es
mov sp,bp
pop bp
cli
ret
blb02:
mov [x0],bx
mov [x1],cx
mov [y1],dx
mov [y0],ax

sub     dx,ax
inc dx
mov [highh],dx

shr bx,1
shr bx,1
shr bx,1
inc bx
shr cx,1
shr cx,1
shr cx,1
xor ax,ax
mov [widebyte],ax
cmp cx,bx
jb      lbb001
sub cx,bx
mov [widebyte],cx
lbb001:
setmode0
mov dx,3ceh
selreg 5
movreg 2
mov ax,[x0]
mov bx,[x1]
shr ax,1
shr ax,1
shr ax,1
inc ax
shl ax,1
shl ax,1
shl ax,1
cmp ax,bx
jbe     barlb201

mov ax,ax
mov ax,[y0]
mov bx,[x1]
call _getbit
not cx

push cx
mov ax,[y0]
mov bx,[x1]
call _getaddr
pop dx
or cx,dx

push cx
mov ax,[y0]
mov bx,[x0]
call _getbit
pop dx
and dx,cx
mov cl,dl
mov dx,3ceh
selreg 8
movreg cl
mov cx,[highh]
mov ax,fillsettings.fillcolor
barb3:
mov ah,es:[bx]
mov es:[bx],al
add bx,80
loop barb3
jmp barexit

barlb201:

mov ax,[y0]      ;y0
mov bx,[x0]      ;x0
call _getbit
mov dx,3ceh
selreg 8
movreg cl
mov ax,fillsettings.fillcolor
mov cx,[highh]
mov [firstp],bx
barlb3:
mov ah,es:[bx]
mov es:[bx],al
add bx,80
loop barlb3

mov cx,[widebyte]
cmp cx,0
je barlb52

selreg 8
movreg 0ffh
mov dx,[firstp]
inc dx
mov ax,fillsettings.fillcolor
mov cx,[highh]
barlb41:
push cx
mov bx,dx
mov cx,[widebyte]
barlb5:
mov es:[bx],al
inc bx
loop barlb5
pop cx
add dx,80
loop barlb41

barlb52:
mov ax,[y0]      ;y0
mov bx,[x1]      ;x1
call _getbit
not cl
push cx
mov ax,[y0]      ;y0
mov bx,[x1]      ;x1
call _getaddr
pop dx
or cl,dl

mov dx,3ceh
selreg 8
movreg cl
mov ax,[fillsettings.fillcolor]
mov ah,es:[bx]
mov es:[bx],al
mov cx,[highh]
barlb6:
mov ah,es:[bx]
mov es:[bx],al
add bx,80
loop barlb6


barexit:
restoremode
selreg 5
movreg 0
selreg 8
movreg 0ffh

pop di
pop si
pop ds
pop es
mov sp,bp
pop bp
cli
ret
_bar endp

@cleardevice$qv label far
_cleardevice proc    far
sti
push bp
mov bp,sp
push es
pushds
push si
push di
mov ax,0a000h
mov es,ax

setmode0
mov dx,03ceh

selreg 5
movreg 0
selreg 0
movreg 0
selreg 1
movreg 0fh

xor bx,bx
mov di,bx

mov cx,19200d

rep stosw

restoremode
selreg 1
movreg 00h
selreg 5
movreg 0
pop di
pop si

pop ds
pop es
mov sp,bp
pop bp
cli
ret
_cleardevice endp

@clearviewport$qv label far
_clearviewport proc    far
sti
push bp
mov bp,sp
pushds
push si
push di
mov ax,fillsettings.fillcolor
mov [forline],ax

mov ax,0
mov fillsettings.fillcolor,ax

mov ax,viewportsetting.bottom
sub ax,viewportsetting.top
push ax
mov ax,viewportsetting.right
sub ax,viewportsetting.left
push ax
xor ax,ax
push ax
xor ax,ax
push ax
call _bar
mov ax,[forline]
mov fillsettings.fillcolor,ax

pop di
pop si

pop ds
mov sp,bp
pop bp
cli
ret
_clearviewport endp


_getaddr proc    near

mov cx,80d
mul cx
mov cl,bl

shr bx,1
shr bx,1
shr bx,1

add bx,ax

and cl,07h
mov al,80h
shr al,cl
mov cl,al

ret
_getaddr endp

_getbit proc    near

mov cx,80d
mul cx
mov cl,bl

shr bx,1
shr bx,1
shr bx,1

add bx,ax

and cl,07h
mov al,0ffh
shr al,cl
mov cl,al

ret
_getbit endp

@putpixel$qiii label far
_putpixel proc    far
sti
push bp
mov bp,sp
push es
pushds

mov ax,0a000h
mov es,ax
setmode0
selreg  5
movreg 2
mov ax,[bp+8]
mov bx,[bp+6]
add     ax,viewportsetting.top
add     bx,viewportsetting.left

cmp ax,viewportsetting.bottom
jnbe putexit
cmp bx,viewportsetting.right
jnbe putexit
call _getaddr
mov dx,03ceh
selreg 8
movreg cl

mov al,[bp+10]
mov ah,es:[bx]
mov es:[bx],al

putexit:
restoremode
selreg 5
movreg 0
selreg 8
movreg 0ffh

pop ds
pop es
mov sp,bp
pop bp
cli
ret
_putpixel endp

@setwritemode$qi label far
_setwritemode proc    far
sti
push bp
mov bp,sp
pushds

mov dx,3ceh
selreg 3
in al,dx
mov bx,[bp+6]
cmp bx,0
jne setlb
mov al,0
jmp setlb1
setlb:
or al,24d
setlb1:
out dx,al
mov [mode],al

pop ds
mov sp,bp
pop bp
cli
ret
_setwritemode endp

@setcolor$qi label far
_setcolor  proc    far
push bp
mov bp,sp
pushds

mov bx,[bp+6]
and bx,15d

mov [color],bl

pop ds
mov sp,bp
pop bp
ret
_setcolor endp

@setviewport$qiiiii label far
_setviewport proc far
push bp
mov bp,sp
pushds

mov ax,[bp+6]
mov [viewportsetting.left],ax
mov ax,[bp+8]
mov [viewportsetting.top],ax
mov ax,[bp+10]
cmp ax,[viewportsetting.left]
jge sl1
mov bx,ax
mov ax,[viewportsetting.left]
mov [viewportsetting.left],bx
sl1:
mov [viewportsetting.right],ax
mov ax,[bp+12]
cmp ax,[viewportsetting.top]
jge sl2
mov bx,ax
mov ax,[viewportsetting.top]
mov [viewportsetting.top],bx
sl2:
mov [viewportsetting.bottom],ax
mov ax,[bp+14]
mov [viewportsetting.clip],ax

pop ds
mov sp,bp
pop bp
ret
_setviewport endp
@getviewsettings$qn12viewporttype label far

_getviewsettings proc far
push bp
mov bp,sp
pushds

mov bx,[bp+6]
mov ax,[viewportsetting.left]
mov ss:[bx],ax
mov ax,[viewportsetting.top]
mov ss:[bx+2],ax
mov ax,[viewportsetting.right]
mov ss:[bx+4],ax
mov ax,[viewportsetting.bottom]
mov ss:[bx+6],ax
mov ax,[viewportsetting.clip]
mov ss:[bx+8],ax

pop ds
mov sp,bp
pop bp
ret
_getviewsettings endp

_setfillstyle proc far
push bp
mov bp,sp
pushds

mov ax,[bp+6]
mov fillsettings.pattern,ax
mov ax,[bp+8]
mov fillsettings.fillcolor,ax

pop ds
mov sp,bp
pop bp
ret
_setfillstyle endp

_getfillsettings proc far
push bp
mov bp,sp
pushds

mov bx,[bp+6]
mov ax,fillsettings.pattern
mov [bx],ax
mov ax,fillsettings.fillcolor
mov [bx+2],ax

pop ds
mov sp,bp
pop bp
ret
_getfillsettings endp

@getmax label far
_getmaxx proc far
push bp
mov bp,sp
mov ax,639d
mov sp,bp
pop bp
ret
_getmaxx endp

@getmaxy$qv label far
_getmaxy proc far
push bp
mov bp,sp
mov ax,479d
mov sp,bp
pop bp
ret
_getmaxy endp


@initgraph$qv label far
_initgraph proc far
push bp
mov bp,sp
xor ah,ah
mov al,12h
int  10h
mov sp,bp
pop bp
ret
_initgraph endp

@closegraph$qv label far
_closegraph proc far
push bp
mov bp,sp
xor ah,ah
mov al,3
int  10h
mov sp,bp
pop bp
ret
_closegraph endp

@getbkcolor$qv label far
_getbkcolor proc    far
push bp
pushds
mov bp,sp
xor ah,ah
mov al,[bkcolor]
pop ds
mov sp,bp
pop bp
ret
_getbkcolor endp

@getcolor$qv label far
_getcolor proc    far
push bp
pushds
mov bp,sp
xor ah,ah
mov al,[color]
pop ds
mov sp,bp
pop bp
ret
_getcolor endp

@getwritemode$qv label far
_getwritemode proc    far
push bp
mov bp,sp
pushds
mov dx,3ceh
selreg 3
in al,dx
and al,24d
cmp al,0
je setlbm
mov al,1
setlbm:
xor ah,ah
pop ds
mov sp,bp
pop bp
ret
_getwritemode endp

@setlinestyle$qii label far
_setlinestyle proc    far
push bp
pushds
mov bp,sp
xor ah,ah
mov al,[color]
pop ds
mov sp,bp
pop bp
ret
_setlinestyle   endp

@floodfill$qiii label far
_floodfill proc    far
push bp
pushds
mov bp,sp
xor ah,ah
mov al,[color]
mov sp,bp
pop ds
pop bp
ret
_floodfill   endp
;--------------------------------------------------------------------
;功能: 用于获取视窗信息
;参数: &VIEWPORTTYPE
@restoreview$qn12viewporttype label far
_restoreview    proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
push ds
push es
push si
push di

mov si,[bp+6]

mov ax,[bp+8]
mov ds,ax

mov ax,seg viewportsetting
mov es,ax
mov di,offset viewportsetting
mov cx,5
rep movsw

pop di
pop si
pop es
pop ds
mov sp,bp
pop bp
ret
_restoreview endp



@writehz16$qiiinuc label far

_writehz16 proc far
sti
push bp
mov bp,sp
push es
pushds
push si
push ss
push di

mov ax,0a000h
mov es,ax

setmode0
selreg  5
movreg 2

mov di,[bp+6]      ;x0
mov bx,di
and bl,07
mov bh,0ffh
mov cl,bl
shr bh,cl
mov ax,[bp+8]      ;y0
mov cx,80d
mul cx

shr di,1
shr di,1
shr di,1
add di,ax

mov cx,10h
mov dx,03ceh
mov al,8
out dx,al
inc dx
mov ax,[bp+10]
mov ah,al

mov si,[bp+14]
mov ss,si
mov si,[bp+12]

cmp bl,0
jne llpp
llp:
mov al,ss:[si]
out dx,al
mov al,es:[di]
mov es:[di],ah
inc si
inc di
mov al,ss:[si]
inc si
out dx,al
mov al,es:[di]
mov es:[di],ah
add di,79d
loop llp

jmp succ

llpp:
push cx

mov al,ss:[si]
mov cl,bl
shr al,cl
out dx,al
mov al,es:[di]
mov es:[di],ah

inc di
mov al,ss:[si]
mov cl,8
sub cl,bl
shl al,cl

inc si
mov ch,ss:[si]
mov cl,bl
shr ch,cl
or al,ch
out dx,al
mov al,es:[di]
mov es:[di],ah

inc di

mov al,ss:[si]
mov cl,8
sub cl,bl
shl al,cl
out dx,al

mov al,es:[di]
mov es:[di],ah

add di,78d
inc si
pop cx
loop llpp


succ:
mov al,0ffh
out dx,al

restoremode
selreg 5
movreg 0

pop di
pop ss
pop si
pop ds
pop es
mov sp,bp
pop bp
cli
ret

_writehz16 endp

@writeascil$qiiii label far
_writeascil proc far
sti
push bp
mov bp,sp
push es
pushds
push si
push ss
push di

mov ax,0a000h
mov es,ax

setmode0
selreg 5
in al,dx
mov old_5_bit,al
movreg 2
mov di,[bp+6]      ;x0
mov bx,di
and bl,07
mov bh,0ffh
mov cl,bl
shr bh,cl
mov ax,[bp+8]      ;y0
mov cx,80d
mul cx

shr di,1
shr di,1
shr di,1
add di,ax

mov dx,03ceh
mov al,8
out dx,al
inc dx

in al,dx
mov old_8_bit,al


mov ax,[bp+10]
mov ah,al

mov si,[bp+12]
sub si,32d
shl si,1
shl si,1
shl si,1
shl si,1

mov cx,offset ascildot

add si,cx

mov cx,16d

cmp bl,0
jne llpp2
llp2:
mov al,[si]
out dx,al
mov al,es:[di]
mov es:[di],ah
inc si
add di,80d
loop llp2

jmp succ2

llpp2:
push cx

mov al,[si]
mov cl,bl
shr al,cl
out dx,al
mov al,es:[di]
mov es:[di],ah

inc di
mov al,[si]

mov cl,8
sub cl,bl
shl al,cl

out dx,al
mov al,es:[di]
mov es:[di],ah

add di,79d
inc si
pop cx
loop llpp2


succ2:

restoremode

selreg 5
movreg old_5_bit
selreg 8
movreg old_8_bit

pop di
pop ss
pop si
pop ds
pop es
mov sp,bp
pop bp
cli
ret

_writeascil endp

@loadascil$qv label far
_loadascil proc    far
push bp
mov bp,sp
pushds

mov dx,offset hzk
mov ah,03dh
xor al,al
int 21h

jnb openright

mov dx,offset openerror
mov ah,9
int 21h
jmp closeright
openright:
mov bx,ax
mov ah,03fh
mov dx,offset ascildot
mov cx,1536d
int     21h

jnb readright

mov dx,offset readerror
mov ah,9
int 21h
jmp closeright
readright:

mov ah,03eh
int 21h
jnb closeright
mov dx,offset closeerror
mov ah,9
int 21h
jmp closeright
closeright:
pop ds
pop bp
ret
_loadascil   endp

;--------------------------------------------------------------------
@installclock$qv label far
_installclock proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds
push es

mov ah,35h
mov al,1ch
int 21h
mov int_1c_off,bx
mov int_1c_seg,es

push ds
mov ax,cs
mov ds,ax
mov ah,25h
mov al,1ch
mov dx,offset new_int_1c
int 21h
pop ds

pop es
pop ds
mov sp,bp
pop bp
ret
_installclock endp

;--------------------------------------------------------------------
@quitclock$qv label far
_quitclock proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds

mov dx,int_1c_off
mov ax,int_1c_seg
mov ds,ax

mov ah,25h
mov al,1ch

int 21h

pop ds
mov sp,bp
pop bp
ret
_quitclock endp

;--------------------------------------------------------------------
@resetclock$qv label far
_resetclock proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds
xor ax,ax
mov currtime,ax
pop ds
mov sp,bp
pop bp
ret
_resetclock endp
;--------------------------------------------------------------------
@setmaxtime$qi label far
_setmaxtime proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds

mov ax,[bp+6]

mov maxtime,ax

pop ds
mov sp,bp
pop bp
ret
_setmaxtime endp

;--------------------------------------------------------------------
@timeout$qv label far
_timeout proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds

mov ax,currtime
cmp ax,maxtime
jge outt
xor ax,ax
jmp out1
outt:
mov ax,1
out1:
pop ds
mov sp,bp
pop bp
ret
_timeout endp
;--------------------------------------------------------------------
showtime proc far
;--------------------------------------------------------------------
mov cl,10d
div cl
mov cx,ax
xor ax,ax
mov al,cl
add ax,48d

push cx
push ax

mov ax,128d
push ax
mov ax,timebkcol
push ax
push dx
push bx
call _writeascil
pop bx
pop dx
pop ax
pop ax

pop ax

push ax
mov ax,timecol
push ax
push dx
push bx
call _writeascil
pop bx
pop dx
pop ax
pop ax

pop cx

xor ax,ax
mov al,ch
add ax,48d
add bx,8
push ax

mov ax,128d
push ax
mov ax,timebkcol
push ax
push dx
push bx
call _writeascil
pop bx
pop dx
pop ax
pop ax
pop ax


push ax
mov ax,timecol
push ax
push dx
push bx
call _writeascil
pop bx
pop dx
pop ax
pop ax

ret
showtime endp


newtime proc far
mov al,offsecond
inc al

mov bx,timex
add bx,48d
mov dx,timey
push ax
push bx
call showtime
pop bx
pop ax
mov offsecond,al

cmp al,60d
jb ot1
xor al,al
mov offsecond,al

push ax
push bx
call showtime
pop bx
pop ax


mov al,offminute
inc al
mov offminute,al

sub bx,24d

push ax
push bx
call showtime
pop bx
pop ax

cmp al,60d
jb ot1

xor al,al
mov offminute,al

push ax
push bx
call showtime
pop bx
pop ax

mov al,offhour
inc al
mov offhour,al
sub bx,24d

push ax
push bx
call showtime
pop bx
pop ax

ot1:
ret
newtime endp






;--------------------------------------------------------------------
@settimeon$qiiii label far
_settimeon proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds

mov ax,[bp+6]
mov timex,ax
mov ax,[bp+8]
mov timey,ax
mov ax,[bp+10]
mov timecol,ax
mov ax,[bp+12]
mov timebkcol,ax

mov al,0
mov offhour,al
mov offminute,al
mov offsecond,al
mov timer,al
mov al,1
mov timeon,al

pop ds
mov sp,bp
pop bp
ret
_settimeon endp

;--------------------------------------------------------------------
@setclockon$qiiii label far
_setclockon proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds

mov ax,[bp+6]
mov clockx,ax
mov ax,[bp+8]
mov clocky,ax
mov ax,[bp+10]
mov timecol,ax
mov ax,[bp+12]
mov timebkcol,ax

mov ah,2ch
int 21h
mov abshour,ch
mov absminute,cl
mov abssecond,dh

mov al,1
mov clockon,al


pop ds
mov sp,bp
pop bp
ret
_setclockon endp

;--------------------------------------------------------------------
@M_gettime$qnuc label far
_M_gettime  proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds
push si
mov si,[bp+6]
mov ax,[bp+8]
mov ds,ax

mov ah,2ch
int 21h

xor ax,ax
mov al,ch
mov dl,10d
div dl
add ah,48d
add al,48d
mov ds:[si],al
inc si
mov ds:[si],ah
inc si
mov ah,':'
mov ds:[si],ah
inc si

xor ax,ax
mov al,cl
mov dl,10d
div dl
add ah,48d
add al,48d
mov ds:[si],al
inc si
mov ds:[si],ah
inc si
mov ah,':'
mov ds:[si],ah
inc si

xor ax,ax
mov al,dh
mov dl,10d
div dl
add ah,48d
add al,48d
mov ds:[si],al
inc si
mov ds:[si],ah
inc si
xor ah,ah
mov ds:[si],ah

pop si
pop ds
mov sp,bp
pop bp
ret
_M_gettime endp


;--------------------------------------------------------------------
@setclockoff$qv label far
_setclockoff proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds

mov al,0
mov clockon,al

pop ds
mov sp,bp
pop bp
ret
_setclockoff endp

;--------------------------------------------------------------------
@settimeoff$qv label far
_settimeoff proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds

mov al,0
mov timeon,al

pop ds
mov sp,bp
pop bp
ret
_settimeoff endp

;--------------------------------------------------------------------
@M_random$qi label far
_M_random proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
pushds
push es
push di
push si

xor ax,ax
mov es,ax
mov di,046ch
mov si,es:[di]
mov ax,ds:[si]

; mov dx,ds:[si+2]
and dx,00h
; and ax,ffffh
mov si,randsi
inc si
cmp si,982d
jb lk
mov si,0
lk:
mov randsi,si
mov bl,ascildot[si]
mov bh,ascildot[si+1]
add ax,bx

mov bx,[bp+6]
cmp bx,0
je oi
div bx
oi:
mov ax,dx

pop si
pop di
pop es
pop ds
mov sp,bp
pop bp
ret
_M_random endp


newclock proc far
; xor ah,ah

mov al,abssecond
inc al
mov bx,clockx
add bx,48d
mov dx,clocky
push ax
push bx
call showtime
pop bx
pop ax

mov abssecond,al

cmp al,60d
jb oot1
xor al,al
mov abssecond,al

push ax
push bx
call showtime
pop bx
pop ax


mov al,absminute
inc al
mov absminute,al

sub bx,24d

push ax
push bx
call showtime
pop bx
pop ax

cmp al,60d
jb oot1

xor al,al
mov absminute,al

push ax
push bx
call showtime
pop bx
pop ax

mov al,abshour
inc al
mov abshour,al
sub bx,24d

push ax
push bx
call showtime
pop bx
pop ax
oot1:
ret
newclock endp


;--------------------------------------------------------------------
new_int_1c proc far
;--------------------------------------------------------------------
push bp
mov bp,sp
push es
push ax
push bx
push cx
push dx
push si
push di
pushf
pushds


mov al,clocker
inc al
cmp al,18d
jb llll

mov ax,currtime
inc ax
mov currtime,ax
mov ax,0
llll:
mov clocker,al

mov ax,rule
inc ax
mov rule,ax
cmp ax,1620d


jb lllll
mov ax,0
mov rule,ax
mov al,offsecond
inc al
mov offsecond,al
mov al,abssecond
inc al
mov abssecond,al
lllll:
mov al,clockon
cmp al,1
je ottt
mov al,timeon
cmp al,1
je ottt
jmp ot
ottt:

mov al,timer
inc al
mov timer,al
cmp al,18d
jb ot

xor ax,ax
mov timer,al

mov al,clockon
cmp al,0
je oto
call newclock
oto:
mov al,timeon
cmp al,0
je ot
call newtime
ot:

pop ds
popf
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop es
mov sp,bp
pop bp
iret
new_int_1c endp

end

[/code:1:e47180bf29]

 mengwg 回复于:2004-03-10 01:07:39
再贴一个,也是94年写的,当时在dos下面做个现在类似win的程序。
自己实现的图形库、拼音输入法、ems管理、菜单、按钮、多窗口管理,
管理了鼠标、键盘等消息事件。


[code:1:fe4323eaae]
void main(int argc,char *argv[])
{
int i=0;
MENU menu;
GET mainget;
MENU popu0,popu1,popu2;

initgraph();
hzini();
  echo_off();
  load_image(0,0,"c:\\service\\speed.img");
  echo_on();
  delay(300);
  setwritemode(1);
  pyini();
  xmax=getmaxx();
  ymax=getmaxy();
  mouse(xmax,ymax);
  EMSini();

  if(argc==2)
  {
   strcpy(filename,argv[1]);
   while(filename[i]!='\0'&&filename[i]!='.'){bodyname[i]=filename[i];i++;};
   if(filename[i]!='.') strcat(filename,".scx");
   if ((screen=fopen(filename,"rb"))!=NULL){
  fclose(screen);
  read_();
 };
   }
   else strcpy(filename,"");

  menu.define(20,30,"@vn添加对象;文件管理;格式控制;");
  menu.dist(10,0);
  menu.textsize(16,16);
  popu0.define(5,50,"@hb窗口     F6;LIST选择器;按钮;开关;选择类别;//检测框;-;读取变量;//显示变量;-;框;线;//圆;文本;实心框;//显示图形;");
  popu0.size(120,16);
  popu1.define(90,50,"@hb新建文件;读取文件  F3;存盘      F2;另存为...;-;隐藏菜单  F4;文本编辑;生成函数  F9;-;帮助信息  F1;清屏;退出系统  Alt+Q;");
  popu1.size(130,16);
  popu2.define(180,50,"@hb左对齐 Ctl+L;右对齐 Ctl+R;上对齐 Ctl+U;select Ctl+A;");
  popu2.size(110,16);
  popu0.function(0,(char *) wind_);
  popu0.function(1,(char *) list_);
  popu0.function(2,(char *) buttons_);
  popu0.function(3,(char *) check_);
  popu0.function(4,(char *) choose_);
  popu0.function(7,(char *) get_);

  popu0.function(10,(char *) rectangle_);
  popu0.function(11,(char *) line_);

  popu0.function(13,(char *) text_);
  popu0.function(14,(char *) bar_);

  popu1.function(0,(char *) creat_);
  popu1.function(1,(char *) readfrom_);
  popu1.function(2,(char *) save_);
  popu1.function(3,(char *) saveas_);
  popu1.function(5,(char *) draw_);


  popu1.function(6,(char *) editcomm_);
  popu1.function(7,(char *) generate);
  popu1.function(9,(char *) help_);
  popu1.function(10,(char *) clearscr_);
  popu1.function(11,(char *) quit_);
  menu.setmainmenu();

  menu.setpopu(0,&popu0);
  menu.setpopu(1,&popu1);
  menu.setpopu(2,&popu2);
  mainget.push(&menu);
  mainget.setmouserightkey(SPACE,F4);
  mainget.sethotkey(SPACE,F2,1,(char *)save_);
  mainget.sethotkey(SPACE,F1,1,(char *)help_);
  mainget.sethotkey(SPACE,F3,1,(char *)readfrom_);
  mainget.sethotkey(SPACE,F4,1,(char *)draw_);
  mainget.sethotkey(ALT,'q',1,(char *)quit_);
  mainget.sethotkey(SPACE,F6,1,(char *)wind_);
  mainget.sethotkey(SPACE,F9,1,(char *)generate);
  demowind0.define(0,0,320,350,"SCREEN","blue");
  demowind0.prepare();
  do
  {
    mainget.active();
  }while(1);
}

[/code:1:fe4323eaae]


上面的程序可以用来丁直界面,自动生成下面的代码。

[code:1:fe4323eaae]
/* ------------------------------------------------------------
   屏幕自动生成: s.fun
   From: Speed Software Technology Department, Meng wg
                                               1995-1998  
-------------------------------------------------------------- */
void s(){

GET getmanage;
viewporttype pv;
windows name;
BOTTONS demobut;
int but=0;
     getviewsettings(&pv);
     name.define(100,100,400,300,"设置窗口","nothing");
     name.prepare();
     demobut.define(&but,0,30,"@vt>B力学帮手;!>aBut2;//But3;");
        demobut.dist(16,16);
        demobut.textsize(16,16);
     getmanage.push(&demobut);
     getmanage.active();
     name.finish();
     setviewport(pv.left,pv.top,pv.right,pv.bottom,pv.clip);
};
[/code:1:fe4323eaae]

 bierdaci 回复于:2004-03-10 11:07:42
楼上这位大哥真厉害,编了那么多的肯定是高手了,不知道大哥现在做什么了

 mengwg 回复于:2004-03-10 13:23:33
[quote:a23f9cfb37="bierdaci"]楼上这位大哥真厉害,编了那么多的肯定是高手了,不知道大哥现在做什么了[/quote:a23f9cfb37]

兄弟还在编程序。

 阿Benni 回复于:2004-03-10 14:49:26


 bierdaci 回复于:2004-03-10 17:14:24
[quote:9aba69f79d="mengwg"]

兄弟还在编程序。[/quote:9aba69f79d]

我看了你的主页好像你开了个软件公司开发软件,还有类库我简单的看了一下那个类库使用说明,大哥真厉害93、94年的时候我没见过电脑呢,呵呵

 jinxingvenus 回复于:2004-05-18 20:53:31
都是强人,我学习中。。。

 bierdaci 回复于:2004-05-18 22:37:26
晕!!这么久的贴子也能顶上来~~~~~~

 ghnie 回复于:2004-05-25 13:27:33
有没有linux下的
谢谢

 失忆的风 回复于:2004-07-26 00:42:45
为了这一贴,我进来顶一顶。

我刚学C语言5个月,这是我的作品。
http://www.uoog.com/forums/upload/715-1-1.rar

 hongyu1861 回复于:2004-10-31 12:51:12
请问楼主,怎么样把24位BMP转换成256索引色?可以提供一下代码吗?谢谢.

 hongyu1861 回复于:2004-10-31 12:53:37
用C来实现,

 枫轻扬 回复于:2004-11-01 19:17:59
呵呵,当初俺也做过一个类似的程序,几本比较经典的书就是<计算机图形学>和那个<VESA 图形图像程序设计>, 不过用的是Watcom C++, 第一次做出在DOS下显示 24位色的BMP文件时真是激动得不得了.

 bierdaci 回复于:2004-11-02 09:35:42
[quote:a5e990c21d="枫轻扬"]呵呵,当初俺也做过一个类似的程序,几本比较经典的书就是<计算机图形学>和那个<VESA 图形图像程序设计>, 不过用的是Watcom C++, 第一次做出在DOS下显示 24位色的BMP文件时真是激动得不得了.[/quote:a5e990c21d]

大家怎么都对DOS下显示真彩感兴趣?有这精力还不如学点实用的东西呢,比如LINUX呵呵

 枫轻扬 回复于:2004-11-02 12:27:42
呵,毕竟那个时候linux还只是听说,第一次接触还是在99年的了,以前没得其他的玩,只好用DOS.

 轩辕砍刀 回复于:2004-11-02 12:50:20
牛人

收下了

 bierdaci 回复于:2004-11-02 13:30:43
[quote:94eedca036="枫轻扬"]呵,毕竟那个时候linux还只是听说,第一次接触还是在99年的了,以前没得其他的玩,只好用DOS.[/quote:94eedca036]

99年时我也装过是蓝点LINUX不过第一天装了第二天我就给删了,装上去两眼黑黑的啥也看不懂,还占我的硬盘空间.不过现在工作天天用LINUX了,不用也得用呵呵

 zhousqy 回复于:2005-06-25 19:57:56
pf,pf.

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有