⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.cpp

📁 Enter the Matrix MS-DOS screensaver. Sample of using bios functions (by int 10h) for text data out
💻 CPP
字号:
#include <bios.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

void set_mode(char m);
void set_cursor(char h,char l);
void set_active_vpage(char vp);
void scroll_text_down(char n,char x0,char y0,char x,char y);
void move_cursor(char x,char y);
void get_scr_size(char *w,char *h);
void write_symbol(char s,char a);
void read_symbol(char *s,char *a);
void xdelay(int msec);
int key_pressed();
#define ESC 27

const char vpage = 0;
char scr_width;
char scr_height;

char text[128] = {" Enter the Matrix "};
int textlen = strlen(text);
const int text_space = 20;
const int max_velocity = 10;
const int mdelay = 10;
int *scr_buf;
int *velocity_buf;
int *cur_velocity_buf;
int key;

const char label_h=5;
const char label_w=53;

#define X 0
char label[label_h][label_w] = {
{1,1,1,X,1,0,1,X,1,1,1,X,1,1,1,X,1,1,1,X,1,0,0,0,1,X,X,X,1,1,1,X,1,1,1,X,0,1,0,X,1,0,0,X,1,1,1,X,1,1,1},
{1,0,0,X,1,0,1,X,1,0,0,X,0,1,0,X,1,0,0,X,1,1,0,1,1,X,X,X,1,0,0,X,1,0,1,X,0,1,0,X,1,0,0,X,1,0,0,X,1,0,1},
{1,1,1,X,1,0,1,X,1,1,1,X,0,1,0,X,1,1,1,X,1,0,1,0,1,X,X,X,1,1,1,X,1,1,1,X,0,1,0,X,1,0,0,X,1,1,1,X,1,0,1},
{0,0,1,X,0,1,0,X,0,0,1,X,0,1,0,X,1,0,0,X,1,0,0,0,1,X,X,X,1,0,0,X,1,0,1,X,0,1,0,X,1,0,0,X,1,0,0,X,1,0,1},
{1,1,1,X,0,1,0,X,1,1,1,X,0,1,0,X,1,1,1,X,1,0,0,0,1,X,X,X,1,0,0,X,1,0,1,X,0,1,0,X,1,1,1,X,1,1,1,X,1,1,1},
				};
#undef X

unsigned char label_x=5,label_y=5;

void main()
{
	char i,j,c,a;
	time_t t;

	srand((unsigned) time(&t));
	set_mode(0x03);
	set_active_vpage(vpage);
	set_cursor(0x20,0x00);

	get_scr_size(&scr_width,&scr_height);
	scr_buf = (int *) malloc(scr_width*sizeof(int));
	velocity_buf = (int *) malloc(scr_width*sizeof(int));
	cur_velocity_buf = (int *) malloc(scr_width*sizeof(int));

	for (i=0;i<scr_width;i++)
	{
		scr_buf[i] = rand() % text_space;
		velocity_buf[i] = rand() % max_velocity;
		cur_velocity_buf[i] = velocity_buf[i];
	}

	do
	{
		key = key_pressed();
		if (key==0x4B00)
		{
			if (label_x>0)
				label_x--;
		}
		if (key==0x4D00)
		{
			if (label_x+label_w<scr_width)
				label_x++;
		}
		if (key==0x4800)
		{
			if (label_y>0)
				label_y--;
		}
		if (key==0x5000)
		{
			if (label_y+label_h<scr_height)
				label_y++;
		}

		for (i=0;i<scr_width;i++)
		{
			move_cursor(i,0);
			if (scr_buf[i]<=0)
			{
				c = text[-scr_buf[i]];
			}
			else
			{
				c = ' ';
			}
			a = 2;
			if (rand()%2 == 0)
			{
				a = a|0x08;
			}

			if (cur_velocity_buf[i] == 0)
			{
				write_symbol(c,a);
				scr_buf[i]--;
				if ((-scr_buf[i])>=textlen)
				{
					scr_buf[i] = rand() % text_space;
				}
			}
		}

		for (j=0;j<label_h;j++)
		{
			for (i=0;i<label_w;i++)
			{
				if (label[j][i])
				{
					move_cursor(label_x+i,label_y+j);
					read_symbol(&c,&a);
					a = a|0x20;
					write_symbol(c,a);
				}
			}
		}

		xdelay(mdelay);

		for (j=0;j<label_h;j++)
		{
			for (i=0;i<label_w;i++)
			{
				if (label[j][i])
				{
					move_cursor(label_x+i,label_y+j);
					read_symbol(&c,&a);
					a = a&0xDF;
					write_symbol(c,a);
				}
			}
		}

		for (i=0;i<scr_width;i++)
		{
			if (cur_velocity_buf[i] == 0)
			{
				scroll_text_down(1,i,0,i,scr_height-1);
				cur_velocity_buf[i] = velocity_buf[i];
			}
			else
				cur_velocity_buf[i]--;
		}
	}
	while ((char) key!=ESC);
	free(scr_buf);
	free(velocity_buf);
	free(cur_velocity_buf);
	return;
}

void set_mode(char m)
{
	asm {
	   mov ah, 00h
	   mov al, m
	   int 10h
	}
}

void set_cursor(char h,char l)
{
	asm {
	   mov ah, 1
	   mov ch, h
	   mov cl, l
	   int 10h
	}
}

void set_active_vpage(char vp)
{
	asm {
	   mov ah, 05h
	   mov al, vp
	   int 10h
	}
}

void get_scr_size(char *w,char *h)
{
	char x,y;

	asm {
	   push es
	   xor ax, ax
	   mov es, ax
	   mov dh, es:[484h] //Number of strings
	   mov dl, es:[44Ah] //Number of symbols
	   mov x, dl
	   mov y, dh
	   inc y
	   pop es
	}
	*w = x;
	*h = y;
}

void move_cursor(char x,char y)
{
	asm {
	   mov ah, 02h
	   mov bh, vpage
	   mov dh, y
	   mov dl, x
	   int 10h
	}
}

void write_symbol(char s,char a)
{
	asm {
	   mov ah, 09h
	   mov al, s
	   mov bh, vpage
	   mov bl, a
	   mov cx, 1
	   int 10h
	}
}

void scroll_text_down(char n,char x0,char y0,char x,char y)
{
	asm {
	   mov ah, 07h
	   mov al, n
	   mov bh, 7
	   mov ch, y0
	   mov cl, x0
	   mov dh, y
	   mov dl, x
	   int 10h
	}
}

void xdelay(int msec)
{
	asm {
	   mov ax, msec
	   mov cx,1193
	   mul cx
	   inc dx

	   xor ax,ax
	   mov es,ax
	   mov si,46Ch
	   mov bx,es:[si+0]
	   mov cx,es:[si+2]
	   add bx,dx
	   adc cx,ax
	   }
	repeat:
	asm {
	   mov ax,es:[si+0]
	   mov dx,es:[si+2]
	   sub ax,bx
	   sbb dx,cx
	   js repeat
	}
}

int key_pressed()
{
	int r=0;

	asm {
	   mov ah, 1
	   int 16h
	   jz r0
	   mov ah, 0
	   int 16h
	   mov r, ax
	}

	r0:
	return r;
}

void read_symbol(char *s,char *a)
{
	char cc,aa;
	asm {
	   mov ah, 08h
	   mov bh, vpage
	   int 10h
	   mov cc, al
	   mov aa, ah
	}

	*s = cc;
	*a = aa;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -