
/* 
 * Title       : wc.c
 * Description : WonderCommand
 * Author      : KAWAMOTO "nanashino" Yasuhisa
 * Email       : nanashi@yk.rim.or.jp
 * Date        : 01/03/2001
 */

/*
 * History     : 01/03/2001  SLEEP対応
 *               01/02/2001  CFGファイル対応
 *               11/20/2000  画面構成など大幅変更
 *               08/13/2000  GEDアイコン対応
 *                           JOYSTICKモード(テスト版)追加
 *               07/30/2000  初期バージョン
 */

#include <stdio.h>
#include <sys/bios.h>
#include <sys/libwwc.h>
#include "misc.h"
#include "font.h"
#include "bkgd.h"

#define CFG_FILE "/rom0/wc.cfg"

#define MES_1     0x0001
#define MES_2     0x0002
#define MES_3     0x0004
#define MTR_A_FWD 0x0008
#define MTR_B_FWD 0x0010
#define MTR_C_FWD 0x0020
#define MTR_A_RVS 0x0040
#define MTR_B_RVS 0x0080
#define MTR_C_RVS 0x0100
#define PRG_1     0x0200
#define PRG_2     0x0400
#define PRG_3     0x0800
#define PRG_4     0x1000
#define PRG_5     0x2000
#define PRG_STOP  0x4000
#define BEEP      0x8000
#define REPEAT    (MTR_A_FWD   \
                   | MTR_B_FWD \
                   | MTR_C_FWD \
                   | MTR_A_RVS \
                   | MTR_B_RVS \
                   | MTR_C_RVS)

#define KEY_ALL   (KEY_START \
                   | KEY_A  \
                   | KEY_B  \
                   | KEY_X1 \
                   | KEY_X2 \
                   | KEY_X3 \
                   | KEY_X4 \
                   | KEY_Y1 \
                   | KEY_Y2 \
                   | KEY_Y3 \
                   | KEY_Y4)

void sendmsg(uint m)
{
	uchar d, s;
	
	comm_send_char(0x55);
	comm_send_char(0xFF);
	comm_send_char(0x00);
	comm_send_char(0xD2);
	comm_send_char(~0xD2);
	s = 0xD2;
	d = (m >> 8) & 0xFF;
	comm_send_char(d);
	comm_send_char(~d);
	s += d;
	d = m & 0xFF;
	comm_send_char(d);
	comm_send_char(~d);
	s += d;
	comm_send_char(s);
	comm_send_char(~s);
}

