古董C语言书下的俄罗斯方块代码运行不了,求解决

古董C语言书上的俄罗斯方块代码运行不了,求解决
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<string.h>
#include<dos.h>
#include<windows.h>
int map[26][10];
typedef struct
{
int d[4][4];
}Block;
int BlockList[7][4][4]={
{{0,0,0,0},{0,1,0,0},{0,1,0,0},{0,1,1,0}},
{{0,0,0,0},{0,0,2,0},{0,0,2,0},{0,2,2,0}},
{{0,3,0,0},{0,3,0,0},{0,3,0,0},{0,3,0,0}},
{{0,4,0,0},{0,4,4,0},{0,0,4,0},{0,0,0,0}},
{{0,0,5,0},{0,5,5,0},{0,5,0,0},{0,0,0,0}},
{{0,6,6,0},{0,0,6,0},{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,7,7,0},{0,7,7,0},{0,0,0,0}},
};
unsigned char cmap[]={0,0x72,0x30,0x47,0x57,0x27,0x60,0x74};
long GameMode=0,GameSpeed=-1,GameScore=0;

char far*TextBuf=(char far*)0xb80000001; /*XXXX*/
char TextBck[20][10]; /*XXXX*/
#define SCREEN(x,y) (TextBuf[((y)*160)+((x)*2)]) /*XXXX*/
#define SCOLOR(x,y) (TextBuf[((y)*160)+((x)*2)+1]) /*XXXX*/

void Rotate(const Block *src,Block *dest)
{
int i,j;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
dest->d[i][j]=src->d[j][3-i];
}

int MapCheck(int x,int y)
{
if(x<0||x>=10||y<0||y>=26)
return -1;
return map[y][x];
}

int BlockCheck(int x,int y,const Block *src)
{
int i,j;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
if(MapCheck(x+j,y-i)&&src->d[i][j])
return 0;
return 1;
}

void CreateBlock(Block *src)
{
int i,j,k=rand()%7;
Block t;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
src->d[i][j]=BlockList[k][i][j];
for(i=rand()%4;i>0;i--,*src=t)
Rotate(src,&t);
}

long TimePass=0,TimeExit=-1,GameTime=-1,w;
int SpeedX[10]={17,16,13,11,9,7,5,4,3,2};
int x=3,y=20,v=0,level;
Block A,B,C;

void GameMain(void);
void GameDriver(void);
void GameView(void);
int main()
{
system("cls");
srand(time(NULL));
for(w=0;w<26;w++)
memset(map[w],0,sizeof(int)*10);
for(w=0;w<22;w++)
SCREEN(w,0)=254,SCOLOR(w,0)=8,
SCREEN(w,21)=254,SCOLOR(w,21)=8,
SCREEN(0,w)=254,SCOLOR(0,w)=8,
SCREEN(21,w)=254,SCOLOR(21,w)=8;
GameSpeed=2;
GameMain();
return 0 ;
}

int readkey()
{
if(!kbhit())
return 0;
if((w=getch())==0)
return getch();
return (int)w;
}

void GameMain(void)
{
long key,i,j,m,n,old_time=0;
CreateBlock(&A);
CreateBlock(&C);
for(GameMode=0,v=SpeedX[GameSpeed];GameMode==0;TimePass++)
{
while(clock()==old_time);
old_time=clock();
// nosound();
key=readkey();
if(key==75)
if(BlockCheck(x-1,y,&A))
x--;
  if(key==77)
if(BlockCheck(x+1,y,&A))
x++;
if(key==80)
v=0;
if(key==' ')
{
for(i=y;i>=0;i--)
if(!BlockCheck(x,i-1,&A))
break;
y=i;
v=0;
}
if(key==27)
GameMode=1;
if(key==72)
{
Rotate(&A,&B);
if(BlockCheck(x,y,&B))
A=B;
}
if(--v<=0)
{
v=SpeedX[GameSpeed];
if(BlockCheck(x,y-1,&A)==0)
{
for(i=0,m=y;i<4;i++,m--)
for(j=0,n=x;j<4;j++,n++)
if(MapCheck(n,m)==0&&A.d[i][j])
map[m][n]=A.d[i][j];
A=C;
CreateBlock(&C);
if(y>=20)
GameMode=-1;
else
y=20,x=3;
GameDriver();
}
else
y--;
}
GameView();
}
while(kbhit())
getch();
while(!kbhit());
//nosound();
}

void GameDriver(void)
{
int inc[5]={10,100,300,600,1000},count=0,x,y,k,i,j;