#include "graphics.h"
#include "math.h"
#include "stdio.h"
#include "conio.h"
#include "bios.h"
#include "dos.h"
#include "io.h"
char key_state[128],key_pressed[128];
void interrupt far (*OldInt9Handler)();
enum modes {AUTO, HIGH};
enum bool {FALSE=0, TRUE=1};
#define MODE enum modes
#define BOOL enum bool
#define K_ENTER 0x1c
#define K_DOWN 0x50
#define K_UP 0x48
#define K_SPACE 0x39
#define K_ESC 0x01
#define K_C 0x2e
#define K_A 0x1e
#define K_X 0x2d
#define UP 0
#define DOWN 1
#define PI 3.1415
#define MODE_KEY 0
#define MODE_CMD 1
#define MAX_CMD_NUM 15
/*Instruction define*/
#define EXIT 0
#define CHM 1
#define PU 2
#define PD 3
#define CHC 4
#define CHHT 5
#define ADTH 6
#define FW 7
#define BW 8
#define CLR 9
#define CHP 10
enum hlpmsg{ALL_CMD, IN_ERROR, PU_OK, PD_OK, CHC_OK, CHP_OK, CHM_OK,
FW_OK, BW_OK, CHHT_OK, ADTH_OK, CLR_OK, M_KEY, IN_COLOR,
IN_POS, IN_HEAD, IN_STEPS};
#define HLPMSG enum hlpmsg
typedef int penState;
typedef struct{float v,h;}aPoint;
typedef struct
{
float heading;
penState pen;
int color;
aPoint Pos;
}newTurtle;
newTurtle turtle;
char GMODE=MODE_CMD;
char CmdWords[MAX_CMD_NUM][4]={
{'E', 'X', 'I', 'T'}, {'C', 'H', 'M', ' '},
{'P', 'U', ' ', ' '}, {'P', 'D', ' ', ' '},
{'C', 'H', 'C', ' '}, {'C', 'H', 'H', 'T'},
{'A', 'D', 'T', 'H'}, {'F', 'W', ' ', ' '},
{'B', 'W', ' ', ' '}, {'C', 'L', 'R', ' '},
{'C', 'H', 'P', ' '},
};
char CmdTmp[4];
unsigned char NumTmp[4];
unsigned char NumTmp1[4];
typedef struct node
{
int color;
int x1, x2, y1, y2;
}NODE;
/*---------------------------------------*/
/*other functions*/
void OpenSecCmdWnd()
{
setcolor(2);
rectangle(510, 250, 595, 275);
while(bioskey(1)==0)
{
setcolor(2);
line(513, 270, 518, 270);
setcolor(0);
line(513, 270, 518, 270);
}
window(66, 17, 66, 17);
}
void CloseSecCmdWnd()
{
setfillstyle(SOLID_FILL, 0);
bar(511, 250, 595, 275);
}
int Cvt4CToInt(int i)
{
if(i==0)
return NumTmp[0]+NumTmp[1]*10+NumTmp[2]*100+NumTmp[3]*1000-53328;
else
return NumTmp1[0]+NumTmp1[1]*10+NumTmp1[2]*100+NumTmp1[3]*1000-53328;
}
int GetAn4BInterger()
{
int i, j;
union REGS regs;
unsigned char t;
regs.h.ah=0x07;
IN_AGAIN:
for(i=0;i<4;i++)
NumTmp[i]=48;
for(i=0;i<4;i++)
{
IN:
while(bioskey(1)==0) {;};
if(bioskey(1)==0x1c0d)
{ bioskey(0); goto OUT;}
int86(0x21, ®s, ®s);
t=regs.h.al;
if(t>57 || t<48) goto IN;
else
{
for(j=3;j>0;j--)
NumTmp[j]=NumTmp[j-1];
NumTmp[0]=t;
printf("%c", t);
}
}
while(bioskey(1)==0) {;}
if(bioskey(1)!=0x1c0d)
{
bioskey(0);
CloseSecCmdWnd();
OpenSecCmdWnd();
goto IN_AGAIN;
}
OUT:
return Cvt4CToInt(0);
}
void StoreTwo4BInterger()
{
int i, j;
union REGS regs;
unsigned char t;
regs.h.ah=0x07;
IN_AGAIN1:
for(i=0;i<4;i++)
{
NumTmp[i]=48;
NumTmp1[i]=48;
}
for(i=0;i<4;i++)
{
IN1:
while(bioskey(1)==0) {;};
if(bioskey(1)==0x1c0d)
{ bioskey(0); goto OVER;}
int86(0x21, ®s, ®s);
t=regs.h.al;
if(t==44)
{
printf("%c", t);
goto OUT1;
}
if(t>57 || t<48) goto IN1;
else
{
for(j=3;j>0;j--)
NumTmp[j]=NumTmp[j-1];
NumTmp[0]=t;
printf("%c", t);
}
}
while(bioskey(1)==0) {;}
if(bioskey(1)!=0x1c0d)
{
int86(0x21, ®s, ®s);
t=regs.h.al;
if(t==44)
{
printf("%c", t);
goto OUT1;
}
CloseSecCmdWnd();
OpenSecCmdWnd();
goto IN_AGAIN1;
}
OUT1:
for(i=0;i<4;i++)
NumTmp1[i]=48;
for(i=0;i<4;i++)
{
IN2:
while(bioskey(1)==0) {;};
if(bioskey(1)==0x1c0d)
{ bioskey(0); goto OVER;}
int86(0x21, ®s, ®s);
t=regs.h.al;
if(t>57 || t<48) goto IN2;
else
{
for(j=3;j>0;j--)
NumTmp1[j]=NumTmp1[j-1];
NumTmp1[0]=t;
printf("%c", t);
}
}
while(bioskey(1)==0) {;}
if(bioskey(1)!=0x1c0d)
{
bioskey(0);
CloseSecCmdWnd();
OpenSecCmdWnd();
goto IN_AGAIN1;
}
OVER: ;
}
void far interrupt NewInt9(void)
{
unsigned char ScanCode,temp;
ScanCode=inportb(0x60);
temp=inportb(0x61);