📄 matrix.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 + -