logo 广告
Loading...
 导航 所在位置:论坛首页 -> ┈┋电脑网络┋┈ -> 图象媒体技术应用 -> DOS下看真彩BMP位图的小程序(我给加了注释)
回复
标题:DOS下看真彩BMP位图的小程序(我给加了注释)收藏 编辑 删除 楼主 | 上一篇 下一篇
睡不着的海
头像
等级:
权限:版主
积分:-35
金钱:2688
声望:28
经验:-11
发帖数:1012
注册:2005年9月1日
资料 短消息2007-10-24 16:29:46

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



A.c main文件

CODE:
#include ;
#include ;
#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;
}BMP.C 主文件,里边有画直线函数

CODE:
#include;
#include;
#include;
#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;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 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 {
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 {
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;
}a.h 头文件

CODE:
#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;
};mybmp.c这是嵌入式汇编的画点函数

CODE:
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;
}gl.asm 底层画点函数要用TASM编译,不过有上边的嵌入式汇编这个可以不用了

CODE:
.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 ◆

看不懂啊!!




其实挺挺简单的,你可以不用看汇编写的画点函数,因为涉及到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系列的试过也都好用。 ◆

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




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




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

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




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

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

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




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





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

呵呵,计数器的程序也是我在学的间断的一个重要的程序,当时好象写了近1200行,




计数器是个什么程序呀,用来计什么的?




我也写过这种程序。但是是显示16色的。
我不知楼是是如何上真采的。1024*768
我是用trubo c 2.0

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

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

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




[quote]原帖由 "mzpvsww"]呵呵,弓虽?我用c ,不过对汇编就垃圾的很[/quote 发表:


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




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




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

CODE:
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