uint keymap[10][10] = 
{
	{0x0008, 0x0040, 0x0010, 0x0080, 0x0020, 0x0100, 0x0000, 0x8000, 0x0000, 0x0000}, /* 0 */
	{0x0001, 0x0002, 0x0004, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000}, /* 1 */
	{0x0000, 0x0000, 0x0000, 0x8000, 0x0028, 0x0060, 0x0108, 0x0140, 0x0010, 0x0080}, /* 2 */
	{0x0000, 0x0000, 0x0000, 0x8000, 0x0008, 0x0020, 0x0100, 0x0040, 0x0010, 0x0080}, /* 3 */
	{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 4 */
	{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 5 */
	{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 6 */
	{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 7 */
	{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 8 */
	{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 9 */
};

uint scrn[28*18] = 
{
	0x00A1, 0x0057, 0x006F, 0x006E, 0x0064, 0x0065, 0x0072, 0x0043, 0x006F, 0x006D, 0x006D, 0x0061, 0x006E, 0x0064,
	0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A2,
	0x00A5, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A1, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A2, 0x0020, 0x0020, 0x0020, 0x00B1, 0x00B2, 0x00B3,
	0x00C1, 0x00C2, 0x00C3, 0x00C1, 0x00C2, 0x00C3, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00D3, 0x00D0, 0x00A5,
	0x00A5, 0x00A5, 0x0020, 0x00BA, 0x00BB, 0x00BC, 0x0020, 0x00A5, 0x0020, 0x0020, 0x0020, 0x00D3, 0x00D3, 0x00D3,
	0x00C4, 0x00C4, 0x00C4, 0x00D3, 0x00D3, 0x00D3, 0x00C7, 0x00C7, 0x00C7, 0x00C7, 0x00C7, 0x00C7, 0x00C5, 0x00A5,
	0x00A5, 0x00A5, 0x00B1, 0x0020, 0x00B1, 0x0020, 0x00B1, 0x00A5, 0x0020, 0x0020, 0x0020, 0x00C5, 0x00C5, 0x00C5,
	0x00D7, 0x00D7, 0x00D7, 0x00D6, 0x00D6, 0x00D6, 0x00D2, 0x00D2, 0x00D2, 0x00D2, 0x00D2, 0x00D2, 0x00C5, 0x00A5,
	0x00A5, 0x00A5, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5, 0x0020, 0x0020, 0x0020, 0x00CD, 0x00CD, 0x00CD,
	0x00C6, 0x00C6, 0x00C6, 0x00D2, 0x00D2, 0x00D2, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00C2, 0x00A5,
	0x00A5, 0x00A5, 0x00B3, 0x0020, 0x00B3, 0x0020, 0x00B3, 0x00A5, 0x0020, 0x0059, 0x0031, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A5, 0x0041, 0x0020, 0x0042, 0x0020, 0x0043, 0x00A5, 0x0020, 0x0059, 0x0034, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A5, 0x00AB, 0x0020, 0x00AB, 0x0020, 0x00AB, 0x00A5, 0x0020, 0x0059, 0x0032, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A5, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5, 0x0020, 0x0059, 0x0033, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A5, 0x00A7, 0x0020, 0x0020, 0x0020, 0x00A7, 0x00A5, 0x0020, 0x0058, 0x0031, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A5, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5, 0x0020, 0x0058, 0x0034, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A5, 0x00A7, 0x0020, 0x00A7, 0x0020, 0x00A7, 0x00A5, 0x0020, 0x0058, 0x0032, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A5, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5, 0x0020, 0x0058, 0x0033, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A5, 0x00A7, 0x0020, 0x0020, 0x0020, 0x00A7, 0x00A5, 0x0020, 0x0020, 0x0041, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x00A3, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A4, 0x0020, 0x0020, 0x0042, 0x0020, 0x0020, 0x0020,
	0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00A5,
	0x00A5, 0x005B, 0x0030, 0x0020, 0x0031, 0x0020, 0x0032, 0x0020, 0x0033, 0x0020, 0x0034, 0x0020, 0x0035, 0x0020,
	0x0036, 0x0020, 0x0037, 0x0020, 0x0038, 0x0020, 0x0039, 0x0020, 0x0045, 0x0058, 0x0049, 0x0054, 0x005D, 0x00A5,
	0x00A3, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6,
	0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A6, 0x00A4
};

void dispkeymap(int m)
{
	int i, j;
	uint k;
	
	if(9 < m) return;
	
	for(j = 0; j < 10; j++)
	{
		k = keymap[m][j];
		for(i = 0; i < 16; i++)
		{
			if(k & (1 << i))
				screen_fill_attr(SCREEN2, i+11, j+6, 1, 1, 0x00AE, 0xFE00);
			else
				screen_fill_attr(SCREEN2, i+11, j+6, 1, 1, 0x00AD, 0xFE00);
		}
	}
}

void dispscrn(int m)
{
	if(9 < m) return;
	
	screen_set_char(SCREEN2, 0, 0, 28, 18, scrn);
	screen_fill_attr(SCREEN2, 0, 0, 28, 18, 0x0800, 0xE1FF);
	dispkeymap(m);
}

void dispbutton(uint m)
{
	if(m & MES_1)
		screen_fill_attr(SCREEN2, 2, 4, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 2, 4, 1, 1, 0x00A7, 0xFE00);
	if(m & MES_2)
		screen_fill_attr(SCREEN2, 4, 4, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 4, 4, 1, 1, 0x00A7, 0xFE00);
	if(m & MES_3)
		screen_fill_attr(SCREEN2, 6, 4, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 6, 4, 1, 1, 0x00A7, 0xFE00);
	if(m & MTR_A_FWD)
		screen_fill_attr(SCREEN2, 2, 6, 1, 1, 0x00AA, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 2, 6, 1, 1, 0x00A9, 0xFE00);
	if(m & MTR_B_FWD)
		screen_fill_attr(SCREEN2, 4, 6, 1, 1, 0x00AA, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 4, 6, 1, 1, 0x00A9, 0xFE00);
	if(m & MTR_C_FWD)
		screen_fill_attr(SCREEN2, 6, 6, 1, 1, 0x00AA, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 6, 6, 1, 1, 0x00A9, 0xFE00);
	if(m & MTR_A_RVS)
		screen_fill_attr(SCREEN2, 2, 8, 1, 1, 0x00AC, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 2, 8, 1, 1, 0x00AB, 0xFE00);
	if(m & MTR_B_RVS)
		screen_fill_attr(SCREEN2, 4, 8, 1, 1, 0x00AC, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 4, 8, 1, 1, 0x00AB, 0xFE00);
	if(m & MTR_C_RVS)
		screen_fill_attr(SCREEN2, 6, 8, 1, 1, 0x00AC, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 6, 8, 1, 1, 0x00AB, 0xFE00);
	if(m & PRG_1)
		screen_fill_attr(SCREEN2, 2, 10, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 2, 10, 1, 1, 0x00A7, 0xFE00);
	if(m & PRG_2)
		screen_fill_attr(SCREEN2, 6, 10, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 6, 10, 1, 1, 0x00A7, 0xFE00);
	if(m & PRG_3)
		screen_fill_attr(SCREEN2, 2, 12, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 2, 12, 1, 1, 0x00A7, 0xFE00);
	if(m & PRG_4)
		screen_fill_attr(SCREEN2, 4, 12, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 4, 12, 1, 1, 0x00A7, 0xFE00);
	if(m & PRG_5)
		screen_fill_attr(SCREEN2, 6, 12, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 6, 12, 1, 1, 0x00A7, 0xFE00);
	if(m & PRG_STOP)
		screen_fill_attr(SCREEN2, 2, 14, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 2, 14, 1, 1, 0x00A7, 0xFE00);
	if(m & BEEP)
		screen_fill_attr(SCREEN2, 6, 14, 1, 1, 0x00A8, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 6, 14, 1, 1, 0x00A7, 0xFE00);
	if(m)
		screen_fill_attr(SCREEN2, 4, 2, 1, 1, 0x00AF, 0xFE00);
	else
		screen_fill_attr(SCREEN2, 4, 2, 1, 1, 0x00A6, 0xFE00);
}

int curpos[11][2] = 
{
	{ 2, 1},
	{ 4, 1},
	{ 6, 1},
	{ 8, 1},
	{10, 1},
	{12, 1},
	{14, 1},
	{16, 1},
	{18, 1},
	{20, 1},
	{22, 4}
};

uchar snd[16] =
{
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

void beep(void)
{
	sound_set_volume(0, 0xFF);
	sys_wait(2);
	sound_set_volume(0, 0x00);
}

uint s2bn(char far *s, int n)
{
	uint res;
	char c;
	
	res = 0;
	while(n--)
	{
		c = *s++;
		if((c < '0') || ('1' < c))
			break;
		res = res / 2 + (c - '0') * 0x8000;
	}
	return res;
}

void readcfg(void)
{
	int i ,j;
	char buf[19];
	FILE far *fp;
	char far *sp;
	
	if(NULL == (fp = fopen(CFG_FILE, "r")))
		return;
	for(j = 0; j < 10; j++)
	{
		for(i = 0; i < 10; i++)
		{
			for(;;)
			{
				sp = fgets(buf, 19, fp);
				if((buf[0] == '0') || (buf[0] == '1'))
					break;
				if(sp == NULL)
					break;
			}
			if(sp != NULL)
				keymap[j][i] = s2bn(buf, 16);
			else
				keymap[j][i] = 0;
		}
	}
	fclose(fp);
}

void init(void)
{
	int x, y;
	uint bkgd;

	sound_init();
	sound_set_channel(0x01);
	sound_set_output(0x01);
	sound_set_wave(0, snd);
	sound_set_pitch(0, 1938);
	
	comm_set_baudrate(COMM_SPEED_9600);
	
	display_control(0);
	lcd_set_segments(lcd_get_segments() | LCDSEG_HORIZONTAL);
	
	if(HARDARCH_WSC == wwc_get_hardarch())
		wwc_set_color_mode(COLOR_MODE_4COLOR);
	
	if(HARDARCH_WS == wwc_get_hardarch())
	{
		lcd_set_color(0x4210, 0xF840);
		palette_set_color(4, 0x7654);
		palette_set_color(0, 0x4567);
		palette_set_color(1, 0x3210);
	}
	else
	{
		wwc_palette_set_color(4, 0, 0x0FFF);
		wwc_palette_set_color(4, 1, 0x0888);
		wwc_palette_set_color(4, 2, 0x0444);
		wwc_palette_set_color(4, 3, 0x0000);
		wwc_palette_set_color(0, 0, 0x0000);
		wwc_palette_set_color(0, 1, 0x0444);
		wwc_palette_set_color(0, 2, 0x0888);
		wwc_palette_set_color(0, 3, 0x0FFF);
		wwc_palette_set_color(1, 0, 0x0FFF);
		wwc_palette_set_color(1, 1, 0x0FAA);
		wwc_palette_set_color(1, 2, 0x0AAF);
		wwc_palette_set_color(1, 3, 0x0AAA);
	}
	
	font_set_color(0x0003);
	font_set_monodata(0, font_width*font_height, bmp_font);
	for(y = 0; y < 18; y++)
	{
		for(x = 0; x < 28; x++)
		{
			bkgd = 0x0820;
			screen_set_char(SCREEN2, x, y, 1, 1, &bkgd);
		}
	}
	
	font_set_colordata(256, bkgd_width*bkgd_height, bmp_bkgd);
	for(y = 0; y < 18; y++)
	{
		for(x = 0; x < 28; x++)
		{
			bkgd = 0x0300 | (y % bkgd_height) * bkgd_width + (x % bkgd_width);
			screen_set_char(SCREEN1, x, y, 1, 1, &bkgd);
		}
	}
	
	display_control(DCM_SCR2 | DCM_SCR1);
}

int keycheck(void)
{
	int k;
	
	k = key_press_check();
	sys_wait(1);
	
	return(k & ~(k ^ key_press_check()));
}

int menu(int m)
{
	uint key, oldkey;
	
	beep();
	screen_fill_attr(SCREEN2, curpos[m][0], 16, curpos[m][1], 1, 0x0000, 0xE1FF);
	
	oldkey = 0;
	while(keycheck() & KEY_ALL);
	while(1)
	{
		key = keycheck();
		if(key & ~oldkey & KEY_START)
		{
			screen_fill_attr(SCREEN2, curpos[m][0], 16, curpos[m][1], 1, 0x0800, 0xE1FF);
			beep();
			m = -1;
			break;
		}
		if(key & ~oldkey & KEY_X4)
		{
			screen_fill_attr(SCREEN2, curpos[m][0], 16, curpos[m][1], 1, 0x0800, 0xE1FF);
			beep();
			m--;
			if(m < 0) m = 10;
			dispkeymap(m);
			screen_fill_attr(SCREEN2, curpos[m][0], 16, curpos[m][1], 1, 0x0000, 0xE1FF);
		}
		if(key & ~oldkey & KEY_X2)
		{
			screen_fill_attr(SCREEN2, curpos[m][0], 16, curpos[m][1], 1, 0x0800, 0xE1FF);
			beep();
			m++;
			if(10 < m) m = 0;
			dispkeymap(m);
			screen_fill_attr(SCREEN2, curpos[m][0], 16, curpos[m][1], 1, 0x0000, 0xE1FF);
		}
		if(key & ~oldkey & KEY_A)
		{
			screen_fill_attr(SCREEN2, curpos[m][0], 16, curpos[m][1], 1, 0x0800, 0xE1FF);
			beep();
			break;
		}
		oldkey = key;
	}
	while(keycheck() & KEY_ALL);
	
	return(m);
}

void sleep(void)
{
	comm_close();
	
	sys_set_awake_key(0);
	sys_sleep();
	
	comm_open();
}

void main(int argc, char *argv[])
{
	int mode, i;
	uint key;
	uint msg, oldmsg;
	ulong tick;
	
	init();
	readcfg();
	
	mode = 0;
	dispscrn(mode);
	
	comm_open();
	oldmsg = 0;
	tick = sys_get_tick_count();
	while(keycheck() & KEY_ALL);
	while(1)
	{
		if((sys_get_sleep_time() != 0)
			&& ((tick + 75 * 60 * sys_get_sleep_time()) < sys_get_tick_count())) sleep();
		if((key = keycheck()) & KEY_ALL)
			tick = sys_get_tick_count();
		if(key & KEY_START)
		{
			i = menu(mode);
			if(0 <= i) mode = i;
			if(mode == 10) break;
			dispkeymap(mode);
		}
		msg = 0;
		if(key & KEY_Y1) msg |= keymap[mode][0];
		if(key & KEY_Y4) msg |= keymap[mode][1];
		if(key & KEY_Y2) msg |= keymap[mode][2];
		if(key & KEY_Y3) msg |= keymap[mode][3];
		if(key & KEY_X1) msg |= keymap[mode][4];
		if(key & KEY_X4) msg |= keymap[mode][5];
		if(key & KEY_X2) msg |= keymap[mode][6];
		if(key & KEY_X3) msg |= keymap[mode][7];
		if(key & KEY_A)  msg |= keymap[mode][8];
		if(key & KEY_B)  msg |= keymap[mode][9];
		dispbutton(msg);
		if((msg & (MTR_A_FWD | MTR_A_RVS)) == (MTR_A_FWD | MTR_A_RVS))
			msg &= ~(MTR_A_FWD | MTR_A_RVS);
		if((msg & (MTR_B_FWD | MTR_B_RVS)) == (MTR_B_FWD | MTR_B_RVS))
			msg &= ~(MTR_B_FWD | MTR_B_RVS);
		if((msg & (MTR_C_FWD | MTR_C_RVS)) == (MTR_C_FWD | MTR_C_RVS))
			msg &= ~(MTR_C_FWD | MTR_C_RVS);
		if((msg != oldmsg) || (msg & REPEAT))
		{
			sendmsg(msg);
			oldmsg = msg;
		}
		sys_wait(8);
	}
	comm_close();
}
